<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Vivek Haldar</title>
    <link>http://vivekhaldar.com/</link>
    <description>Recent content on Vivek Haldar</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Thu, 25 Aug 2022 21:30:04 +0800</lastBuildDate><atom:link href="http://vivekhaldar.com/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>The Complexity Ratchet</title>
      <link>http://vivekhaldar.com/articles/the-complexity-ratchet/</link>
      <pubDate>Fri, 15 May 2026 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-complexity-ratchet/</guid>
      <description>&lt;p&gt;Recently, Jasmine Sun wrote &lt;a href=&#34;https://www.nytimes.com/2026/04/30/opinion/ai-labor-work-force-silicon-valley.html&#34;&gt;a long op-ed in the New York Times&lt;/a&gt; about the notion of a permanent underclass. Everyone at the big AI labs is convinced that AI will eventually replace all human labor — all human knowledge work — and that if we don&amp;rsquo;t calibrate our technology and policy choices properly, the result will be a new permanent underclass. At this point it&amp;rsquo;s almost a meme in Silicon Valley AI circles.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Recently, Jasmine Sun wrote <a href="https://www.nytimes.com/2026/04/30/opinion/ai-labor-work-force-silicon-valley.html">a long op-ed in the New York Times</a> about the notion of a permanent underclass. Everyone at the big AI labs is convinced that AI will eventually replace all human labor — all human knowledge work — and that if we don&rsquo;t calibrate our technology and policy choices properly, the result will be a new permanent underclass. At this point it&rsquo;s almost a meme in Silicon Valley AI circles.</p>
<p>On her Substack, she later wrote <a href="https://jasmi.news/p/party-in-the-permanent-underclass">a follow-up piece</a> where she walked through some of the rebuttals — and the rebuttals to the rebuttals. One of the most prominent rebuttals to an argument like that is the good old Jevons paradox: when the cost of a desirable good goes down, the demand for it skyrockets. So even if artificial intelligence becomes much cheaper, you&rsquo;ll just have more and more demand for it, and more and more jobs. Sun&rsquo;s rebuttal to that rebuttal is that, sure, you might have more demand for AI, but that doesn&rsquo;t necessarily mean the demand gets fulfilled by <em>humans</em>. I think that&rsquo;s the crux of the argument.</p>
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/HkkM2CfL2LY?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<h2 id="the-complexity-ratchet">The Complexity Ratchet</h2>
<p>There&rsquo;s one part of this argument that often gets missed. I don&rsquo;t know if it has a name — I like to call it the <strong>complexity ratchet</strong> — and I think it&rsquo;s what might still end up saving humans.</p>
<p>If you look at the tech tree of civilization, it&rsquo;s one long walk up the ladder of complexity: from mud huts to wooden buildings to concrete buildings to skyscrapers, or from wheels to cars to jet airplanes to spaceships and rockets. Each of these is orders of magnitude more complex than the one before it.</p>
<h2 id="why-spreadsheets-didnt-kill-accounting">Why Spreadsheets Didn&rsquo;t Kill Accounting</h2>
<p>A very clean, recent example — one within most of our lifetimes — is the advent of the personal computer. The killer app for the personal computer was the spreadsheet. People didn&rsquo;t really know what to do with a personal computer until VisiCalc came around and they saw spreadsheets. That&rsquo;s what made everyone realize what computers could actually be used for.</p>
<p>When spreadsheets came out, the overwhelming lament at the time was that they would wipe out the accounting profession. Decades later, we know they didn&rsquo;t. Quite the contrary — they probably 10x&rsquo;d or 100x&rsquo;d the number of accountants.</p>
<p>Why? The complexity ratchet. Because spreadsheets made it so easy to do more and more complex financial engineering, the result was that you needed more and more human accountants to stay on top of all that complex financial engineering. You can make the same argument for most digital technology. I don&rsquo;t think you&rsquo;d have laws and bills in Congress that run to thousands of pages if you didn&rsquo;t have word processors.</p>
<h2 id="how-technology-raises-civilizations-complexity">How Technology Raises Civilization&rsquo;s Complexity</h2>
<p>So the complexity ratchet argument is that all of these technologies irreversibly ratchet up the level of complexity in our civilization. They let us create, manage, and live with more and more complex legal, societal, financial, and educational structures. And those structures just become part of our lives, part of our civilization.</p>
<p>Even though you need machines to manipulate a lot of these systems, you ultimately also need a lot of humans. The financial system is a great example: you need a lot of complex machinery to operate today&rsquo;s financial markets — and not just the markets, but all the structures around them: companies, LLCs, C corps, S corps, public and private corporations, shareholder and ownership structures. You created a lot of complexity, and you did so irreversibly. You needed machines to climb that complexity ladder, and you need machines to maintain civilization at that level of complexity. But all the while, you didn&rsquo;t do away with humans — just as with spreadsheets, you didn&rsquo;t reduce the total number of accountants in the world.</p>
<p>So I think the complexity ratchet might be a corollary of — maybe a necessary companion to — the now-familiar Jevons paradox argument.</p>
<h2 id="will-ai-make-us-accountants-or-farmers">Will AI Make Us Accountants or Farmers?</h2>
<p>Now, there&rsquo;s a rebuttal to <em>this</em> too: okay, AI will enable a massive leap in the complexity of the structures we build and use, but sure, the AI itself will manage all of it for you. I think that&rsquo;s still plausible at this point. I don&rsquo;t think we know enough yet to say whether it goes the way it did for accountants — where you still needed a lot of accountants — or whether it goes the way of agriculture, where we still produce more than enough food for the entire planet but the number of farmers, in both absolute and relative terms, completely fell off. We just don&rsquo;t need many farmers anymore.</p>
<p>So will all this go the way of accountants, or the way of farmers? You can draw some historical parallels here. Farming is a very physical activity — it&rsquo;s from the world of atoms, not the world of bits. There&rsquo;s some ceiling, some limit, to how much food you need or want, and how much food you can store and move around. Accounting and law and finance, on the other hand, are purely abstract, completely conceptual. There&rsquo;s no ceiling to the complexity of financial structures, as long as someone is still getting some utility out of it.</p>
<p>If you believe that argument, then even with AI — even with the complexity ratchet enabled by AI — you&rsquo;re still going to need a lot of humans in the future to stay on top of all that complexity. In other words, we go the way of the accountants rather than the farmers.</p>
<p>Only time will tell which way we end up going. But I wanted to talk about the complexity ratchet argument, because the Jevons paradox argument is pretty well known by now, and I haven&rsquo;t seen the complexity ratchet argument made — at least not to my knowledge.</p>
<p>All the best!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>A Tale of Two Job Markets</title>
      <link>http://vivekhaldar.com/articles/a-tale-of-two-job-markets/</link>
      <pubDate>Sun, 03 May 2026 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/a-tale-of-two-job-markets/</guid>
      <description>&lt;p&gt;It was the best of times. It was the worst of times.&lt;/p&gt;
&lt;p&gt;That, I think, is how you&amp;rsquo;d have to summarize the state of the software engineering job market right now. Everyone keeps saying AI is eating the entry-level rungs of the ladder. (&lt;a href=&#34;https://vivekhaldar.com/articles/llms-eat-entry-level-swes/&#34;&gt;I said it back in early 2024!&lt;/a&gt;) And to show just how confusing things are, I want to put two seemingly contradictory pieces of data side by side.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>It was the best of times. It was the worst of times.</p>
<p>That, I think, is how you&rsquo;d have to summarize the state of the software engineering job market right now. Everyone keeps saying AI is eating the entry-level rungs of the ladder. (<a href="https://vivekhaldar.com/articles/llms-eat-entry-level-swes/">I said it back in early 2024!</a>) And to show just how confusing things are, I want to put two seemingly contradictory pieces of data side by side.</p>
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/ugzw5I3Vako?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<h2 id="two-graphs-two-narratives">Two Graphs, Two Narratives</h2>
<p>The first graph comes from a <a href="https://www.citadelsecurities.com/news-and-insights/the-economics-of-intelligence/">report from Citadel Securities</a> that came out about a week ago. The author&rsquo;s argument is that AI-exposed industries are <em>not</em> seeing headcount contraction. Software engineering job postings have been spiking since around mid-2025. He looks at another heavily AI-exposed industry — customer service — and sees the same upward trend in postings. The thesis: AI is creating jobs and accelerating new business formation, <em>especially</em> in industries exposed to AI.</p>
<p>The second graph is from <a href="https://digitaleconomy.stanford.edu/news/ai-and-labor-markets-what-we-know-and-dont-know/">a paper by Brynjolfsson et al.</a>, cited in the recently released <a href="https://hai.stanford.edu/ai-index/2026-ai-index-report">Stanford AI Index 2026</a> — specifically <a href="https://hai.stanford.edu/assets/files/ai_index_report_2026_chapter_4_economy.pdf">Chapter 4 on the economy</a>. The Brynjolfsson paper looks at the number of people <em>actually employed</em> in these roles. And the picture is starkly different: among workers ages 22 to 25, employment in the most AI-exposed occupations has fallen roughly 16% relative to the least exposed. Junior software engineers, in particular, have fallen off a cliff since around late 2022 — with no comparable decline for mid-career and senior engineers.</p>
<p>So which is it? Is AI creating jobs, or destroying entry-level jobs?</p>
<p>The simplest reconciliation is that these two graphs are measuring different things.</p>
<p>The Citadel chart counts <strong>job postings</strong>. That&rsquo;s a forward-looking signal: how many roles are open, how many companies are willing to hire, what the demand side intends to do over the next few months. It&rsquo;s not a snapshot of who is currently employed.</p>
<p>The Brynjolfsson chart counts <strong>employed people</strong>. That&rsquo;s a backward-looking signal: who actually has a job right now. The two can diverge for long stretches, especially in industries going through structural change.</p>
<p>So both can be true at the same time. The pipeline of new openings can be filling up while the existing population of junior engineers has shrunk. One is the leading indicator. The other is the lagging one.</p>
<h2 id="the-causality-is-messy">The Causality Is Messy</h2>
<p>There&rsquo;s a wrinkle, though. The Brynjolfsson authors issued <a href="https://digitaleconomy.stanford.edu/news/canaries-interest-rates-and-timinga-more-on-recent-drivers-of-employment-changes-for-young-workers/">an update to their paper</a> where, after controlling for various confounders, they found the timing of the employment decline shifts to <strong>2024 rather than late 2022</strong>. And the causality gets a lot messier. You can&rsquo;t pin it just on AI. You can&rsquo;t rule out the usual culprits — ZIRP and massive hiring during COVID.</p>
<p>The honest read on the data is: yes, junior software engineering employment is down. No, we don&rsquo;t yet have a clean attribution to AI. Most likely it&rsquo;s a stew — AI plus the COVID overhiring correction plus the rate environment.</p>
<h2 id="ground-truth">Ground Truth</h2>
<p>I talk to a lot of folks who are close to graduation, or have recently graduated, or are trying to break in. The vibe matches the Brynjolfsson chart, not the Citadel chart. The entry-level software engineering market just feels really tough right now.</p>
<p>But the Citadel chart is forward-looking. So if you take it seriously, the tide may have already turned. The worst may be behind us.</p>
<h2 id="the-old-scripts-are-torn-up">The Old Scripts Are Torn Up</h2>
<p>The framing I keep coming back to when I talk to people about this: there is plenty of opportunity. But all the old scripts have been torn up.</p>
<p>For more than the last two decades — through the internet boom and into the cloud era — there were fairly stable scripts for a software engineering career. Stable job expectations. A stable ladder defining how to grow your skills and climb through the levels. A well-known script for what to study, what to major in, how to interview.</p>
<p>AI, especially at the junior end, is completely rewriting what that ladder means. The well-understood scripts that an entire generation of new grads, engineering managers, and leaders have been running on no longer work. They have to be rewritten, by all of us, while we&rsquo;re already running.</p>
<p>So if you&rsquo;re trying to start a career in software right now, or trying to figure out how to manage one, the right mental model is to&hellip; figure it out yourself, because nobody else has any idea either.</p>
<p>There is plenty of opportunity. The old scripts just don&rsquo;t work anymore. Write your own.</p>
<p>All the best!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>O Moat, Where Art Thou?</title>
      <link>http://vivekhaldar.com/articles/o-moat-where-art-thou/</link>
      <pubDate>Thu, 23 Apr 2026 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/o-moat-where-art-thou/</guid>
      <description>&lt;p&gt;How does one build a moat in the AI startup space? Or as VCs like to say: &amp;ldquo;Where does the value accrue?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Here are some observations. I can&amp;rsquo;t quite thread them into a coherent narrative. The crystal ball is cloudy, and also the clouds are moving very fast.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;every AI startup wants to be a pure product, almost SaaS-like company. Almost all of them end up becoming bespoke solution builders, aka consultants. Nobody likes being called that, so they say &amp;ldquo;forward deployed engineer&amp;rdquo;. You want to build agents for companies, and every company is a snowflake.&lt;/li&gt;
&lt;li&gt;Palantir looked like a consultancy for a decade before it dawned on everyone that they had a durable product behind it. The startups are hoping to reproduce that playbook: structure the engagements to harvest transferable artifacts rather than bespoke deliverables.&lt;/li&gt;
&lt;li&gt;The major model vendors are moving aggressively into verticals. See recent product pushes such as &amp;ldquo;Claude for finance/law/healthcare&amp;rdquo;. So much for the 2023-25 thesis of finding shelter in vertical specialization.&lt;/li&gt;
&lt;li&gt;The major model vendors are aggressively hiring FDEs. FDEs are subsidized by the token business. They don&amp;rsquo;t have to pay for themselves — they exist to expand usage. A startup&amp;rsquo;s FDEs have to be explicitly funded. The vertical startup is competing with a cross-subsidy they can&amp;rsquo;t match.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Capability&lt;/em&gt; is not &lt;em&gt;access&lt;/em&gt;. Can the major model vendors really shmooze enterprise sales? Or: rizz is the only moat.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Speed of erosion&lt;/em&gt; matters. If a startup can carve a niche that lasts 6 months before the giants catch up, maybe it can convert that into a trusted relationship that persists. In other words, move fast enough to turn a perishable asset into a durable one.&lt;/li&gt;
&lt;li&gt;maybe the very framing of &amp;ldquo;having a moat&amp;rdquo; is incorrect. When the ground under your feet shifts so fast, you probably want some notion of &amp;ldquo;velocity + customer intimacy&amp;rdquo;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/k1v9IQjkZPQ?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;</description>
      <content:encoded><![CDATA[<p>How does one build a moat in the AI startup space? Or as VCs like to say: &ldquo;Where does the value accrue?&rdquo;</p>
<p>Here are some observations. I can&rsquo;t quite thread them into a coherent narrative. The crystal ball is cloudy, and also the clouds are moving very fast.</p>
<ul>
<li>every AI startup wants to be a pure product, almost SaaS-like company. Almost all of them end up becoming bespoke solution builders, aka consultants. Nobody likes being called that, so they say &ldquo;forward deployed engineer&rdquo;. You want to build agents for companies, and every company is a snowflake.</li>
<li>Palantir looked like a consultancy for a decade before it dawned on everyone that they had a durable product behind it. The startups are hoping to reproduce that playbook: structure the engagements to harvest transferable artifacts rather than bespoke deliverables.</li>
<li>The major model vendors are moving aggressively into verticals. See recent product pushes such as &ldquo;Claude for finance/law/healthcare&rdquo;. So much for the 2023-25 thesis of finding shelter in vertical specialization.</li>
<li>The major model vendors are aggressively hiring FDEs. FDEs are subsidized by the token business. They don&rsquo;t have to pay for themselves — they exist to expand usage. A startup&rsquo;s FDEs have to be explicitly funded. The vertical startup is competing with a cross-subsidy they can&rsquo;t match.</li>
<li><em>Capability</em> is not <em>access</em>. Can the major model vendors really shmooze enterprise sales? Or: rizz is the only moat.</li>
<li><em>Speed of erosion</em> matters. If a startup can carve a niche that lasts 6 months before the giants catch up, maybe it can convert that into a trusted relationship that persists. In other words, move fast enough to turn a perishable asset into a durable one.</li>
<li>maybe the very framing of &ldquo;having a moat&rdquo; is incorrect. When the ground under your feet shifts so fast, you probably want some notion of &ldquo;velocity + customer intimacy&rdquo;.</li>
</ul>
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/k1v9IQjkZPQ?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

]]></content:encoded>
    </item>
    
    <item>
      <title>Skills, CLIs, and MCP: What They&#39;re Actually For</title>
      <link>http://vivekhaldar.com/articles/skills-clis-and-mcp/</link>
      <pubDate>Fri, 17 Apr 2026 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/skills-clis-and-mcp/</guid>
      <description>&lt;p&gt;There&amp;rsquo;s been a lot of discourse in the AI agent space lately about skills, CLIs, and MCP. Some of it is a category error. Some of it is a false dichotomy. And some of it is just not considering what environment these things are meant for.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been building in this space for a while and I have some thoughts that I&amp;rsquo;m hoping will clear some of these things up. Let&amp;rsquo;s start with skills. What are skills really for?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>There&rsquo;s been a lot of discourse in the AI agent space lately about skills, CLIs, and MCP. Some of it is a category error. Some of it is a false dichotomy. And some of it is just not considering what environment these things are meant for.</p>
<p>I&rsquo;ve been building in this space for a while and I have some thoughts that I&rsquo;m hoping will clear some of these things up. Let&rsquo;s start with skills. What are skills really for?</p>
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/wHdDEQm8BmM?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<h2 id="skills-are-desire-paths">Skills are desire paths</h2>
<p>Skills have been a formalization of something people were already doing. That&rsquo;s why I call them a <em>desire path</em> — you look for where people are walking, where the grass is worn out, and that&rsquo;s where you build the sidewalks.</p>
<p>Before skills existed as a spec, people were stuffing additional context into markdown files and feeding them to the model through whatever harness or agent they were using. Anthropic formalized that into a proper spec, while adding context-saving mechanics like progressive disclosure.</p>
<p>The whole point of skills is to articulate either <strong>procedural knowledge</strong> or <strong>informational knowledge</strong>. Procedural knowledge is a set of instructions for how to do something — you already know what to do, and you want to simply tell the model. You don&rsquo;t want the model to have to plan or think or reason through a process that is largely pre-determined. Informational knowledge is general domain context that helps the model on a task.</p>
<p>To take a common example: if you were building a data analysis agent that queries a bunch of tables, you&rsquo;d give it knowledge about what the column names mean inside your company, because those meanings are specific to your domain. That&rsquo;s informational knowledge. But you&rsquo;d also give it very specific instructions for how to, say, close the books at the end of the month. That&rsquo;s not something you want the agent to plan or reason about — you just spell out your process. That&rsquo;s a procedural skill.</p>
<p>The important thing about skills is that they&rsquo;re almost always something that is <em>not</em> in world knowledge. It&rsquo;s additional domain information — whether informational or procedural — that you are making explicit.</p>
<p><a href="https://www.anthropic.com/research/skills-benchmark">SkillsBench</a> empirically showed that curated skills authored by humans bring a huge jump in task performance. Whereas self-generated skills — skills generated by the model — bring no benefit or in some cases even hurt performance. Which makes sense if you follow the logic above: skills are supposed to be something outside the model&rsquo;s world knowledge. You don&rsquo;t want the model to generate skills for you. You want to <em>tell</em> it all your knowledge.</p>
<p>A great example is Anthropic&rsquo;s own <a href="https://github.com/anthropics/claude-code-skills">PDF skill</a>. They spell out common PDF operations — merging, splitting, extracting — and specify to use PyPDF. The model doesn&rsquo;t have to go hunt for PDF libraries or plan and reason about well-understood operations. The skill just says: here&rsquo;s how to do it.</p>
<h2 id="mcp">MCP</h2>
<p>MCP has been a smashing success, so most people now have a reasonable understanding of it. The core idea is to bring context to the model. And once again, like the skills desire path, MCP is a formalization of function calling. Before MCP, each model provider — OpenAI, Gemini, Anthropic — had their own slightly different syntax and API. MCP formalized that into a spec.</p>
<p>The other thing MCP does, and this is less known, is serve up resources — HTML pages, JavaScript, CSS. This is now the basic mechanism behind MCP apps and ChatGPT apps: they are MCP servers that serve UI via resources.</p>
<p>So why did MCP get a bad reputation? Two technical reasons.</p>
<p><strong>Context hogging.</strong> When an MCP server had a large list of tools, just loading it would eat a chunk of your context window. The most well-known culprit was the GitHub MCP server with something like 70 tools — loading it consumed roughly a third of your context window. I&rsquo;d argue that&rsquo;s not MCP&rsquo;s fault. That&rsquo;s bad MCP server design. If you&rsquo;re building an MCP server, you probably should not make it a kitchen sink.</p>
<p><strong>Context dumping.</strong> When you call an MCP tool, the results land in the window. Unfortunately, a bunch of badly designed servers would produce very large tool results, often larger than they needed to be.</p>
<p>Fortunately, both of these problems have been largely mitigated today by <strong>code mode</strong>. The idea was initially proposed by Cloudflare, but Anthropic later adopted it as the canonical way to invoke MCP tools. The basic idea is that instead of the model directly getting all tool results, you write a small amount of code to make the tool call and interpret the results. Doing it in code shields the model from both problems.</p>
<p>So I think the initial reasons MCP got a bad rap have been largely addressed. A lot of it was just bad server design, and code mode fixes the underlying mechanism.</p>
<h2 id="where-do-clis-work-really-well">Where do CLIs work really well?</h2>
<p>That brings us to CLIs. Peter Steinberger famously said he prefers CLIs over MCP. So let&rsquo;s look at where CLIs actually work well.</p>
<p>They work really well on what I call <strong>personal agents</strong>. These are agents running on my own machine — a Mac Mini, a VM, whatever — where I control the environment. I&rsquo;m signed into all the CLIs — GitHub, Google Cloud, Cloudflare — and my agents can just invoke them on my behalf. The auth story on personal machines is clean and seamless.</p>
<p>The other advantage is <strong>context efficiency</strong>. Agents can do agentic search over a CLI&rsquo;s function space by invoking <code>--help</code> and walking the subcommand tree. Most modern CLIs are structured as a top-level command with subcommands, each handling a subset of functionality. Agents are surprisingly good at this tree-based exploration. They don&rsquo;t suffer from the context hogging problem of loading dozens of MCP tool descriptions at once.</p>
<h2 id="where-mcp-wins">Where MCP wins</h2>
<p>But CLIs don&rsquo;t work everywhere. In enterprise scenarios, you really do want MCP.</p>
<p>When you&rsquo;re doing a proper production deployment, you&rsquo;re deploying your own binary. You&rsquo;re not also deploying a bunch of CLIs with some auth credentials alongside your application. You want proper service separation.</p>
<p>An organizational pattern I see across enterprise deployments: one team stands up the official MCP servers for the entire company, and other teams build agents on top. This buys you <strong>central governance</strong> — one official source of truth for the underlying data. You don&rsquo;t want people spinning up side MCP servers all over the place, just like in the old days you didn&rsquo;t want everyone creating side tables and fragmenting the source of truth.</p>
<p>It also buys you <strong>separation of concerns</strong>. The teams building agents don&rsquo;t need to worry about standing up MCP servers, and the team building MCP servers doesn&rsquo;t need to know about every agent use case across the company.</p>
<h2 id="its-not-eitheror">It&rsquo;s not either/or</h2>
<p>The takeaway: these are complementary tools, working at different layers of the agent stack, for different environments, not competing alternatives. Skills encode domain knowledge the model doesn&rsquo;t have. CLIs work great for personal agents on machines you control. MCP is the right abstraction for enterprise deployment with governance and service separation.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Human-Agent Interaction Is Becoming the Bottleneck</title>
      <link>http://vivekhaldar.com/articles/human-agent-interaction-is-becoming-the-bottleneck/</link>
      <pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/human-agent-interaction-is-becoming-the-bottleneck/</guid>
      <description>&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/0nlJzL2BT-s?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

&lt;p&gt;I&amp;rsquo;ve been a heavy user of agents for a while now — not just coding agents, but agents in general, for all my work. And I&amp;rsquo;m beginning to bump up against some walls when it comes to human-agent interaction. I want to share some thoughts on what those walls are and what might actually solve them.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/0nlJzL2BT-s?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<p>I&rsquo;ve been a heavy user of agents for a while now — not just coding agents, but agents in general, for all my work. And I&rsquo;m beginning to bump up against some walls when it comes to human-agent interaction. I want to share some thoughts on what those walls are and what might actually solve them.</p>
<h2 id="the-chat-ui-has-a-low-ceiling">The Chat UI Has a Low Ceiling</h2>
<p>Look at <a href="https://x.com/rabi_guha/status/2040082295563169852">the direction agent UI is going</a>. Cursor 3.0 just shipped, and its big selling point is managing tons of agents — local or cloud, running in parallel — all in one UI. Claude Code looks similar. And it&rsquo;s not just the agents: a ton of SaaS products (Linear, PostHog, Attio) have converged on the same ChatGPT-like interface: chat front and center, a sidebar of previous conversations.</p>
<p>This kind of UI has a low floor — it makes it easy to get started with agents. But I&rsquo;d claim it also has a fairly low ceiling. Once you do a lot of your work (or even <em>all</em> your work) through agents, you hit a wall.</p>
<p>The wall is sensemaking — making sense of all that work after it&rsquo;s done.</p>
<h2 id="narrating-your-work">Narrating Your Work</h2>
<p>For the longest time, I&rsquo;ve been a fan of this concept called <a href="/articles/narrate-your-work/"><em>narrating your work</em></a>. The idea is simple: you keep synthesized notes of the things you&rsquo;ve been working on. A work log.</p>
<p>I was first exposed to this at Google, where engineers posted weekly &ldquo;snippets&rdquo; — short updates on what they&rsquo;d done that week. Most people dropped a few bullet points. But every once in a while, there were those three or four engineers (you know who you are) who wrote mini essays in their snippets. Subjective, synthesized views of what they were working on, what was working, what wasn&rsquo;t, what their plans were.</p>
<p>I got enormous value from reading those. These were engineers in distant parts of the company — it was one-sided in the sense that I never worked with them or met them in person. But reading their essays gave me a deep insight into the kinds of work they were doing. It made me feel a kinship with them. And it&rsquo;s what encouraged me to keep up my own snippet-writing habit.</p>
<p>The primary audience is yourself — reflection over the mountain of work — but the secondary audience is everyone else who stumbles across it.</p>
<h2 id="the-sensemaking-problem">The Sensemaking Problem</h2>
<p>Here&rsquo;s the point: all these agent UIs make it really difficult to make sense of all the work you&rsquo;ve done with your agents. You cover ten miles in a day where you would have covered one without agents. But at the end of the day — or the week — you&rsquo;re left disoriented. You&rsquo;ve done <em>so much work</em>. But if you try to think back: What did I actually accomplish? What&rsquo;s the higher-level picture? It&rsquo;s hard to reconstruct.</p>
<p>You need that synthesis so you can learn from it and plan your next chunk of work. And that, I think, is the main shortcoming of current agent UIs. They let you do a ton of work, but leave you in a disoriented place. Synthesis over all that work is an unsolved problem.</p>
<h2 id="agent-kitchen-a-first-attempt">Agent Kitchen: A First Attempt</h2>
<p>So I built a tool called <a href="https://github.com/vivekhaldar/agent-kitchen">Agent Kitchen</a> that gives me a higher-level view of all the work I&rsquo;ve been doing with my agents — across repos, across my home directory, across random directories on my computer. I wrote about the motivation in <a href="/articles/your-agent-sessions-are-disappearing/">a previous post</a>.</p>
<p>I&rsquo;ve been using it daily since I released it recently. It&rsquo;s now my primary interface into all my Claude Code sessions. I get a global view of sessions across different repos and directories, and I can click to resume any of them.</p>
<p>But even with this, I want more. This still isn&rsquo;t quite the high-level synthesized narrative I&rsquo;m after. Ideally, I&rsquo;d want a paragraph or two of plain natural language at the top — a synthesis of what I got done in a given repo or directory, with links off to the relevant sessions so I can click to resume them.</p>
<p>Another common annoyance: agent chats grow really long, with many turns between you and the agent, and you just have to scroll through them. There&rsquo;s no minimap, no bookmarks to just your inputs — nothing like the minimap in VS Code that gives you a global view of a long file. These are small UI issues, but they add up to the same problem: agents treat everything as a wall of text.</p>
<h2 id="ux-is-now-the-bottleneck">UX Is Now the Bottleneck</h2>
<p>Overall, I think we&rsquo;re arriving at a place where the UI/UX of using agents is becoming the bottleneck in how effective we can be with them. The models are getting better. The harnesses and agents are getting better. But I believe we&rsquo;re now bottlenecked by the UX paradigm.</p>
<p>We spent the last two years making agents that can do more work. Now we need interfaces that help humans <em>understand</em> all that work. Until then, we&rsquo;re sprinting blind.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Meta-Harness: Automating the Benchmaxing Loop</title>
      <link>http://vivekhaldar.com/articles/meta-harness-automating-the-benchmaxing-loop/</link>
      <pubDate>Sat, 04 Apr 2026 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/meta-harness-automating-the-benchmaxing-loop/</guid>
      <description>&lt;p&gt;The central question in the agent space right now is: &lt;strong&gt;how do you get humans out of the loop?&lt;/strong&gt; If you&amp;rsquo;re manually steering your agent, you have only partially automated the flow, and you the human are still the bottleneck. Two recent projects illustrate how to climb this ladder of abstraction, and the second one hits close to home for me.&lt;/p&gt;
&lt;h2 id=&#34;autoresearch&#34;&gt;Autoresearch&lt;/h2&gt;
&lt;p&gt;Andrej Karpathy&amp;rsquo;s &lt;a href=&#34;https://github.com/karpathy/autoresearch&#34;&gt;AutoResearch&lt;/a&gt; showed a clean version of this idea. Take a program that trains a small GPT model, and let a coding agent edit it directly — making changes to architecture, hyperparameters, optimizer, anything — then running a training job and checking whether a performance metric improved. If it did, keep the change. If not, git-reset back to the last good version. Greedy hill-climbing, running overnight automatically.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The central question in the agent space right now is: <strong>how do you get humans out of the loop?</strong> If you&rsquo;re manually steering your agent, you have only partially automated the flow, and you the human are still the bottleneck. Two recent projects illustrate how to climb this ladder of abstraction, and the second one hits close to home for me.</p>
<h2 id="autoresearch">Autoresearch</h2>
<p>Andrej Karpathy&rsquo;s <a href="https://github.com/karpathy/autoresearch">AutoResearch</a> showed a clean version of this idea. Take a program that trains a small GPT model, and let a coding agent edit it directly — making changes to architecture, hyperparameters, optimizer, anything — then running a training job and checking whether a performance metric improved. If it did, keep the change. If not, git-reset back to the last good version. Greedy hill-climbing, running overnight automatically.</p>
<p>A human ML researcher performs the same loop manually: set off a training run, check metrics, tweak the training logic, repeat. AutoResearch automates that entire cycle. The crucial enabler is having <strong>one very unambiguous, very clear metric to optimize</strong>. The agent does the hill-climbing all by itself.</p>
<h2 id="metaharness">MetaHarness</h2>
<p><a href="https://arxiv.org/abs/2603.28052">Meta-Harness</a> takes this idea and applies it to <strong>model harnesses</strong> — what we used to call scaffolding. A harness is all the logic you wrap around a base model to make it accomplish a task: the reasoning loop, tool use, planning, prompt engineering. Claude Code is a harness, just a very general-purpose one. So is any agent framework you build for a specific purpose.</p>
<p>Meta-Harness is trying to do for harnesses what Autoresearch did for training: <em>can you automatically construct the optimal harness for a given task?</em></p>
<p>The architecture is simple, and mirrors what a human AI engineer does.  A coding agent — Claude Code with Opus 4.6, in their experiments — acts as the <strong>proposer</strong>: it creates a new harness, which gets evaluated on a benchmark. The scores, the harness source code, and crucially all the <strong>execution traces</strong> (prompts, tool calls, model outputs) get stored back to the file system. Then the agent loops back.</p>
<p>There is no complex co-ordination mechanism. It is just the file system, folders full of harness code, benchmark results, and traces. The proposer reads everything from previous iterations via standard tools (grep, cat, ls), does failure analysis on the traces, and proposes something better. There&rsquo;s a minimal domain-specific prompt that tells the agent where to write harnesses and what files it can modify, but beyond that, <strong>no special-purpose programmatic logic</strong> drives the improvement. The general-purpose proposer agent (Claude Code, in this case) is smart enough to poke around the folders and files from previous runs, analyze where it failed, propose improvements, and keep the loop going.</p>
<p>And it works. They tested across multiple domains — text classification, math reasoning (IMO-level problems), and agentic coding (TerminalBench-2) — and the meta-harness loop produced harnesses that beat the strongest handcrafted baselines in each.</p>
<p>This is very bitter-lesson-pilled: throw search and compute at the problem, and you&rsquo;ll outperform bespoke human engineering.</p>
<p>AutoResearch operates on a narrow signal. It only works with the last good <code>train.py</code> (reverting on failure) and one scalar metric. Meta-Harness operates on a <strong>much richer information set</strong>: the source code, evaluation scores, <em>and</em> full execution traces from <em>every</em> previous attempt are preserved and accessible. That richer context gives the proposer far more to work with when diagnosing failures and proposing improvements.</p>
<h2 id="i-did-this-by-hand-and-regretted-it">I Did This By Hand (And Regretted It)</h2>
<p>This resonates for me personally. I recently designed and open-sourced <a href="https://github.com/vivekhaldar/proceda/">Proceda</a>, a harness for automating standard operating procedures into agents, and spent days benchmaxing it on SOP-Bench. My loop looked exactly like Meta-Harness — run the benchmark, look at the score, ask Claude Code to analyze the failure traces, improve the harness, repeat — except I was the one closing the loop manually.</p>
<p>I got to <a href="https://enchiridionlabs.online/sop-bench-results.html">SOTA on SOP-Bench</a> doing this, but at the end I was kicking myself for not setting up an AutoResearch-style automated loop. Which is precisely what Meta-Harness formalizes.</p>
<h2 id="the-takeaway">The Takeaway</h2>
<p>The main thrust of the entire agent field right now is removing humans from agentic loops. <a href="https://github.com/karpathy/autoresearch">AutoResearch</a> and <a href="https://arxiv.org/abs/2603.28052">Meta-Harness</a> are two concrete illustrations of how to do it: define a clear metric, give the agent access to its own history, and let it rip.</p>
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/sPxf47qnj6w?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

]]></content:encoded>
    </item>
    
    <item>
      <title>Surprising a model</title>
      <link>http://vivekhaldar.com/articles/surprising-a-model/</link>
      <pubDate>Mon, 16 Mar 2026 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/surprising-a-model/</guid>
      <description>&lt;p&gt;Back when my kids were little and I was working at Google I was dogfooding an internal Maps or &lt;a href=&#34;https://en.wikipedia.org/wiki/Google_Now&#34;&gt;Google Now&lt;/a&gt; (remember that?) experiment on my Android phone that nudged you to get going for an event that it had inferred you needed to get to—even if it was not explicitly an event on your calendar!&lt;/p&gt;
&lt;p&gt;For me, this was a notification at 5:30 pm on weekdays to get moving to pick up kids from daycare before it closed at 6 pm. It understood this about my life with very high confidence after maybe a week of silent observation.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Back when my kids were little and I was working at Google I was dogfooding an internal Maps or <a href="https://en.wikipedia.org/wiki/Google_Now">Google Now</a> (remember that?) experiment on my Android phone that nudged you to get going for an event that it had inferred you needed to get to—even if it was not explicitly an event on your calendar!</p>
<p>For me, this was a notification at 5:30 pm on weekdays to get moving to pick up kids from daycare before it closed at 6 pm. It understood this about my life with very high confidence after maybe a week of silent observation.</p>
<p>I separately looked up my location history and noticed how much it was like clockwork. A perfect triangle between home, daycare and the office. Clockwise in the morning, counter-clockwise in the evening, in time windows varying by a few minutes.</p>
<p>I remember thinking to myself: the bulk of my life can be captured in—and predicted by—a <a href="https://protobuf.dev/overview/">protobuf</a> that is probably under a kilobyte. On a personal level this gave me a lot of food for thought.</p>
<p>But on a philosophical level it drove home another point: one way to look at agency or free will is the ability to surprise a predictive model.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Your Agent Sessions Are Disappearing</title>
      <link>http://vivekhaldar.com/articles/your-agent-sessions-are-disappearing/</link>
      <pubDate>Mon, 16 Mar 2026 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/your-agent-sessions-are-disappearing/</guid>
      <description>&lt;p&gt;I use Claude Code as my primary interface to my computer. Not just for coding—for everything. Research, writing, system administration, media processing, calendar management. If it can be done from a terminal, Claude Code does it for me.&lt;/p&gt;
&lt;p&gt;This means that a huge amount of my daily work—the conclusions I&amp;rsquo;ve reached, the investigations I&amp;rsquo;ve done, the decisions I&amp;rsquo;ve made—lives scattered across hundreds of agent sessions. And unless I do something about it, all of that just&amp;hellip; disappears. It&amp;rsquo;s the browser history problem all over again.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I use Claude Code as my primary interface to my computer. Not just for coding—for everything. Research, writing, system administration, media processing, calendar management. If it can be done from a terminal, Claude Code does it for me.</p>
<p>This means that a huge amount of my daily work—the conclusions I&rsquo;ve reached, the investigations I&rsquo;ve done, the decisions I&rsquo;ve made—lives scattered across hundreds of agent sessions. And unless I do something about it, all of that just&hellip; disappears. It&rsquo;s the browser history problem all over again.</p>
<h2 id="the-browser-history-problem-redux">The Browser History Problem, Redux</h2>
<p>Browser history has never been good. You visit a page, read something useful, close the tab, and it&rsquo;s gone. You vaguely remember that you saw something relevant three days ago, but good luck finding it.</p>
<p>That&rsquo;s exactly where we are with coding agent sessions right now. Every Claude Code or Codex session is a rich conversation full of context, decisions, and insights. And when you&rsquo;re done, it gets serialized into a JSONL file in a hidden directory and effectively ceases to exist.</p>
<p>I have months of these sessions. They contain things I&rsquo;ve figured out about my own codebase, debugging insights, architectural decisions, research results. It&rsquo;s a gold mine that I can&rsquo;t access.</p>
<h2 id="why-existing-tools-didnt-fit">Why Existing Tools Didn&rsquo;t Fit</h2>
<p>There&rsquo;s no shortage of agent orchestration tools. <a href="https://github.com/cibaca/sculptor">Sculptor</a>, <a href="https://github.com/conductor-is/conductor">Conductor</a>, <a href="https://github.com/smtg-ai/claude-squad">Claude Squad</a>—they&rsquo;re all good projects with thoughtful design choices. But they all share an assumption that doesn&rsquo;t match how I work: <strong>you start by picking a single git repo.</strong></p>
<p>That&rsquo;s not how I use coding agents. My Claude Code sessions start at my home directory. I have a global store of memories, skills, and workflows in <code>~/AGENT</code> that I want applied everywhere, regardless of which repo I&rsquo;m in. And my work routinely spans multiple repositories—a feature implementation might touch three or four small repos that are all connected. The single-repo model is a straitjacket.</p>
<p>The other mismatch is about what I actually need. These tools focus on <strong>orchestration</strong>—spinning up isolated environments, managing concurrent agents, containerizing for security. Those are real concerns. But they&rsquo;re not <em>my</em> concern. What I need is <strong>sense-making</strong>. I need to look back over my last week of agent sessions and understand what happened. I need a high-level timeline that says &ldquo;Monday: debugging the auth flow. Tuesday-Wednesday: refactored the scanner. Thursday: three separate research sessions on MCP servers.&rdquo;</p>
<p>Orchestration is a nice-to-have. Understanding your own history is a must-have.</p>
<h2 id="agent-kitchen">Agent Kitchen</h2>
<p>So I built <a href="https://github.com/vivekhaldar/agent-kitchen">Agent Kitchen</a>. It&rsquo;s a local web dashboard that reads your Claude Code and Codex session history, generates LLM-powered summaries, and presents everything as a browsable, searchable timeline grouped by repository.</p>
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/q3cCpfJ2OgM?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<p>The core workflow is simple. <code>agent-kitchen index</code> scans your sessions and generates summaries (using Claude Haiku via the Agent SDK, so it runs on your Claude Max subscription—no separate API bill). <code>agent-kitchen web</code> serves the dashboard. That&rsquo;s it.</p>
<p>What you get is a reverse-chronological view of every folder and repo you&rsquo;ve worked in, with your sessions grouped and summarized. Each repo group has a timeline at the top—an LLM-generated narrative of what you&rsquo;ve been doing over the past days and weeks. You can click any session to resume it—Agent Kitchen spins up a terminal emulator right there in the browser. You can start new sessions with one click. There&rsquo;s a time slider to filter by recency, fuzzy search, and vim-style keyboard navigation.</p>
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/mD7mWkRUabo?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<h2 id="what-this-is-really-about">What This Is Really About</h2>
<p>Agent Kitchen is a small tool that scratches a specific itch. But the itch points at something bigger.</p>
<p>As coding agents become our primary work interface, <strong>the history of our agent sessions becomes the history of our work.</strong> It&rsquo;s not just conversation logs—it&rsquo;s an institutional record of decisions, investigations, dead ends, and breakthroughs. We&rsquo;re generating this record every day, and right now we&rsquo;re throwing almost all of it away.</p>
<p>Browser history became genuinely useful when someone realized it wasn&rsquo;t just a list of URLs—it was a map of your information-seeking behavior. Agent session history has the same potential. It&rsquo;s not just a list of conversations. It&rsquo;s a searchable, summarizable record of everything you&rsquo;ve figured out.</p>
<p>The tools we build around agent sessions shouldn&rsquo;t just help us run more agents in parallel. They should help us <strong>understand what we&rsquo;ve already done.</strong> That&rsquo;s the harder problem, and the more valuable one.</p>
<h2 id="try-it">Try It</h2>
<p>Agent Kitchen is <a href="https://github.com/vivekhaldar/agent-kitchen">open source</a> and on PyPI. You can run it without installing anything: <code>uvx agent-kitchen web</code>.</p>
<p>One tip: by default, Claude Code <a href="https://code.claude.com/docs/en/settings">deletes sessions older than 30 days</a>. Set <code>cleanupPeriodDays</code> to something large in your <code>~/.claude/settings.json</code> to keep them around. Your old sessions have more value than you think.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>MCP Knife: A CLI Swiss Army Knife for MCP Servers</title>
      <link>http://vivekhaldar.com/articles/mcp-knife-cli-swiss-army-knife-for-mcp-servers/</link>
      <pubDate>Mon, 09 Feb 2026 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/mcp-knife-cli-swiss-army-knife-for-mcp-servers/</guid>
      <description>&lt;p&gt;This single command-line pipeline takes an API, stands up an MCP server for it, reshapes its tools, and generates a full interactive UI — with zero hand-written code:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mcpknife boot --prompt &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Free Dictionary API https://dictionaryapi.dev/&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;  | mcpknife mod --prompt &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Create one tool: given a word, return synonyms and antonyms&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;  | mcpknife ui
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Three stages, composed with Unix pipes. The first reads API docs and generates an MCP server. The second transforms its tools with a natural language prompt. The third generates an interactive web UI. The output is a running MCP app you can use in ChatGPT or any MCP host — built entirely from the command line.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>This single command-line pipeline takes an API, stands up an MCP server for it, reshapes its tools, and generates a full interactive UI — with zero hand-written code:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>mcpknife boot --prompt <span style="color:#e6db74">&#34;Free Dictionary API https://dictionaryapi.dev/&#34;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>  | mcpknife mod --prompt <span style="color:#e6db74">&#34;Create one tool: given a word, return synonyms and antonyms&#34;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>  | mcpknife ui
</span></span></code></pre></div><p>Three stages, composed with Unix pipes. The first reads API docs and generates an MCP server. The second transforms its tools with a natural language prompt. The third generates an interactive web UI. The output is a running MCP app you can use in ChatGPT or any MCP host — built entirely from the command line.</p>
<p><a href="https://github.com/vivekhaldar/mcpknife">MCP Knife</a> is open source (Apache 2.0) and available on npm. If you want to understand how each piece works and what&rsquo;s happening under the hood, keep reading.</p>
<h2 id="three-subcommands-one-pipeline">Three Subcommands, One Pipeline</h2>
<p>MCP Knife has three subcommands, each handling one stage of the journey:</p>
<h3 id="mcpknife-boot"><code>mcpknife boot</code></h3>
<p>Given a natural language prompt and some API documentation, <code>boot</code> stands up an entirely new MCP server. Under the hood, this uses <a href="https://github.com/vivekhaldar/mcpboot">MCP Boot</a>, which works in two phases: at startup, an LLM reads your prompt and API docs, plans which tools to create, and generates JavaScript handler functions for each one. At runtime, those cached handlers execute in a sandboxed Node.js VM — no further LLM calls, no per-invocation costs.</p>
<p>For example:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>mcpknife boot --prompt <span style="color:#e6db74">&#34;Free Dictionary API https://dictionaryapi.dev/&#34;</span>
</span></span></code></pre></div><p>That&rsquo;s it. You now have a running MCP server wrapping the dictionary API.</p>
<h3 id="mcpknife-mod"><code>mcpknife mod</code></h3>
<p>The server from <code>boot</code> might expose more tools than you need, or you might want to reshape them. The <code>mod</code> subcommand transforms tools on an existing MCP server using natural language. It&rsquo;s built on <a href="https://github.com/vivekhaldar/mcpblox">MCP Blox</a>, which acts as a programmable proxy — it intercepts tool definitions, uses an LLM to generate transformation code, and runs that code in a sandbox.</p>
<p>You can rename tools, hide ones you don&rsquo;t want, reformat outputs, or compose multiple upstream tools into a single new synthetic tool. All with a prompt:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>mcpknife mod --prompt <span style="color:#e6db74">&#34;Create one tool: given a word, return its synonyms and antonyms&#34;</span>
</span></span></code></pre></div><h3 id="mcpknife-ui"><code>mcpknife ui</code></h3>
<p>Finally, <code>ui</code> auto-generates an interactive web interface for your MCP server. This is powered by <a href="https://github.com/vivekhaldar/mcp-generative-ui/">MCP Generative UI</a>, a proxy layer that discovers your server&rsquo;s tools and uses an LLM to create self-contained HTML interfaces for each one. It supports both the MCP Apps standard and the OpenAI Apps SDK (for ChatGPT integration).</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>mcpknife ui
</span></span></code></pre></div><p>No prompt needed — the default UI is usually good enough. But if you want to customize, you can pass a styling prompt, or use the built-in <code>_ui_refine</code> tool to iteratively improve the generated UI with natural language feedback.</p>
<h2 id="composability">Composability</h2>
<p>You can compose the above invocations using good old Unix pipes. Each stage reads an upstream server URL from stdin and outputs its own URL to stdout. MCP Knife itself is a lightweight process multiplexer, not a monolith. The OS kernel handles the pipes, signal propagation (Ctrl+C, exit codes) flows cleanly through the chain, and each stage is independently replaceable.</p>
<p>A typical pipeline will start with <code>boot</code>, have a few <code>mod</code>s in the middle, and end with <code>ui</code>.</p>
<p>You can also use each subcommand standalone. Want to add a UI to an existing MCP server? Just run <code>mcpknife ui --upstream &quot;npx some-mcp-server&quot;</code>. Want to reshape tools without changing anything else? Pipe into <code>mcpknife mod</code>. The pieces work together or apart.</p>
<h2 id="live-example-dictionary-synonyms-app">Live Example: Dictionary Synonyms App</h2>
<p>In the full demo video below, I walk through this exact pipeline with the Free Dictionary API. The three-stage pipeline produces an MCP app that takes a word and displays its synonyms and antonyms in a clean, generated UI — no hand-coded frontend.</p>
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%;">
  <iframe src="https://www.youtube.com/embed/y0rvk7GxaH8" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%;" frameborder="0" allowfullscreen></iframe>
</div>
<p>And if the UI isn&rsquo;t quite right? You can refine it. The <code>_ui_refine</code> tool accepts natural language feedback like &ldquo;show synonyms and antonyms in two columns side by side&rdquo; and regenerates the interface. You keep iterating until you&rsquo;re satisfied.</p>
<h2 id="configuration">Configuration</h2>
<p>All the LLM-powered stages need an API key and model specification. Rather than passing these on every command, you can create a <code>~/.mcpkniferc</code> config file:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;provider&#34;</span>: <span style="color:#e6db74">&#34;anthropic&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;model&#34;</span>: <span style="color:#e6db74">&#34;claude-sonnet-4-20250514&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;apiKey&#34;</span>: <span style="color:#e6db74">&#34;sk-ant-...&#34;</span>
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>CLI flags override config, and project-level <code>.mcpkniferc</code> files override the global one.</p>
<h2 id="installation">Installation</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>npm install -g mcpknife
</span></span></code></pre></div><p>Requires Node.js 18+. The repo is open source under the Apache 2.0 license.</p>
<h2 id="underlying-tools">Underlying tools</h2>
<p>MCP Knife is the culmination of three separate tools I built over the past few weeks:</p>
<ul>
<li><a href="https://github.com/vivekhaldar/mcpboot"><strong>MCP Boot</strong></a> — Bootstrap MCP servers from API docs</li>
<li><a href="https://github.com/vivekhaldar/mcpblox"><strong>MCP Blox</strong></a> — Transform and compose MCP server tools</li>
<li><a href="https://github.com/vivekhaldar/mcp-generative-ui/"><strong>MCP Generative UI</strong></a> — Add dynamic UIs to MCP servers</li>
</ul>
<p>Each of these works standalone, but MCP Knife makes them composable in a way that feels natural on the command line. I&rsquo;d love to hear your feedback — try it out, let me know what you build, and open issues on the <a href="https://github.com/vivekhaldar/mcpknife">GitHub repo</a> if you run into anything.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>mcpblox: Transform and Compose MCP Servers with Unix Pipes</title>
      <link>http://vivekhaldar.com/articles/mcpblox-transform-compose-mcp-servers-unix-pipes/</link>
      <pubDate>Tue, 03 Feb 2026 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/mcpblox-transform-compose-mcp-servers-unix-pipes/</guid>
      <description>&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/y0rvk7GxaH8?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

&lt;p&gt;I&amp;rsquo;ve been building and using MCP servers for months now, and a recurring frustration finally pushed me to build something: I kept wanting to &lt;em&gt;reshape&lt;/em&gt; MCP servers without modifying them. Rename a tool. Hide the ones I don&amp;rsquo;t need. Combine two tools into one. Simple transformations that shouldn&amp;rsquo;t require forking a repo or writing adapter code.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/y0rvk7GxaH8?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<p>I&rsquo;ve been building and using MCP servers for months now, and a recurring frustration finally pushed me to build something: I kept wanting to <em>reshape</em> MCP servers without modifying them. Rename a tool. Hide the ones I don&rsquo;t need. Combine two tools into one. Simple transformations that shouldn&rsquo;t require forking a repo or writing adapter code.</p>
<p>So I built <a href="https://github.com/vivekhaldar/mcpblox">mcpblox</a>, a programmable MCP proxy that takes any existing MCP server and a natural language transform prompt, and produces a <em>new</em> MCP server with reshaped tools. It&rsquo;s on npm and Apache 2.0 licensed.</p>
<p>(I really wanted the name &ldquo;mcpipes&rdquo; but it was taken. &ldquo;mcp-lego&rdquo; would have been&hellip; legally interesting.)</p>
<h2 id="the-problem">The Problem</h2>
<p>Most MCP servers are designed for general use. They expose a lot of tools, often with verbose names and schemas that don&rsquo;t quite fit your specific workflow. You end up with tools you don&rsquo;t need cluttering your agent&rsquo;s context, naming conventions that don&rsquo;t match your preferences, and no way to combine multiple upstream tools into the single composite operation you actually want.</p>
<p>The traditional fix is to write a wrapper server by hand. That works, but it&rsquo;s tedious, fragile, and you lose the ability to iterate quickly. What I wanted was something more like the Unix philosophy: small, composable transformations you can chain together.</p>
<h2 id="how-it-works">How It Works</h2>
<p>The core idea is simple. mcpblox sits between your MCP host and an upstream MCP server. At startup, it:</p>
<ol>
<li>Connects to the upstream server and discovers all its tools</li>
<li>Sends your natural language transform prompt plus the tool definitions to an LLM</li>
<li>The LLM produces a structured <em>transform plan</em>&mdash;which tools to rename, modify, hide, or compose into new synthetic tools</li>
<li>For each transform, the LLM generates JavaScript functions that run in a sandboxed <code>vm</code> context</li>
<li>The result is cached, so subsequent startups with the same prompt skip the LLM entirely</li>
</ol>
<p>At runtime, tool calls flow through the transform pipeline. Input arguments get transformed, the upstream tool is called, and the output is transformed before returning to the host. Pass-through tools are proxied directly with zero overhead.</p>
<img src="/img/mcpblox-arch.svg" alt="mcpblox architecture: MCP Host communicates over HTTP with mcpblox, which transforms tool calls and proxies them to the upstream MCP server" style="max-width: 100%;">
<h2 id="a-simple-example">A Simple Example</h2>
<p>Take the <a href="https://github.com/calvernaz/mcp-yfinance">yfinance MCP server</a>&mdash;a great tool for financial data that exposes several tools, all prefixed with <code>yfinance_</code>. To strip that prefix:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>npx mcpblox <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>  --upstream <span style="color:#e6db74">&#34;uvx mcp-server-yfinance&#34;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>  --prompt <span style="color:#e6db74">&#34;Remove the yfinance_ prefix from all tool names&#34;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>  --api-key $ANTHROPIC_API_KEY
</span></span></code></pre></div><p>That&rsquo;s it. You now have a proxy MCP server where <code>yfinance_get_price</code> is just <code>get_price</code>. Point any MCP host at <code>http://localhost:8000/mcp</code> and you&rsquo;re done.</p>
<h2 id="the-real-power-composition-via-unix-pipes">The Real Power: Composition via Unix Pipes</h2>
<p>A single transformation is useful. But the real power comes from chaining them&mdash;just like Unix pipes.</p>
<p>When mcpblox detects its stdout is a pipe, it binds to an OS-assigned port and writes its URL to stdout. The next mcpblox instance reads that URL from stdin as its upstream. No explicit <code>--upstream</code> flag needed.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>mcpblox --upstream <span style="color:#e6db74">&#34;uvx mcp-server-yfinance&#34;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --prompt <span style="color:#e6db74">&#34;Remove the yfinance_ prefix from all tool names&#34;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>  | mcpblox <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --prompt <span style="color:#e6db74">&#34;Create a new tool called compare_stocks that takes two tickers and returns price, market cap, and 52-week range for both&#34;</span>
</span></span></code></pre></div><p>The first stage strips the prefix. The second stage <em>creates an entirely new synthetic tool</em> that composes multiple upstream calls. Each stage is cached independently&mdash;change the second prompt and only the second stage regenerates.</p>
<p>This lets you build up elaborate transformations from simple, understandable steps. The composition model is the same one that makes Unix powerful: complex behavior from simple, composable parts.</p>
<h2 id="synthetic-tools">Synthetic Tools</h2>
<p>This is where things get interesting. The <code>--prompt</code> isn&rsquo;t limited to renaming or hiding. You can ask mcpblox to create entirely new tools that orchestrate multiple upstream tool calls.</p>
<p>For example, a prompt like:</p>
<blockquote>
<p>Create a tool called <code>get_period_returns</code> that calls <code>get_price_history</code> for 1-month, 3-month, 6-month, and 12-month periods, and returns calculated returns for a given ticker.</p></blockquote>
<p>This generates a synthetic tool with its own schema and an orchestration function that calls the upstream tool multiple times, aggregates the results, and returns a clean response&mdash;all from a single natural language description.</p>
<h2 id="slap-a-ui-on-it">Slap a UI on It</h2>
<p>In my <a href="https://youtu.be/gOrC__LuLbY">previous work on generative UI for MCP</a>, I made <a href="https://github.com/vivekhaldar/mcp-generative-ui/">mcp-generative-ui</a> pipe-friendly too, so you can cap off a pipeline with a UI:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>mcpblox --upstream <span style="color:#e6db74">&#34;uvx mcp-server-yfinance&#34;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --prompt <span style="color:#e6db74">&#34;Remove yfinance_ prefix&#34;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>  | mcpblox <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>    --prompt <span style="color:#e6db74">&#34;Create compare_stocks tool; hide all tools except compare_stocks and get_price_history&#34;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span><span style="color:#ae81ff"></span>  | mcp-gen-ui
</span></span></code></pre></div><p>The result: a base MCP server, transformed and composed through two pipeline stages, with a generated interactive UI on top. The compare_stocks tool renders a graphical comparison instead of raw JSON. All from a shell one-liner with good old Unix pipes.</p>
<h2 id="try-it">Try It</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>npx mcpblox --help
</span></span></code></pre></div><p>The <a href="https://github.com/vivekhaldar/mcpblox">repo</a> is open and Apache 2.0 licensed. I&rsquo;d love to hear what transformations and compositions you come up with.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>The Three Abstractions That Make AI Agents Real</title>
      <link>http://vivekhaldar.com/articles/the-three-abstractions-that-make-ai-agents-real/</link>
      <pubDate>Sat, 31 Jan 2026 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-three-abstractions-that-make-ai-agents-real/</guid>
      <description>&lt;p&gt;Over the last few months, a number of abstractions have shipped from model vendors that help you build systems on top of LLMs&amp;mdash;specifically, agents that automate end-to-end workflows. Individually, each abstraction solves a specific problem. But what&amp;rsquo;s coming into focus now is how they &lt;em&gt;click together&lt;/em&gt; to enable something much larger: agents that can execute long, multi-step business processes from start to finish.&lt;/p&gt;
&lt;p&gt;I want to lay out how I see these pieces fitting together. But first, a crucial distinction.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Over the last few months, a number of abstractions have shipped from model vendors that help you build systems on top of LLMs&mdash;specifically, agents that automate end-to-end workflows. Individually, each abstraction solves a specific problem. But what&rsquo;s coming into focus now is how they <em>click together</em> to enable something much larger: agents that can execute long, multi-step business processes from start to finish.</p>
<p>I want to lay out how I see these pieces fitting together. But first, a crucial distinction.</p>
<p>For each of these capabilities, there are multiple competing standards and implementations. It&rsquo;s important to separate the <em>abstract idea</em> (what capability does this provide?) from the <em>concrete standard</em> (which protocol or standard implements it?). The abstract ideas are what matter for architectural thinking. The concrete implementations will evolve and compete.</p>
<p>Here are the three key abstractions:</p>
<h2 id="1-mcp-standardized-access-to-data-and-apis">1. MCP: Standardized Access to Data and APIs</h2>
<p>The first foundational abstraction is <a href="https://modelcontextprotocol.io/">MCP</a> (Model Context Protocol). Its key function: standardize how models and agents access data and APIs, without building a forest of bespoke integrations.</p>
<p>Before MCP, every agent needed custom code to talk to every data source. MCP gives you a standard interface&mdash;a universal adapter between agents and the world&rsquo;s APIs and databases. It&rsquo;s been widely adopted and is, by now, <a href="https://youtu.be/LrZAzQatogQ">a proven success</a>.</p>
<h2 id="2-skills-encoding-domain-knowledge-for-agents">2. Skills: Encoding Domain Knowledge for Agents</h2>
<p>The second abstraction is <a href="https://youtu.be/dy07zXpwfJ8"><em>skills</em></a>. At a high level, skills let you encode instructions, SOPs (standard operating procedures), or domain knowledge in a form that agents can access and follow.</p>
<p>This is critical because not every agent task should involve dynamic planning from scratch. Many workflows are already well-understood. You <em>know</em> the right sequence of steps. You don&rsquo;t want the agent to improvise&mdash;you want it to execute a known procedure reliably.</p>
<p>Skills are the abstraction that captures this. (For a deeper dive into how skills, commands, and sub-agents relate in practice, see <a href="https://youtu.be/mVHB9rYOri0">this breakdown</a>.) And importantly, skills can <em>use</em> MCPs to access data and APIs, but do so at a higher level of abstraction. For example, a skill might say: &ldquo;Get the last 30 days of sales for Product X.&rdquo; That&rsquo;s a high-level, abstract instruction. Underneath, it gets translated into: which database, which table, which columns, what SQL query&mdash;and eventually, an MCP call that sits between the agent and your database.</p>
<p>The separation of concerns is clean: skills encode the <em>what</em>, MCPs handle the <em>how</em>.</p>
<h2 id="3-generative-ui-the-last-mile-for-humans">3. Generative UI: The Last Mile for Humans</h2>
<p>The third and most recent abstraction is putting UIs on top of agents. There are a couple of <a href="https://youtu.be/gOrC__LuLbY">competing standards</a> here&mdash;<a href="https://youtu.be/cxszN4J6INw">OpenAI&rsquo;s Apps SDK</a> and <a href="https://youtu.be/LXcSmb5G8b8">MCP Apps</a> (an extension of MCP supported by multiple vendors)&mdash;but the abstract capability is the same: AI agents or MCP servers can now serve up a UI, not just text or tool responses.</p>
<p><strong>UI is a last-mile problem.</strong> Agents themselves are far more effective working through APIs, MCPs, and command-line interfaces. UI exists for <em>humans</em>&mdash;to consume the final output of an agent&rsquo;s work. And if UI is just the last-mile output for human consumption, then a necessary implication is that <strong><a href="https://youtu.be/WtSwXaTNJkM">UI must be generative</a></strong>.</p>
<p>Think about it: if an agent executes a bespoke query or a multi-step skill, the result contains a unique mix of personal data, query-dependent information, and even query-independent signals (like PageRank was for Google search results). A static, pre-designed UI can&rsquo;t anticipate this. The UI needs to be generated dynamically to fit the specific intent in the user&rsquo;s request.</p>
<p>This is analogous to how search results pages or LLM chat interfaces work&mdash;every response is different, and the presentation adapts to the content. Handcrafted, static UIs designed ahead of time simply don&rsquo;t work when the output is this dynamic.</p>
<h2 id="how-they-click-together">How They Click Together</h2>
<p>Here&rsquo;s the full picture:</p>
<ol>
<li><strong>Skills</strong> encode the workflow&mdash;the high-level instructions and domain knowledge.</li>
<li><strong>MCP</strong> provides standardized access to the data and APIs that skills need.</li>
<li><strong>Generative UI</strong> renders the final output for human consumption.</li>
</ol>
<p>A concrete example: An agent executes a skill that says &ldquo;Get last 30 days of sales for Product X.&rdquo; The skill translates this into MCP calls to query the right database. The results come back, and an MCP App generates a UI&mdash;maybe a chart, a summary table, and some key insights&mdash;tailored to this specific result.</p>
<p>Each of these abstractions was a missing piece that, until recently, you had to cobble together from scratch. Now they exist as standardized capabilities. Together they enable agents that can execute real, end-to-end business processes.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Confessions of an AI Hype-Bro</title>
      <link>http://vivekhaldar.com/articles/confessions-of-an-ai-hype-bro/</link>
      <pubDate>Wed, 28 Jan 2026 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/confessions-of-an-ai-hype-bro/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been described as an AI-hype-bro. It&amp;rsquo;s probably fair. The month ChatGPT came out I was mesmerized by it, and it was all I could talk about over lunch with colleagues. I hard-pivoted my career to working on the LLM app layer. I was fortunate enough to find a role on a team working on that and join them. I was at Google at the time. But then I left and jumped into the world of startups, joining a company building AI agents for enterprises. I jumped into AI, and all in all, it was good for my career. Browse through the archives here and you&amp;rsquo;ll find post after post of me exhorting software engineers to not dismiss AI, to adapt, adopt and learn.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I&rsquo;ve been described as an AI-hype-bro. It&rsquo;s probably fair. The month ChatGPT came out I was mesmerized by it, and it was all I could talk about over lunch with colleagues. I hard-pivoted my career to working on the LLM app layer. I was fortunate enough to find a role on a team working on that and join them. I was at Google at the time. But then I left and jumped into the world of startups, joining a company building AI agents for enterprises. I jumped into AI, and all in all, it was good for my career. Browse through the archives here and you&rsquo;ll find post after post of me exhorting software engineers to not dismiss AI, to adapt, adopt and learn.</p>
<p>BUT&hellip; I have to acknowledge the valley of despair and darkness I went through, and that many software engineers are going through now. A lot of those feelings are manifesting in the anti-AI sentiment that now is a common strain. &ldquo;My handwritten code is better.&rdquo; &ldquo;AI code is slop&rdquo;. &ldquo;It is a slot machine&rdquo;.</p>
<p>When ChatGPT came out I had been a professional software engineer for more than two decades. I had built up an entire identity around my competence at it. Even with the models back then, I could see how LLMs would eventually eat the act of writing software. I was beginning to understand how the Luddites felt. Livelihood, competence, identity all endangered. In old posts and videos of mine, you&rsquo;ll see me torn between the melancholy of letting go of that identity, and the excitement of the fuzzy uncertain future being shaped by these new tools.</p>
<p>Software engineering was always a field where change was constant, and learning to keep up with new tools, languages and techniques was a core part of the job. We went from programming for individual computers, to networked computers, to mobile devices. We learned and adapted and stayed competent. But all that change had a human pace to it. Each of these waves took the better part of a decade or more to play out and for the job market to shift accordingly. For example: one could build a long, stable career as a Java programmer in an uninterrupted line since the early 2000s, keeping up with the trickle of new language and library features, and major language updates every few years.</p>
<p>With AI, that human pace of change is a thing of the past. If your expectations for model and harness capabilities are anchored to 4 months ago, you&rsquo;re already out of date. It feels like there is never any stable ground to stand up. Like the Red Queen said, &ldquo;it takes all the running you can do, to keep in the same place; if you want to get somewhere else, you must run at least twice as fast as that!&rdquo; There are no best practices, no university courses, no anchors. You need to stay terminally online or follow a few key folks (Simon Willison, Geoff Huntley, Steve Yegge, among others) to understand how best to wield AI.</p>
<p>I acknowledge this&ndash; the uncertainty, the impossible pace, the threat to livelihood&ndash; is ultimately stressful, and often demoralizing and dejecting. All the life scripts and paths we were given are being torn up, and the new ones are not in place yet.</p>
<p>At the same time, the bitter truth in my opinion is that there is no return. I&rsquo;ve been hiring software engineers, both at big-tech and startups, for a decade. Today, if I interviewed a candidate for a SWE role and they told me they were skeptical of using AI tools for programming, that would be the same level of red flag as someone in 2020 saying they don&rsquo;t like IDEs and write their code in notepad. Is it possible they are a great software engineer? Yes, I&rsquo;d keep an open mind. But it would still be a giant red flag. Also round the corner for eng managers lies the issue of handling perf with the increasing divergence between AI-maxing-SWEs and AI-skeptic-SWEs.</p>
<p>I&rsquo;m writing all this to acknowledge that behind all the excitement, promise and hype of AI ushering in a golden new age, the on-the-ground reality of a lot of software engineers is difficult right now. What helped me through it was learning and embracing these tools and getting them to do my bidding. I realized that my deeper skills as an experienced software engineer &ndash; specification, design, discernment, taste, judgment, review, systems level thinking, architecture &ndash; are exactly what enables me to wield them as amplifiers.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Subagents, Commands and Skills Are Converging</title>
      <link>http://vivekhaldar.com/articles/claude-code-subagents-commands-skills-converging/</link>
      <pubDate>Sat, 10 Jan 2026 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/claude-code-subagents-commands-skills-converging/</guid>
      <description>&lt;p&gt;Claude Code has been shipping at a blistering pace. But buried in the recent 2.1.x releases is a fundamental shift in how the tool thinks about extensibility. The changes to skills, slash commands, and subagents might look incremental, but they&amp;rsquo;re pointing toward something bigger: these three abstractions are merging into one.&lt;/p&gt;
&lt;p&gt;Let me explain what&amp;rsquo;s happening and where I think this is headed.&lt;/p&gt;
&lt;h2 id=&#34;the-three-abstractions-and-why-they-exist&#34;&gt;The Three Abstractions (And Why They Exist)&lt;/h2&gt;
&lt;p&gt;Claude Code currently has three different ways to extend its capabilities. Each came about at different times, solving different problems.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Claude Code has been shipping at a blistering pace. But buried in the recent 2.1.x releases is a fundamental shift in how the tool thinks about extensibility. The changes to skills, slash commands, and subagents might look incremental, but they&rsquo;re pointing toward something bigger: these three abstractions are merging into one.</p>
<p>Let me explain what&rsquo;s happening and where I think this is headed.</p>
<h2 id="the-three-abstractions-and-why-they-exist">The Three Abstractions (And Why They Exist)</h2>
<p>Claude Code currently has three different ways to extend its capabilities. Each came about at different times, solving different problems.</p>
<p><a href="https://code.claude.com/docs/en/slash-commands"><strong>Slash Commands</strong></a> are the simplest. You have a prompt you use often. Instead of typing it every time, you save it to a file and invoke it with <code>/command-name</code>. That&rsquo;s it. A saved prompt with a shortcut.</p>
<p><a href="https://code.claude.com/docs/en/skills"><strong>Skills</strong></a> evolved from slash commands. The key difference: a skill isn&rsquo;t just a markdown file—it&rsquo;s a <em>folder</em>. That folder contains your prompt (<code>skill.md</code>) plus supporting resources: code snippets, HTML templates, whatever the skill needs. This lets you build capabilities that go beyond text, like parsing PDFs or generating Word documents.</p>
<p><a href="https://code.claude.com/docs/en/sub-agents"><strong>Subagents</strong></a> do two things. First, they let you define a <em>persona</em>: &ldquo;You are an expert code reviewer. Here&rsquo;s how you do reviews.&rdquo; Second—and this is the important part—they run in their own context window. They don&rsquo;t fill up your main conversation.</p>
<p>Here&rsquo;s how invocation used to work:</p>
<ul>
<li>Slash commands: <strong>Explicit</strong>. You type <code>/command</code> and it runs.</li>
<li>Skills: <strong>Auto-discovered</strong>. The model sees your intent, checks its skills folder, and pulls in relevant ones. Only the name and description load initially—the full skill loads on-demand.</li>
<li>Subagents: Run in their own context window, spawned when needed.</li>
</ul>
<p>But reading the above you can probably already see the cracks appearing. Even though each abstraction had a good reason to exist at the time it was introduced, now that you have all three it makes choosing one not entirely straightforward. If you want to give the model a new capability there is a fair bit of head-scratching involved. Which abstraction best fits what I want to do? They all overlap with each other to some extent.</p>
<h2 id="what-changed">What Changed</h2>
<p>The recent releases blur all these lines.</p>
<p><strong>Skills can be invoked as slash commands.</strong> Skills now appear in the <code>/</code> menu. You can explicitly invoke them. They still auto-discover, but explicit invocation is now an option. The physical difference in how skills and commands were invoked is now gone.</p>
<p><strong>Skills can run in their own context.</strong> A new front matter field, <code>context: fork</code>, lets a skill run as a subagent—in its own context window. This was subagents&rsquo; whole reason for existing.</p>
<p><strong>Skills can declare agent dependencies.</strong> The <code>agent</code> field in skill front matter lets you specify which agents (explore, plan, etc.) a skill can use. The semantics here are honestly confusing. I can&rsquo;t wrap my ahead around what it means for a skill to use a generic agent like &ldquo;plan&rdquo;.</p>
<p>These changes take three abstractions that already overlapped and brings them much closer together. I&rsquo;d be surprised if all three didn&rsquo;t collapse into one neat, easy-to-understand abstraction soon.</p>
<h2 id="a-unified-abstraction">A Unified Abstraction</h2>
<p>What could that unified abstraction look like?</p>
<p>These three abstractions conflate two orthogonal concerns:</p>
<p><strong>Concern 1: How to encode knowledge.</strong></p>
<p>There are two types of knowledge:</p>
<ul>
<li>
<p><em>Conceptual knowledge</em>: Abstract domain expertise. &ldquo;You are a security engineer. Here&rsquo;s what great security engineers look for.&rdquo; This is persona-style knowledge—the stuff you&rsquo;d put in a subagent.</p>
</li>
<li>
<p><em>Procedural knowledge</em>: Step-by-step processes. SOPs. Code snippets that manipulate PDFs. Scripts that generate documents. This is what skills are good at.</p>
</li>
</ul>
<p><strong>Concern 2: Where to execute.</strong></p>
<p>Do you run in the main context window, or fork into your own? This used to be a subagent-only feature. Now skills can do it too.</p>
<p>When you mix orthogonal concerns into the same abstractions, you get the muddy situation we have now.</p>
<h2 id="where-this-is-headed">Where This Is Headed</h2>
<p>The folks at Anthropic are probably already thinking along these lines. The <a href="https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md">changelog</a> hints suggest they are. Here&rsquo;s what I think the endgame looks like:</p>
<p><strong>One abstraction: Skills.</strong></p>
<p>Skills are already a superset of the other two:</p>
<ul>
<li>They can contain just a markdown prompt (like a command)</li>
<li>They can contain resources (their original purpose)</li>
<li>They can encode personas (conceptual knowledge)</li>
<li>They can run in their own context (like subagents)</li>
</ul>
<p><strong>One switch: Context mode.</strong></p>
<p>A simple front matter field: <code>context: main</code> or <code>context: fork</code>. That&rsquo;s it. You decide whether your skill runs in the main conversation or gets its own context window.</p>
<p><strong>Composition through references.</strong></p>
<p>Skills can reference other skills. This is already possible and works naturally with auto-discovery. A skill referencing another is just an emphasized hint—&ldquo;when running this, keep these other skills in mind.&rdquo;</p>
<p><strong>Invocation becomes uniform.</strong></p>
<p>Everything is <code>/skill-name</code>. Auto-discovery still works for capabilities the model decides to pull in. No mental overhead about &ldquo;is this a command or a skill?&rdquo;</p>
<h2 id="the-simplified-model">The Simplified Model</h2>



<div class="goat svg-container ">
  
    <svg
      xmlns="http://www.w3.org/2000/svg"
      font-family="Menlo,Lucida Console,monospace"
      
        viewBox="0 0 544 105"
      >
      <g transform='translate(8,16)'>
<text text-anchor='middle' x='0' y='4' fill='currentColor' style='font-size:1em'>S</text>
<text text-anchor='middle' x='0' y='20' fill='currentColor' style='font-size:1em'>├</text>
<text text-anchor='middle' x='0' y='36' fill='currentColor' style='font-size:1em'>├</text>
<text text-anchor='middle' x='0' y='52' fill='currentColor' style='font-size:1em'>├</text>
<text text-anchor='middle' x='0' y='68' fill='currentColor' style='font-size:1em'>├</text>
<text text-anchor='middle' x='0' y='84' fill='currentColor' style='font-size:1em'>└</text>
<text text-anchor='middle' x='8' y='4' fill='currentColor' style='font-size:1em'>k</text>
<text text-anchor='middle' x='8' y='20' fill='currentColor' style='font-size:1em'>─</text>
<text text-anchor='middle' x='8' y='36' fill='currentColor' style='font-size:1em'>─</text>
<text text-anchor='middle' x='8' y='52' fill='currentColor' style='font-size:1em'>─</text>
<text text-anchor='middle' x='8' y='68' fill='currentColor' style='font-size:1em'>─</text>
<text text-anchor='middle' x='8' y='84' fill='currentColor' style='font-size:1em'>─</text>
<text text-anchor='middle' x='16' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='16' y='20' fill='currentColor' style='font-size:1em'>─</text>
<text text-anchor='middle' x='16' y='36' fill='currentColor' style='font-size:1em'>─</text>
<text text-anchor='middle' x='16' y='52' fill='currentColor' style='font-size:1em'>─</text>
<text text-anchor='middle' x='16' y='68' fill='currentColor' style='font-size:1em'>─</text>
<text text-anchor='middle' x='16' y='84' fill='currentColor' style='font-size:1em'>─</text>
<text text-anchor='middle' x='24' y='4' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='32' y='4' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='32' y='20' fill='currentColor' style='font-size:1em'>P</text>
<text text-anchor='middle' x='32' y='36' fill='currentColor' style='font-size:1em'>K</text>
<text text-anchor='middle' x='32' y='52' fill='currentColor' style='font-size:1em'>C</text>
<text text-anchor='middle' x='32' y='68' fill='currentColor' style='font-size:1em'>C</text>
<text text-anchor='middle' x='32' y='84' fill='currentColor' style='font-size:1em'>I</text>
<text text-anchor='middle' x='40' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='40' y='20' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='40' y='36' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='40' y='52' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='40' y='68' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='40' y='84' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='48' y='20' fill='currentColor' style='font-size:1em'>y</text>
<text text-anchor='middle' x='48' y='36' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='48' y='52' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='48' y='68' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='48' y='84' fill='currentColor' style='font-size:1em'>v</text>
<text text-anchor='middle' x='56' y='20' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='56' y='36' fill='currentColor' style='font-size:1em'>w</text>
<text text-anchor='middle' x='56' y='52' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='56' y='68' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='56' y='84' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='64' y='4' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='64' y='20' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='64' y='36' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='64' y='52' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='64' y='68' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='64' y='84' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='72' y='4' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='72' y='20' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='72' y='36' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='72' y='52' fill='currentColor' style='font-size:1em'>x</text>
<text text-anchor='middle' x='72' y='68' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='72' y='84' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='80' y='4' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='80' y='20' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='80' y='36' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='80' y='52' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='80' y='68' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='80' y='84' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='88' y='20' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='88' y='36' fill='currentColor' style='font-size:1em'>g</text>
<text text-anchor='middle' x='88' y='52' fill='currentColor' style='font-size:1em'>:</text>
<text text-anchor='middle' x='88' y='68' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='88' y='84' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='96' y='4' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='96' y='20' fill='currentColor' style='font-size:1em'>:</text>
<text text-anchor='middle' x='96' y='36' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='96' y='68' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='96' y='84' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='104' y='4' fill='currentColor' style='font-size:1em'>b</text>
<text text-anchor='middle' x='104' y='36' fill='currentColor' style='font-size:1em'>:</text>
<text text-anchor='middle' x='104' y='52' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='104' y='68' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='104' y='84' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='112' y='4' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='112' y='20' fill='currentColor' style='font-size:1em'>F</text>
<text text-anchor='middle' x='112' y='52' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='112' y='68' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='112' y='84' fill='currentColor' style='font-size:1em'>:</text>
<text text-anchor='middle' x='120' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='120' y='20' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='120' y='36' fill='currentColor' style='font-size:1em'>C</text>
<text text-anchor='middle' x='120' y='52' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='120' y='68' fill='currentColor' style='font-size:1em'>:</text>
<text text-anchor='middle' x='128' y='4' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='128' y='20' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='128' y='36' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='128' y='52' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='128' y='84' fill='currentColor' style='font-size:1em'>/</text>
<text text-anchor='middle' x='136' y='4' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='136' y='20' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='136' y='36' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='136' y='68' fill='currentColor' style='font-size:1em'>R</text>
<text text-anchor='middle' x='136' y='84' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='144' y='4' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='144' y='20' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='144' y='36' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='144' y='52' fill='currentColor' style='font-size:1em'>(</text>
<text text-anchor='middle' x='144' y='68' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='144' y='84' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='152' y='4' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='152' y='20' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='152' y='36' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='152' y='52' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='152' y='68' fill='currentColor' style='font-size:1em'>f</text>
<text text-anchor='middle' x='152' y='84' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='160' y='4' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='160' y='36' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='160' y='52' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='160' y='68' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='160' y='84' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='168' y='4' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='168' y='20' fill='currentColor' style='font-size:1em'>w</text>
<text text-anchor='middle' x='168' y='36' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='168' y='52' fill='currentColor' style='font-size:1em'>f</text>
<text text-anchor='middle' x='168' y='68' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='176' y='4' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='176' y='20' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='176' y='36' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='176' y='52' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='176' y='68' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='176' y='84' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='184' y='4' fill='currentColor' style='font-size:1em'>)</text>
<text text-anchor='middle' x='184' y='20' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='184' y='36' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='184' y='52' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='184' y='68' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='184' y='84' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='192' y='20' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='192' y='36' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='192' y='52' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='192' y='68' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='200' y='52' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='200' y='68' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='200' y='84' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='208' y='20' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='208' y='36' fill='currentColor' style='font-size:1em'>O</text>
<text text-anchor='middle' x='208' y='52' fill='currentColor' style='font-size:1em'>)</text>
<text text-anchor='middle' x='208' y='84' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='216' y='20' fill='currentColor' style='font-size:1em'>k</text>
<text text-anchor='middle' x='216' y='36' fill='currentColor' style='font-size:1em'>R</text>
<text text-anchor='middle' x='216' y='68' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='216' y='84' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='224' y='20' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='224' y='52' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='224' y='68' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='224' y='84' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='232' y='20' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='232' y='36' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='232' y='52' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='232' y='68' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='232' y='84' fill='currentColor' style='font-size:1em'>-</text>
<text text-anchor='middle' x='240' y='20' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='240' y='36' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='240' y='68' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='240' y='84' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='248' y='20' fill='currentColor' style='font-size:1em'>.</text>
<text text-anchor='middle' x='248' y='36' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='248' y='52' fill='currentColor' style='font-size:1em'>f</text>
<text text-anchor='middle' x='248' y='68' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='248' y='84' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='256' y='20' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='256' y='36' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='256' y='52' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='256' y='84' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='264' y='20' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='264' y='36' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='264' y='52' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='264' y='68' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='264' y='84' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='272' y='36' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='272' y='52' fill='currentColor' style='font-size:1em'>k</text>
<text text-anchor='middle' x='272' y='68' fill='currentColor' style='font-size:1em'>k</text>
<text text-anchor='middle' x='272' y='84' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='280' y='20' fill='currentColor' style='font-size:1em'>+</text>
<text text-anchor='middle' x='280' y='36' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='280' y='68' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='280' y='84' fill='currentColor' style='font-size:1em'>v</text>
<text text-anchor='middle' x='288' y='36' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='288' y='52' fill='currentColor' style='font-size:1em'>(</text>
<text text-anchor='middle' x='288' y='68' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='288' y='84' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='296' y='20' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='296' y='36' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='296' y='52' fill='currentColor' style='font-size:1em'>f</text>
<text text-anchor='middle' x='296' y='68' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='296' y='84' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='304' y='20' fill='currentColor' style='font-size:1em'>p</text>
<text text-anchor='middle' x='304' y='36' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='304' y='52' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='304' y='68' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='304' y='84' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='312' y='20' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='312' y='52' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='312' y='84' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='320' y='20' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='320' y='36' fill='currentColor' style='font-size:1em'>(</text>
<text text-anchor='middle' x='320' y='52' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='320' y='68' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='328' y='20' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='328' y='36' fill='currentColor' style='font-size:1em'>j</text>
<text text-anchor='middle' x='328' y='52' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='328' y='68' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='336' y='20' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='336' y='36' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='344' y='20' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='344' y='36' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='344' y='52' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='344' y='68' fill='currentColor' style='font-size:1em'>f</text>
<text text-anchor='middle' x='352' y='20' fill='currentColor' style='font-size:1em'>l</text>
<text text-anchor='middle' x='352' y='36' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='352' y='52' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='352' y='68' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='360' y='52' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='360' y='68' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='368' y='20' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='368' y='36' fill='currentColor' style='font-size:1em'>w</text>
<text text-anchor='middle' x='368' y='52' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='368' y='68' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='376' y='20' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='376' y='36' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='376' y='52' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='376' y='68' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='384' y='20' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='384' y='36' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='384' y='52' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='392' y='20' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='392' y='36' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='392' y='68' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='400' y='20' fill='currentColor' style='font-size:1em'>u</text>
<text text-anchor='middle' x='400' y='36' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='400' y='52' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='400' y='68' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='408' y='20' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='408' y='52' fill='currentColor' style='font-size:1em'>w</text>
<text text-anchor='middle' x='408' y='68' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='416' y='20' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='416' y='36' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='416' y='52' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='416' y='68' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='424' y='20' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='424' y='36' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='424' y='52' fill='currentColor' style='font-size:1em'>t</text>
<text text-anchor='middle' x='424' y='68' fill='currentColor' style='font-size:1em'>e</text>
<text text-anchor='middle' x='432' y='20' fill='currentColor' style='font-size:1em'>s</text>
<text text-anchor='middle' x='432' y='52' fill='currentColor' style='font-size:1em'>c</text>
<text text-anchor='middle' x='432' y='68' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='440' y='36' fill='currentColor' style='font-size:1em'>i</text>
<text text-anchor='middle' x='440' y='52' fill='currentColor' style='font-size:1em'>h</text>
<text text-anchor='middle' x='448' y='36' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='448' y='52' fill='currentColor' style='font-size:1em'>)</text>
<text text-anchor='middle' x='464' y='36' fill='currentColor' style='font-size:1em'>m</text>
<text text-anchor='middle' x='472' y='36' fill='currentColor' style='font-size:1em'>a</text>
<text text-anchor='middle' x='480' y='36' fill='currentColor' style='font-size:1em'>r</text>
<text text-anchor='middle' x='488' y='36' fill='currentColor' style='font-size:1em'>k</text>
<text text-anchor='middle' x='496' y='36' fill='currentColor' style='font-size:1em'>d</text>
<text text-anchor='middle' x='504' y='36' fill='currentColor' style='font-size:1em'>o</text>
<text text-anchor='middle' x='512' y='36' fill='currentColor' style='font-size:1em'>w</text>
<text text-anchor='middle' x='520' y='36' fill='currentColor' style='font-size:1em'>n</text>
<text text-anchor='middle' x='528' y='36' fill='currentColor' style='font-size:1em'>)</text>
</g>

    </svg>
  
</div>
<p>That&rsquo;s it. One primitive. One switch for context behavior. Composition through references. Uniform invocation.</p>
<p>Everything else—the distinction between commands and skills, the separate concept of subagents—becomes unnecessary.</p>
<h2 id="why-this-matters">Why This Matters</h2>
<p>If you&rsquo;re building workflows with Claude Code today, you&rsquo;re navigating three overlapping abstractions with unclear boundaries. Do you make this a command or a skill? Should it be a subagent? The decision tree is more confusing than it needs to be.</p>
<p>A unified model means one question: &ldquo;What knowledge am I encoding?&rdquo; Write it as a skill. If it needs its own context, flip the switch in YAML frontmatter.</p>
<p>I hope we see this simplification in the next few releases. The changes in 2.1.x are clearly headed this direction.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>The Birth of a New Platform</title>
      <link>http://vivekhaldar.com/articles/birth-of-a-new-platform/</link>
      <pubDate>Wed, 24 Dec 2025 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/birth-of-a-new-platform/</guid>
      <description>&lt;p&gt;It&amp;rsquo;s not often that we see the birth of a new platform. We&amp;rsquo;re seeing one right now, with an app store for the AI age being built from scratch right before our eyes. OpenAI recently announced that &lt;a href=&#34;https://openai.com/index/developers-can-now-submit-apps-to-chatgpt/&#34;&gt;developers can now submit apps to ChatGPT&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;When that happens, it&amp;rsquo;s worth understanding the mechanics of it. With that in mind, I went through building a very simple app and getting it to run and render inside ChatGPT:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>It&rsquo;s not often that we see the birth of a new platform. We&rsquo;re seeing one right now, with an app store for the AI age being built from scratch right before our eyes. OpenAI recently announced that <a href="https://openai.com/index/developers-can-now-submit-apps-to-chatgpt/">developers can now submit apps to ChatGPT</a>.</p>
<p>When that happens, it&rsquo;s worth understanding the mechanics of it. With that in mind, I went through building a very simple app and getting it to run and render inside ChatGPT:</p>
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/cxszN4J6INw?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<p>Some observations:</p>
<p><strong>These are very early days</strong>, in every sense: specs, tooling, patterns, and monetization. It really does feel similar to the early days of the iOS App Store. It isn&rsquo;t clear yet what kind of apps will feel at home on this new platform.</p>
<p><strong>Specs.</strong> OpenAI has simply made up its <a href="https://developers.openai.com/apps-sdk/quickstart">own conventions on top of the Model Context Protocol (MCP)</a>. Meanwhile, Anthropic has a <a href="https://blog.modelcontextprotocol.io/posts/2025-11-21-mcp-apps/">proposed extension to MCP</a> that is currently in the <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/pull/1865">early stages of community feedback</a>.</p>
<p><strong>Tooling.</strong> There isn&rsquo;t any. Other than whatever exists to write a Python or TypeScript server, or more specifically, an <a href="https://modelcontextprotocol.io/">MCP</a> server. Developers need to ensure they&rsquo;re conforming to the OpenAI-specific conventions that the MCP server must obey (e.g., serving <code>ui://...</code> resources) that will make it a valid app in ChatGPT.</p>
<p>There isn&rsquo;t even good (or any) tooling to test and iterate on your app server. Anthropic&rsquo;s <a href="https://github.com/modelcontextprotocol/inspector">MCP Inspector</a> will let you introspect and execute a generic MCP server. <a href="https://github.com/MCPJam/inspector">MCPJam</a> claims to have an MCP inspector with support for ChatGPT apps, but I couldn&rsquo;t get it working. I had to vibe-code <a href="https://github.com/vivekhaldar/chatgpt-app-tester">a simple &ldquo;emulator&rdquo; to render ChatGPT apps locally</a>. OpenAI&rsquo;s recommended process is to turn on &ldquo;developer mode&rdquo; on your real ChatGPT account (which is possible only on paid plans!) and tunnel your local MCP server into it. I&rsquo;ll be polite and say that is&hellip; not ideal.</p>
<p><strong>Monetization.</strong> No official word yet from OpenAI, other than indirect monetization via distribution or transactions due to traffic coming from ChatGPT.</p>
<p>But in spite of all these shortcomings, I&rsquo;m betting developers will flood the gates. One cannot just pass up an opportunity to reach an audience of <a href="https://techcrunch.com/2025/10/06/sam-altman-says-chatgpt-has-hit-800m-weekly-active-users/">800 million weekly active users</a>. This is right out of the <a href="https://stratechery.com/2015/aggregation-theory/">aggregation theory</a> playbook.</p>
<p>From the point of view of apps that have established brands, there is a deep strategic tension here. LLMs are driven by intent expressed in natural language. This leads to decoupling intent from brand name recognition. For example, on my phone, I translate the intent &ldquo;I want to check out houses for sale&rdquo; into finding and tapping the icon for the Redfin app. In ChatGPT, that intent will lead to the LLM selecting an appropriate app which can satisfy that intent. It could be Redfin or Zillow or any number of other real estate apps. I as a user don&rsquo;t need to know or care. I&rsquo;m trusting ChatGPT to simply pick the right one and the best one. I riffed on this a bit more here:</p>
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/ofH1cFzCE4Y?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<p>There are many unknowns. As Ilya Sutskever said: <a href="https://www.dwarkesh.com/p/ilya-sutskever-2">the answer will reveal itself</a>.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Unix Was a Love Letter to Agents</title>
      <link>http://vivekhaldar.com/articles/unix-love-letter-to-agents/</link>
      <pubDate>Sat, 20 Dec 2025 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/unix-love-letter-to-agents/</guid>
      <description>&lt;p&gt;Nearly sixty years ago, as Thompson and Ritchie were crafting Unix at Bell Labs, they had no idea that the operating system and culture they were building would end up being the perfect home for AI agents in the future.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s no accident that the most successful AI agents today&amp;ndash;CLI agents like Claude Code&amp;ndash;are built to run in a Unix environment. The fit is so natural, so seamless, that it&amp;rsquo;s easy to miss how remarkable it is. But understanding &lt;em&gt;why&lt;/em&gt; Unix and AI agents work so well together can teach us a lot about how to build robust, reliable agents.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Nearly sixty years ago, as Thompson and Ritchie were crafting Unix at Bell Labs, they had no idea that the operating system and culture they were building would end up being the perfect home for AI agents in the future.</p>
<p>It&rsquo;s no accident that the most successful AI agents today&ndash;CLI agents like Claude Code&ndash;are built to run in a Unix environment. The fit is so natural, so seamless, that it&rsquo;s easy to miss how remarkable it is. But understanding <em>why</em> Unix and AI agents work so well together can teach us a lot about how to build robust, reliable agents.</p>
<p>It starts, first of all, with the <a href="https://en.wikipedia.org/wiki/Unix_philosophy">Unix Philosophy</a>: small, sharp tools that do one thing well; orthogonality and the primacy of composability; and text as a universal interface.</p>
<p>And while Unix tools are sharp and focused, they also have depth and richness within their domain. For example, <code>wc</code> can count words, lines, characters or bytes. I call this the <em>&ldquo;narrow doors, large rooms&rdquo;</em> principle. This ensures that a tool can cover all or a large part of a given problem area.</p>
<p>If you&rsquo;ve struggled with building LLM tool-calling systems, you will find that these are exactly the ideas that also help to untangle them and build them more reliably (<a href="https://platform.openai.com/docs/guides/function-calling">1</a>, <a href="https://www.anthropic.com/engineering/advanced-tool-use">2</a>).</p>
<p>You can invert some of these design principles to see common pitfalls in LLM tool-calling: &ldquo;wide door, shallow room&rdquo; (a vaguely-named tool that doesn&rsquo;t do much) and &ldquo;wide door, labyrinth inside&rdquo; (a tool that does everything but unpredictably).</p>
<p>In addition to this core design philosophy, the early culture around Unix had a strong emphasis on writing. They wrote not just comprehensive technical documentation describing how to operate the system (man pages), but also articles and books on system design, architectural tradeoffs, and how to build complex systems from simple parts. They had an <a href="https://theody.net/elements.html">obsession with wordsmithing</a>.</p>
<p>Decades later, the output of this extensive culture of writing became part of the corpus that trained modern LLMs. This is why a CLI agent feels right at home in the Unix shell. It understands all those sharp little tools, and how to string them together to achieve complex ends.</p>
<p>An LLM is, in a profound sense, exactly the user Unix was designed for: an entity that thinks in natural language, can read documentation, can reason about it, plan with it, and compose small operations into larger workflows. In human form, this would be a knowledgeable poweruser.</p>
<p>This makes for an interesting contrast with GUIs, which tried to abstract away this depth and knowledge required for effective use of a system in the name of user-friendliness. To be useful in a GUI environment, an agent would need computer vision, cursor control, window management, and pixel-level understanding of interface elements. I&rsquo;m sure computer-use models will get better, but they&rsquo;re miles behind CLI agents currently.</p>
<p>Unix was a love letter to agents. It just took fifty years for the recipients to arrive.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Coding Agents Are Outliers</title>
      <link>http://vivekhaldar.com/articles/coding-agents-are-outliers/</link>
      <pubDate>Sun, 02 Nov 2025 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/coding-agents-are-outliers/</guid>
      <description>&lt;p&gt;If you look at the agent landscape today, one of the most prominent success stories has been software coding agents, particularly the quantum leap since the CLI coding agents came out, starting with Claude Code in early 2025. While people were certainly using LLMs for various coding tasks before these CLI agents, this new form factor offered a compelling set of functionality not available before. They can write complex code, debug tricky issues, refactor entire codebases, and even deploy applications.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>If you look at the agent landscape today, one of the most prominent success stories has been software coding agents, particularly the quantum leap since the CLI coding agents came out, starting with Claude Code in early 2025. While people were certainly using LLMs for various coding tasks before these CLI agents, this new form factor offered a compelling set of functionality not available before. They can write complex code, debug tricky issues, refactor entire codebases, and even deploy applications.</p>
<p>But in this piece I want to convince you that coding agents are actually outliers when it comes to designing and building AI agents. The very characteristics that make coding a perfect domain for AI agents—deterministic outputs, clear success and failure states, rich tooling, immediate feedback loops—are precisely what makes them unrepresentative of most other agent domains.</p>
<p>The success of coding agents has created a template that everyone seems eager to copy. But this template is misleading. What works for coding agents doesn&rsquo;t necessarily work elsewhere, and understanding why is crucial for anyone trying to build AI agents in other domains.</p>
<h2 id="building-your-own-tools">Building your own tools</h2>
<p>The people who build AI models are themselves programmers and computer scientists. Programming is how they build their products. This creates a unique dynamic that doesn&rsquo;t exist in any other domain.</p>
<p>When researchers at the major model providers improve their models&rsquo; coding abilities, they immediately become the first line of users. The same (or very adjacent) teams build the agentic scaffolds around these models. They use these tools to write the very code that improves the models. They experience every frustration, every limitation, and every breakthrough firsthand. This isn&rsquo;t just dogfooding—it&rsquo;s a tight feedback loop where the builders&rsquo; own productivity depends on the quality of what they&rsquo;re building. This feedback loop goes straight back into model development. No other domain has this level of builder-user overlap, and it shows in the results.</p>
<p>Beyond this human feedback loop, there&rsquo;s the matter of training data. Programming is very well represented in the datasets used to train large language models. Code repositories, technical documentation, tutorials, blog posts—the internet is awash with programming content.</p>
<p>But it&rsquo;s not just the code itself. The entire ecosystem of software development is documented online: testing practices, CI/CD pipelines, debugging strategies, architectural patterns, code reviews, post-mortems. This world knowledge makes coding agents not just good at writing code—they understand the full software development lifecycle because all of this knowledge is in their training data. They know that after writing code, you should execute tests. They know what test-driven development means. They know how to set up deployment pipelines. They understand version control. This depth of representation is unique to programming.</p>
<p>Compare this to other highly specialized technical domains—material science, drug discovery, energy, manufacturing etc. Unlike programming, there is very little public world knowledge explaining and documenting the day-to-day work tackled by a professional in such fields.</p>
<h2 id="agents-versus-workflows">Agents Versus Workflows</h2>
<p>Slight tangent: we need to clarify the <a href="https://blog.langchain.com/how-to-think-about-agent-frameworks/">distinction between workflows and agents</a>.</p>
<p>Workflows are predetermined sequences of steps designed to accomplish specific goals. When you use a workflow, you know exactly what steps will be taken and in what order. You might use AI or LLMs to help execute individual steps, but the sequence itself is fixed. The model isn&rsquo;t deciding what to do next; it&rsquo;s just helping you do it better. Workflows are perfect for repetitive, well-defined tasks where consistency and predictability matter more than adaptability.</p>
<p>Agents, on the other hand, perform reasoning and planning. They look at a problem, consider various approaches, and generate their own sequences of steps to solve it. They adapt their approach based on intermediate results. When something doesn&rsquo;t work, they try something else. They might ask for clarification or suggest alternative strategies. True agents don&rsquo;t just execute; they plan and adapt.</p>
<p>Coding agents are firmly on the agentic side of this spectrum. In fact, most coding agents have a special affordance for “plan mode”. The extensive programming-related world knowledge baked into the models lets them look at every unique programming problem they are given and improvise a high-level plan to tackle it.</p>
<p>However, most domains that people are trying to apply agent architectures to actually just need better workflows. Not every problem benefits from dynamic planning and reasoning. Sometimes, what you need is a well-designed sequence of steps executed consistently. (What precisely is the role of an LLM in such a workflow? That is a topic for another post.)</p>
<h2 id="the-tacit-knowledge-problem">The Tacit Knowledge Problem</h2>
<p>The real reason coding agents are outliers becomes clear when you look at other specialized domains. In fields outside programming, most of the knowledge needed to operate effectively isn&rsquo;t written down anywhere, public or not. It&rsquo;s tacit knowledge, locked inside the heads of experts and professionals. They notice subtle patterns, remember similar cases, and apply intuition. This knowledge is contextual, situational, and often very hard to fully articulate.</p>
<p>Building agents for these domains requires solving this tacit knowledge problem. You need to somehow extract knowledge that experts themselves often can&rsquo;t articulate, codify it in a way that preserves its contextual nuance, and then ground an AI model on it. This is fundamentally harder than leveraging the already-documented world of programming knowledge.</p>
<p>Codifying this tacit knowledge and workflows, and providing it to a model to ground on is exactly the core playbook for the “AI Agent for X” startups (X could be lawyers, accountants etc). This is not easy. You either need to be a domain expert, or else embed yourself with them for an extended period of time. There are no shortcuts. (Some ways to do that is yet another topic for another post)</p>
<h2 id="why-success-doesnt-translate">Why Success Doesn&rsquo;t Translate</h2>
<p>The success of coding agents has created unrealistic expectations for AI agents in other domains. We see these impressive coding demonstrations—an agent building an entire web app from a prompt, fixing complex bugs, refactoring legacy code—and assume similar breakthroughs are just around the corner for other fields.</p>
<p>But the conditions that enable coding agents are unique, not universal. Programming has deterministic outcomes: code either works or it doesn&rsquo;t. It has immediate feedback: run it and its tests and see what happens. It has rich tooling: debuggers, profilers, test suites. It has clear success metrics: tests pass, performance improves, bugs are fixed. And most importantly, the people building the models are programmers and use the models for programming.</p>
<p>Most other domains lack these characteristics. Success in marketing is measured in customer engagement months later. Legal advice quality might only become clear after a case concludes years hence. Medical treatment effectiveness varies by patient in ways that are hard to predict. Design quality is subjective and context-dependent.</p>
<p>This doesn&rsquo;t mean we can&rsquo;t build useful AI agents for these domains. But it does mean we need to adjust our expectations and our approaches. The coding agent template is something to aspire towards, but not a given in other domains.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Narrate Your Work</title>
      <link>http://vivekhaldar.com/articles/narrate-your-work/</link>
      <pubDate>Sun, 14 Sep 2025 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/narrate-your-work/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://scripting.com/2001/12/02.html&#34;&gt;The phrase shows up in 2001 on Dave Winer’s blog&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I like working with developers who communicate. Ask any of them. I stress this all the time. &amp;ldquo;Narrate your work,&amp;rdquo; says Dave. Our RFC process generates excellent writing. Perhaps we have different values than other devteams. People wonder how we get so much done with so few people. Perhaps this is it.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.jonudell.net/2009/04/28/data-driven-career-discovery/&#34;&gt;Jon Udell echoed the sentiment&lt;/a&gt; a few years later (2009):&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://scripting.com/2001/12/02.html">The phrase shows up in 2001 on Dave Winer’s blog</a>:</p>
<blockquote>
<p>I like working with developers who communicate. Ask any of them. I stress this all the time. &ldquo;Narrate your work,&rdquo; says Dave. Our RFC process generates excellent writing. Perhaps we have different values than other devteams. People wonder how we get so much done with so few people. Perhaps this is it.</p></blockquote>
<p><a href="https://blog.jonudell.net/2009/04/28/data-driven-career-discovery/">Jon Udell echoed the sentiment</a> a few years later (2009):</p>
<blockquote>
<p>Since then I’ve spoken a few times about the idea that by narrating our work, we can perhaps restore some of what was lost when factories and then offices made work opaque and not easily observable. Software developers are in the vanguard of this reintegration, because our work processes&hellip; are fully mediated by digital networks. But it can happen in other lines of work too, and I’m sure it will.</p></blockquote>
<p>An important part of early Google engineering culture was the notion of snippets. Snippets were short summaries of work and achievements from the last week, and sometimes, plans for the next. Most engineers would write snippets for their week every Friday afternoon.</p>
<p>Importantly, snippets were visible to the entire company. Anyone could look up anyone else&rsquo;s snippets and hence read an ongoing log of their work, their challenges and their plans.</p>
<p>They ranged in length and format. Most wrote snippets that were a quick list of bullets. Often there would be links to documents, bugs or code. But there were a few outliers who used snippets as a creative outlet, writing mini-essays or sometimes long reflections in their snippets. I greatly enjoyed these.</p>
<p>Narrating your work is different from making your work public. It is the meta-narrative. It is talking about how you did the work, about the thought process behind it, about what informed the work. It is about all the missteps and the struggle and the  paths that did not work out. It is not a clean story. It is not a synthesized result. It is a lab notebook, not a published paper.</p>
<p>Ironically, when you narrate your work, there usually isn&rsquo;t a narrative. Every individual update seems to be a random point in the cloud. Only when you look back on a few months or years of you narrating your work do you begin to see all the threads. All those points start appearing as a coherent picture when you zoom out.</p>
<p>Narration serves both the writer and the reader. To the writer it provides a respite, and recognition of work accomplished, lessons learned and things built, in an otherwise breakneck work environment. To the reader it provides commiseration, comfort in the knowledge that there are others sharing similar burdens and pushing through comparable struggles. Above all—the reader gets to learn from those further along the path of mastery.</p>
<p>Keep narrating.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>The Assembly Language of Knowledge Work</title>
      <link>http://vivekhaldar.com/articles/read-cognify-write/</link>
      <pubDate>Sat, 13 Sep 2025 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/read-cognify-write/</guid>
      <description>&lt;p&gt;The work most of us are doing right now—the clicking, the tabbing between windows, the copy-pasting, the endless typing interspersed with bursts of genuine cognition—will soon seem as archaic as programming in assembly language—the low-level instruction set for a machine that is about to be automated away.&lt;/p&gt;
&lt;h2 id=&#34;the-atom-of-work-the-read-cognify-write-loop&#34;&gt;The Atom of Work: The Read-Cognify-Write Loop&lt;/h2&gt;
&lt;p&gt;Break down any task performed by a knowledge worker, and you find the same atomic structure repeating itself:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The work most of us are doing right now—the clicking, the tabbing between windows, the copy-pasting, the endless typing interspersed with bursts of genuine cognition—will soon seem as archaic as programming in assembly language—the low-level instruction set for a machine that is about to be automated away.</p>
<h2 id="the-atom-of-work-the-read-cognify-write-loop">The Atom of Work: The Read-Cognify-Write Loop</h2>
<p>Break down any task performed by a knowledge worker, and you find the same atomic structure repeating itself:</p>
<ul>
<li><strong>Read</strong>: You ingest information. This could be reading an email, listening in a meeting, analyzing a spreadsheet, or even reviewing the output of your previous task.</li>
<li><strong>Cognify</strong>: You process that information. This is the black box of thought where judgment, synthesis, analysis, extrapolation, or creativity happens. It’s the process of forming a judgment, decision, or the next step.</li>
<li><strong>Write</strong>: You persist that new insight. This could mean writing an email, updating a document, creating a presentation slide, or writing a piece of code.</li>
</ul>
<p>Complex projects are a long series of these read-cognify-write steps. A massive undertaking like launching a new product is composed of thousands of smaller RCW loops. Sometimes they’re strung together in bursts carried out in a few minutes, other times they might have weeks-long pauses.</p>
<p>The RCW steps need a structure to live within. First, you must create a project plan. To do that, you break the task down: &ldquo;analyze market data&rdquo; (a series of RCW loops), &ldquo;draft a budget&rdquo; (more loops), &ldquo;assign team roles&rdquo; (even more loops). At the end, you perform a final synthesis step, combining the outputs of all these threads into the final artifact—the project plan.</p>
<p>That sounds like the basic plan-and-execute structure of most AI agents today, and it is.</p>
<p>For decades, humans have been the sole engine capable of this entire process. We hold the high-level intent for a project over weeks, months, or even years, manually &ldquo;compiling&rdquo; that intent into countless atomic RCW tasks. We are the planners, the executors, and the synthesizers. But this is changing.</p>
<p>But agents have been progressing to <a href="https://www.youtube.com/watch?v=9U15vncqdnk">hold intent over longer and longer tasks</a>. The resulting curve showing the <a href="https://metr.org/blog/2025-03-19-measuring-ai-ability-to-complete-long-tasks/">length of tasks that AI can do</a> shows up as a neat line on a log-chart, i.e. a clean exponential.</p>
<h2 id="the-ai-compiler-for-knowledge-work">The AI &ldquo;Compiler&rdquo; for Knowledge Work</h2>
<p>The latest generation of reasoning AI models can now perform both the low-level execution and the high-level planning and orchestration. They can not only perform an individual RCW step but also do the planning required to decompose a complex goal into those smaller steps and then synthesize the final output.</p>
<p>AI is becoming like a compiler for knowledge work. Tiny RCW loops are the target assembly language ISA for these compilers.</p>
<p>When a programmer writes in a high-level language like Python, they are expressing their intent. They don&rsquo;t worry about memory allocation, CPU instruction sets, or register management. The compiler handles that, translating the simple, human-readable intent into efficient, low-level machine code. Yet, there was a time when humans had to painstakingly handle moving values between memory and registers, manage the stack, and write assembly language.</p>
<p>Similarly, we will soon stop managing the low-level &ldquo;assembly language&rdquo; of work. Instead of manually executing hundreds of RCW loops, we will state our high-level intent—&ldquo;Create a go-to-market strategy for Project X&rdquo;—and the AI agent will compile it, orchestrating the necessary steps to produce the final output.</p>
<h2 id="the-bitter-lesson-and-the-black-box">The Bitter Lesson and the Black Box</h2>
<p><a href="https://www.oneusefulthing.org/p/the-bitter-lesson-versus-the-garbage">Ethan Mollick makes a similar point eschewing this low level work in favor of clearly stating intent</a>, making the analogy with Sutton&rsquo;s &ldquo;The Bitter Lesson.&rdquo; The lesson is that we shouldn&rsquo;t try to force AI to replicate the exact steps a human would take. Instead, we should give it a clear goal and a robust way to measure success, then let it find its own, potentially alien, path to the solution.</p>
<p>This is exactly how we treat compilers. A programmer rarely, if ever, inspects the assembly code their compiler generates. They trust it because it&rsquo;s proven to be efficient and correct. We must adopt a similar mindset for AI agents. The key is not to micromanage their internal plan but to focus on two things:</p>
<ul>
<li><strong>Clearly Stated Intent</strong>: The quality of your output depends entirely on the clarity of your prompt. Our skill will shift from execution to direction.</li>
<li><strong>Inspectable Artifacts &amp; Evals</strong>: We don&rsquo;t need to know how the AI did it, but we need to trust the result. This means demanding outputs with citations, verifiable reasoning, and clear diffs showing changes.</li>
</ul>
<h2 id="optimizations-for-knowledge-work">Optimizations for Knowledge Work</h2>
<p>Pushing the compiler analogy further, you could “optimize” knowledge work very much like how a compiler optimizes code when emitting assembly. AI agents will apply the same principles to knowledge work workflows.</p>
<p>Consider these classic compiler optimizations and their application to corporate knowledge work:</p>
<ul>
<li><strong>Dead Code Elimination</strong>: A human, working from habit, might waste a day generating a report that no one uses in the final presentation. An AI agent, seeing the full dependency graph of the project, would identify the task as &ldquo;dead code&rdquo;—its output is never used—and eliminate it before it even begins.</li>
<li><strong>Common Subexpression Elimination</strong>: A human might analyze a dataset for a summary email, then someone else might re-analyze the same raw data for a detailed slide deck. An agent would perform the core analysis once, cache the results (the &ldquo;common subexpressions&rdquo;), and then reuse them.</li>
<li><strong>Instruction Reordering &amp; Parallelization</strong>: A human preparing a competitive analysis would research funding, then product features, then press releases, one after another. An agent would see these as independent tasks and execute them in parallel, cutting the time-to-completion dramatically.</li>
<li><strong>Loop Unrolling</strong>: A human sending 50 personalized follow-up emails performs a slow, repetitive loop with high cognitive overhead for each iteration. An agent would &ldquo;unroll the loop,&rdquo; pulling all the data in one batch operation and generating all 50 drafts simultaneously.</li>
</ul>
<h2 id="from-assembly-to-intent">From Assembly to Intent</h2>
<p>The knowledge work we do today is a mesh of high-level strategic thought and low-level, manual execution. We are the thinkers and the typists, the strategists and the assemblers. The AI compiler is coming for the assembly part of the job.</p>
<p>Our value and focus will shift entirely to the realm of intent. Our core tasks will be to ask the right questions, to define the goals with clarity and precision, and to build the robust evaluation systems that ensure the quality and reliability of the output. The painstaking, manual process of bringing those ideas to life will be abstracted away, just like compilers abstracted away assembly language to high-level languages.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>My Video Production Stack (for YouTube)</title>
      <link>http://vivekhaldar.com/articles/my-video-production-stack/</link>
      <pubDate>Sun, 07 Sep 2025 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/my-video-production-stack/</guid>
      <description>&lt;p&gt;There are two barriers to publishing videos on YouTube. The first one is getting over thinking you are cringe and the second one is video editing. You have to battle the first one on your own, but I&amp;rsquo;m hoping that with what I share below, you can ease the burden of the latter.&lt;/p&gt;
&lt;h2 id=&#34;no-hands-editing-processing-and-publishing&#34;&gt;No-hands editing, processing and publishing&lt;/h2&gt;
&lt;p&gt;The goal of this video production stack is to take a raw video, then automatically edit it, transcribe it, come up with timestamped chapter markers for the YouTube description, and upload it to my YouTube channel. Basically this is a fully automatic publishing workflow after the point I hit stop on the record button.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>There are two barriers to publishing videos on YouTube. The first one is getting over thinking you are cringe and the second one is video editing. You have to battle the first one on your own, but I&rsquo;m hoping that with what I share below, you can ease the burden of the latter.</p>
<h2 id="no-hands-editing-processing-and-publishing">No-hands editing, processing and publishing</h2>
<p>The goal of this video production stack is to take a raw video, then automatically edit it, transcribe it, come up with timestamped chapter markers for the YouTube description, and upload it to my YouTube channel. Basically this is a fully automatic publishing workflow after the point I hit stop on the record button.</p>
<p>This, of course, is very specific to the kinds of videos that I make, which is talking head videos with a screen share. But that is a large enough genre on YouTube that this setup might be useful to others out there.</p>
<p>I have several different tools across multiple git repos to accomplish this. Today I am making all those repos public. Let me explain below what each one does.</p>
<h2 id="the-complete-workflow">The Complete Workflow</h2>
<p>My YouTube publishing workflow consists of four main components, each handling a different part of the video processing pipeline. They&rsquo;re written in Python and designed to work seamlessly together:</p>
<ol>
<li><strong><a href="https://github.com/vivekhaldar/color_edit/">color_edit</a></strong> - Intelligent video editing based on visual cues</li>
<li><strong><a href="https://github.com/vivekhaldar/yt_chapter_maker">yt_chapter_maker</a></strong> - AI-powered chapter generation and title suggestions</li>
<li><strong><a href="https://github.com/vivekhaldar/yt_upload">yt_upload</a></strong> - YouTube API integration for uploading</li>
<li><strong><a href="https://github.com/vivekhaldar/video_upload_workflow">video_upload_workflow</a></strong> - The orchestrator that ties everything together</li>
</ol>
<p>Let me walk you through each component and how they work internally.</p>
<h3 id="color_edit-visual-cue-based-video-editing">color_edit: Visual Cue-Based Video Editing</h3>
<p>The first and most crucial tool in my stack is <code>color_edit</code>. This is the tool that automatically creates a fully edited video from my raw recording. Before I created this tool for myself, I used to spend multiple hours reading each video.</p>
<p>The key innovation here is using colored frames as editing markers. When recording, I display:</p>
<ul>
<li><strong>Green frames</strong> to mark sections I want to keep</li>
<li><strong>Red frames</strong> to mark sections I want to remove</li>
<li>Regular content is neither red nor green</li>
</ul>
<p>This is much easier to demonstrate than to explain. <a href="https://youtu.be/Bdoi7BDhrWc">Check out this video where I visually explain how this works.</a></p>
<p>Another important function performed by this tool is the removal of silent parts of the video, also known as &ldquo;dead air&rdquo;.</p>
<p>The final output is a tightly edited video with no dead air and only the sections I explicitly marked as keepers.</p>
<h3 id="yt_chapter_maker-ai-powered-chapter-generation">yt_chapter_maker: AI-Powered Chapter Generation</h3>
<p>Once the video is edited, <code>yt_chapter_maker</code> takes over to generate metadata. This tool is pretty simple. It prompts an LLM to look at the transcript for the video and then suggest few options for titles as well as timestamped chapter markers that can go in the video description.</p>
<h3 id="yt_upload-youtube-api-integration">yt_upload: YouTube API Integration</h3>
<p>The <code>yt_upload</code> tool handles the actual YouTube upload process using the YouTube API. You will need to get client secrets using the Google Cloud console in order to invoke the API. Also, the very first time you run it, you will have to do an OAuth dance through the browser.</p>
<p>The uploaded video is kept as private so that you look at the video and its metadata before publishing it.</p>
<h3 id="video_upload_workflow-the-orchestrator">video_upload_workflow: The Orchestrator</h3>
<p>Of course I don&rsquo;t want to have to invoke all of the above steps individually every time. So I have a meta-orchestrator that runs the entire pipeline. It also takes care of transcribing the video using OpenAI&rsquo;s whisper tool.</p>
<p>There&rsquo;s some caching of intermediate outputs to make retries faster in case something breaks midway.</p>
<h2 id="audio">Audio</h2>
<p>Getting good audio is way more important than high-resolution video. People can watch a potato webcam video if it has decent audio, but will not stay for 2 seconds on video shot on an 8K RED camera if the audio sounds like it is coming out of a tincan.</p>
<p>Fortunately, it is very hard to go wrong with any decent modern microphone. <a href="https://www.amazon.com/FIFINE-Microphone-Voice-Over-Windscreen-Amplitank-K688/">These</a> <a href="https://www.amazon.com/DJI-Charging-Microphone-Ultralight-Anti-Interference/">are</a> the mics I&rsquo;m currently using (depending on where I am recording).</p>
<h2 id="experience">Experience</h2>
<p>Various parts of the above setup came about organically over time.</p>
<p><code>color_edit</code> is the oldest one. I&rsquo;ve been using it for more than 4 years now and every video on my channel in that time frame has been automatically edited using it. I haven&rsquo;t even been making any changes to it recently. It does its job well and without any fuss.</p>
<p>The other parts are more recent and were mostly cobbled together in the last year or so. All the same, at this point they have been used to publish many videos on my channel and I intend to keep using this pipeline.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Natlang Code</title>
      <link>http://vivekhaldar.com/articles/natlang-code/</link>
      <pubDate>Sat, 16 Aug 2025 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/natlang-code/</guid>
      <description>&lt;p&gt;It is now commonplace to write code in natural language.&lt;/p&gt;
&lt;p&gt;This might seem like a controversial or nonsensical statement, but consider the following:&lt;/p&gt;
&lt;p&gt;In Claude Code, &lt;a href=&#34;https://docs.anthropic.com/en/docs/claude-code/slash-commands&#34;&gt;you can define custom commands and workflows in plain text&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Custom slash commands allow you to define frequently-used prompts as Markdown files that Claude Code can execute.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;(&lt;a href=&#34;https://cloud.google.com/blog/topics/developers-practitioners/gemini-cli-custom-slash-commands&#34;&gt;Gemini-CLI has a similar feature&lt;/a&gt;, with the slight syntactic difference that it uses TOML.)&lt;/p&gt;
&lt;p&gt;The initial usage of these commands started by automating common developer workflows (write, test, review, commit, push, bring up dev server etc). They were &amp;ldquo;scripts&amp;rdquo;, but in natural language.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>It is now commonplace to write code in natural language.</p>
<p>This might seem like a controversial or nonsensical statement, but consider the following:</p>
<p>In Claude Code, <a href="https://docs.anthropic.com/en/docs/claude-code/slash-commands">you can define custom commands and workflows in plain text</a>:</p>
<blockquote>
<p>Custom slash commands allow you to define frequently-used prompts as Markdown files that Claude Code can execute.</p></blockquote>
<p>(<a href="https://cloud.google.com/blog/topics/developers-practitioners/gemini-cli-custom-slash-commands">Gemini-CLI has a similar feature</a>, with the slight syntactic difference that it uses TOML.)</p>
<p>The initial usage of these commands started by automating common developer workflows (write, test, review, commit, push, bring up dev server etc). They were &ldquo;scripts&rdquo;, but in natural language.</p>
<p>In a shell or Python script one could never say &ldquo;look at the diff and formulate a succinct but descriptive commit message following our company style guide at &lt;url&gt;&rdquo;. In current coding agents, such a semantic task is trivial.</p>
<p>But then, soon after, people started using these agentic coding agents as <em>everything agents.</em> See the long list of <a href="https://x.com/alexalbert__/status/1948765443776544885">non-coding use-cases in this X thread</a>. Or how one can <a href="https://x.com/trq212/status/1944877527044120655">run Claude Code in the home directory</a> (not a git repo) and use it to automate most of what one does on a computer.</p>
<p>This uplevel of using CLI agents as everything-agents brings the same conundrum that every developer faces when faced with a series of repetitive tasks: should I bite the bullet and write a script to automate this, or just go ahead and do it manually? Almost always, writing a script takes much more time than doing in manually <em>once</em>. Now instead of writing a shell or Python script, one has to do the calculus on slowing down and writing out a text file with instructions and criteria, so that the agent can do it in the future.</p>
<h2 id="stuck-in-chatland">Stuck in Chatland</h2>
<p>While developers are automating entire workflows with coding agents, the rest of us are stuck in what I call &ldquo;chatland&rdquo;. Chatland is using ChatGPT to &ldquo;ask questions&rdquo;, or run prompts one-shot. And then what? Closely read it? Copy/paste it somewhere? Ask even more questions?</p>
<p>Chat is great for exploration; it is not meant for repeatability and <em>workflow automation.</em> It is a nice local maxima, certainly not a global one. One could, however, use a long conversation with the model to arrive at the process and pull out tacit knowledge, much like a newbie on the job does with a more experienced colleague.</p>
<p>A whole host of tools have cropped up to address the shortcomings of chat for automation: n8n, Gumloop, make.com and many others. Their drag-and-drop UI based on flowchart-construction seems like a natural way to express and then automate workflows, but it can be fiddly and breaks down with data-intensive flows. <a href="https://dl.acm.org/doi/pdf/10.1145/3746223">As Erik Meijer put it</a>:</p>
<blockquote>
<p>Most workflow tools, like UIPath, Workato, and Azure Logic Apps, primarily use sequential composition with limited control flow and repetition validating our design choices. One complication in workflow tools is the need for a &ldquo;language&rdquo; of functions to manipulate data as it flows between actions. We replace this with pattern-matching to simplify and enhance the expressiveness of the base language without the need for an extra layer of ad-hoc functions</p></blockquote>
<p>(<a href="https://youtu.be/0A10LcXs570">I covered that paper in a video here.</a>)</p>
<p>More importantly, when businesses <em>do</em> document their workflows, they rarely use flowcharts (or the more enterprise-y <a href="https://en.wikipedia.org/wiki/Business_Process_Model_and_Notation">BPMN</a>). They write SOPs (standard operating procedures) in natural language. SOPs are the grown-up versions of custom slash-commands written in markdown.</p>
<h2 id="the-pain-of-articulation">The pain of articulation</h2>
<p>In a recent post titled &ldquo;<a href="https://vivekhaldar.com/articles/ai-is-a-mirror/">AI is a mirror</a>&rdquo;, I wrote:</p>
<blockquote>
<p>The company that has a clear, pre-defined workflow that is even ready to be considered for agentification is extremely rare. They know they have inefficiencies. They feel the pain of manual, repetitive tasks. But they can&rsquo;t articulate the precise sequence of steps, the decision points, and the logic that governs the work.</p></blockquote>
<p>Ethan Mollick had already picked up on this theme. <a href="https://www.oneusefulthing.org/p/the-bitter-lesson-versus-the-garbage">In a recent column, he spoke of the &ldquo;garbage can&rdquo; model of the organization and its processes</a>:</p>
<blockquote>
<p>One thing you learn studying (or working in) organizations is that they are all actually a bit of a mess. In fact, one classic organizational theory is actually called the Garbage Can Model. This views organizations as chaotic &ldquo;garbage cans&rdquo; where problems, solutions, and decision-makers are dumped in together, and decisions often happen when these elements collide randomly, rather than through a fully rational process&hellip;
The Garbage Can represents a world where unwritten rules, bespoke knowledge, and complex and undocumented processes are critical. It is this situation that makes AI adoption in organizations difficult, because even though 43% of American workers have used AI at work, they are mostly doing it in informal ways, solving their own work problems. <em>Scaling AI across the enterprise is hard because traditional automation requires clear rules and defined processes; the very things Garbage Can organizations lack.</em></p></blockquote>
<p>He goes on to apply the <a href="https://www.cs.utexas.edu/~eunsol/courses/data/bitter_lesson.pdf">bitter-lesson</a> mindset to applying AI to enterprise work:</p>
<blockquote>
<p>The Bitter Lesson suggests we might soon <em>ignore how companies produce outputs and focus only on the outputs themselves</em>. Define what a good sales report or customer interaction looks like, then train AI to produce it. The AI will find its own paths through the organizational chaos; paths that might be more efficient, if more opaque, than the semi-official routes humans evolved.</p></blockquote>
<p>(Emphasis mine.)</p>
<p>I agree, and this is why I think we must encode knowledge of &ldquo;what good looks like&rdquo; for the output of a process into a rigorous <a href="https://vivekhaldar.com/articles/platos-cave-of-ai-agent-evals/">eval/benchmark</a>.</p>
<blockquote>
<p>The client company defines the task by creating this benchmark. It&rsquo;s filled with input examples and the corresponding ideal outputs. The agent-building company&rsquo;s only job is to build an agent that achieves a pre-agreed-upon score on this benchmark.</p></blockquote>
<p>Note that raw model intelligence will not help with workflow articulation. <a href="https://latentintent.substack.com/p/model-intelligence-is-no-longer-the">As Casper put it</a>:</p>
<blockquote>
<p>Recently, both OpenAI and Google models were on par with gold medallists in the International Mathematical Olympiad 2025 (IMO). At the same time it&rsquo;s still difficult to make AI agents work for relatively simple enterprise use cases. Why is there such a disparity in model performance between problem domains? Why are models so much better at complex maths tasks that only few humans can complete, while struggling at simple every day tasks done by most humans? <em>It&rsquo;s because the bottleneck isn&rsquo;t in intelligence, but in human tasks: specifying intent and context engineering.</em></p></blockquote>
<p>(Emphasis mine.)</p>
<hr>
<p>Developers writing elaborate workflows in plain-text files are speed-running the same journey that enterprises need to make to achieve the end-to-end benefits of AI. They have to look beyond helping individual contributors with granular tasks in &ldquo;chatland AI&rdquo;, and make the leap to &ldquo;workflow-automation AI&rdquo;.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>The Mac-vs-PC Story Playing out in CLI Agents</title>
      <link>http://vivekhaldar.com/articles/cli-agent-architecture/</link>
      <pubDate>Wed, 06 Aug 2025 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/cli-agent-architecture/</guid>
      <description>&lt;p&gt;(&lt;a href=&#34;https://x.com/vivekhaldar/status/1951741635244806188&#34;&gt;Expanded from this tweet thread&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;Recently I became Claude Code-pilled. I had been eagerly trying out the CLI agents from all three major providers: Gemini CLI from Google, Codex CLI from OpenAI, and Claude Code from Anthropic. All the breathless AI influencers turned out to be  right: Claude Code is just much, much better than the others.&lt;/p&gt;
&lt;p&gt;If you look at the internal architecture of these CLI agents and the resulting full product, you will see the Mac vs PC story playing out all over again.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>(<a href="https://x.com/vivekhaldar/status/1951741635244806188">Expanded from this tweet thread</a>.)</p>
<p>Recently I became Claude Code-pilled. I had been eagerly trying out the CLI agents from all three major providers: Gemini CLI from Google, Codex CLI from OpenAI, and Claude Code from Anthropic. All the breathless AI influencers turned out to be  right: Claude Code is just much, much better than the others.</p>
<p>If you look at the internal architecture of these CLI agents and the resulting full product, you will see the Mac vs PC story playing out all over again.</p>
<p>The architecture of a CLI agent consists of three layers:</p>
<ol>
<li><strong>The Model:</strong> This is the foundational Large Language Model (LLM) that does the core thinking—the Claude, Gemini etc. This layer is responsible for the raw intelligence of the system.</li>
<li><strong>The Agentic Scaffolding Around the Model:</strong> This middle layer consists of all the tools, prompts, retrieval mechanisms (like RAG or <a href="https://www.youtube.com/watch?v=vbEbDG3d1TQ">agentic search</a>), and retry loops. It’s the framework that guides the model, giving it the tools and context it needs to perform a specific task, like fixing a bug, or writing code for a feature spec.</li>
<li><strong>The Text User Interface (TUI):</strong> The textual user interaction in the terminal. This layer manages everything the user sees and interacts with: rendering output in the terminal, handling input, and displaying the status of ongoing tasks.</li>
</ol>
<p>In most of the major CLI agents today—Codex, Gemini CLI, and Claude Code—these three layers are bundled together into a single, monolithic package. You can&rsquo;t easily swap out one component for another.</p>
<p>But just like people wanted to build their own PCs out of parts of their choice, we’re now seeing CLI agents that are offering a more mix and match approach. Agents like <a href="https://github.com/sst/opencode">OpenCode</a> and <a href="https://github.com/charmbracelet/crush">Crush</a> let you swap in any LLM and also bring modularity to the core system prompts used for agentic behavior. They are innovating at the TUI level and pulling in users with eye-candy UI. They are betting on a <strong>modular, mix-and-match strategy</strong>.</p>
<p>Anthropic, however, is taking the complete opposite approach with Claude Code. Their strategy is reminiscent of Apple&rsquo;s: a <strong>fully integrated, hermetically-sealed system</strong>. You use the Claude model with their proprietary agentic harness and their TUI. It is telling that of the three major CLI agents, it is the only one that is <em>not</em> open-source.</p>
<p>It works though. Claude Code has cemented its reputation as the best SWE (and even general-purpose) CLI agent. I suspect a lot of that is due to the underlying Claude models, but also a significant part of its effectiveness comes from the tenacity and intelligence baked into its agentic harness—the secret sauce they&rsquo;re not giving away (prompt reverse-engineering notwithstanding).</p>
<p>I&rsquo;m not sure which approach will win out. Maybe we&rsquo;ll settle in an equilibrium–very much like the Mac and the PC have–where both kinds of products are successful and have a large user base.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>AI is a Mirror</title>
      <link>http://vivekhaldar.com/articles/ai-is-a-mirror/</link>
      <pubDate>Mon, 28 Jul 2025 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/ai-is-a-mirror/</guid>
      <description>&lt;p&gt;[As this post was sitting in my drafts, &lt;a href=&#34;https://substack.com/inbox/post/169199293&#34;&gt;Ethan Mollick published a deeply insightful post&lt;/a&gt; making a similar point. Go read that.]&lt;/p&gt;
&lt;p&gt;I’ve talked to a lot of companies about building AI agents, and I’ve noticed a strange pattern. You sit down with them, ready to talk workflows, pipelines, and agents, and you ask the simple question: &amp;ldquo;What do you want to automate?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;And they don&amp;rsquo;t know.&lt;/p&gt;
&lt;p&gt;AI acts as a mirror. You bring it in, hoping it will solve your problems, but it just stands there and reflects your own organization back at you, asking: &amp;ldquo;So, what do you actually do here? What is your process? What is your workflow?&amp;rdquo;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>[As this post was sitting in my drafts, <a href="https://substack.com/inbox/post/169199293">Ethan Mollick published a deeply insightful post</a> making a similar point. Go read that.]</p>
<p>I’ve talked to a lot of companies about building AI agents, and I’ve noticed a strange pattern. You sit down with them, ready to talk workflows, pipelines, and agents, and you ask the simple question: &ldquo;What do you want to automate?&rdquo;</p>
<p>And they don&rsquo;t know.</p>
<p>AI acts as a mirror. You bring it in, hoping it will solve your problems, but it just stands there and reflects your own organization back at you, asking: &ldquo;So, what do you actually do here? What is your process? What is your workflow?&rdquo;</p>
<p>For a shocking number of companies, the answer is a shrug.</p>
<p>The company that has a clear, pre-defined workflow that is even ready to be considered for agentification is extremely rare. They know they have inefficiencies. They feel the pain of manual, repetitive tasks. But they can&rsquo;t articulate the precise sequence of steps, the decision points, and the logic that governs the work.</p>
<p>The initial enthusiasm for &ldquo;AI transformation&rdquo; quickly becomes a painful, soul-searching exercise in process documentation. The AI doesn&rsquo;t tell them what to do; it forces them to figure it out for themselves.</p>
<h2 id="the-second-battle-escaping-the-vibes-trap">The Second Battle: Escaping the &ldquo;Vibes&rdquo; Trap</h2>
<p>Let&rsquo;s say you get past that first hurdle. After weeks of dialogue, whiteboarding, and untangling departmental spaghetti, you finally pin down a workflow. You build an agent. It starts doing the thing.</p>
<p>Now comes the second battle: Is it any good?</p>
<p>The default metric for success in most organizations is &ldquo;vibes.&rdquo; Does it feel right? Does the output seem okay? This is a terrible way to build an engineered system, which is what an AI agent is. &ldquo;Good enough&rdquo; isn&rsquo;t a spec.</p>
<p>This is where the mirror shows its second reflection. Not only do you have to define the process, but you also have to define what a successful outcome looks like. You need a rubric. You need properties of a good output. <a href="https://vivekhaldar.com/articles/platos-cave-of-ai-agent-evals/">You need a benchmark</a>.</p>
<p>Without a clear definition of &ldquo;good,&rdquo; you&rsquo;re just tweaking prompts and hoping for the best. You can&rsquo;t measure progress. You can&rsquo;t have a meaningful conversation about improving the agent&rsquo;s performance. You&rsquo;re stuck in a subjective loop of feedback based on gut feelings.</p>
<p>To truly make the most of AI, organizations first have to look within.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Plato&#39;s Cave of AI Agent Evals</title>
      <link>http://vivekhaldar.com/articles/platos-cave-of-ai-agent-evals/</link>
      <pubDate>Sun, 27 Jul 2025 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/platos-cave-of-ai-agent-evals/</guid>
      <description>&lt;p&gt;&lt;em&gt;[The following is a platonic ideal&amp;ndash; a thought experiment. It was borne of many recent conversations and experiences around building AI agents for enterprise customers.]&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Imagine two parties: the company that needs an agent and the company that builds it. In this ideal world, they never have a meeting. They never speak. Their entire interaction is mediated through a single, shared Git repository.&lt;/p&gt;
&lt;p&gt;This repository contains one thing: a comprehensive set of evaluation data—a benchmark.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>[The following is a platonic ideal&ndash; a thought experiment. It was borne of many recent conversations and experiences around building AI agents for enterprise customers.]</em></p>
<p>Imagine two parties: the company that needs an agent and the company that builds it. In this ideal world, they never have a meeting. They never speak. Their entire interaction is mediated through a single, shared Git repository.</p>
<p>This repository contains one thing: a comprehensive set of evaluation data—a benchmark.</p>
<p>The client company defines the task by creating this benchmark. It&rsquo;s filled with input examples and the corresponding ideal outputs. The agent-building company&rsquo;s only job is to build an agent that achieves a pre-agreed-upon score on this benchmark.</p>
<p>If the client wants to change the agent&rsquo;s behavior? They don&rsquo;t send an email or schedule a call. They add new data points to the benchmark that illustrate the desired change. Or they modify existing ones. The agent&rsquo;s behavior is shaped only by the data in the eval set.</p>
<p>The builder&rsquo;s job is simple: make the agent pass the test. The client&rsquo;s job is also simple: create a test that accurately reflects their needs.</p>
<p>If this sounds familiar, it should. It’s essentially Test-Driven Development (TDD) for AI. In software engineering, TDD dictates that before you write a single line of feature code, you first write a test that defines what success looks like. The test fails, naturally. Then, you write just enough code to make it pass. Plato&rsquo;s Cave of Evals applies the same philosophy. The benchmark is the failing test. The agent is the code you write to make the test pass.</p>
<p>Of course, this is a hypothetical ideal. In the real world, the nuance of a business problem can&rsquo;t always be perfectly captured in a static dataset. But Plato&rsquo;s Cave of Evals captures the spirit of what we should be aiming for. It forces clarity. It makes the abstract concrete. It shifts the entire development process from subjective feedback loops based on vibes to objective, data-driven iteration.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Fixing Auth for Personal AI Agents</title>
      <link>http://vivekhaldar.com/articles/fixing-auth-for-personal-ai-agents/</link>
      <pubDate>Fri, 25 Jul 2025 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/fixing-auth-for-personal-ai-agents/</guid>
      <description>&lt;p&gt;Agentic browsers and AI assistants are shipping, but they&amp;rsquo;re all built on a broken identity foundation. They either run with limited API-only access or they force users into the insane practice of handing over raw credentials. For agents to act on our behalf without creating a security and audit nightmare, we need to fix auth at a more fundamental level.&lt;/p&gt;
&lt;p&gt;This isn&amp;rsquo;t an application-layer problem. This is an identity-layer problem.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Agentic browsers and AI assistants are shipping, but they&rsquo;re all built on a broken identity foundation. They either run with limited API-only access or they force users into the insane practice of handing over raw credentials. For agents to act on our behalf without creating a security and audit nightmare, we need to fix auth at a more fundamental level.</p>
<p>This isn&rsquo;t an application-layer problem. This is an identity-layer problem.</p>
<h3 id="the-core-problem-impersonation-vs-delegation">The Core Problem: Impersonation vs. Delegation</h3>
<p>Right now, an AI agent has two bad options for accessing your accounts:</p>
<ol>
<li><strong>Scoped API Access:</strong> The agent gets an OAuth token with a limited scope (e.g., calendar.read). This is a sandbox, and a pretty small one at that. The agent can&rsquo;t browse the web <em>as you</em>; it can only hit pre-approved endpoints. This neuters the whole concept of a general-purpose agent.</li>
<li><strong>Credential Handover:</strong> You give the agent your literal username and password. This is catastrophically insecure. It makes auditing impossible and turns every agent into a potential supply chain attack vector for your personal accounts. Every action the agent takes is logged as an action <em>you</em> took.</li>
</ol>
<p>We have robust protocols for a user authenticating themselves, and for an application acting on its own behalf. We have no standard for an application acting <em>as a delegate for a user,</em> especially for today’s use-cases of AI agents needing to work as the signed-in user.</p>
<h3 id="no-service-accounts-are-not-the-answer">No, Service Accounts Are Not the Answer</h3>
<p>Let&rsquo;s get this out of the way: service-accounts are the wrong abstraction. A service account is an impersonal, non-human principal. It&rsquo;s for a CI/CD pipeline or a backend cron job.</p>
<p>A personal AI agent is the opposite: it&rsquo;s a delegate for a <em>specific human</em>, operating on that human&rsquo;s personal data. Tying its actions to <a href="mailto:billing-reporter@gserviceaccount.com">billing-reporter@gserviceaccount.com</a> is useless. We need to tie its actions to <a href="mailto:jane.doe@gmail.com">jane.doe@gmail.com</a> but with a clear, auditable asterisk.</p>
<h3 id="the-fix-delegated-auth-with-an-actor-claim">The Fix: Delegated Auth with an actor Claim</h3>
<p>The fix has to happen at the identity layer to be universal and widely applicable. The major identity providers—Google, Microsoft etc—need to extend their auth protocols (think OAuth/OIDC) to support agent delegation.</p>
<p>When a user authorizes an agent, the IdP should issue a standard access token with one crucial addition: a claim that specifies the actor. Something like:</p>
<p>&ldquo;actor&rdquo;: { &ldquo;type&rdquo;: &ldquo;delegated_agent&rdquo;, &ldquo;id&rdquo;: &ldquo;agent_id_xyz&rdquo; }</p>
<p>When an agent presents this token to a resource server (like the Gmail API), the server can see two critical pieces of information:</p>
<ol>
<li><strong>The Subject (sub):</strong> The action is for <a href="mailto:jane.doe@gmail.com">jane.doe@gmail.com</a>.</li>
<li><strong>The Actor (actor):</strong> The action was performed by agent_id_xyz on Jane&rsquo;s behalf.</li>
</ol>
<p>This creates an audit trail for actions performed by an agent on behalf of a user. It also allows us to build policy around the actor. The IdP or the resource server could enforce rules like actor.type: &lsquo;agent&rsquo; cannot perform destructive actions like account.delete or password.reset.</p>
<h3 id="why-doing-this-at-the-app-layer-doesnt-work">Why doing this at the app layer doesn’t work</h3>
<p>Trying to solve this at the app layer is a non-starter. You&rsquo;ll get a thousand different, incompatible implementations, and no one will trust anyone else&rsquo;s X-Agent-ID header. The IdP is the only trustworthy source of truth for who is acting. It&rsquo;s the only entity that can cryptographically certify that a given request was performed by a legitimate, user-sanctioned delegate.</p>
<h3 id="immediate-use-case-agentic-browser-support">Immediate use-case: Agentic Browser Support</h3>
<p>The need for something like this is already apparent in today&rsquo;s agentic browsers, like Comet, or Google’s upcoming Mariner.</p>
<p>The ideal implementation is native to the browser itself. Imagine Chrome&rsquo;s profile manager having a concept of &ldquo;delegated agent sessions.&rdquo; An agentic browser like Mariner would be able to clearly distinguish actions performed by the human user from those performed by the browser agent carrying out its own plans and tasks.</p>
<p>The benefits are clear:</p>
<ul>
<li><strong>Users:</strong> Get to delegate tasks without handing over the keys to the kingdom. You get a real audit log and systemic guardrails.</li>
<li><strong>Developers:</strong> Can finally build powerful agents without resorting to janky screen scraping or insecure credential storage.</li>
<li><strong>Identity Providers:</strong> Unlock a new ecosystem of trusted third-party agents, making their platforms stickier and more powerful.</li>
</ul>
<p>Without a proper identity layer for delegation, personal AI agents will remain stuck between being glorified toys and unacceptable security risks. It&rsquo;s time to build the auth protocols for the agentic era.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Does AI Make Programming Feel Like Factory Work?</title>
      <link>http://vivekhaldar.com/articles/ai-programming-factory-work/</link>
      <pubDate>Sat, 07 Jun 2025 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/ai-programming-factory-work/</guid>
      <description>&lt;p&gt;(This blog post is derived from &lt;a href=&#34;https://www.youtube.com/watch?v=1GFiWSJBBK4&#34;&gt;this video on my YouTube channel&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://archive.ph/HVZRL&#34;&gt;The New York Times recently published an article&lt;/a&gt; about programmers at Amazon complaining that their jobs were beginning to look like warehouse work because of AI.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;At Amazon, Some Coders Say Their Jobs Have Begun to Resemble Warehouse Work
Pushed to use artificial intelligence, software developers at the e-commerce giant say they must work faster and have less time to think. Others welcome the shift.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>(This blog post is derived from <a href="https://www.youtube.com/watch?v=1GFiWSJBBK4">this video on my YouTube channel</a>.)</p>
<p><a href="https://archive.ph/HVZRL">The New York Times recently published an article</a> about programmers at Amazon complaining that their jobs were beginning to look like warehouse work because of AI.</p>
<blockquote>
<p>At Amazon, Some Coders Say Their Jobs Have Begun to Resemble Warehouse Work
Pushed to use artificial intelligence, software developers at the e-commerce giant say they must work faster and have less time to think. Others welcome the shift.</p></blockquote>
<p>Their managers are turning the screws on them, saying they should be using AI to get more done in less and less time.</p>
<blockquote>
<p>Three Amazon engineers said that managers had increasingly pushed them to use A.I. in their work over the past year. The engineers said that the company had raised output goals and had become less forgiving about deadlines.</p></blockquote>
<p>This is where the comparison with blue-collar warehouse workers comes in. These programmers are now saying that they feel like “bystanders in their own jobs”.</p>
<blockquote>
<p>The automation of coding has special resonance for Amazon engineers, who have watched their blue-collar counterparts undergo a similar transition.</p></blockquote>
<p>They&rsquo;re making the same argument that factory and warehouse workers have been making for a long time: their jobs have been stripped of all creativity and craft, becoming mechanized, repetitive, and soul-crushing.</p>
<blockquote>
<p>The new approach to coding at many companies has, in effect, eliminated much of the time the developer spends reflecting on his or her work. “It used to be that you had a lot of slack because you were doing a complicated project — it would maybe take a month, maybe take two months, and no one could monitor it,” Dr. Katz said. “Now, you have the whole thing monitored, and it can be done quickly.”</p></blockquote>
<p>“White-collar&quot; programmers are now feeling the same pressures that have been felt in mechanical factory work since the dawn of the industrial age.</p>
<p>I want to tie these recent developments back to some very old ideas that go back to the very birth of the field of software engineering itself—and hopefully shed light on some common themes that have been recurring in our field since the very beginning.</p>
<h2 id="blue-collar-coders">Blue-collar coders</h2>
<p>Back in 2013, <a href="https://vivekhaldar.com/articles/blue-collar-coders/">I wrote a blog post reacting to some prominent bloggers talking about &ldquo;blue-collar coders.&rdquo;</a> They were arguing that the work of web and software development can and should be thought of as blue-collar work.</p>
<p>Here is <a href="https://web.archive.org/web/20121231200922/https://www.dashes.com/anil/2012/10/the-blue-collar-coder.html">Anil Dash writing back in 2012</a> – he is making the case for software engineering to be treated as vocational education. &ldquo;We need web dev vo-tech”.</p>
<blockquote>
<p>High schools have long offered vocational education, preparing graduates for practical careers by making them proficient in valuable technical skill sets which they can put to use directly in the job market right after graduation. Vocational-technical schools (vo-tech) provide trained workers in important fields such as healthcare, construction trades, and core business functions like accounting. For a significant number of my high school peers, vo-tech was the best path to a professional job that would pay well over the duration of an entire career.</p></blockquote>
<blockquote>
<p>Now it’s time that vo-tech programs broadly add internet and web technologies to the mix. We need web dev vo-tech.</p></blockquote>
<p>And here is <a href="https://seldo.com/posts/software_developers_can_save_the_economy">Laurie Voss</a> making a similar argument about how knowledge workers should think of themselves more as blue-collar workers. He makes the crucial comparison to factory work and Taylorism. Voss argues for that same model to be applied to web development.</p>
<blockquote>
<p>Think about how a physical factory worked. The reason unskilled jobs in manufacturing, say, cars existed is because some very highly skilled people first got together and looked at the process of building a car and said “okay, we can automate this bit and this bit and this bit, but making machines to do this bit is way too hard”. The blue collar workers of Detroit didn’t know how to build cars; they knew how to operate one particular bit of machinery. The only people who knew how to build cars were the guys who put the machines together.</p></blockquote>
<blockquote>
<p>Now let’s try applying that model to web development, an example I pick because I know a fair bit about building web sites. Think about all the businesses in the world that have web sites, or need them built or maintained. There is an entire industry built around cranking out simple websites for small businesses, in WordPress or Drupal or a thousand proprietary solutions. This industry is making a bunch of smart freelancers a ton of cash, which is great for them individually, but terrible for the tech sector as a whole.</p></blockquote>
<p>This is an argument that can be applied to any technology that&rsquo;s fairly mature, where the methods for achieving a certain outcome or building a certain product are well-understood. It&rsquo;s not surprising that even back in 2012, when web development was already mature with a fairly well-understood stack, he would make an argument like this.</p>
<p><a href="https://vivekhaldar.com/articles/blue-collar-coders/">My old blog post</a> reacting to these two was making the opposite case. I argued that it&rsquo;s not tenable to think of software development purely as a vocational line of work, simply because of the pace at which technology changes.</p>
<blockquote>
<p>The problem with this vocational tech approach is that it implicitly assumes the knowledge gained during vocational training will be relevant for a long period of time. The pace of technology change renders that unviable.</p></blockquote>
<p>But the core philosophy that all these people are talking about is Taylorism. And Taylorism is also deeply linked to the birth of software engineering. <a href="https://vivekhaldar.com/articles/the-programming-assemblyline/">In another very old blog post</a> I reflected on Taylorism and how it relates to programming. Taylorism is a deep topic, but if you were to drastically simplify it, its core ideas are these two: you measure everything, and you separate thinking from doing.</p>
<blockquote>
<p>Briefly, Taylorism has two central tenets:</p>
<ol>
<li><strong>Measurement</strong>: associate metrics with all aspects of work.</li>
<li><strong>The separation of thinking and doing</strong>: An educated class of managers measures and plans all the work, and is responsible for the overall process, while a class of laborers carries out the implementation of those plans.</li>
</ol></blockquote>
<p>This is exactly the point Voss was making when comparing software development to what happens in a car factory. Someone thinks about, examines, and codifies a process (the thinking part), and they then bring in an army of laborers to do tiny bits of that process (the doing part).</p>
<h2 id="the-birth-of-software-engineering">The birth of software engineering</h2>
<p>Where this links up to software engineering is that back in 1968, the very term &ldquo;software engineering&rdquo; was coined at a NATO conference of the top people building computers and writing software at the time. One of the central themes the attendees were discussing was the notion of industrializing the process of building software. Doug McIlroy expressed this by saying, &ldquo;The software industry is not industrialized,&rdquo; and compared it to the mass production techniques used in physical factories.</p>
<blockquote>
<p>Software production today appears in the scale of industrialization somewhere below the more backward construction industries. I think its proper place is considerably higher, and would like to investigate the prospects for mass-production techniques in software.</p></blockquote>
<p>He was calling for a catalog of interchangeable parts with well-understood characteristics, and for applying the same methods used for physical assembly in factories to the creation of software.</p>
<blockquote>
<p>The idea of subassemblies carries over directly and is well exploited. The idea of interchangeable parts corresponds roughly to our term <code>modularity</code>, and is fitfully respected. The idea of machine tools has an analogue in assembly programs and compilers. Yet this fragile analogy is belied when we seek for analogues of other tangible symbols of mass production. There do not exist manufacturers of standard parts, much less catalogues of standard parts. One may not order parts to individual specifications of size, ruggedness, speed, capacity, precision or character set.</p></blockquote>
<p>Another lens through which you can view this entire argument is what I call the notion of <a href="https://vivekhaldar.com/articles/gui-vs-cli-operation-vs-expression/">operation versus expression</a>. The key idea is that sometimes you&rsquo;re operating a piece of machinery, and the goal is to quickly achieve some well-defined end. But other times, you&rsquo;re trying to express yourself, which goes back to the notion of looking at what you&rsquo;re doing as a craft.</p>
<p>Software engineers like to talk about how they <em>craft</em> their software. Are you operating a piece of machinery, or are you trying to express yourself and create something? This argument comes up again and again in the software industry whenever there&rsquo;s a big shift in how we build software. Even when IDEs were becoming popular, the idea that they were taking the craft away from software engineering was widely expressed. Many software engineers felt that IDEs were constraining the creative ways in which they could write software.</p>
<p>This argument is now, of course, coming up again because AI is once again fundamentally changing the way we write software. But the point of this whole rant is that going back to the very birth of the field of software engineering, we&rsquo;ve wanted to make it industrial. We&rsquo;ve wanted to make it Taylorist. And there has been a steady stream of developments—from compilers and high-level languages to IDEs and now, finally, AI—that have made us steadily march in that direction.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>The Personal Side of Jevons Paradox in the Age of AI</title>
      <link>http://vivekhaldar.com/articles/personal-side-jevons-paradox/</link>
      <pubDate>Mon, 02 Jun 2025 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/personal-side-jevons-paradox/</guid>
      <description>&lt;p&gt;Something interesting happened back in January/February of 2025. If you were watching Google Trends, you might have seen this sudden, massive spike for the term &amp;ldquo;Jevons Paradox.&amp;rdquo; Everyone, all at once, seemed to start talking about it.&lt;/p&gt;
&lt;p&gt;So, what &lt;em&gt;is&lt;/em&gt; Jevons Paradox? It’s the phenomenon where making a resource more efficient to use doesn&amp;rsquo;t actually lead to us using &lt;em&gt;less&lt;/em&gt; of it. Paradoxically, it often leads to &lt;em&gt;increased&lt;/em&gt; consumption of that very resource. Because it&amp;rsquo;s more efficient and often cheaper or more accessible, more people start using it, or they find more purposes for it, and the total consumption shoots up.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Something interesting happened back in January/February of 2025. If you were watching Google Trends, you might have seen this sudden, massive spike for the term &ldquo;Jevons Paradox.&rdquo; Everyone, all at once, seemed to start talking about it.</p>
<p>So, what <em>is</em> Jevons Paradox? It’s the phenomenon where making a resource more efficient to use doesn&rsquo;t actually lead to us using <em>less</em> of it. Paradoxically, it often leads to <em>increased</em> consumption of that very resource. Because it&rsquo;s more efficient and often cheaper or more accessible, more people start using it, or they find more purposes for it, and the total consumption shoots up.</p>
<p>Why the sudden chatter around this specific time, early 2025? A big piece of news hit around January 20, 2025: <strong>DeepSeek R1 was released</strong>. China being denied access to the most powerful NVIDIA GPUs, they had to fall back on less powerful hardware. The efficiency with which they trained that model took most AI watchers by surprise. NVIDIA’s stock took a nosedive in the couple of days following the release.</p>
<p>But apart from the plate tectonics of AI, there&rsquo;s a very personal side to this.</p>
<p><a href="https://substack.com/@contraptions/note/c-108501320">Venkatesh Rao put it perfectly in a note</a>:</p>
<blockquote>
<p>Good sign that AI Jevons paradox has kicked in properly. I’m working much harder than before AI. It’s now clear that I was lazy and low productivity before because I couldn’t afford serfs/graduate student assistants.</p></blockquote>
<p>Those “graduate student assistants” he’s referring to are the latest AI models, of course, especially the reasoning variety like O3 and Gemini 2.5 Pro.</p>
<p><a href="https://fakepixels.substack.com/p/jevons-paradox-a-personal-perspective">Tina He wrote a lovely, insightful piece on her Substack</a>, and she nails this personal pressure.</p>
<blockquote>
<p>When your productivity increases, several mechanisms kick in simultaneously: Leisure’s opportunity cost skyrockets. When an hour of work generates what once took days, rest becomes luxury taxed by your own conscience. Every pause carries an invisible price tag that flickers in your peripheral vision&hellip; The game theory is unforgiving: when everyone can produce 10x more, the baseline resets, leaving us all running faster just to stay in place.</p></blockquote>
<p>It’s this feeling that if AI can do so much for you, every moment you&rsquo;re <em>not</em> directing it, you&rsquo;re falling behind. The output potential is so high that the cost of leisure feels enormous.</p>
<p>Somewhat ironically, the frontier model labs themselves, perhaps unwittingly, are encouraging this. Take a look at Anthropic’s &ldquo;<a href="https://www.anthropic.com/engineering/claude-code-best-practices">Claude Code: Best practices for agentic coding</a>”. They suggest a workflow:</p>
<blockquote>
<p>Create 3-4 git checkouts in separate folders. Open each folder in separate terminal tabs. Start Claude in each folder with different tasks. Cycle through to check progress and approve/deny permission requests.</p></blockquote>
<p>This is literally parallelizing your work with AI agents, requiring you to manage multiple streams. It reminded me of a short-order cook frantically running between pans on the fire.</p>
<p><a href="https://x.com/vivekhaldar/status/1914046459877708033">I asked on X</a>:</p>
<blockquote>
<p>Question is — why do you need human SWEs to carry out these steps and babysit the AI? Or until when?</p></blockquote>
<p>The trend towards AI working even when <em>we&rsquo;re</em> not actively directing it is growing. OpenAI introduced scheduled tasks in ChatGPT a few months ago. The AI can be working tirelessly, even without our direct, real-time input.</p>
<p>The folks from Letta AI (aka MemGPT) took this even further with their paper on &ldquo;<a href="https://arxiv.org/pdf/2504.13171">Sleep-time Compute: Beyond Inference Scaling at Test-time</a>:</p>
<blockquote>
<p>&hellip;allows models to “think” offline about contexts before queries are presented; by anticipating what queries users might ask and pre-computing useful quantities, we can significantly reduce the compute requirements at test-time.</p></blockquote>
<p>So, the AI is pre-processing, anticipating, constantly churning in the background. If you start doing this, the appetite for hardware, for GPUs, is basically going to be insatiable because there&rsquo;s no real upper bound on how much you could anticipate and pre-compute.</p>
<p>This all reminds me of a recent <a href="https://www.youtube.com/watch?v=GT_sXIUJPUo">podcast with Tyler Cowen where he was asked about the bottlenecks to AI progress</a>. His answer was blunt. The interviewer, Dwarkesh Patel, asked, &ldquo;What are the specific bottlenecks?&rdquo;</p>
<blockquote>
<p>Humans. Here they are. Bottleneck, bottleneck. Hi. Good to see you. And some of you are terrified. You’re going to be even bigger bottlenecks.</p></blockquote>
<p>So, where does that leave us? In this world where Jevons Paradox at the personal level just seems to squeeze our time more and more, what’s the play? I love how Tina He framed it in the conclusion of her essay:</p>
<blockquote>
<p>This may be the good news for those that didn’t dare to fully lean into what they love and want to do. What if the most game-optimal play in the new system is actually to become relentlessly, unapologetically you?</p></blockquote>
]]></content:encoded>
    </item>
    
    <item>
      <title>The Programmer&#39;s Climb</title>
      <link>http://vivekhaldar.com/articles/programmers-climb/</link>
      <pubDate>Sat, 26 Apr 2025 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/programmers-climb/</guid>
      <description>&lt;p&gt;As a computer science undergrad in the mid-90s, my “Introduction to Programming” course in the very first semester was modeled after the legendary “Structure and Interpretation of Computer Programs” by Abelson and Sussman.&lt;/p&gt;
&lt;p&gt;For a quarter-century at MIT, Abelson, Sussman, and colleagues used Scheme to teach freshmen how to manufacture abstractions almost artisanally from scratch. Rooted in the Lisp ethos, the premise was that by understanding a handful of primitives and mastering a small set of combinators, students could build a platonic ladder of abstractions—a veritable cathedral of computation—and still reason about every brick. This pedagogical approach involved first creating abstractions to model the problem domain, effectively designing a custom language in which the final solution could then be expressed cleanly, almost self-evidently.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>As a computer science undergrad in the mid-90s, my “Introduction to Programming” course in the very first semester was modeled after the legendary “Structure and Interpretation of Computer Programs” by Abelson and Sussman.</p>
<p>For a quarter-century at MIT, Abelson, Sussman, and colleagues used Scheme to teach freshmen how to manufacture abstractions almost artisanally from scratch. Rooted in the Lisp ethos, the premise was that by understanding a handful of primitives and mastering a small set of combinators, students could build a platonic ladder of abstractions—a veritable cathedral of computation—and still reason about every brick. This pedagogical approach involved first creating abstractions to model the problem domain, effectively designing a custom language in which the final solution could then be expressed cleanly, almost self-evidently.</p>
<p>At that point I’d been programming in BASIC (including its more modern variants like Visual Basic) and Pascal for a few years through middle and high school. The concept of functional programming was alien and jarring to me. But soon it clicked for me, and this way of approaching programming in an almost algebraic way grew on me.</p>
<p>When MIT moved from Scheme to Python for teaching its own introductory CS course (6.001) in 2007 it was news in academic CS circles. It was a signal of the way programming was changing, or already had changed, by the early 2000s.</p>
<p>This wasn&rsquo;t a sudden coup or a rejection of SICP&rsquo;s profound ideas. To their credit, Abelson and Sussman themselves had advocated for a change, recognizing that the landscape of programming, and therefore the essential skills required of engineers, had fundamentally shifted.</p>
<p>This transition, like the earlier <a href="https://vivekhaldar.com/articles/when-compilers-were-the--ai--that-scared-programmers">move from assembly to high-level languages</a>, offers another valuable lens through which to understand the evolution of our craft – another one of which is happening before our eyes today with the rise of AI-assisted coding.</p>
<h2 id="the-motivation">The motivation</h2>
<p>As Gerald Sussman himself explained <a href="https://wingolog.org/archives/2009/03/24/international-lisp-conference-day-two#:~:text=was%20a%20gem,techniques%20to%20compose%20them%20into">in a 2009 talk</a>:</p>
<blockquote>
<p>In 1980, good programmers spent a lot of time thinking, and then produced spare code that they thought should work. Code ran close to the metal, even Scheme &ndash; it was understandable all the way down. Like a resistor, where you could read the bands and know the power rating and the tolerance and the resistance and $V=IR$ and that&rsquo;s all there was to know. 6.001 had been conceived to teach engineers how to take small parts that they understood entirely and use simple techniques to compose them into larger things that do what you want.</p></blockquote>
<blockquote>
<p>But programming now isn&rsquo;t so much like that&hellip; Nowadays you muck around with incomprehensible or nonexistent man pages for software you don&rsquo;t know who wrote. <strong>You have to do basic science on your libraries to see how they work,</strong> trying out different inputs and seeing how the code reacts. This is a fundamentally different job, and it needed a different course.</p></blockquote>
<p>The original SICP approach emphasized deep understanding, achieved by carefully composing systems layer by layer from fundamental building blocks like recursion and higher-order procedures, allowing theoretical mastery of the entire stack.</p>
<p>However, the reality of professional software development had shifted dramatically. It was becoming less about constructing every component yourself and more about integrating large, complex libraries—often opaque black boxes with imperfect documentation. Consequently, the crucial skill evolved from pure logical construction towards empirical investigation—needing to perform &ldquo;basic science&rdquo; just to discover how these external systems behaved. To continue teaching only purity and first principles started to feel disconnected; the core task was becoming one of interrogating and orchestrating complex, pre-existing tools, not just building everything from scratch.</p>
<p>Hal Abelson agreed. Both authors had been <a href="https://mitadmissions.org/blogs/entry/the_end_of_an_era_1/">lobbying to replace 6.001 for years</a> before the final curtain in Fall 2007.</p>
<h2 id="the-choice-of-python">The choice of Python</h2>
<p>The replacement course, 6.01, was deliberately centered on the challenges of programming robots to navigate the physical world. This focus was chosen because robots serve as the antithesis of the idealized, predictable components studied in SICP; their wheels slip, sensors yield noisy or inaccurate data, environments change unexpectedly, and all predictive models are mere approximations. Tackling robotics therefore forced students to grapple with a different kind of engineering complexity, emphasizing the need to build systems incorporating robustness, feedback mechanisms, and probabilistic reasoning to handle inherent real-world uncertainty and failure, rather than focusing solely on Platonic elegance.</p>
<p>And why Python? Sussman&rsquo;s explanation was pragmatic: it had <a href="https://wingolog.org/archives/2009/03/24/international-lisp-conference-day-two">readily available libraries for interfacing with the robotics hardware they were using</a>. This highlights Python&rsquo;s &ldquo;batteries included&rdquo; philosophy – its strength lies in its vast ecosystem of libraries for tackling real-world tasks, even if one doesn&rsquo;t understand the internals of every library used. The focus shifted towards using available tools to solve practical problems, mirroring the professional landscape.</p>
<h2 id="lessons-for-today">Lessons for today</h2>
<p>The earlier transition from hand-written assembly to high-level languages and compilers is another example of a major change in the way programs were created. It automated low-level machine details via compilers. It raised the level of abstraction, allowing programmers to focus more on logic and less on managing registers and memory addresses. <a href="https://vivekhaldar.com/articles/when-compilers-were-the--ai--that-scared-programmers/">Back then, programmers initially resisted compilers fiercely</a>, fearing deskilling, loss of efficiency and control. But compilers opened programming to a broader audience, reshaping the role of programmers and greatly expanding software&rsquo;s scope and impact.</p>
<p>Similarly, the transition from Scheme to Python (even in an academic context) marked another profound phase shift, driven by practical necessity as programming evolved from theoretical elegance toward empirical complexity. Today, we’re in the middle of yet another such shift—AI-assisted programming.</p>
<p>Just as Python freed programmers from reinventing wheels, AI-powered coding tools such as GitHub Copilot, Cursor, and Aider liberate us further from mechanical coding details. This arguably pushes the programmer&rsquo;s role <em>further</em> up the abstraction stack. The &ldquo;basic science&rdquo; Sussman described might now involve prompting for, verifying, debugging, and integrating AI-generated code, and focusing even more on high-level design, architecture, and requirements. <strong>Tool literacy is beginning to beat syntax mastery</strong>.</p>
<p>Yet, just as with previous shifts, programmers today voice similar concerns: loss of control, deskilling, uncertainty around code quality, and fear of diminished roles.</p>
<p>But history offers reassurance: each phase shift in programming hasn&rsquo;t diminished the profession, but elevated it. Assembly programmers feared compilers but ended up focusing on high-level problem-solving instead of machine instructions. Scheme purists might have lamented Python’s practicality-over-purity approach, yet today’s programmers grapple with much richer complexities, enabled by the vast ecosystems of Python and other modern languages.</p>
<p>Academia is also beginning to grapple with this, with every major CS department scrambling to understand how to teach “Intro to CS/Programming” (and even <a href="https://youtu.be/HwW16r4B-UA">intermediate courses</a>) when the latest <a href="https://youtu.be/-PJkkDpyqac">LLM one-shots into the top quartile of the class</a>. <strong>Pedagogy must follow practice.</strong> If freshmen arrive with ChatGPT open in another tab, pretending it doesn’t exist is as futile as ignoring Python and its “batteries-included” packages in 2007.</p>
<p>Ultimately, each technological leap—from compilers automating machine code to Python&rsquo;s libraries simplifying integration, and now to AI generating code—has freed human programmers to operate at higher levels of abstraction and tackle more complex problems. The future is programmers <em>amplified.</em></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Dijkstra would’ve (incorrectly) HATED vibe-coding</title>
      <link>http://vivekhaldar.com/articles/dijkstra-vibe-coding/</link>
      <pubDate>Fri, 11 Apr 2025 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/dijkstra-vibe-coding/</guid>
      <description>&lt;p&gt;Edsger W. Dijkstra was one of the greats of computing, responsible for large parts of the way we write programs today. He was an early champion of structured programming. His missive &lt;a href=&#34;https://youtu.be/9Ma-Q_8d4bA&#34;&gt;“GOTO considered harmful”&lt;/a&gt; now seems blindingly obvious, but was against the grain of programming at the time (which is why he had to write it!).&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.cs.utexas.edu/~EWD/transcriptions/EWD06xx/EWD667.html&#34;&gt;In one of his missives he makes the case against using natural language for programming&lt;/a&gt;:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Edsger W. Dijkstra was one of the greats of computing, responsible for large parts of the way we write programs today. He was an early champion of structured programming. His missive <a href="https://youtu.be/9Ma-Q_8d4bA">“GOTO considered harmful”</a> now seems blindingly obvious, but was against the grain of programming at the time (which is why he had to write it!).</p>
<p><a href="https://www.cs.utexas.edu/~EWD/transcriptions/EWD06xx/EWD667.html">In one of his missives he makes the case against using natural language for programming</a>:</p>
<p><strong>Formal language/notation is precise!</strong> And it has precise rules for <em>composition</em> which enable stating complex ideas clearly.</p>
<blockquote>
<p>The virtue of formal texts is that their manipulations, in order to be legitimate, need to satisfy only a few simple rules; they are, when you come to think of it, an amazingly effective tool for ruling out all sorts of nonsense that, when we use our native tongues, are almost impossible to avoid.</p></blockquote>
<p><strong>Math took off only after it shed the ambiguity of natural language</strong></p>
<blockquote>
<p>Greek mathematics got stuck because it remained a verbal, pictorial activity&hellip; and the modern civilized world could only emerge &hellip; when Western Europe could free itself from the fetters of medieval scholasticism &hellip; thanks to the carefully, or at least consciously designed formal symbolisms that we owe to people like Vieta, Descartes, Leibniz, and (later) Boole.</p></blockquote>
<p><strong>The trap of unknown imprecision</strong>. Natural language lets us make statements that <em>sound</em> reasonable, but don’t hold up to rigorous scrutiny.</p>
<blockquote>
<p>When all is said and told, the &ldquo;naturalness&rdquo; with which we use our native tongues boils down to <strong>the ease with which we can use them for making statements the nonsense of which is not obvious.</strong></p></blockquote>
<p>In other words, a rigorous formal notation <em>forces</em> clarity and precision, which is hard work, but the return is a reliable, dependable and correct system.</p>
<p><strong>Will natural language actually be easier?</strong></p>
<blockquote>
<p>a change of interface can easily increase at both sides of the fence the amount of work to be done (even drastically so). Hence the increased preference for what are now called &ldquo;narrow interfaces&rdquo;. Therefore, although changing to communication between machine and man conducted in the latter&rsquo;s native tongue would greatly increase the machine&rsquo;s burden, <strong>we have to challenge the assumption that this would simplify man&rsquo;s life</strong>.</p></blockquote>
<p>This is a subtle but crucial point. When using any interface between human and computer, there is some work that both parties have to do. For example, with a structured programming language, the human must do the work of converting their thoughts into a syntactically correct program, and the computer  (compiler) does the work of translating it for and executing it on the machine.</p>
<p>But the nature of the interface itself also creates an overhead for both parties to manage and interpret the communication happening over that interface. This overhead includes:</p>
<ul>
<li><strong>Specification Cost</strong>: The effort needed to clearly articulate intent across the interface.</li>
<li><strong>Interpretation/Translation Cost</strong>: The computational or cognitive effort to parse, understand, and translate instructions received via the interface.</li>
<li><strong>Verification Cost</strong>: The effort to ensure the communication was successful and the intended semantics were preserved.</li>
<li><strong>Ambiguity Resolution Cost</strong>: The effort spent dealing with underspecified or potentially misinterpreted communications.</li>
</ul>
<p>At first glance, the move to using natural language seems like it would drastically reduce the human’s effort (they wouldn’t have to write code anymore!) at the expense of drastically increasing the computation required.</p>
<p>Dijkstra’s argument is that the <em>reduction</em> in precision, the <em>increase</em> in ambiguity, and the resultant <em>increase</em> in the human&rsquo;s burden to manage that ambiguity and verify correctness mean that the overall human effort could easily increase, potentially outweighing any perceived benefit from not having to learn a formal syntax. (This argument is similar to the one from the “<a href="https://www.youtube.com/watch?v=YgKLOu9f0sI">Ironies of Automation</a>”: increasing the automation in a machine can <em>increase</em> the human operator’s cognitive load.)</p>
<p>That’s a pretty damning critique if applied to the vibe-coding style of programming today. He would have <em>absolutely hated</em> vibe-coding.</p>
<p>I agree completely with Dijkstra’s argument when it comes to the advantages of formal notation, but I still think vibe-coding (or AI-assisted coding, which is largely natural-language driven) is a net benefit for building applications today.</p>
<hr>
<p>Dijkstra is talking about <strong>correctness</strong>, which rightly was the focus of early computer science. When writing code for algorithms (sorting, graphs) or basic systems (OS kernels, compilers) one needed to be precise and rigorous to get confidence in the correctness of the code implementing the algorithm.</p>
<p>The basic high-stakes layers of computing (CPU instruction sets, operating systems, compilers, interpreters) are fairly settled by now, and were built with a lot of rigor. They are as “correct” and reliable as is possible to make them with human engineering.</p>
<p>(Aside: note that the modern computing stack got quite reliable, but largely without formal proofs. C.A.R. Hoare <a href="https://link.springer.com/chapter/10.1007%2F3-540-60973-3_77">writes about it here</a> (<a href="https://youtu.be/eY8AyCZ5uUg">video</a>), and attributes it to treating programming as an <em>engineering</em> discipline, with thorough reviews and lots of testing.)</p>
<p><strong>But the apps we&rsquo;re building today do not have a clear notion of correctness</strong>. Often &ldquo;correctness&rdquo; is discovered during building, testing and releasing the app. Think of social media apps, or CRUD enterprise apps full of tangled biz logic. How would you define “correctness” for such applications? There is a notion of “meeting the specification”, but:</p>
<p><strong>The business specification for modern software is in natural language, not a formal one.</strong> Product managers and business owners write their &ldquo;specs&rdquo;, such as they are, in natural language. There is no formalism in which to ground the process. That imprecise natural language is taken by system architects and software engineers and turned into software, which <em>does</em> have a formal, executable language.</p>
<p>The specifiers (i.e. product managers or business owners) and the builders (designers, programmers) perform an iterative dance amongst themselves and the application to arrive at the behavior they collectively deem acceptable in their context.</p>
<p>Consider the absurdity of the counter-factual: if modern applications did have a clear notion of correctness, product managers would throw a PRD over the wall to engineering, and would never need to be spoken with again.</p>
<p>The modern activity of software engineering is more about <strong>discovery</strong> and <strong>evolution</strong> than building to a static specification. It also largely consists of snapping components together (<a href="https://www.cs.dartmouth.edu/~doug/components.txt">the long-cherished dream of software engineering</a>). Databases and web frameworks exist–you need to smush your business logic in the middle and build a differentiated user experience.</p>
<p>For such a scenario, AI-assisted coding that lets you quickly build an MVP, quickly change it, and do all that with a natural-language driven interface, is a boon. As folks like <a href="https://www.youtube.com/watch?v=AM0ZzkLDsYw">Claire Vo</a> and <a href="https://www.youtube.com/watch?v=EBosnqXWxYI">Sahil Lavingia</a> are pointing out, the well-known roles of PM, eng, UX are collapsing into one. An end-to-end “product engineer” can spec, design and build an application, using a fraction of the headcount (usually just themselves!) and time previously required.</p>
<p>The argument for the necessity of formal notation and the benefits of AI-assisted vibe-coding apply to very different layers in the computing stack. Use appropriately.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>The case against local LLMs</title>
      <link>http://vivekhaldar.com/articles/the-case-against-local-llms/</link>
      <pubDate>Sat, 29 Mar 2025 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-case-against-local-llms/</guid>
      <description>&lt;p&gt;As a geek, I love the idea of running LLMs locally, and owning my entire AI stack without depending on cloud APIs. I run LLMs locally with Ollama all the time. I’d love to see a world where the intelligence that these models provide is democratized, cheap and plentiful.&lt;/p&gt;
&lt;p&gt;But if I think about it objectively there are several reasons local LLMs going mainstream might not happen.&lt;/p&gt;
&lt;h2 id=&#34;widely-used-utilities-want-to-be-centralized&#34;&gt;Widely used utilities want to be centralized&lt;/h2&gt;
&lt;p&gt;In the early days of electricity, factories generated their own electricity on-site. This phase was relatively short-lived, giving way to the centralized power grid we have now. The same thing happened with water, trash disposal, manufactured goods and pretty much every staple of modern life.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>As a geek, I love the idea of running LLMs locally, and owning my entire AI stack without depending on cloud APIs. I run LLMs locally with Ollama all the time. I’d love to see a world where the intelligence that these models provide is democratized, cheap and plentiful.</p>
<p>But if I think about it objectively there are several reasons local LLMs going mainstream might not happen.</p>
<h2 id="widely-used-utilities-want-to-be-centralized">Widely used utilities want to be centralized</h2>
<p>In the early days of electricity, factories generated their own electricity on-site. This phase was relatively short-lived, giving way to the centralized power grid we have now. The same thing happened with water, trash disposal, manufactured goods and pretty much every staple of modern life.</p>
<p>The Web and its underlying protocols were also motivated by the idea of enabling decentralized control and ownership. But the Web of today is centralized to a few large providers, with billions of users.</p>
<p>There will always be geeks who will host and serve their own email and website, and it is a beautiful thing that that is possible. The protocols are open for anyone to participate in, and web and email servers are open-source and freely available. But the vast majority of people will want shrink-wrapped solutions.</p>
<p>So just looking at the historical trend of how similar technologies have tended to end up with centralized structures (even if they could be decentralized), it’s not looking good for the local-LLMs argument.</p>
<p>Which brings me to my second point&hellip;</p>
<h2 id="centralized-management-is-about-labor-not-control">Centralized management is about labor, not control</h2>
<p>The desire to decentralize is often motivated by having control&ndash; control over that particular component (electricity, a server, a model etc). But the more important factor is labor.</p>
<p>Owning and controlling a thing takes constant labor. Sure, you could run and maintain your own email and web server. Are you ready for the care and feeding of the surrounding infrastructure? The electricity, the network, the storage? What about configuration, keeping up with updates and security patches? There’s a reason operating the physical and software aspects of running a datacenter is a full-time job.</p>
<p>The same argument applies to local LLMs. It’s rarely about just the LLM. You also need all the surrounding infrastructure, both physical (hardware, network etc) and software (what is the app layer around the LLM?).</p>
<p>The question for you is whether you want to spend your labor on all that, or something else. What is the opportunity cost?</p>
<h3 id="about-efficiency-and-cost">About efficiency and cost</h3>
<p>I haven’t seen any rigorous studies making the comparison, but I’d be very surprised if from an efficiency and cost point of view local LLMs beat out a large datacenter that aggregates demand and has economies of scale.</p>
<p>An anecdotal data point: the M3 Ultra Mac Studio with 512 GB of RAM, the current cream of the crop for running large-ish LLMs locally, costs $8549, or $712 per month for 12 months (before taxes). I bet if you sent the collected works of Shakespeare back and forth to the latest and greatest LLM API all day every day for a year, your API bill would be a fraction of that.</p>
<h2 id="value-moves-up-the-stack-away-from-utilities">Value moves up the stack, away from utilities</h2>
<p>If you’re building a mobile or web app, the valuable and differentiated part is the user experience, domain knowledge and the problem being solved. The database or web framework you used is a non-differentiated commodity. It can be swapped out relatively easily.</p>
<p>The same goes for apps built around LLMs. They’re like the jet engines in an airliner: important and necessary, but only a small part of the entire experience and value.</p>
<p>Hotrodders build beautiful cars in their garage, and have a great time doing it. I do want a world where local LLMs are available to the geeks and builders and experimenters to play and build with. I just don’t think local will be the mainstream way they are consumed.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>  &#34;But LLMs are not deterministic!&#34;
  </title>
      <link>http://vivekhaldar.com/articles/-but-llms-are-not-deterministic--/</link>
      <pubDate>Fri, 28 Mar 2025 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/-but-llms-are-not-deterministic--/</guid>
      <description>&lt;p&gt;The most common retort to my &lt;a href=&#34;https://vivekhaldar.com/articles/llms-are-compilers/&#34;&gt;“LLMs are compilers”&lt;/a&gt; framing is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“… but compilers are deterministic, LLMs just generate probabilistic output!”&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;I think that retort is &lt;a href=&#34;https://en.wikipedia.org/wiki/Not_even_wrong&#34;&gt;not even wrong&lt;/a&gt;, and I’ll explain why.&lt;/p&gt;
&lt;p&gt;The analogy’s central idea was not that LLMs replicate every characteristic of compilers, but that using natural-language-driven LLMs is another large step up in &lt;strong&gt;abstraction&lt;/strong&gt;. Traditional compilers enabled programmers to express themselves in high-level languages instead of assembly. Similarly, LLMs empower programmers to &lt;strong&gt;express their intent directly in natural language&lt;/strong&gt;, translating it into code.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The most common retort to my <a href="https://vivekhaldar.com/articles/llms-are-compilers/">“LLMs are compilers”</a> framing is:</p>
<blockquote>
<p>“… but compilers are deterministic, LLMs just generate probabilistic output!”</p></blockquote>
<p>I think that retort is <a href="https://en.wikipedia.org/wiki/Not_even_wrong">not even wrong</a>, and I’ll explain why.</p>
<p>The analogy’s central idea was not that LLMs replicate every characteristic of compilers, but that using natural-language-driven LLMs is another large step up in <strong>abstraction</strong>. Traditional compilers enabled programmers to express themselves in high-level languages instead of assembly. Similarly, LLMs empower programmers to <strong>express their intent directly in natural language</strong>, translating it into code.</p>
<p>Let’s examine the “but they’re not deterministic!” argument closely:</p>
<p>The entire field of engineering revolves around combining <strong>unreliable, unpredictable components</strong> into <strong>reliable, predictable systems</strong>. This principle is foundational in computer systems as well, best described in the classic paper <a href="https://youtu.be/dE699lHDW7I">“End-to-end Arguments in System Design”</a>. All modern computers are built on this philosophy, achieving reliability through layered abstractions and error-handling.</p>
<p>Building robust systems with LLMs follows the same approach. Developers can introduce reliability and predictability through techniques such as:</p>
<ul>
<li>Writing clear, detailed specifications</li>
<li>Utilizing tests and functional checks to validate outputs</li>
<li>Employing feedback loops (including human-in-the-loop validation) to enforce correctness</li>
</ul>
<p>In fact, many components of contemporary computer systems already exhibit fundamental non-determinism at both hardware and software levels. Some examples:</p>
<ul>
<li><strong>Library dependencies</strong>: External libraries your code relies upon may update unexpectedly, introducing changes outside your control.</li>
<li><strong>Garbage collection</strong>: Runtime memory management is inherently unpredictable—triggering at different times depending on complex internal states.</li>
<li><strong>Multi-threading and concurrency</strong>: Thread execution order, timing, and context-switching are unpredictable, yet managed through synchronization mechanisms to create deterministic outcomes.</li>
<li><strong>JIT compilation</strong>: Modern runtimes dynamically decide whether and how aggressively to compile bytecode based on real-time data and usage patterns.</li>
<li><strong>Caching</strong>: Cache behavior (hits, misses, eviction policies) is non-deterministic due to dependence on system state and usage patterns.</li>
</ul>
<p>Modern computing is built around turning non-deterministic components into deterministic experiences for users.</p>
<p>We can—and should—apply precisely the same strategy to LLMs. This is especially straightforward in programming, where we have the luxury of a clear and quick reward function: <strong>run the generated code and validate it against intended outcomes</strong>.</p>
<p>Rather than viewing non-determinism as a disqualifier for LLMs, we should embrace it as simply another characteristic to manage—just as we’ve always done in computing.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>End-user Abstraction</title>
      <link>http://vivekhaldar.com/articles/end-user-abstraction/</link>
      <pubDate>Sun, 23 Mar 2025 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/end-user-abstraction/</guid>
      <description>&lt;p&gt;I was watching some old &lt;a href=&#34;http://youtube.com/watch?v=XvDZLjaCJuw&#34;&gt;UNIX&lt;/a&gt; &lt;a href=&#34;http://youtube.com/watch?v=tc4ROCJYbm0&#34;&gt;videos&lt;/a&gt; the other day. AT&amp;amp;T must have made them as PR back in the day. They seem fresh and timely even today, forty years later, like one of those classic rock albums that never sounds stale.&lt;/p&gt;
&lt;p&gt;They were showing example after example of end-users &amp;ndash; almost everyone at AT&amp;amp;T, even the non-technical staff &amp;ndash; using the shell and writing shell scripts to compose complex functionality out of simple programs. The Unix philosophy in action!&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I was watching some old <a href="http://youtube.com/watch?v=XvDZLjaCJuw">UNIX</a> <a href="http://youtube.com/watch?v=tc4ROCJYbm0">videos</a> the other day. AT&amp;T must have made them as PR back in the day. They seem fresh and timely even today, forty years later, like one of those classic rock albums that never sounds stale.</p>
<p>They were showing example after example of end-users &ndash; almost everyone at AT&amp;T, even the non-technical staff &ndash; using the shell and writing shell scripts to compose complex functionality out of simple programs. The Unix philosophy in action!</p>
<p>This was more than the still-elusive goal of &ldquo;end-user programming&rdquo; &ndash; it was end-user <strong>abstraction</strong>! They were building up abstractions, and it was making them more productive!</p>
<p>It&rsquo;s sad to see the loss of that notion of composability when it comes to GUIs. Modern GUIs just don&rsquo;t have that compositional layer. You can&rsquo;t compose GUIs. You can&rsquo;t script GUIs. You&rsquo;re just stuck operating them. And it&rsquo;s not because something prevents that in principle. It was just never a priority for the builders of these giant programs.</p>
<p>It&rsquo;s funny that after all these decades of GUIs being the dominant computing interaction model, we&rsquo;re finally &ldquo;scripting&rdquo; them with AI <a href="https://www.anthropic.com/news/3-5-models-and-computer-use">computer</a> <a href="https://openai.com/index/computer-using-agent/">use</a> models.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>AI coding - From Tactics to Strategy</title>
      <link>http://vivekhaldar.com/articles/ai-coding---from-tactics-to-strategy/</link>
      <pubDate>Fri, 28 Feb 2025 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/ai-coding---from-tactics-to-strategy/</guid>
      <description>&lt;p&gt;One of the pitfalls of being an early adopter of AI-coding tools like Copilot is that you anchor on early patterns, and don&amp;rsquo;t push the model hard enough today. For example, early Copilot usage was focused on line, paragraph or simple method completion. It popularized &amp;ldquo;comment-oriented&amp;rdquo; programming, where you&amp;rsquo;d start by writing a somewhat detailed comment and Copilot would generate it for you.&lt;/p&gt;
&lt;p&gt;The overall philosophy was still one of hand-writing code, but with lots of help from the model. I call this the &lt;em&gt;tactical era of AI-driven coding&lt;/em&gt;, based on roughly GPT-3.5/4-class models.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>One of the pitfalls of being an early adopter of AI-coding tools like Copilot is that you anchor on early patterns, and don&rsquo;t push the model hard enough today. For example, early Copilot usage was focused on line, paragraph or simple method completion. It popularized &ldquo;comment-oriented&rdquo; programming, where you&rsquo;d start by writing a somewhat detailed comment and Copilot would generate it for you.</p>
<p>The overall philosophy was still one of hand-writing code, but with lots of help from the model. I call this the <em>tactical era of AI-driven coding</em>, based on roughly GPT-3.5/4-class models.</p>
<p>We&rsquo;re now firmly in the <em>strategic era of AI-driven coding</em>, with agent-modes widely available in Cursor and VS Code, and even on the command-line with <a href="https://aider.chat">Aider</a>, Claude Code etc.</p>
<p>This enables <a href="https://x.com/karpathy/status/1886192184808149383">vibe coding</a>, and moving the level of programming even higher in abstraction, encouraging <a href="https://vivekhaldar.com/articles/spec-driven-vibe-coding/">starting with specs</a>. Another mode is <a href="https://news.ycombinator.com/item?id=43164561">test-driven development</a>: &ldquo;Claude is really good at test driven development, so we often ask Claude to write tests first and then ask Claude to iterate against the tests​&rdquo;.</p>
<p>The philosophy is to treat hand-editing code (&ldquo;artisanal hand-crafted commits&rdquo;!) as a last resort. <em>Context is king!</em> The more context, the better. It could be specs, background info, existing code, library documentation, or even multi-model input like images, video or sound.</p>
<p>The role of the programmer is shifting towards guiding strategic aka agentic coding with the right context.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Human evals are outsourced vibe checks</title>
      <link>http://vivekhaldar.com/articles/human-evals-are-outsourced-vibe-checks/</link>
      <pubDate>Sun, 23 Feb 2025 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/human-evals-are-outsourced-vibe-checks/</guid>
      <description>&lt;p&gt;Engineering has always been about measurement and evaluation. But when it comes to LLMs, traditional approaches to evaluation don’t work as cleanly as they do for other software systems.&lt;/p&gt;
&lt;p&gt;Of course, evals and benchmarks are an important signal (perhaps the only signal) of raw capability. They show us improvement over time. The fact that many of the original benchmarks from a year or so ago are at or near saturation also tells us a lot.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Engineering has always been about measurement and evaluation. But when it comes to LLMs, traditional approaches to evaluation don’t work as cleanly as they do for other software systems.</p>
<p>Of course, evals and benchmarks are an important signal (perhaps the only signal) of raw capability. They show us improvement over time. The fact that many of the original benchmarks from a year or so ago are at or near saturation also tells us a lot.</p>
<p>But if <a href="https://every.to/divinations/llms-are-the-new-cpus">LLMs are the new CPUs</a>, there is an important difference between the way old-school CPU benchmarks (SPECInt, GeekBench etc) were interpreted, and how we should interpret LLM benchmarks.</p>
<p>The translation of CPU benchmarks to performance on real-world apps was objective. A higher SPECInt score, for example, translated to an objectively measurable and valuable metric like transaction throughput or request latency.</p>
<p>Unlike CPU benchmarks, where better performance directly translates to measurable improvements in real-world applications, LLM benchmarks don’t always correlate neatly with real-world utility. Why? Because the success of LLM outputs is often inherently subjective.</p>
<p>Take, for example, a common LLM use-case: summarization. However, in your particular application, summarization might mean something very specific. Maybe you want summaries that emphasize only some aspects of the input, or are always within a certain length range. The metric for success itself is fuzzy. This subjectivity isn’t just a quirk of summarization—it’s a pattern across many LLM applications. That’s why evaluation often relies on human judgment.</p>
<p>There are two common ways of measuring adherence to such criteria: either use LLM-as-a-judge, or human evals. When the developer of the application in question runs a few inputs and subjectively evaluates the output, it is called a &ldquo;vibe check&rdquo;. Human evals are vibe-checks outsourced to multiple humans, at scale.</p>
<p>Note that this is not true of all ML models. A fraud-detection or spam classification model might be probabilistic (just like LLMs) but it still has an objectively measurable success rate in terms of false and true positives. It&rsquo;s just that the kinds of applications LLMs are currently used for anchor heavily on natural language understanding and interpretation, which is naturally resistant to clear-cut objective measures.</p>
<p>If your company or organization is fortunate enough to afford regular human evals on a subset of your traffic, I recommend the following: pick a small subset of your human evals, roughly split between positive and negative judgments. Get your leads together in a room and go through each human judgment. Watch as they all disagree with each other and the human evaluator on the judgment, and as your naive notion that human evals were some sort of golden signal goes down in flames like the Hindenburg.</p>
<p>So what can we do? How can we judge fit-for-purpose and do internal hill climbing for LLM-driven applications?</p>
<p>Embrace the vibe-checks, but be structured about it. Develop a small, representative set of inputs for the particular problem your application is solving. The number doesn&rsquo;t have to be large&ndash; even tens of samples get you pretty far. Then, rather than have golden answers (which are brittle and don&rsquo;t accommodate change very well), document the <strong>properties</strong> you&rsquo;d like to see in the outputs. This should give you a good feel for whether your prompt engineering or model changes or agentic loops are giving you better answers.</p>
<p>Since traditional benchmarking doesn’t work well for LLM-driven applications, we have to lean into subjective evaluation. But instead of relying on gut feelings, we can make subjective evaluation a bit more systematic.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Writing is building, but software is now content</title>
      <link>http://vivekhaldar.com/articles/writing-is-building--but-software-is-now-content/</link>
      <pubDate>Sun, 23 Feb 2025 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/writing-is-building--but-software-is-now-content/</guid>
      <description>&lt;p&gt;The other day I was listening to a podcast in which &lt;a href=&#34;https://youtu.be/IsZh-nLyfBA?t=1414&#34;&gt;Dan Shipper said something in passing&lt;/a&gt; that stopped me dead in my tracks: &amp;ldquo;writing is building, but software is now content&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;It is one of those pithy quotes that whacks you on the head and makes a bunch of random pieces fall into place and make sense.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Writing is building but software is now content&amp;hellip; one of the really cool things is when we we just launched this app called Cora and that has 10,000 people on the wait list. Those are all now Every subscribers.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The other day I was listening to a podcast in which <a href="https://youtu.be/IsZh-nLyfBA?t=1414">Dan Shipper said something in passing</a> that stopped me dead in my tracks: &ldquo;writing is building, but software is now content&rdquo;.</p>
<p>It is one of those pithy quotes that whacks you on the head and makes a bunch of random pieces fall into place and make sense.</p>
<blockquote>
<p>Writing is building but software is now content&hellip; one of the really cool things is when we we just launched this app called Cora and that has 10,000 people on the wait list. Those are all now Every subscribers.</p>
<p><strong>You can&rsquo;t write an article that&rsquo;s going to get you 10,000 new subscribers but you can write software that does it</strong>, and that&rsquo;s incredible.</p></blockquote>
<p>Let me try to break that down so I can understand it.</p>
<h2 id="writing-is-building">&ldquo;writing is building&rdquo;</h2>
<p>This is speaking to the primacy of the motivation, idea, definition and spec for a product. Perhaps in the case of <a href="https://every.to">Every</a>, this also includes the main writing on the site. Most importantly, <strong>writing is not content any more</strong>.</p>
<p>What is <strong>content</strong> then? Content used to be a derogatory term. People would churn out lots of it. It would be low-effort. It was used at the <strong>top of the funnel</strong>. This was the world of content marketing and SEO writ large.</p>
<p>But at the end of the day, this content alone was not <strong><strong>executable</strong></strong> or <strong><strong>actionable</strong></strong>. You could not get the content to actually do something for you.</p>
<p>This is where <strong>software</strong> comes in. Software is <strong>utilitarian</strong>. You can run it to <strong>do things for you</strong>, unlike writing. It used to be <strong>expensive</strong> and hence, <strong>scarce</strong>. But that is becoming less true by the day in the age of coding LLMs.</p>
<p>In the old world, there would be lots of content at the top of the funnel. This funnel would get fed by social media and SEO. At the bottom of the funnel you&rsquo;d have some kind of software or service being sold.</p>
<p>In this old world, writing was cheap and software was expensive.</p>
<h2 id="dot-dot-dot-but-software-is-now-content">&ldquo;&hellip;but software is now content&rdquo;</h2>
<p>But now that AI makes software cheap, one can <strong>quickly build</strong> useful software and use <strong>software at the top of the funnel</strong>. This could not have been done before AI. I think this is what Shipper is talking about when he says that putting out a software product got him way more paying subscribers than churning out articles.</p>
<p>In the new world, the setup looks something like this: you do a limited amount of high-value writing. It may not even be published. But it serves as fodder for what&rsquo;s next. And what&rsquo;s next is building <strong>lots of exploratory prototypes in software</strong>. This software can tackle small niches and long-tail use-cases.</p>
<p>You can do this now because creating software is getting cheaper. When software was expensive you could only build software for the 20% fat head, leaving the 80% long tail to fend for themselves. This software now becomes the top of the funnel. At the bottom, you sell subscriptions or services. This is the strategy Shipper and co are following with <a href="https://every.to/studio">Every Studio</a>.</p>
<p>[BTW, <a href="https://www.youtube.com/@EveryInc/videos">AI&amp;I</a> is a shockingly under-rated podcast. If Dwarkesh et al are the &ldquo;architecture astronauts&rdquo; of AI, Dan Shipper et al are the miners with dusty faces.]</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>When Compilers Were the &#39;AI&#39; That Scared Programmers</title>
      <link>http://vivekhaldar.com/articles/when-compilers-were-the--ai--that-scared-programmers/</link>
      <pubDate>Sun, 16 Feb 2025 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/when-compilers-were-the--ai--that-scared-programmers/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://youtu.be/vO1A6WY71T0&#34;&gt;Video version of this&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The early history of high-level languages and compilers is
fascinating.  It is a tale of the pioneers of computer science
charting new territory, but also of deep resistance to new ways of
doing old things.  And I think it has a lot to teach us about how our
tribe of programmers is wrestling right now with the idea of AI and
LLMs, writing code.&lt;/p&gt;
&lt;h2 id=&#34;early-compilers&#34;&gt;Early Compilers&lt;/h2&gt;
&lt;p&gt;In the early decades of computing, programming was done at the most
granular level, hand coding in machine code or assembly language.
This was painstaking work.  Programmers had to manage operation
codes and memory addresses directly, which one early pioneer likened
to hand-to-hand combat with the machine.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://youtu.be/vO1A6WY71T0">Video version of this</a>.</p>
<p>The early history of high-level languages and compilers is
fascinating.  It is a tale of the pioneers of computer science
charting new territory, but also of deep resistance to new ways of
doing old things.  And I think it has a lot to teach us about how our
tribe of programmers is wrestling right now with the idea of AI and
LLMs, writing code.</p>
<h2 id="early-compilers">Early Compilers</h2>
<p>In the early decades of computing, programming was done at the most
granular level, hand coding in machine code or assembly language.
This was painstaking work.  Programmers had to manage operation
codes and memory addresses directly, which one early pioneer likened
to hand-to-hand combat with the machine.</p>
<p>By the mid-1950s, however, a revolutionary shift was underway.
High-level languages and their compilers began to automate low-level
details, allowing programmers to write instructions in more
human-readable forms.  Developed at IBM by John Backus&rsquo; team,
Fortran was the first widely used high-level language.  It enabled
scientists and engineers to write formulas and algorithms in a more
natural mathematical notation, which the compiler would then convert
to machine instructions.  Fortran dramatically reduced the number of
statements required.  A program that might have needed 1,000
assembly instructions could now be done in about 50 Fortran
statements.</p>
<p>The Fortran compiler quickly proved that compiled code could
approach the efficiency of hand-coded assembly.  Early skeptics who
insisted that high-level code could never be as efficient as
hand-crafted machine code were confounded when Backus&rsquo; team
delivered an optimizing compiler that made Fortran programs run
nearly as fast as assembly.</p>
<p>Adoption was rapid.  A 1958 survey found that over half of all code
being run on IBM computers was generated by the Fortran compiler.
This was a stunning validation of this new approach.</p>
<h2 id="resistance">Resistance</h2>
<p>Even then, many working programmers were skeptical or resistant.
They had deep expertise in assembly language and were proud of the
arcane skills needed to wring efficiency out of early machines.
John Backus later described this culture as a priesthood of
programming.  In the 1950s, programmers often regarded themselves as
guardians of arcane knowledge, possessing skills and knowledge of
mysteries far too complex for ordinary mortals.</p>
<p>One of the most
frequent arguments against compilers was that compiled code could
not be as efficient or compact as handwritten assembly.  People
would say they could be more efficient in assembly, giving a whole
litany of reasons to avoid high-level languages.  And this was not
entirely untrue.  The earliest compilers sometimes did produce
verbose or suboptimal machine language.  A 1965 Honeywell management
briefing noted candidly that a highly skilled assembly programmer
could still beat COBOL&rsquo;s output in efficiency.  But it also
questioned how many highly skilled programmers are available or even
needed at the average installation.</p>
<p>In practice, compiler optimizations improved quickly.  IBM&rsquo;s Fortran
team introduced the first optimizing compiler and proved that
compiled code could approach or match the performance of hand-coded
assembly in many cases.  As these successes became evident, the
purely performance-based objections began to wane.</p>
<p>The next argument was control.  Many assembly programmers were
accustomed to having intimate control over memory and CPU
instructions.  Surrendering this control to a compiler felt risky.
There was a sentiment of, if I don&rsquo;t code it down to the metal, how
can I trust what&rsquo;s happening?  In some cases, this was about
efficiency.  In other cases, it was about debuggability and
understanding programming behavior.  However, as compilers matured,
they began providing diagnostic output and listings that actually
improved understanding.</p>
<h2 id="more-programmers">More programmers</h2>
<p>There was an implicit fear that making programming easier might
reduce the prestige or necessity of the seasoned programmer.
High-level languages opened the door for newcomers to write code
without years of experience in binary or assembly.  The priesthood
culture, Bacchus described, suggests that some experts guarded this
domain closely.</p>
<p>Grace Hopper encountered this attitude when promoting compilers.
Management and colleagues initially thought the idea of automatic
programming was crazy, fearing it would make programmers obsolete.
Hopper and others had to repeatedly demonstrate that these tools
would augment programmers&rsquo; productivity, not replace the need for
skilled people.</p>
<p>In fact, far from eliminating jobs, high-level languages led to an
explosion in demand for programmers.  High-level languages opened
the door for many more people to become programmers.  In the 1940s
and early 50s, programming was the domain of a small elite with
specialized training, often in mathematics or electrical
engineering.  By the 1960s, that pool had widened significantly.
Fortran had allowed scientists and engineers to directly write
programs for their problems, and COBOL did something similar for
business.  It enabled individuals with domain expertise, such as in
accounting or inventory, to learn programming without needing a deep
computer science background.  As one retrospective put it, COBOL
democratized coding.  Companies could take everyday people and train
them to be useful COBOL programmers in a few months, allowing a new
influx of talent into the field.</p>
<p>The result was a dramatic expansion of the programmer workforce.
The role was now seen as more akin to logical clerical work rather
than electrical engineering.  This set the stage for programming to
become a mainstream profession rather than a niche craft.</p>
<h2 id="going-higher">Going higher</h2>
<p>As compilers automated the gritty aspects of coding, the skill set
for programmers evolved.  There was less need to memorize machine
instruction sets or calculate memory addresses by hand&ndash; tasks the
compiler would handle flawlessly.</p>
<p>Instead, the emphasis shifted to problem analysis and program
design.  This is reflected in the terminology.  The rise of the term
analyst in job titles during the 1960s.  A high-level language freed
programmers to think more about what the program should accomplish
rather than how at the bit level to implement it.  One manager in
1963 noted that with the advent of COBOL, he valued employees who
understood the business logic and could structure a program clearly.
The compiler would take care of the low-level details if the
high-level logic was sound.</p>
<p>In short, the introduction of high-level languages elevated the
abstraction level at which programmers operated.  By making
programming more efficient and accessible, high-level languages
enabled many more applications to be developed in a given time.
Businesses could automate more of their operations, which in turn
drove demand for more computers.</p>
<p>This expanded the scope of automation in society.  Entire new
domains for computing emerged because software could be written fast
enough to respond to business needs.  High-level languages were the
catalyst that helped move computing from a limited experimental
phase into a major industry of its own.</p>
<h2 id="ai">AI</h2>
<p>The shift from assembly language to high-level languages with
compilers in the 1950s and 1960s has striking parallels to today&rsquo;s
transition from manual coding to AI-assisted programming with tools
like GitHub, Copilot, Cursor, Aider, and others.</p>
<p>In both cases, a fundamental change in how code is written is
occurring, leading to initial skepticism, gradual adoption, and
ultimately, a redefinition of what it means to be a programmer.</p>
<p>The debate playing out today about what it means to be a programmer
when LLMs can churn out large amounts of working code is of exactly
the same shape.  Let&rsquo;s learn from it and not make the same mistakes.</p>
<h3 id="sources">Sources</h3>
<p><a href="https://www.ibm.com/history/fortran#:~:text=Fortran%20was%20born%20of%20necessity,to%20half%20their%20time%20debugging">1</a>, <a href="https://www.ibm.com/history/fortran#:~:text=Fortran%20democratized%20computer%20programming%20by,to%20only%2047%20in%20Fortran">2</a>, <a href="https://www.ibm.com/history/fortran#:~:text=Fortran%20confounded%20skeptics%20who%20insisted,translated%20Fortran%E2%80%99s%20programs%20into%20the%C2%A0IBM%C2%A0704%E2%80%99s">3</a>, <a href="https://harrymoreno.com/assets/greatPapersInCompSci/10.1_-_Programming_in_America_in_the_1950s_-_Some_Personal_Impressions-John_Backus.pdf#:~:text=leading%20to%20a%20significant%20development,recognized%20that%20pro%02gramming">4</a>, <a href="https://ethw.org/Oral-History:Jean_Sammet#:~:text=want%20to%20use%20assembly%20language,to%20a%20relatively%20small%20area">5</a>, <a href="https://www.wealthsimple.com/en-ca/magazine/cobol-controls-your-money">6</a>, <a href="https://s3data.computerhistory.org/brochures/honeywell.cobol.1965.102646124.pdf">7</a>.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Spec-driven Vibe-coding</title>
      <link>http://vivekhaldar.com/articles/spec-driven-vibe-coding/</link>
      <pubDate>Sat, 08 Feb 2025 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/spec-driven-vibe-coding/</guid>
      <description>&lt;p&gt;Giving a name to an amorphous new thing is a powerful act. And that&amp;rsquo;s what Karpathy did, via &lt;a href=&#34;https://x.com/karpathy/status/1886192184808149383&#34;&gt;tweet&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;There&amp;rsquo;s a new kind of coding I call &amp;ldquo;vibe coding&amp;rdquo;, where you fully give in to the vibes, embrace exponentials, and forget that the code even exists. It&amp;rsquo;s possible because the LLMs (e.g. Cursor Composer w Sonnet) are getting too good. Also I just talk to Composer with SuperWhisper so I barely even touch the keyboard. I ask for the dumbest things like &amp;ldquo;decrease the padding on the sidebar by half&amp;rdquo; because I&amp;rsquo;m too lazy to find it. I &amp;ldquo;Accept All&amp;rdquo; always, I don&amp;rsquo;t read the diffs anymore. When I get error messages I just copy paste them in with no comment, usually that fixes it. The code grows beyond my usual comprehension, I&amp;rsquo;d have to really read through it for a while. Sometimes the LLMs can&amp;rsquo;t fix a bug so I just work around it or ask for random changes until it goes away. It&amp;rsquo;s not too bad for throwaway weekend projects, but still quite amusing. I&amp;rsquo;m building a project or webapp, but it&amp;rsquo;s not really coding - I just see stuff, say stuff, run stuff, and copy paste stuff, and it mostly works.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Giving a name to an amorphous new thing is a powerful act. And that&rsquo;s what Karpathy did, via <a href="https://x.com/karpathy/status/1886192184808149383">tweet</a>:</p>
<blockquote>
<p>There&rsquo;s a new kind of coding I call &ldquo;vibe coding&rdquo;, where you fully give in to the vibes, embrace exponentials, and forget that the code even exists. It&rsquo;s possible because the LLMs (e.g. Cursor Composer w Sonnet) are getting too good. Also I just talk to Composer with SuperWhisper so I barely even touch the keyboard. I ask for the dumbest things like &ldquo;decrease the padding on the sidebar by half&rdquo; because I&rsquo;m too lazy to find it. I &ldquo;Accept All&rdquo; always, I don&rsquo;t read the diffs anymore. When I get error messages I just copy paste them in with no comment, usually that fixes it. The code grows beyond my usual comprehension, I&rsquo;d have to really read through it for a while. Sometimes the LLMs can&rsquo;t fix a bug so I just work around it or ask for random changes until it goes away. It&rsquo;s not too bad for throwaway weekend projects, but still quite amusing. I&rsquo;m building a project or webapp, but it&rsquo;s not really coding - I just see stuff, say stuff, run stuff, and copy paste stuff, and it mostly works.</p></blockquote>
<p>&ldquo;I just see stuff, say stuff, run stuff, and copy paste stuff, and it mostly works&rdquo; &ndash; this &ldquo;veni,vidi, vici&rdquo; for the modern AI age.</p>
<p>This is how a lot of us have been programming for a while already. It will become more entrenched as the models get better. Having to constantly hit &ldquo;Accept All&rdquo; will become the number one user complaint.</p>
<p>I spent the weekend vibe-programming a side project I&rsquo;ve wanted to implement for a while: a time-tracking app that simply regularly looks at my computer screen and infers what activities I&rsquo;m doing, and whether that&rsquo;s deep work, light work, or just entertainment. The project itself is not important for this post. I want to focus on the methodology for building it.</p>
<p>I built it using a twist on vibe-coding that I call <strong>spec-driven vibe-coding</strong>. The overall flow is this:</p>
<p><strong>First, write a spec</strong>. Actually, two specs.</p>
<p>First prompt the LLM to take a basic outline of the idea and propose a <strong>full product spec</strong>. Iterate in Artifacts as necessary, though for me the first cut was pretty much there.</p>
<p>Then give the product spec to o1-pro to produce an <strong>engineering design document</strong>.</p>
<p>Armed with these two documents, you can zero-shot vibe-code the product. At this point I moved to <a href="https://github.blog/news-insights/product-news/github-copilot-the-agent-awakens/">VS Code with agents</a>. I put the above two docs into a &ldquo;docs&rdquo; folder in my repo, attached it as context in Copilot Chat, and simply asked it to implement the spec.</p>
<p>In this case, I also prompted it again to write tests to cover all the code it had generated. It took a few rounds of back and forth to get all the tests to pass. Then a few more rounds to resolve runtime errors to get it to run and actually work. All in all, this was about a Saturday afternoon&rsquo;s worth of combined time. From 3-4 bullet points of the basic idea to product spec to software design to running code.</p>
<p>And then I started adding features. I kept the same basic principle in mind: <strong>first write a spec, then update the software design doc, then ask the LLM to write code that meets the spec and the design</strong>.</p>
<p>Throughout the entire process <strong>I did not write any code by hand</strong>. I found bugs and issues, yes, but I gave the stack traces or test failures back to the model to solve. I was getting tired of hitting &ldquo;Accept&rdquo;.</p>
<p>This is the worst this capability will ever be. This was a tiny weekend project. (Actually, if I had to do this by hand before the AI age, I&rsquo;m sure it wouldn&rsquo;t have fit in a weekend, and hence, would never get built.) This basic flow will work for larger and larger codebases over time. Raw-dogging code by hand will have the same frequency as writing assembly.</p>
<p>If you are a programmer, <a href="https://vivekhaldar.com/articles/ai-resistance-considered-harmful--for-programmers-/">you should be embracing AI</a> to increase your impact and agency.</p>
<h2 id="appendix-prompts-and-results">Appendix: Prompts and Results</h2>
<p>Prompt to take basic outline of idea and produce a product spec:</p>
<blockquote>
<p>Canvas help me write product spec for the following idea. I am also attaching a diagram describing the flow I&rsquo;m thinking of. This product spec will then be given to a software engineer to design and implement, so it should have enough detailed description of the product for an engineer to design and implement it fully.</p>
<p>Idea for Time Tracking</p>
<p>#quantified-self</p>
<p>### Goal
Automatically measure which apps and tasks I&rsquo;m spending my time on, on my computer</p>
<p>### Outline</p>
<ul>
<li>Take screenshots of desktop every ~1min (configurable time interval)</li>
<li>Have a vision LLM describe that image</li>
<li>Then do some more summarization and analysis on that
<ul>
<li>This should give me a picture of what I&rsquo;m spending my time on</li>
</ul>
</li>
</ul></blockquote>
<p><a href="https://gist.github.com/vivekhaldar/a596a4d5eaec4f71e9162ffc0568746f">Resulting product spec.</a></p>
<p>Prompt to take product spec and produce a detailed engineering design document:</p>
<blockquote>
<p>i will give you a product spec below, as a markdown file. thoroughly read it and then produce a software design document to implement that spec. this design doc will be handed off to a programmer for implementation, so it should have enough detail that the programmer can implement it without any ambiguity.</p>
<p>basic tech choices: this will run in mac os x, should be written in python, run as a command line app (no gui necessary).</p>
<p>&lt;paste in product spec here&gt;</p></blockquote>
<p><a href="https://gist.github.com/vivekhaldar/c32177773d44856a6e800c81573182fd">Resulting design doc.</a></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Don&#39;t credit AI</title>
      <link>http://vivekhaldar.com/articles/don-t-credit-ai/</link>
      <pubDate>Thu, 06 Feb 2025 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/don-t-credit-ai/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve seen several articles where the author mentions that it was written with the help of AI. I&amp;rsquo;m hoping that&amp;rsquo;s a passing phase.&lt;/p&gt;
&lt;p&gt;When an analyst presents a financial model, does he mention that it was made with the help of Excel?&lt;/p&gt;
&lt;p&gt;Whether the tools in your arsenal are word processors, or grammar and spelling checkers, or human editors, or modern LLMs, you, alone, are the author.&lt;/p&gt;
&lt;p&gt;Ethan Mollick&amp;rsquo;s proposed policy is the most sensible one for the AI age: &lt;a href=&#34;https://www.oneusefulthing.org/p/my-class-required-ai-heres-what-ive&#34;&gt;use AI all you like, but you are responsible for the work turned in&lt;/a&gt;. Your name is on the paper. You get the grade.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I&rsquo;ve seen several articles where the author mentions that it was written with the help of AI. I&rsquo;m hoping that&rsquo;s a passing phase.</p>
<p>When an analyst presents a financial model, does he mention that it was made with the help of Excel?</p>
<p>Whether the tools in your arsenal are word processors, or grammar and spelling checkers, or human editors, or modern LLMs, you, alone, are the author.</p>
<p>Ethan Mollick&rsquo;s proposed policy is the most sensible one for the AI age: <a href="https://www.oneusefulthing.org/p/my-class-required-ai-heres-what-ive">use AI all you like, but you are responsible for the work turned in</a>. Your name is on the paper. You get the grade.</p>
<p>This applies to AI slop too. AI isn&rsquo;t responsible for slop. There is a human author behind it. They should put their name on the slop. It should have all the same consequences as putting out purely human-written poor work into the world.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Emacs in the age of AI</title>
      <link>http://vivekhaldar.com/articles/emacs-in-the-age-of-ai/</link>
      <pubDate>Thu, 30 Jan 2025 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/emacs-in-the-age-of-ai/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve expressed my fondness for Emacs in several post on this blog (&lt;a href=&#34;https://vivekhaldar.com/articles/a-spiritual-successor-to-emacs/&#34;&gt;A spiritual successor to Emacs&lt;/a&gt;, &lt;a href=&#34;https://vivekhaldar.com/articles/the-levels-of-emacs-proficiency/&#34;&gt;The levels of Emacs proficiency&lt;/a&gt;, and &lt;a href=&#34;https://youtu.be/0i8Az2MHwGo&#34;&gt;Why I still use Emacs&lt;/a&gt;), but I will play turncoat and write about the things that pull me out of Emacs. And they all have to do with AI.&lt;/p&gt;
&lt;p&gt;In theory, Emacs should be the ideal UI for the age of LLMs, because after all, it&amp;rsquo;s all just text, and Emacs excels at manipulating text. But!&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I&rsquo;ve expressed my fondness for Emacs in several post on this blog (<a href="https://vivekhaldar.com/articles/a-spiritual-successor-to-emacs/">A spiritual successor to Emacs</a>, <a href="https://vivekhaldar.com/articles/the-levels-of-emacs-proficiency/">The levels of Emacs proficiency</a>, and <a href="https://youtu.be/0i8Az2MHwGo">Why I still use Emacs</a>), but I will play turncoat and write about the things that pull me out of Emacs. And they all have to do with AI.</p>
<p>In theory, Emacs should be the ideal UI for the age of LLMs, because after all, it&rsquo;s all just text, and Emacs excels at manipulating text. But!</p>
<p>The first thing that pulls me out of Emacs is programming with Github Copilot, and its deeply integrated experience with VS Code. Some of that interaction is probably in closed protocols between VS Code and Copilot backends, but it is also the bespoke UI for inline chat and multi-file edits.</p>
<p>The next thing that pulls me out of Emacs is prototyping and writing and iterating with Artifacts and Canvas, and the general UI affordances in the bespoke clients for the major LLM providers. This holds for both code and prose.</p>
<p>Note that the above arguments have the same shape as those from a decade or so ago that claimed (rightfully) that crafted IDEs offer a richer, smoother experience for programming (particularly in IDE-dependent languages like Java) than trying to spend hours recreating the same functionality in Emacs only to end up with a clunky experience. That might still be true to an extent but the magnitude of the problem is a lot less severe due to a system-level innovation: language servers that speak a common, broadly supported protocol (LSP), and every language toolset shipping with one that was editor/IDE-agnostic.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>AI resistance considered harmful (for programmers)</title>
      <link>http://vivekhaldar.com/articles/ai-resistance-considered-harmful--for-programmers-/</link>
      <pubDate>Fri, 17 Jan 2025 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/ai-resistance-considered-harmful--for-programmers-/</guid>
      <description>&lt;p&gt;There&amp;rsquo;s now a well-established sub-genre of tech and programmer YouTube: the AI dunker. The AI dunker looks down on LLMs with disdain. &amp;ldquo;Look at this buggy code the LLM produced! Look at my clean handwritten code. Really it&amp;rsquo;s just much faster for me to do it by hand. I&amp;rsquo;m a real programmer. My code is more robust, cleaner, and has no bugs. I can&amp;rsquo;t believe you fools fell for all this hype. Who are these feeble-minded coders forking over ten bucks every month for Copilot? It&amp;rsquo;s just VCs trying to make a quick buck. Don&amp;rsquo;t fall for it!&amp;rdquo;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>There&rsquo;s now a well-established sub-genre of tech and programmer YouTube: the AI dunker. The AI dunker looks down on LLMs with disdain. &ldquo;Look at this buggy code the LLM produced! Look at my clean handwritten code. Really it&rsquo;s just much faster for me to do it by hand. I&rsquo;m a real programmer. My code is more robust, cleaner, and has no bugs. I can&rsquo;t believe you fools fell for all this hype. Who are these feeble-minded coders forking over ten bucks every month for Copilot? It&rsquo;s just VCs trying to make a quick buck. Don&rsquo;t fall for it!&rdquo;</p>
<p>AI dunkers are doing newbie programmers a huge disservice. Those who listen to the AI dunkers and internalize their backwards-looking, risk-averse, techno-primitivism will be hurting their learning, growth, and ultimately, their careers. While they&rsquo;re also doing a disservice to programmers well into their careers, I want to focus on the learners and early-career programmers in this post.</p>
<p>The AI dunkers are only the latest in a continuous line of techno-primitivists.</p>
<p>When compilers abstracted away assembly language and allowed programming in high-level languages, techno-primitivists argued about the loss of control, the loss of performance, and the loss of understanding of how the machine works.</p>
<p>When IDEs and auto-complete made it easier to write lots of code quickly, techno-primitivists argued about the loss of &ldquo;true&rdquo; understanding of the language and libraries programmers were using, about writing expedient code, and extolled the virtues of the spartan steel-minded programmer writing code &ldquo;raw.&rdquo;</p>
<p>And now, at the dawn of the next step-function in how we write programs, the techno-primitives stand athwart the gates, warning us of the perils ahead and the virtues of past ways.</p>
<p>What should those who are learning programming do instead? They should embrace this new way of programming but do so while prioritizing learning, understanding, and growth through challenge. You have agency&ndash; use it! You are not a slave to the tools before you.</p>
<p>First of all, don&rsquo;t use AI to get answers and move on. Use it to learn and understand. Imagine having a pair programmer mentor with infinite patience and deep knowledge. Ask it to explain existing code. Ask it to review the code you wrote. Ask it for idiomatic ways to rewrite your newbie code. Ask it for five alternative ways to write the same thing and what the tradeoffs are among them. Ask it which standard libraries you could&rsquo;ve used instead.</p>
<p>The message should be one of encouragement and exploration of these new tools, fully embracing them to become more effective programmers, with a minor cautionary note about their failure modes and pitfalls—not one of dismissive skepticism.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>How I use AI (late 2024)</title>
      <link>http://vivekhaldar.com/articles/how-i-use-ai--late-2024-/</link>
      <pubDate>Wed, 20 Nov 2024 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/how-i-use-ai--late-2024-/</guid>
      <description>&lt;p&gt;This is how I&amp;rsquo;ve been using AI (well, mostly LLMs) in the day-to-day of my professional and personal life, as of November 2024.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m currently an engineering manager at &lt;a href=&#34;http://emergence.ai&#34;&gt;Emergence AI&lt;/a&gt;. Before that I was at Google in various roles (SWE, TL, TLM, EM). Most of my professional work is organizational and technical architecture/design, with a smattering of coding. I do code regularly for personal tools and explorations.&lt;/p&gt;
&lt;h2 id=&#34;programming&#34;&gt;Programming&lt;/h2&gt;
&lt;p&gt;I use LLMs for programming a &lt;strong&gt;lot&lt;/strong&gt;. It is now a basic tool, on par with having an IDE. I sometimes see techno-primitivist takes on how using AI/LLMs for coding is &amp;ldquo;bad&amp;rdquo;. I can only hope that folks getting into programming now aren&amp;rsquo;t swayed by that.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>This is how I&rsquo;ve been using AI (well, mostly LLMs) in the day-to-day of my professional and personal life, as of November 2024.</p>
<p>I&rsquo;m currently an engineering manager at <a href="http://emergence.ai">Emergence AI</a>. Before that I was at Google in various roles (SWE, TL, TLM, EM). Most of my professional work is organizational and technical architecture/design, with a smattering of coding. I do code regularly for personal tools and explorations.</p>
<h2 id="programming">Programming</h2>
<p>I use LLMs for programming a <strong>lot</strong>. It is now a basic tool, on par with having an IDE. I sometimes see techno-primitivist takes on how using AI/LLMs for coding is &ldquo;bad&rdquo;. I can only hope that folks getting into programming now aren&rsquo;t swayed by that.</p>
<p>My two main tools are: Copilot in VS Code, and aider on the command line.</p>
<p>I&rsquo;m a happy GitHub Copilot subscriber. Pretty much all my programming these days is in Python, and it works great for that. Just like the writing use-case, having Copilot means never having to start from a blank slate. I&rsquo;ve been writing Python for more than two decades, so I have an eye for when it produces code I don&rsquo;t like (it almost never produces flat-out wrong code). Depending on how lazy I&rsquo;m feeling, I either edit it myself, or simply re-prompt it. I exercise the full range of Copilot features &ndash; the core feature of tab-completion (usually based on a comment or a prompt), as well as its chat features, for asking general programming questions, reviewing code and explaining code. Using &ldquo;/explain&rdquo; very often saves me a round-trip to Google and library or package documentation.</p>
<p>But when I need some very heavy lifting done, particularly for project-wide edits across multiple files, I turn to <a href="http://aider.chat">aider</a>. Aider with Claude-3.5-Sonnet is a very powerful combination. Things for which I turn to aider:</p>
<ul>
<li>scaffolding out a new project with basic functionality working (fastapi, uvicorn, gunicorn etc)</li>
<li>generating tests from scratch</li>
<li>reviewing: take a messy first pass, prompt it to be a thorough reviewer and stickler for idiomatic usage, and rewrite it to be clean and modular</li>
<li>refactoring across multiple files. Works great if you first generate tests.</li>
</ul>
<p>Aider reports the cost of a session based on token usage (you have to bring your own API key for the underlying model and pay for it), and it is heart-warming to see the number of times it has generated code for me that would&rsquo;ve taken me 30-90 minutes and it cost something like 7 cents.</p>
<p>Note that Copilot and Aider represent two very different modalities for programming with LLMs: copilots and agents. Copilot, is, well, a copilot. You, the programmer, ask it to write or re-write code, and it does that in the same place where you do your edit-compile-run cycle, namely, the IDE. Aider, on the other hand, is outside your IDE. It is somewhat more autonomous. It runs in the terminal. It performs agentic workflows and often performs multiple steps (each using LLMs) to carry out the programming task you ask. With tools like Cursor, these two modes are starting to unify.</p>
<h2 id="media-consumption-reading-and-watching">Media consumption - reading and watching</h2>
<p>I read stuff on the web and watch videos on YouTube. I&rsquo;ve written a couple of utilities for myself to save time on both.</p>
<ul>
<li>HN summarizer: Given an HN story ID, fetch content of the article it is talking about as well as the comment thread, summarize it.</li>
<li>YouTube video summarizer: this one is more complex. I wanted to do something better than a naive video summarizer, which would transcribe the video, then simply prompt an LLM to summarize it and present a textual summary. I wanted a <strong>video summary</strong> that was edited from the original video. So I used whisper to transcribe the video with word-level timestamps, then prompt an LLM to construct a summary consisting only of direct quotes from the transcript, and use those two combined to output a chopped up version of the original video. Works great. I use it daily on multiple videos, usually long lectures or podcasts.</li>
</ul>
<p>Another common workflow is quickly understanding research papers. I&rsquo;ll throw a PDF of the paper into the ChatGPT desktop app, then interrogate it. It helps me quickly understand the key findings, assumptions and methodology in a paper. This is somewhere between just reading the abstract and doing a quick page-by-page read.</p>
<p>Since the introduction of <a href="https://openai.com/index/introducing-chatgpt-search/">ChatGPT Search</a> it has also significantly eaten into my Google search volume. I now trust web-grounded RAG enough for many day-to-day queries.</p>
<h2 id="writing">Writing</h2>
<p>Two main themes here: going from unstructured to structured, and never starting from a blank page.</p>
<p>I will sometimes do an unstructured stream-of-consciousness braindump (could be either typed-out text, or just spoken voice into ChatGPT&rsquo;s advanced voice mode) and ask the model to rewrite it cleanly. Helpful for capturing crisp summaries and action items from complex discussions.</p>
<p>When writing (design docs, requirements, blog posts), get over the activation energy of starting from a blank page. Ask the LLM for an outline, or use it as a Socratic partner to flesh out ideas or pressure-test them.</p>
<h2 id="personal-utilities">Personal utilities</h2>
<p>Miscellaneous use-cases and personal utilities that don&rsquo;t fit neatly in the above buckets:</p>
<ul>
<li>create a math quiz on a given topic for my elementary school kids</li>
<li>given a transcript of a video I&rsquo;ve recorded for my <a href="http://youtube.com/@vivekhaldar">YouTube channel</a>, suggest chapter titles and timestamp markers</li>
<li>trawl over my screenshots directory (where every filename is of the form &ldquo;Screenshot-&lt;date&gt;.png&rdquo;), then use a combination of a vision model and language model to give it a short, descriptive filename. From chaos, order!</li>
<li>create a chatty TODO tracker. Braindump a bunch of things I need to get done, get a clean, itemized TODO list. Then conversationally tell it as I get things done. I can ask things like &ldquo;what&rsquo;s left to do?&rdquo; or give it natural language updates like &ldquo;move item X to tomorrow&rdquo;.</li>
</ul>
<p>Huge shout out to <a href="https://simonwillison.net/">Simon Willison&rsquo;s</a> excellent <a href="https://llm.datasette.io/">llm command-line tool</a> that makes it a breeze to invoke pretty much every LLM from the command line, and do so in a unix-tool way that can be composed with pipes and all. It also has a clean, simple Python API that has become my goto library for abstracting over vendor-specific LLM client libraries.</p>
<h2 id="barriers-and-wishlist">Barriers and wishlist</h2>
<p>As you can see from the above, I&rsquo;m a heavy AI/LLM user, and I derive a ton of utility from it. I&rsquo;d like for that to be even more frictionless. Here are my major barriers to even deeper usage of AI (or a wishlist):</p>
<ul>
<li>deployment: this is my biggest pain-point. I can quickly whip up a Python script that strings together some LLM calls and does some local file I/O. But that only works on that local machine. What if I want to wrap it up as a web app, living in the cloud, so that I can use it even if I happen to be working on another computer? Then I immediately land in the quagmire of containerization and fighting with AWS/GCP etc to get it running in the cloud. I wish there was a quicker, easier way to wrap up these things for cloud deployment.</li>
<li>prompting: seems funny to say, but prompting is still a bit of a black art. I have to beg the LLM gods. There are magic incantations like &ldquo;take a deep breath&rdquo;. There is a lot of trial and error. Part of this is clarifying  my own thinking so that I can instruct the LLM clearly about what exactly I want. But there still is a bag of tricks one must know.</li>
<li>background running: related to the deployment point above, but there are some use-cases I have in mind where I&rsquo;d like to trigger LLMs with tasks periodically or based on a condition. This is essentially hooking up scripts to a cron schedule or other trigger, but it comes back to the pain of deployment.</li>
</ul>
<h2 id="how-i-feel-about-it">How I feel about it</h2>
<p>I&rsquo;ll confess, for all my techno-optimism, I was taken aback when GPT-4 was released, and they emphasized how good it was at coding. I <a href="https://vivekhaldar.com/articles/lazypost--programming-in-the-age-of-gpt-and-copilot/">wrote back then</a>:</p>
<blockquote>
<p>The release of GPT-4 yesterday and the subsequent demo has made me feel a mix of excitement, melancholy and disorientation.</p>
<p>A couple of years ago I thought I had a decent grasp of the trajectory of programming as a field, and as a career path. Languages, frameworks and libraries would get better at modeling and abstracting more complex programs, safety vs performance would be less and less of a conflicting tradeoff, compilers would get better, IDEs and tools would get better, and underneath it all, even if Moore’s Law was hitting a wall, we’d just continue throwing more cores at larger problems. But at the end of the day, the immense cognitive leverage that comes from encoding something into executable software would ensure that programmers were always in short supply. But now I feel unsure and disoriented, not certain about where I stand.</p>
<p>I’m beginning to get more and more convinced of Matt Welsh’s take on how LLMs spell the end of programming as we know it (YT video of his talk). The last few decades saw steady linear improvements in programming languages and tooling. The next few years (who knows, maybe months?) are going to be uncharted territory, a step change. Like the saying goes – may you live in interesting times.</p></blockquote>
<p>More than a year and half later, after having used these tools almost daily, I couldn&rsquo;t be more optimistic. Don&rsquo;t believe the doomers and naysayers! As Ethan Mollick likes to say, &ldquo;Always bring AI to the table&rdquo;.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Programming with LLMs: Part 1</title>
      <link>http://vivekhaldar.com/articles/programming-with-llms--rant-1/</link>
      <pubDate>Fri, 27 Sep 2024 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/programming-with-llms--rant-1/</guid>
      <description>&lt;p&gt;Some thoughts on the anti-LLM sentiment in the programming community, sparked by &lt;a href=&#34;https://kennethnym.com/blog/why-i-still-wont-use-llm/&#34;&gt;this article&lt;/a&gt;. This is a lightly edited version of &lt;a href=&#34;https://youtu.be/81TzOl41bEU&#34;&gt;this video on my YouTube channel&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;TL;DR: I disagree with the article, but I want to make it clear that this isn’t a critique of the author. I’m more interested in diving into the ideas and arguments because I feel it reflects a lot of the anti-LLM (Large Language Model) sentiment we see today, particularly in the programmer community.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Some thoughts on the anti-LLM sentiment in the programming community, sparked by <a href="https://kennethnym.com/blog/why-i-still-wont-use-llm/">this article</a>. This is a lightly edited version of <a href="https://youtu.be/81TzOl41bEU">this video on my YouTube channel</a>.</p>
<p>TL;DR: I disagree with the article, but I want to make it clear that this isn’t a critique of the author. I’m more interested in diving into the ideas and arguments because I feel it reflects a lot of the anti-LLM (Large Language Model) sentiment we see today, particularly in the programmer community.</p>
<p>So, let’s dive in.</p>
<h2 id="the-common-argument-against-llms">The Common Argument Against LLMs</h2>
<p>Right at the top of the article, the author concedes that they’re making a stronger version of the common argument against LLMs. Now, the usual argument against using LLMs for programming is that they’re not as good at generating code as some claim. It’s all hype, they say.</p>
<p>People who claim massive productivity gains often point to how quickly they created an app using an LLM. The critics argue that these folks are just blowing smoke. Sure, there’s room to debate where current LLMs are good at generating correct code and where they fail. That’s a fair discussion. There are certainly areas where an LLM won’t be of much help—like when you’re trying to code an entirely new algorithm.</p>
<p>But, of course, there are other areas where LLMs can be a massive productivity boost.</p>
<h2 id="a-stronger-rejection-of-llms">A Stronger Rejection of LLMs</h2>
<p>Here’s where the author steps things up a notch. They’re not just saying LLMs aren’t useful. They’re going further, claiming that even if LLMs were good, they still wouldn’t use them.</p>
<p>This is a much more personal, almost aesthetic, stand against LLMs. That’s what I found interesting.</p>
<h2 id="programming-as-art-vs-dot-commercial-endeavor">Programming as Art vs. Commercial Endeavor</h2>
<p>Now, we get to the meat of the argument. The author treats programming as an art form, stating that programmers have an infinite canvas to express their creativity, which makes programming a form of self-expression. I think this is the crux of a lot of anti-LLM sentiment in the programming world.</p>
<p>I also think they’re conflating two separate things. One is using programming as a means of self-expression, like the author is saying here. The other is using programming as a means to an end—to accomplish a task, run a business, make a profit, and so on. These are two very different endeavors.</p>
<p>Programming as an artisan or an artist is a personal activity. Programming as an industrial or commercial activity is about efficiency, productivity, and scale.</p>
<p>If we’re discussing how LLMs can or can’t help, I think it’s crucial to separate these two types of programming.</p>
<h2 id="you-are-not-an-artisan">You Are Not an Artisan</h2>
<p>This reminded me of an old blog post by Venkatesh Rao from over a decade ago, titled <a href="https://www.ribbonfarm.com/2013/07/10/you-are-not-an-artisan/">You Are Not an Artisan</a>. It’s a fascinating read, and I recommend it, but let me highlight some relevant parts here.</p>
<p>The piece talks about how modern workers often view themselves as artisans, even when working in industrial or commercial contexts. One key point in the article is about how artisans confuse “economically essential variety” with “economically optional variety.”</p>
<p>To paraphrase: if uniqueness in a product mainly makes the producer feel special but doesn’t lead to profitable differentiation, it’s optional, like latte art. In contrast, economically essential variety must be handled to make a market profitable.</p>
<p>The author of the Hacker News article seems to be approaching programming more like the former—as an artisan craft—while many of us in the LLM space see it as the latter: a commercial activity that’s about solving problems and achieving goals.</p>
<h2 id="the-history-of-techno-primitivist-thought">The History of Techno-Primitivist Thought</h2>
<p>There’s a lot of what I call “techno-primitivist” thinking in these arguments. Throughout the history of programming, there’s always been a nostalgic school of thought that resists new developments and clings to older ways of doing things.</p>
<p>The last big wave of this was in the 90s and early 2000s when IDEs (Integrated Development Environments) were gaining popularity and replacing plain text editors. There’s a famous article from that time called <a href="https://charlespetzold.com/etc/DoesVisualStudioRotTheMind.html">Does Visual Studio Rot the Mind?</a> by Charles Petzold (2005). In it, the author rants against IDEs, arguing that tools like IntelliSense (autocomplete) sap our programming intelligence.</p>
<p>Sound familiar? It’s the same kind of sentiment we hear today in the anti-LLM crowd.</p>
<p>In both cases, there’s a yearning for the past—for a time when there were no APIs, classes, properties, or IDEs—just the programmer and the code.</p>
<h2 id="programming-tools-throughout-history">Programming Tools Throughout History</h2>
<p>The author also makes an interesting point comparing using LLMs to asking an artist to paint for you. But if we look at the history of art, this isn’t so clear-cut. Take conceptual art, for example.</p>
<p>One famous case is the work of American artist Sol Lewitt. His wall drawings were often executed by other people based on high-level instructions he provided. So who’s the real artist here—the one giving the instructions, or the people executing the work?</p>
<p>In programming, too, this raises the question: if I give an LLM instructions and it writes code for me, am I still the programmer? I would argue that even if you’re approaching programming from an artist’s point of view, you should use all the tools at your disposal to push your artistic vision further.</p>
<h2 id="the-march-of-abstraction">The March of Abstraction</h2>
<p>The entire history of programming is about automating and abstracting away lower-level tasks. We’ve gone from binary code to assembly, to compilers, to higher-level languages, and beyond. Each step involves creating black boxes to simplify our work.</p>
<p>Using LLMs for programming is just the next step in this evolution. These tools allow us to tackle much larger, more complex tasks than we could have done before.</p>
<h2 id="my-personal-experience-with-llms">My Personal Experience with LLMs</h2>
<p>Personally, my experience with LLMs has been overwhelmingly positive. I’ve used them both for work and for personal projects, and they’ve saved me tons of time. I’ve been able to complete projects that wouldn’t have fit into a weekend before, but now they do, thanks to LLMs. It’s been awesome.</p>
<p>To borrow a quote from Don Draper in Mad Men: Always look forward.</p>
<p>I hope this gives you something to think about. If you’re pessimistic about LLMs, I’d love to hear why and learn about your experiences. If you’re already using LLMs to speed up your programming or explore new things—welcome to the party. It’s the wild west out here, and we’re all figuring out what’s possible with these tools.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Programming with LLMs: Part 2</title>
      <link>http://vivekhaldar.com/articles/programming-with-llms--part-2/</link>
      <pubDate>Fri, 27 Sep 2024 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/programming-with-llms--part-2/</guid>
      <description>&lt;p&gt;Some more thoughts on programming with LLMs, sparked by &lt;a href=&#34;https://www.darrenhorrocks.co.uk/why-copilot-making-programmers-worse-at-programming/&#34;&gt;this article&lt;/a&gt;. This is a lightly edited version of &lt;a href=&#34;https://youtu.be/07Q37ecchZc&#34;&gt;this video on my YouTube channel&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;is-copilot-is-making-programmers-worse&#34;&gt;Is Copilot is Making Programmers Worse?&lt;/h2&gt;
&lt;p&gt;The article is titled &amp;ldquo;Why Copilot is Making Programmers Worse at Programming,&amp;rdquo; and right at the top, the author acknowledges that there&amp;rsquo;s a trade-off here. These tools are really helping programmers increase their productivity, but as he says, there’s a trade-off because he&amp;rsquo;s concerned that they may have unintended consequences on the quality and skill set of programmers.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Some more thoughts on programming with LLMs, sparked by <a href="https://www.darrenhorrocks.co.uk/why-copilot-making-programmers-worse-at-programming/">this article</a>. This is a lightly edited version of <a href="https://youtu.be/07Q37ecchZc">this video on my YouTube channel</a>.</p>
<h2 id="is-copilot-is-making-programmers-worse">Is Copilot is Making Programmers Worse?</h2>
<p>The article is titled &ldquo;Why Copilot is Making Programmers Worse at Programming,&rdquo; and right at the top, the author acknowledges that there&rsquo;s a trade-off here. These tools are really helping programmers increase their productivity, but as he says, there’s a trade-off because he&rsquo;s concerned that they may have unintended consequences on the quality and skill set of programmers.</p>
<h2 id="eroding-core-programming-skills">Eroding Core Programming Skills?</h2>
<p>The first argument he makes against using AI for programming is that it can erode core programming skills. If you have the AI write code for you and you don’t think through the problem yourself, you&rsquo;re gradually going to lose that skill. You&rsquo;re going to gradually lose the ability to use critical thinking and deep reasoning.</p>
<p>There&rsquo;s some truth to this, but if you look at history, there has been a long series of such arguments going all the way back to Socrates. Socrates didn’t like the idea of writing because he thought that if we didn’t hold these ideas in our heads and repeat them by speaking them out loud, we would forget them and not understand them as well. So, he did not like this idea of externalizing thoughts by writing.</p>
<p>Now, I don’t find this particular argument very compelling because it depends on what you mean by core programming skills. Would you have said that programming without an IDE is a core programming skill? That you should not have to rely on all the conveniences of an IDE? You could go lower and lower down the ladder of abstraction. Would you have said that assembly language is a core programming skill? I don’t think anyone misses programming in assembly today.</p>
<p>So, I think this is a matter of abstraction. Even if you have a new tool that is now writing the code for you, all that it means is that there’s a layer of abstraction on top of it—just like compilers compile your high-level language code down to assembly and machine code.</p>
<h2 id="over-reliance-on-auto-generated-code">Over-Reliance on Auto-Generated Code</h2>
<p>The next argument is really interesting: over-reliance on auto-generated code. I think there is a lot to this point. I like to make the parallel with how airline pilots use autopilot. There has been a ton of literature about how automation dependency, because of airline pilots using autopilot, has caused their flying skills to atrophy over time.</p>
<p>So, there&rsquo;s a fine line to walk here because you definitely want to get the benefits of these new tools. They allow you to do more, faster. They allow you to build faster. Just like overall, autopilot really had a drastic influence on improving the safety of air travel, but it does come with this problem. It comes with this problem of automation dependency and pilots forgetting the fundamentals of how to fly.</p>
<p>So, this is somewhat related to the previous point, and I’m not sure what a good solution to this is, other than simply, as some have put it, disengaging the autopilot from time to time. So, programming without AI from time to time just to see if you can still do it, just to keep your skills sharp.</p>
<h2 id="lack-of-ownership-and-responsibility">Lack of Ownership and Responsibility</h2>
<p>The next point is about lack of ownership and responsibility. The author says that if you, as an individual developer, don’t stand behind the code you write, it might lead to sloppy or buggy code. After all, AI-generated code could have bugs or could just be flat-out incorrect.</p>
<p>This is definitely true now, but I think it will be less and less true as time goes on. It also depends a lot on your domain. If your domain is well-trodden, like building a web app backed by a database, my guess is that the error rate of LLM-generated code in that kind of well-understood domain is rapidly going to get to zero. In other domains that are not as well-trodden, the human programmer will still have a big role to play.</p>
<p>The other point I want to make here is that, in at least an industrial setting, if there are bugs, you should look more at the overall process rather than at individual programmers. This goes back to the idea of blameless post-mortems, which started at Google SRE. The main tenet is that when a system breaks, when there’s an outage or a bug, do not blame the individual teams or programmers. Instead, look at the root causes and the process that allowed such a bug to pass through undetected.</p>
<p>The same thing could happen with programmers who aren’t using these tools either. So, at least on this point, I think it goes back more to the process than to the individual programmers.</p>
<h2 id="reduced-learning-opportunities">Reduced Learning Opportunities</h2>
<p>Now, this is actually the one point in this piece that I disagree with most strongly. I feel like it’s exactly the opposite: LLMs lead to way more learning opportunities than before. They democratize the learning of programming more than anything else I’ve seen in two decades of programming.</p>
<p>Why is that? Because you can use the LLM to learn programming. You can use the LLM as a tutor to help teach you programming. If you&rsquo;re a programmer, you can use the LLM to explain code to you, to review code for you, to suggest alternatives to code that you might have written. And if you just use the LLM as a co-pilot during the act of programming, you can learn a lot, especially if you’re new to a language and don’t know all the idiomatic ways of expressing common things in that language.</p>
<h2 id="narrowed-creative-thinking">Narrowed Creative Thinking</h2>
<p>Programming is as much about creativity as it is about logic, says the author. For this one, I actually talked about this specific point in my previous rant about creativity and programming with AI, so I’ll just leave a link to that in the description. There are interesting arguments both ways, so <a href="https://youtu.be/81TzOl41bEU">go take a look at that video</a>.</p>
<h2 id="dependency-on-proprietary-tools">Dependency on Proprietary Tools</h2>
<p>There’s definitely something to this, right now, but the dependency on proprietary tools is rapidly decreasing because of all the open-source models—things like Llama, Phi, and Gemma, and so on. Right now, they’re not up to the level of the proprietary models like GPT-4, Gemini, or Claude, but the gap between open models and proprietary models is rapidly shrinking. I think very soon the open models will be good enough, if not just as good, so this point is gradually going away.</p>
<h2 id="a-false-sense-of-expertise">A False Sense of Expertise</h2>
<p>A developer might feel proficient in programming because they quickly generate working code with the help of Copilot, even if they don’t fully understand the code.</p>
<p>I think this is mitigated a lot if the developer has the right attitude. If the developer just uses Copilot-generated code without understanding it at all, yes, they can do that—they won’t learn much. It’s similar to a high school or college student using an LLM to write an entire essay and just turning it in. But if instead, a developer uses the LLM to actually explore the problem, explore the solution, have a dialogue with the LLM about alternatives and about understanding the code, I think that might actually help them. Like I mentioned a couple of points ago, it might actually help them learn more, understand more, and develop more expertise.</p>
<h2 id="conclusion">Conclusion</h2>
<p>To wrap up, I think the author makes some good points. He’s looked at this problem from a lot of different angles, and this debate is still going on. I myself have a bias towards being a heavy adopter of these tools. I think you should embrace them if you’re a programmer. There’s no going back. These tools will only get better over time, and they’ll only be adopted more and more over time.</p>
<p>So, if you, as a programmer, want to stay relevant, you have to realize the risks and shortcomings of these tools but not ignore them. You have to embrace them and learn them to the best of your ability—just like a couple of decades ago when IDEs became mainstream, and you had to learn how to wield your IDE in order to be a productive, modern programmer.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Subject-object-verb, or– how we use AI</title>
      <link>http://vivekhaldar.com/articles/subject-object-verb--or---how-we-use-ai/</link>
      <pubDate>Sun, 30 Jun 2024 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/subject-object-verb--or---how-we-use-ai/</guid>
      <description>&lt;p&gt;The &lt;a href=&#34;https://www.youtube.com/watch?v=sDIi95CqTiM&#34;&gt;AI as a product vs as a feature&lt;/a&gt; lens of looking at AI is going mainstream, with Humane and Rabbit exemplifying &amp;ldquo;AI as a product&amp;rdquo; and Apple Intelligence representing &amp;ldquo;AI as a feature&amp;rdquo;. But there&amp;rsquo;s another lens to consider: subject-object-verb.&lt;/p&gt;
&lt;p&gt;I frame it as follows: in an AI interaction there are three parties&amp;ndash;human, AI, artifact; which of them is the subject, which is the object and what is the verb or action relating the two? It is a straightforward application of the same concepts from grammar. A secondary aspect of this framing is the degree to which the verb is constrained.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The <a href="https://www.youtube.com/watch?v=sDIi95CqTiM">AI as a product vs as a feature</a> lens of looking at AI is going mainstream, with Humane and Rabbit exemplifying &ldquo;AI as a product&rdquo; and Apple Intelligence representing &ldquo;AI as a feature&rdquo;. But there&rsquo;s another lens to consider: subject-object-verb.</p>
<p>I frame it as follows: in an AI interaction there are three parties&ndash;human, AI, artifact; which of them is the subject, which is the object and what is the verb or action relating the two? It is a straightforward application of the same concepts from grammar. A secondary aspect of this framing is the degree to which the verb is constrained.</p>
<p>Let&rsquo;s look at a few concrete examples:</p>
<p><strong>Generic chat</strong>: probably the most dominant modality right now. Human comes to ChatGPT (or Claude, or Gemini), stares at an empty text box. The verb in this case is completely unconstrained, depending entirely on the prompt provided by the human to the AI. What about picking the subject and the object? In a typical scenario, the human will act as subject, initiating the action. The object will be the thing or goal the subject wants out of this interaction. This, by the way, is the reason why the <a href="https://www.anthropic.com/news/claude-3-5-sonnet">artifacts feature in Claude</a> is groundbreaking. It clearly separates the object of the conversation as a distinguished entity.</p>
<p>But while the human acting as the subject is the most obvious path, there are many valid and useful scenarios where the <strong>human is the object</strong>.</p>
<p>Consider conversations where the <a href="https://papers.ssrn.com/sol3/papers.cfm?abstract_id=4475995">AI is performing the role of a tutor, mentor or coach</a>. Even though the human initiates the conversation, he is the object. The human is being taught, or mentored, or coached. The AI is the subject, performing that action upon the human.</p>
<p>The arc of improving the UX of AI seems to be one of <strong>constraining the verb</strong> and <strong>making the object explicit</strong>. Prominent examples are <a href="https://workspace.google.com/solutions/ai/">using Gemini in Google Workspace</a> and <a href="https://www.apple.com/apple-intelligence/">Apple Intelligence</a>. The way the AI is situated and presented makes the artifact being worked on (the object) readily obvious. It&rsquo;s the document or email or spreadsheet you have open. The verbs are also constrained to some degree to common actions: summarize, rewrite, adjust tone, suggest formulae. Where there is free-form chat, the UI nudges the user to understand that this chat is within the context of that artifact, nudging the user towards asking questions about that open document or sheet, not generic free-form questions.</p>
<p>AI for developers, with products like GitHub Copilot, falls somewhere in between. The subject is almost always the human programmer. The object is almost always the code being worked upon. The verb is a combination of constrained and free-form. It is constrained when seeing inline completion suggestions: there is implicitly only one verb of &ldquo;complete what I&rsquo;m typing&rdquo;. But the other half of Copilot&rsquo;s feature set is Chat, which is open-ended. But chat has pre-defined verbs in the form of command like &ldquo;/explain&rdquo; or &ldquo;/refactor&rdquo;.</p>
<p>When looked at through the lens of <strong>constraining the verb</strong>, we see a replay of the age old CLI vs GUI evolution. A free-form CLI with little to no constraints on utterances is meant for experts and daunting to most users. For the masses we have a crafted and constrained UI with pre-determined happy paths and constrained verbs (actions) that the user can pick from a given menu of options.</p>
<p>If the user is typing in a prompt, they are at the AI CLI. If not, they&rsquo;re likely using a product UI.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Portability of LLM Prompts</title>
      <link>http://vivekhaldar.com/articles/portability-of-llm-prompts/</link>
      <pubDate>Sun, 09 Jun 2024 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/portability-of-llm-prompts/</guid>
      <description>&lt;p&gt;Practitioners know that there is no such thing as prompt portability right now. If you change models, you need to re-eval, and re-tune, all your prompts. Small changes in phrasing and ordering can have large output effects.&lt;/p&gt;
&lt;p&gt;This parallels the days before compilers&amp;ndash; when you had to write bespoke assembly for each platform. Software was not portable.&lt;/p&gt;
&lt;p&gt;Later, compilers for high-level languages could target various ISAs without the programmer having to worry about it.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Practitioners know that there is no such thing as prompt portability right now. If you change models, you need to re-eval, and re-tune, all your prompts. Small changes in phrasing and ordering can have large output effects.</p>
<p>This parallels the days before compilers&ndash; when you had to write bespoke assembly for each platform. Software was not portable.</p>
<p>Later, compilers for high-level languages could target various ISAs without the programmer having to worry about it.</p>
<p>What if&ndash; LLMs came with &ldquo;atomic prompts&rdquo;? Prompts tuned for that specific model for basic tasks like summarization, simple reasoning, personas etc. Make it part of an (extended) model card. Would certainly take a lot of guesswork out of porting prompts across models.</p>
<p>And while we&rsquo;re at it can we please also make it so that we never have to say &ldquo;Take a deep breath&rdquo; and &ldquo;I will tip you $200 for getting this right&rdquo;? That would be great.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>The de-nerdification of programming</title>
      <link>http://vivekhaldar.com/articles/the-de-nerdification-of-programming/</link>
      <pubDate>Fri, 29 Mar 2024 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-de-nerdification-of-programming/</guid>
      <description>&lt;p&gt;Programming with LLMs, and building systems with LLMs, has completed the long de-nerdification of the field.&lt;/p&gt;
&lt;p&gt;The programmers at the dawn of computing were nerds. They had no abstractions. They dealt with raw hardware – switches, circuits, currents. Binary code. Punched cards. Assembly language was a respite.&lt;/p&gt;
&lt;p&gt;The next step up were high-level languages like FORTRAN and C. Imagine having mnemonics like FOR and variable declarations, after futzing with assembly.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Programming with LLMs, and building systems with LLMs, has completed the long de-nerdification of the field.</p>
<p>The programmers at the dawn of computing were nerds. They had no abstractions. They dealt with raw hardware – switches, circuits, currents. Binary code. Punched cards. Assembly language was a respite.</p>
<p>The next step up were high-level languages like FORTRAN and C. Imagine having mnemonics like FOR and variable declarations, after futzing with assembly.</p>
<p>The arc of high-level languages was a long one. Of course, the languages, theory and tools have taken massive leaps over the last few decades. But they&rsquo;re still languages, still authored by and debugged by human programmers.</p>
<p>The people who found this activity appealing were nerds. They were attracted to the unforgiving yet clean logic, the relentless detail, of the machine. Even after hitting the depths of despair during debugging, emerging on the other side was cathartic because while the solid ground of reason was obscured, you managed to find it! And most importantly, it existed.</p>
<p>The platonic universe of pure reason was manifested in a bunch of circuits, and your messy utterances to make the current dance through them. It was solid ground, unassailable, its rewards and comforts showered upon those willing to endure the hardship of – first, thinking clearly and logically, and second, expressing it in executable form.</p>
<p>This is what the programmers always had over the mathematicians. Math was pure abstraction and reason, and it was beautiful, sure – but programming was all that, and it was executable. It could run! It could talk back to you, reflecting back to you the rigor or sloppiness of your own cognition.</p>
<p>All this is to say that computers, and &ldquo;talking&rdquo; to them via code, was for nerds. Those who felt more comfortable with things rather than people. In fact, they avoided people. People were unreasonable, unpredictable, and inconsistent.</p>
<p>The activity of programming has become easier – dare I say, friendlier – over the years. The languages have soared higher and higher, away from the gritty details of the machine. The tools have become more approachable. We want kids to code, and they seem to be doing that pretty well.</p>
<p>Hardware has become cheap and plentiful. Plentiful enough to support higher and higher level abstractions. The languages aim to model not the machine, but your business, and your problem. The words in your program are from your domain, not from the machine. This is all progress, and the modern economy is built on it.</p>
<p>This has reduced the need for the monastic mental rigor needed when the field was more primitive. The field has been de-nerdifying over time.</p>
<p>Which brings us to large language models and prompt engineering.</p>
<p>Programming languages became higher and higher level… until they become natural language. That seems like a natural step, expected even. This step completes de-nerdification of the field.</p>
<p>The process is in its infancy, and will probably take a while to play out. There are also plenty of people who believe that this is a blip, as any nascent change appears to be. But it is inevitable.</p>
<p>But for the nerds of programming, the problem with building a system out of prompts is… that you have to coax the machine into doing what you want. In informal, natural language. Just like people.</p>
<p>A programmer has to program by talking to the computer as if it were a person. Just like the Star Trek computer. Yay!</p>
<p>But the nerd has a nostalgic feeling of loss at this impressive achievement. Someone called this feeling <a href="https://www.reddit.com/r/vesperance/comments/16mm4zm/vesperance_the_emotion_bridging_epochs/">vesperance</a>: &ldquo;the solitary emotion of wistful recognition of the present as a fading era, tinged with anticipation for an unrecognizable, transformative future.&rdquo;</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>LLMs eat entry-level SWEs</title>
      <link>http://vivekhaldar.com/articles/llms-eat-entry-level-swes/</link>
      <pubDate>Fri, 15 Mar 2024 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/llms-eat-entry-level-swes/</guid>
      <description>&lt;p&gt;(This is an edited write-up of &lt;a href=&#34;https://youtu.be/dNmisudM9IE&#34;&gt;my rambling video&lt;/a&gt; on the same topic.)&lt;/p&gt;
&lt;p&gt;A key point missing in the discourse around &amp;ldquo;is AI going to make coding redundant?&amp;rdquo; is that there is a hierarchy to programmers, and there is a hierarchy to the difficulty and ambiguity in programming tasks. It seems obvious to state, but: AI/LLMs will attack the easier side of that spectrum to start with, and in fact, they already are.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>(This is an edited write-up of <a href="https://youtu.be/dNmisudM9IE">my rambling video</a> on the same topic.)</p>
<p>A key point missing in the discourse around &ldquo;is AI going to make coding redundant?&rdquo; is that there is a hierarchy to programmers, and there is a hierarchy to the difficulty and ambiguity in programming tasks. It seems obvious to state, but: AI/LLMs will attack the easier side of that spectrum to start with, and in fact, they already are.</p>
<p>I predict that entry-level junior software engineers are going to get eaten by large language models that can generate code.</p>
<p>Now my take is actually a moderate one. If you listen to folks like <a href="https://www.youtube.com/watch?v=mj0pW9_ckug">Matt Welsh of Fixie.ai</a>, he has a much stronger position. He has the position that all software engineering is going to get eaten by LLMs and AI. And maybe that&rsquo;s true, but I&rsquo;m making the softer claim that it&rsquo;s going to happen more immediately and more obviously for entry level positions really soon.</p>
<p>We have to start by first understanding the level progression of software engineers. If you go look at <a href="http://levels.fyi">levels.fyi</a>, the levels are similar across most tech companies. The first three levels are L3, L4, L5. L3 is entry-level software engineer. That is usually people new to software engineering or recent graduates. L4 is mid-level. L5 is senior. The general scope and responsibilities for an entry-level L3 software engineer are to design, implement, debug, and deploy software that is fairly well-understood and well-defined in scope. Usually this takes the form of someone a bit more senior like an L4 or an L5 doing the higher level or more complex design for a system and breaking it down into well-defined tasks. Then L3 software engineers do maybe some more detailed design, and the more well-defined and well-scoped implementation tasks to implement that larger system.</p>
<p>Basically, what an entry-level software engineer does is take well-defined, well-scoped tasks and then be proficient enough in coding, debugging skills to quickly, correctly, cleanly implement them and deploy them to production and to be able to debug those things if need be. And then once you get to higher levels like mid-level or senior level, it&rsquo;s more about being independent. It&rsquo;s more about larger scope, larger ownership, leadership, all that stuff. But today we&rsquo;re just talking about entry level software engineers.</p>
<p>So given that description of what an entry level software engineer does, it&rsquo;s not that hard to see how the code-generating LLMs of today are creeping very close to it. And if you wait another maybe year, which is practically infinity in machine learning time scales, that it would be pretty easy for LLMs to accomplish that. With context windows getting larger and larger, you can fit more and more surrounding code, adding more context so that you can ask the LLM to write code for something that is very specific to your system and to your code base, your module, your implementation and generate code that understands what the surrounding classes and methods and abstractions are doing and actually uses them as opposed to writing generic code that uses publicly available APIs that the LLM has already been trained on.</p>
<p>If you look at recent increases in context window lengths, for example, Gemini 1.5 went all the way up to a million tokens, and even larger sizes in research. And a million tokens is pretty huge. A million tokens is 750,000 words. A lot of even medium-complexity GitHub repos could fit entirely within that window. Now, if you&rsquo;re working in a closed source enterprise code base, it&rsquo;s probably a lot larger than that, but a million tokens might still be enough to fit the module or the subsystem that an entry-level software engineer is working on. And you can put all that into the context window plus your instructions for what you want to do.</p>
<p>Today the &ldquo;hit rate&rdquo; for accomplishing a task right away is not high. Often a human software engineer has to take that first draft and tweak it a little bit to make it work.</p>
<p>The writing is on the wall. What are the implications of that? Are you just going to have senior software engineers do design, spell out architecture, and drive the LLM, so to speak, give the LLM direction, look at its output, nudge it in the correct direction?</p>
<p>It gets a bit more speculative and vague as you go up the stack from junior to mid-level to senior and beyond. But at least for the kinds of things that entry-level software engineers do, I don&rsquo;t think it&rsquo;s a far stretch at all to say that code-writing LLMs can do that kind of work. They can do a lot of that kind of work even today, and very soon they&rsquo;ll be able to do most, if not all of that entry-level work.</p>
<p>The open question is what that means for the overall hiring pipeline, and career development more generally. If you just skip this entry-level step in career development, how does one even get to mid-level or senior level? How do you get the experience needed to reach those levels? It becomes a bootstrapping problem. And I don&rsquo;t have any good answers to that. I don&rsquo;t think anyone does. I think all this is happening so fast that everyone is pretty much making it up as they go along.</p>
<p>That&rsquo;s an important question for computer science or programming graduates coming into the market, into the tech hiring market in the next few years. They&rsquo;re going to need a lot more than coding and implementation chops to stand out in the hiring pool. And once they do get hired, again, they&rsquo;re going to need more than coding and implementation chops to stand out among their colleagues.</p>
<p>At the very least, what&rsquo;s clear is that if you&rsquo;re graduating now or soon, you have to be extremely familiar and extremely fluent with AI-assisted programming. You have to understand how to prompt an LLM, how to prompt an LLM to get specific kinds of code, how to prompt an LLM to help you debug, how to prompt an LLM to help you critique your code, review your code, debug your code. You have to know various ways of prompting LLMs. You have to know how to work with LLMs. And I think that skill set will become as basic as knowing how to use an IDE or knowing how to do a edit-compile-debug cycle.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>GPT Monologues</title>
      <link>http://vivekhaldar.com/articles/gpt-monologues/</link>
      <pubDate>Sun, 26 Nov 2023 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/gpt-monologues/</guid>
      <description>&lt;p&gt;Ever wished you could provide ChatGPT one initial prompt, then kick back for a few minutes as it waxes eloquent on that topic?&lt;/p&gt;
&lt;p&gt;I used a prompt that tells the LLM to generate a relevant follow-on question, then use that question as the next prompt in the chat.&lt;/p&gt;
&lt;p&gt;You can repeat this for as many turns as you want&amp;ndash; depending on how long you want to listen, and how much you want to rack up your API bill.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Ever wished you could provide ChatGPT one initial prompt, then kick back for a few minutes as it waxes eloquent on that topic?</p>
<p>I used a prompt that tells the LLM to generate a relevant follow-on question, then use that question as the next prompt in the chat.</p>
<p>You can repeat this for as many turns as you want&ndash; depending on how long you want to listen, and how much you want to rack up your API bill.</p>
<p>Below is an example of GPT-4 talking about the Dylan Thomas poem &ldquo;Do not go gentle into that good night&rdquo;. I&rsquo;m no lit major, but sounds like a decent exposition of the poem.</p>
<p>The prompt to generate follow-on questions was:</p>
<blockquote>
<p>Given the above what is one follow-on question that would help me learn about this topic? Please reply with only the question, without any leading or trailing information.</p></blockquote>
<!-- Video Dylan Thomas GPT video -->
<iframe width="560" height="315" src="https://www.youtube.com/embed/hZLXdxedBiU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
]]></content:encoded>
    </item>
    
    <item>
      <title>Metaphors for thinking about LLMs</title>
      <link>http://vivekhaldar.com/articles/metaphors-for-thinking-about-llms/</link>
      <pubDate>Sun, 20 Aug 2023 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/metaphors-for-thinking-about-llms/</guid>
      <description>&lt;p&gt;Not so long ago, I suggested that when it comes to using LLMs for
programming, a useful metaphor is to &lt;a href=&#34;https://vivekhaldar.com/articles/llms-are-compilers/&#34;&gt;think of them as compilers&lt;/a&gt;. I
recently came across a couple of papers which are exploring that line
of thinking deeper.&lt;/p&gt;
&lt;p&gt;In their most general sense, compilers are translators from one
language to another. We usually narrow that meaning to only allow
translators that output low-level executable machine code, but a
program (like an LLM!) that took natural language and emitted
executable code in a high-level language could also very well be
classified as a compiler.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Not so long ago, I suggested that when it comes to using LLMs for
programming, a useful metaphor is to <a href="https://vivekhaldar.com/articles/llms-are-compilers/">think of them as compilers</a>. I
recently came across a couple of papers which are exploring that line
of thinking deeper.</p>
<p>In their most general sense, compilers are translators from one
language to another. We usually narrow that meaning to only allow
translators that output low-level executable machine code, but a
program (like an LLM!) that took natural language and emitted
executable code in a high-level language could also very well be
classified as a compiler.</p>
<p>In <a href="https://drops.dagstuhl.de/opus/volltexte/2023/18524/pdf/OASIcs-SLATE-2023-10.pdf">Large Language Models: Compilers for the 4th Generation of Programming Languages?</a>, the authors chase exactly that line of reasoning:</p>
<blockquote>
<p>&hellip;this is a speculative paper discussing whether large language
models could be considered a higher level of programming language in
relation to current high-level languages. In short, assembly language
(2nd generation) replaced punch-card programming (1st generation) by
introducing mnemonics. These allowed larger and more complex programs
to be created in less time. High level languages (3rd generation) in
turn replaced assembly language by introducing structured English
constraints.  The hypothesis explored in this paper is that large
language models could be a 4th generation language, replacing
high-level languages by allowing natural language specifications.</p></blockquote>
<p>The most obvious objection to this line of reasoning is that compilers
are deterministic and (modulo bugs) will emit &ldquo;correct&rdquo; code, whereas
LLMs are probabilistic and will sometimes emit erroneous or incorrect
code. The authors propose that <em>feedback</em> be used as a central
mechanism. Syntax errors should be fed back to get correct code. Code
that does not adhere to a spec (as expressed in unit tests or other
checking mechanisms) should be fed back to improve the spec, i.e. the
input prompt.</p>
<blockquote>
<p>It can also be argued that the deterministic translator is primarily concerned with syntax
(i.e. the structure of sentences based on the Chomsky hierarchy) and the probabilistic
translator with semantics (i.e. the relationship between words based on the distributional
hypothesis). Therefore, it is not a case of replacement, but of composing these two translation
strategies. As a result, if a source is generated with syntactic errors, the generator would
produce an improved source by using the error messages as feedback.</p></blockquote>
<p>In <a href="https://arxiv.org/pdf/2208.06213.pdf">What is it like to program with artificial intelligence?</a>, the authors cast their net broader and try on a few different metaphors to see how they might fit LLMs.</p>
<ul>
<li>LLM as a pair programmer: Copilot&rsquo;s original pitch. Sometimes you drive, sometimes you navigate. It&rsquo;s your supercharged rubber duck.</li>
<li>LLM as search: Skip Google and StackOverflow, ask ChatGPT/Copilot.</li>
<li>LLM as compiler (there it comes up again!): the march of programming to higher levels of abstraction and being declarative continues unabated, only to end up in&hellip; English?</li>
</ul>
<p>The authors point out scenarios where each of the above metaphors applies, and where it breaks down. Because none of them is a perfect fit, they say that programming with LLMs is an <em>entirely new, distinct way of programming</em>. It certainly <em>feels</em> that way.</p>
<p>Hoping to make videos soon covering these in a bit more detail.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Re: Why I don&#39;t use Copilot</title>
      <link>http://vivekhaldar.com/articles/re--why-i-don-t-use-copilot/</link>
      <pubDate>Thu, 08 Jun 2023 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/re--why-i-don-t-use-copilot/</guid>
      <description>&lt;p&gt;Ed Summers wrote a post on &lt;a href=&#34;https://inkdroid.org/2023/06/04/copilot/&#34;&gt;why he doesn&amp;rsquo;t use Copilot&lt;/a&gt;, and I want to riff on that to see if it helps me build my own mental scaffolding for how LLMs, and AI in general, will change programming, and how programmers should adapt to that. This isn&amp;rsquo;t meant to be a critique of the piece, but my attempt to come up with counterpoints to see what actually holds.&lt;/p&gt;
&lt;p&gt;I wrote up some of my initial thinking on this topic in a blog post titled &lt;a href=&#34;https://vivekhaldar.com/articles/llms-are-compilers/&#34;&gt;LLMs are compilers&lt;/a&gt;, which should tip you to which side of the debate I&amp;rsquo;m on. I don&amp;rsquo;t think this genie (or Pandora, depending on how you look at it) is going back into the box, so now it&amp;rsquo;s mostly a question of how best to use it as a tool.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Ed Summers wrote a post on <a href="https://inkdroid.org/2023/06/04/copilot/">why he doesn&rsquo;t use Copilot</a>, and I want to riff on that to see if it helps me build my own mental scaffolding for how LLMs, and AI in general, will change programming, and how programmers should adapt to that. This isn&rsquo;t meant to be a critique of the piece, but my attempt to come up with counterpoints to see what actually holds.</p>
<p>I wrote up some of my initial thinking on this topic in a blog post titled <a href="https://vivekhaldar.com/articles/llms-are-compilers/">LLMs are compilers</a>, which should tip you to which side of the debate I&rsquo;m on. I don&rsquo;t think this genie (or Pandora, depending on how you look at it) is going back into the box, so now it&rsquo;s mostly a question of how best to use it as a tool.</p>
<p>OK, let&rsquo;s go:</p>
<blockquote>
<p>GitHub Copilot is a technology that is designed to help you write code, kind of like your partner in pair programming. But, you know, it’s not an actual person. It’s “A.I.”–whatever that means.</p>
<p>In principle this sounds like it might actually be a good thing right? I know several people, who I respect, that use it as part of their daily work. I’ve heard smart people say AI coding assistants like Copilot will democratize programming, by making it possible for more people to write code, and automate the drudgery out of their lives. I’m not convinced.</p></blockquote>
<p>Full disclosure: I&rsquo;ve been a paying customer of Copilot for a few months and have been using it for my own miscellaneous scripts, mostly Python and Emacs Lisp. (Note with big blinking red lights: this is for personal stuff only. Don&rsquo;t use Copilot or products like it inside your company unless they have an explicit policy allowing it!) Speaking only for myself, I get orders of magnitude more value from it than the $10/month it costs. How? Copilot (often used in conjunction with GPT, and now, Bard) has reduced the activation energy for the small scripty projects I want to undertake from being just slightly over a weekend (which meant they would get abandoned or not even started) to fitting comfortably within a weekend. And that has made a world of difference, at least for me. I suspect the same story will play out across programmers in general, where it will serve to lower the friction and frustration of programming just enough to increase their overall output.</p>
<blockquote>
<p>Here’s why I don’t use Copilot (or ChatGPT) to write code:</p>
<p>Copilot’s suggestions are based on a corpus of open source code in Github, but the suggestions do not mention where the code came from, and what the license is. GitHub is stealing and selling intellectual property.</p></blockquote>
<p>This is the strongest argument against Copilot&ndash;that they&rsquo;re license-laundering code. This is also the reason that most (all the ones I know of, certainly) big or medium-tech companies outright ban the use of Copilot and similar products for in-corp use. The IP risks are simply not worth it. Until the legal aspect of Copilot is tested in court and some clear precedent is established, that is not likely to change.</p>
<p>But there might be a chicken-and-egg problem here: large corporations that produce code are steering clear of using Copilot, so there is unlikely to be a major lawsuit that would test this in courts. The biggest of big-tech (FANG companies) have internal codebases large enough that they can train LLMs purely on their own codebase to offer completions to their own engineers in-corp, and never worry about getting sued for license infringement. Maybe the best chance of a test case reaching the courts is a small startup using Copilot to develop a product that becomes a huge hit, at which point it would be large enough (for someone) to sue.</p>
<blockquote>
<p>Copilot lets you write code faster. I don’t think more code is a good thing. The more code there is, the more code there is to maintain. Minimalism in features is usually a good thing too. Less really is more.</p></blockquote>
<p>This argument has the same shape as Charles Petzold&rsquo;s classic <a href="https://charlespetzold.com/etc/DoesVisualStudioRotTheMind.html">Does Visual Studio rot the mind?</a>, which was written back in 2005 and lamented the rapid onset of IntelliSense as a basic tool of programmers everywhere. I am sympathetic to this argument, but I&rsquo;m not sure this is going to persuade programmers who are in a rush to put a product out into the market. If a tool let&rsquo;s them ship 1% faster, they will use it.</p>
<p>There is a whole different argument around what <em>type</em> of coding needs IntelliSense (and now Copilot) vs what can be done bareback, but the &ldquo;minimalism is beautiful&rdquo; argument depends on your dependencies being minimal and beautiful. When you&rsquo;re using a library with thousands of classes, each with hundreds of methods, that argument falls apart.</p>
<blockquote>
<p>As more and more programmers use Copilot it creates conservativism in languages and frameworks that prevents people from creating and learning new ways of doing things. Collectively, we get even more stuck in our ways and biases. Some of the biases encoded into LLMs are things that we are actively trying to change.</p></blockquote>
<p>Another strong argument. Copilot sets up a positive feedback loop that greatly reinforces current languages, libraries and frameworks. Doing ML-heavy work in Python? Copilot is so stunningly accurate in that domain (no doubt due to the mountains of code that use pandas and scikit and pytorch and tensorflow) that if a newer, better ML library comes along, one of it&rsquo;s greatest barriers to adoption will be programmers reticent to use it because Copilot doesn&rsquo;t offer good completions for it yet. Same goes for new languages. A chicken-and-egg problem again.</p>
<p>I predict that in order to get traction on new libraries or languages their developers will have to build additional tooling that can somehow &ldquo;inject&rdquo; good completions for that particular new entrant.</p>
<blockquote>
<p>Developers become dependent on Copilot for intellectual work. Actually, maybe addicted is a better word here. The same could be (and was) said about the effect of search engines on software development work (e.g. Googling error messages). But the difference is search results need to be interpreted, and the resulting web pages have important context that you often need to understand. This is work that Copilot optimizes away and truncates our knowledge in the process.</p></blockquote>
<p>The comparison with addiction is one that Petzold makes in the above-linked piece. The argument here is that Copilot is letting programmers get away with a shallower understanding and lesser knowledge. But the exact same argument can be made of every advance that has continously raised the level of abstraction of programming over the decades. Assembly language obviated the need to understand binary programming. Compilers obviated the need to understand assembly language. We&rsquo;re at the point where one could be perfectly adept at accomplishing tasks in Python without actually understanding how a CPU works. The march of progress continues.</p>
<p>Will there need to be an &ldquo;elite&rdquo; class of programmers that build all this infrastructure? Someone has to understand the full stack enough to build OS kernels, compilers, language runtimes, garbage collectors and ML libraries. We&rsquo;ll be in trouble if that class dwindles too much. C is not hip, it&rsquo;s old and tired, but every major OS kernel is still written in C. For the millions of programmers that pick up Python with YouTube tutorials (and that is a wonderful thing!), we still need a few dozen to get drawn into the Linux kernel source and get fascinated by C and pointer chasing, to preserve our ability to manufacture the concrete used to build our digital metropolis. Hopefully things like Copilot lower the barrier enough on the Python end of the pipeline that we still get the trickle we need on the C end.</p>
<blockquote>
<p>Copilot costs money. It doesn’t cost tons of money (for a professional person in the USA) but it could be significant for some. Who does it privilege? Also, it could change (see point 4). Remember who owns this thing.</p></blockquote>
<p>True. $10/month when translated to most places in Asia would be significant enough to keep this out of the reach of most young programmers. With the advent of open-source LLMs that continue to get more capable, hopefully we&rsquo;ll see this price drop significantly, or even soon reach the point that a fairly capable model can be run entirely locally.</p>
<blockquote>
<p>How much energy does it take to run Copilot as millions of developers outsource their intellectual work to its LLM infrastructure? Is this massive centralization and enclosure really progress in computing? Or is it a step backwards as we try to reduce our energy use as a species?</p></blockquote>
<p>I&rsquo;m an <a href="https://twitter.com/vivekhaldar/status/1665826274533847040">unabashed accelerationist</a>, so I&rsquo;d argue this is besides the point. But even if you buy into the premise that we need to reduce our energy consumption, one could argue that centralization leads to efficiencies of scale, and for all we know it might actually be more energy-efficient to consolidate computation happening on millions of clients and bring them into a datacenter.</p>
<blockquote>
<p>What does Copilot see of the code in your editor? Does it use your code as context for the prompt? What does it store, and remember, and give to others? Somebody has probably looked into this, but if they have it is always up for revision. Just out of principle I don’t want my editor sending my code somewhere else without me intentionally doing it.</p></blockquote>
<p>Very fair point and I completely agree. More transparency would go a long way towards more developers becoming comfortable with technology like this. A local log of everything sent to the server would be great.</p>
<blockquote>
<p>Working with others who use Google Copilot makes my job harder, since they sometimes don’t really understand the details of why the code is written a particular way. Over time Copilot code can mix idioms, styles and approaches, in ways that the developer doesn’t really understand or even recognize. This makes maintenance harder.</p></blockquote>
<p>This depends on how things like Copilot embed into the overall development flow. Do you have linters or static checkers enforcing basic formatting and style? Do you have a local style or best practices guide? Do you have a robust code review culture? Yes, if you never look at completions from Copilot with a critical eye and accept blindly everything it suggests, you&rsquo;re likely to end up with a crappy codebase. But you will also end up with a crappy codebase if you take the first draft of your code and check it in without any code review.</p>
<blockquote>
<p>As far as I can tell the only redeeming qualities of Copilot are:</p>
<p>Copilot encourages you to articulate and describe a problem as written prose before starting to write code. You don’t need Copilot for this. Maybe keep a work journal or write a design document? Maybe use your issue tracker? Use text to communicate with other people.</p>
<p>Copilot is more interactive than a rubber duck. But, it turns out Actual People are even more interactive and surprising. Reach out to other professionals and make some friends. Go to workshops and conferences.</p>
<p>Copilot makes me think critically about machine learning technology, my profession and its place in the world.</p></blockquote>
<p>Could not agree more! Sharpening your writing skills, discussing problems with colleagues and looking critically at the new shiny thing&mdash; these are all things every programmer should be doing.</p>
<p>Using not just Copilot but an LLM as a &ldquo;smart&rdquo; rubber duck that you converse with can be an intellectually stimulating and effective way to iterate towards a solution, and even get a deeper understanding of the tradeoffs involved. A couple of great examples of this mode of programming were written up by Prof. Crista Lopes in a <a href="https://web.archive.org/web/20230401132559/http://tagide.com/education/writing-a-grammar-with-chatgpt/">series</a> <a href="https://web.archive.org/web/20230328190813/http://tagide.com/education/the-end-of-programming-as-we-know-it/">of</a> blog posts.</p>
<blockquote>
<p>Maybe my thinking on this will change. But I doubt it. I’m on the older side for a software developer, and (hopefully) will retire some day. Maybe people like me are on the way out, and writing code with Copilot and ChatGPT is the future. I really hope not.</p>
<p>But some good news: you can still uninstall it–from your computer, and from your life.</p></blockquote>
<p>I share some of Summers&rsquo; discombobulation. The day after GPT-4 was demo&rsquo;ed <a href="https://vivekhaldar.com/articles/lazypost--programming-in-the-age-of-gpt-and-copilot/">I wrote</a>:</p>
<blockquote>
<p>A couple of years ago I thought I had a decent grasp of the trajectory of programming as a field, and as a career path. Languages, frameworks and libraries would get better at modeling and abstracting more complex programs, safety vs performance would be less and less of a conflicting tradeoff, compilers would get better, IDEs and tools would get better, and underneath it all, even if Moore’s Law was hitting a wall, we’d just continue throwing more cores at larger problems. But at the end of the day, the immense cognitive leverage that comes from encoding something into executable software would ensure that programmers were always in short supply. But now I feel unsure and disoriented, not certain about where I stand.</p></blockquote>
<p>Potters make art, but they must love the physical feeling of clay. Code is our clay, and we don&rsquo;t know what it&rsquo;ll feel like in a year or two.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>AI doomers will doom us</title>
      <link>http://vivekhaldar.com/articles/ai-doomers-will-doom-us/</link>
      <pubDate>Sun, 21 May 2023 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/ai-doomers-will-doom-us/</guid>
      <description>&lt;p&gt;(The following is a slightly edited script of &lt;a href=&#34;https://youtu.be/RnXnhV_Il-Y&#34;&gt;my video&lt;/a&gt; on the topic)&lt;/p&gt;
&lt;!-- Video on AI doomers --&gt;
&lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#34;https://www.youtube.com/embed/RnXnhV_Il-Y&#34; title=&#34;YouTube video player&#34; frameborder=&#34;0&#34; allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;The AI doomers are everywhere, and they want to start blowing up stuff, and I want to talk about it.&lt;/p&gt;
&lt;p&gt;When Yudkowsky blithely advocates airstriking datacenters that could possibly be training an AGI, even at the risk of that setting of a nuclear exchange, that is  the point at which the podcast hosts should&amp;rsquo;ve gone &amp;ndash; woah woah woah, slow down, that&amp;rsquo;s kind of batshit crazy. You&amp;rsquo;re willing to actually doom humanity for real before it&amp;rsquo;s theoretically doomed at some point in the future by AGI. I know you&amp;rsquo;re constructing some pretty sophisticated arguments that you&amp;rsquo;re totally convinced of, but I&amp;rsquo;ll withold my unabashed support for just a little bit, if that&amp;rsquo;s ok with you.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>(The following is a slightly edited script of <a href="https://youtu.be/RnXnhV_Il-Y">my video</a> on the topic)</p>
<!-- Video on AI doomers -->
<iframe width="560" height="315" src="https://www.youtube.com/embed/RnXnhV_Il-Y" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
<p>The AI doomers are everywhere, and they want to start blowing up stuff, and I want to talk about it.</p>
<p>When Yudkowsky blithely advocates airstriking datacenters that could possibly be training an AGI, even at the risk of that setting of a nuclear exchange, that is  the point at which the podcast hosts should&rsquo;ve gone &ndash; woah woah woah, slow down, that&rsquo;s kind of batshit crazy. You&rsquo;re willing to actually doom humanity for real before it&rsquo;s theoretically doomed at some point in the future by AGI. I know you&rsquo;re constructing some pretty sophisticated arguments that you&rsquo;re totally convinced of, but I&rsquo;ll withold my unabashed support for just a little bit, if that&rsquo;s ok with you.</p>
<p>There&rsquo;s obviously been a rigorous debate about the merits of the AI doomer argument, but I want to highlight some considerations that have not even entered into the debate, much to my surprise.</p>
<h2 id="long-termism">Long-termism</h2>
<p>But a bit of background first. The moral-philosophical underpinnings from which this line of thought comes makes this stance consistent within that world view.</p>
<p>There is a passage in the Bostrom Superintelligence book, which is the bible of the AI doomer movement, that explains  the basis of the philosophy of long-termism (who could even argue with a name like that?).</p>
<p>The total &ldquo;endowment&rdquo; &ndash; the thing we have the highest moral duty to protect &ndash; is the total number of <em>potential</em> human minds, both real (in the flesh?) and <em>virtual</em>, that could live on a substantial fraction of the habitable planets (and even structures in space that are not planets) up to the space reachable by light from Earth, up to the time of the heat death of the universe. That&rsquo;s estimated to be 10^58 minds.</p>
<p>The AI doomer camp was birthed out of the philosophy of long-termism. Bostrom was one of the founding philosophers. Yes, the same Bostrom who wrote Superintelligence. Many others have crafted excellent critiques of that philosophy, so go <a href="https://aeon.co/essays/why-longtermism-is-the-worlds-most-dangerous-secular-credo">read those</a>.</p>
<p>But the gist of it is that it is being used to justify some pretty horrendous suffering wrought upon the real humans beings that are alive today, in order to make sure that the 10^58 humans in our potential future have a chance at existing. What&rsquo;s 10^9 sacrifices when compared to <em>saving</em> 10^58 ? Not even significant.</p>
<p>And that is the reason why the Bostrom-Yudkowsky camp are so comfortable proposing inflicting massive suffering today to reduce that probability of existential wipeout by even a tiny bit. It is guilt-laundering from the present into a future so vast that it is absolved by dilution.</p>
<h2 id="police-state-panopticon">Police state panopticon</h2>
<p>OK, let&rsquo;s even step over the &ldquo;it&rsquo;s better to provoke nuclear war than get to AGI&rdquo; argument. Let&rsquo;s look at the kind of moratorium they are calling for, and the enforcement that requires. Think about what kind of precedent this would set. Forget for a minute the specific field of AI that the AI doomers are talking about.</p>
<p>What they&rsquo;re arguing for is a global government enforcement mechanism that would subject both private corporations and citizens to an all-seeing police state. Because that&rsquo;s what it would take to peek into every data center everywhere. That&rsquo;s what it would take to ensure that GPU manufacturers build tamper-proof GPUs that call home and report malicious training loads, for some definition of malicious that the doomer cabal deems acceptable. And of course, it won&rsquo;t take only monitoring GPUs, because one could train an AGI on CPUs. So we&rsquo;re already at a place where we&rsquo;d need to police all computation, whether it happens on GPUs or CPUs. No more encryption. Every computational load anywhere will be subject to random, or ongoing, surveillance to ensure that the humanity-destroying AGI isn&rsquo;t being trained on it.</p>
<p>Keep going down the compute chain. True enforcement would require monitoring and watchdogs at every semiconductor fab. And to prevent the possibility of someone maybe spinning up their own little fab hidden from the government panopticon, you would give this police state even deeper powers to monitor every aspect of life, industry and consumption. After all, you&rsquo;d want to detect large draws of electricity in case it was being used to train an AGI.</p>
<p>And this politburo once established will of course want to save humanity from other new technologies that pose existential risks. So we&rsquo;ve gone and created a body outside  democratic and judicial guardrails that has the power to squint real hard and declare some class of human endeavor dangerous enough to pose an existential risk, then put a stop to it.</p>
<p>That is the path the AI doomers want to send us down. And this question of individual liberties and preserving free societies never comes up. Not once in the Superintelligence book, and not once in the blitzkrieg of podcast appearances that Yudkowsky has gone on recently. None of the hosts thought to ask about it either. I thought that was a large enough omission to make this rant video.</p>
<h2 id="history">History</h2>
<p>History is not devoid of humanity successfully dealing with what were at the time thought to be existential risks.</p>
<p>Example #1 is nuclear power. We made atomic bombs, and then the entire world got together to make sure that we didn&rsquo;t wipe ourselves out while preserving the ability to go to war with each other. So, yaay, score for humanity!</p>
<p>Another example is the Asilomar Conference. Back in 1975 the prominent biotechnologists of the day got together to discuss how to safely perform research that involved recombinant DNA. They were worried that splicing DNA around would create a killer virus or bacteria or cancer cell that would spread out in the world. They came up with restraints on themselves, and principles for how to safely carry out research while moving the field forward. And all this without dragging government and regulators into it.</p>
<p>So scientists <em>can</em> self-organize to deal with risks, they can self-regulate, they can find ways to push the boundary of knowledge further without shutting down the whole endeavor, and certainly without advocating for airstriking labs.</p>
<h2 id="closing">Closing</h2>
<p>The AI doomers have all the attention right now. Perhaps because we&rsquo;re all worried that AI will take our jobs and strip us of our humanity. That voice saying &ldquo;AI will kill us all! Shut it down now!&rdquo; sounds pretty appealing. But it deserves a bit more pushback.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>IDEs and CAD</title>
      <link>http://vivekhaldar.com/articles/ides-and-cad/</link>
      <pubDate>Sun, 19 Mar 2023 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/ides-and-cad/</guid>
      <description>&lt;p&gt;I was re-reading Charles Petzold&amp;rsquo;s 2005 talk/essay &lt;a href=&#34;http://charlespetzold.com/etc/DoesVisualStudioRotTheMind.html&#34;&gt;Does Visual Studio Rot the Mind?&lt;/a&gt; the other day and trying to relate it to the advent of automation in other fields. Nicholas Carr&amp;rsquo;s 2014 book &lt;a href=&#34;https://www.nicholascarr.com/?page_id=18&#34;&gt;The Glass Cage&lt;/a&gt; is an extended meditation on this topic. Highly recommended. But in my squirreling around I found a couple of papers that investigated the effect of CAD programs on the practice of architecture. So here&amp;rsquo;s a skeletal summary.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I was re-reading Charles Petzold&rsquo;s 2005 talk/essay <a href="http://charlespetzold.com/etc/DoesVisualStudioRotTheMind.html">Does Visual Studio Rot the Mind?</a> the other day and trying to relate it to the advent of automation in other fields. Nicholas Carr&rsquo;s 2014 book <a href="https://www.nicholascarr.com/?page_id=18">The Glass Cage</a> is an extended meditation on this topic. Highly recommended. But in my squirreling around I found a couple of papers that investigated the effect of CAD programs on the practice of architecture. So here&rsquo;s a skeletal summary.</p>
<p>The first paper was <a href="https://www.researchgate.net/publication/308303260_THE_EFFECT_OF_CAD_ON_ARCHITECTURE_STUDENTS'_CREATIVITY_AND_ENTHUSIASM">The effect of CAD on Architecture Students&rsquo; Creativity and Enthusiasm</a>. It looked at self-reported answers from architecture students.</p>
<blockquote>
<p>The study found that architecture students do not perceive CAD applications as having potential to make them lazy in design. Furthermore, student’s ability to develop conceptual patterns, creative forms and novel ideas was found to be enhanced by the use of CAD. Most of the respondents (77.8%) agree that CAD enhances creativity. Lack of design drive and enthusiasm flourish among the undergraduate students because the requirement to present design solutions in manual drafting is perceived as burdensome and a waste of time.</p></blockquote>
<p>The second piece was more an essay and analysis:  <a href="https://eprints.whiterose.ac.uk/1427/1/lawson.b1.pdf">CAD and creativity: Does the computer really help?</a></p>
<p><strong>When CAD helps creativity</strong></p>
<ul>
<li>Students who have great ideas but are not good draftsmen and drawers use CAD to express ideas they would not otherwise have been able to</li>
<li>Even experienced architects say that CAD allows them to push the boundaries of how complex or intricate their designs are</li>
<li>Simple CAD systems can be used by non-professionals to design buildings</li>
</ul>
<p><strong>Can CAD hinder creativity?</strong></p>
<ul>
<li>Many top architects still work with paper and physical forms, and see benefits of CAD to be not large enough to justify the investment in learning it</li>
<li>Anecdotal trend among students: they become proficient in the software, but their creations lack &ldquo;real&rdquo; creativity: &ldquo;They may look extremely convincing, they might be original, but they are most certainly not good design.&rdquo;</li>
<li>On virtuosity without soul, the ease of blinding with polished presentation that lacks deeper substance:
<ul>
<li>&ldquo;Theoretically, it has always been possible to find excellent presentation combined with poor design. However, before the advent of CAD, it seldom happened in practice. This is probably because the visual sensitivity needed to design and to draw well are so similar that it would be unlikely for a student to be skilled in one area but not in the other.&rdquo;</li>
<li>&ldquo;So it is possible to put forward computer presentations that look attractive and even dazzling, that seem authoritative, while the architecture so represented is really quite awful.&rdquo;</li>
</ul>
</li>
<li>They draw a  parallel with desktop publishing: &ldquo;This phenomenon can also be illustrated with reference to the graphic design that proliferated with the advent of the Apple Macintosh computer. We started to see documents obviously produced by people who owned a Mac, with its (at the time) revolutionary what-you-see-is-what-you-get interface and multiple fonts. These documents characteristically contained as many fonts as possible, apparently merely in order to exploit this new and wonderful facility.&rdquo;</li>
<li>Computer makes it easy to do &ldquo;hard&rdquo; things without understanding underlying principles and constraints: &ldquo;Even worse, some of these forms are relatively easy to generate in CAD but are hard to represent in manual perspective—for example, shell forms based on ellipsoidal sections, rotations of curved parabolic forms and so on. Perhaps this encourages students to believe that because they have drawn something infrequently seen, they are being creative.&rdquo;</li>
<li>CAD does not understand or represent the materiality of the structures being designed. The shapes are abstract.</li>
</ul>
<p>Of course, if you&rsquo;re a programmer, you will note the obvious parallels to the debates around IDEs, and lately, Copilot and LLMs.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>LazyPost: Programming in the age of GPT and CoPilot</title>
      <link>http://vivekhaldar.com/articles/lazypost--programming-in-the-age-of-gpt-and-copilot/</link>
      <pubDate>Wed, 15 Mar 2023 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/lazypost--programming-in-the-age-of-gpt-and-copilot/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m confused and in a funk, hence this lazypost. Don&amp;rsquo;t expect any answers.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve always been fascinated by the question of how we as programmers relate to our tools, how that makes us feel about what it is we actually do, and about our identity. Are we craftsmen? Are we factory workers?&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s a question I&amp;rsquo;ve been contemplating for more than a decade on this blog. Some prior writing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://vivekhaldar.com/articles/gui-vs-cli-operation-vs-expression/&#34;&gt;Operation vs expression&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://vivekhaldar.com/articles/sharp-tools-dull-minds/&#34;&gt;Sharp tools, dull minds&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://vivekhaldar.com/articles/you-cant-run-with-the-machines/&#34;&gt;You can&amp;rsquo;t run with the machines&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://vivekhaldar.com/articles/deskilling/&#34;&gt;De-skilling&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://vivekhaldar.com/articles/automating-software-engineering/&#34;&gt;Automating software engineering&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://vivekhaldar.com/articles/the-perils-of-being-a-knowledge-worker/&#34;&gt;The perils of being a knowledge worker&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&amp;rsquo;m happily using GitHub Copilot for my personal code. It has made me churn out more Emacs Lisp and Python, and the prospect of actually getting a little project done in a few precious spare hours on the weekend has definitely egged me on and made me more enthusiastic about experimenting with and starting new things. &lt;em&gt;But what does all this mean for us as programmers?&lt;/em&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I&rsquo;m confused and in a funk, hence this lazypost. Don&rsquo;t expect any answers.</p>
<p>I&rsquo;ve always been fascinated by the question of how we as programmers relate to our tools, how that makes us feel about what it is we actually do, and about our identity. Are we craftsmen? Are we factory workers?</p>
<p>It&rsquo;s a question I&rsquo;ve been contemplating for more than a decade on this blog. Some prior writing:</p>
<ul>
<li><a href="https://vivekhaldar.com/articles/gui-vs-cli-operation-vs-expression/">Operation vs expression</a></li>
<li><a href="https://vivekhaldar.com/articles/sharp-tools-dull-minds/">Sharp tools, dull minds</a></li>
<li><a href="https://vivekhaldar.com/articles/you-cant-run-with-the-machines/">You can&rsquo;t run with the machines</a></li>
<li><a href="https://vivekhaldar.com/articles/deskilling/">De-skilling</a></li>
<li><a href="https://vivekhaldar.com/articles/automating-software-engineering/">Automating software engineering</a></li>
<li><a href="https://vivekhaldar.com/articles/the-perils-of-being-a-knowledge-worker/">The perils of being a knowledge worker</a></li>
</ul>
<p>I&rsquo;m happily using GitHub Copilot for my personal code. It has made me churn out more Emacs Lisp and Python, and the prospect of actually getting a little project done in a few precious spare hours on the weekend has definitely egged me on and made me more enthusiastic about experimenting with and starting new things. <em>But what does all this mean for us as programmers?</em></p>
<p>The <a href="https://openai.com/research/gpt-4">release of GPT-4 yesterday</a> and the subsequent <a href="https://www.youtube.com/watch?v=outcGtbnMuQ">demo</a> has made me feel a mix of excitement, melancholy and disorientation.</p>
<p>A couple of years ago I thought I had a decent grasp of the trajectory of programming as a field, and as a career path. Languages, frameworks and libraries would get better at modeling and abstracting more complex programs, safety vs performance would be less and less of a conflicting tradeoff, compilers would get better, IDEs and tools would get better, and underneath it all, even if Moore&rsquo;s Law was hitting a wall, we&rsquo;d just continue throwing more cores at larger problems.  But at the end of the day, the immense cognitive leverage that comes from encoding something into executable software would ensure that programmers were always in short supply. But now I feel unsure and disoriented, not certain about where I stand.</p>
<p>I&rsquo;m beginning to get more and more convinced of Matt Welsh&rsquo;s take on how <a href="https://cacm.acm.org/magazines/2023/1/267976-the-end-of-programming/fulltext">LLMs spell the end of programming as we know it</a> (<a href="https://www.youtube.com/watch?v=qmJ4xLC1ObU">YT video of his talk</a>). The last few decades saw steady linear improvements in programming languages and tooling. The next few years (who knows, maybe months?) are going to be uncharted territory, a step change. Like the saying goes &ndash; may you live in interesting times.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>LLMs are compilers</title>
      <link>http://vivekhaldar.com/articles/llms-are-compilers/</link>
      <pubDate>Sun, 26 Feb 2023 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/llms-are-compilers/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been thinking about a fruitful way to frame the act of writing code in the age of Copilot/Codex, and I don&amp;rsquo;t think &amp;ldquo;autocomplete on steriods&amp;rdquo; is it. &lt;em&gt;Prompt-driven programming&lt;/em&gt; with an LLM is better thought of as a &lt;strong&gt;compiler&lt;/strong&gt;. Just like what we understand as a compiler today translates from a high-level programming language like C++ or Java to machine code (actually, assembly language), you could view an LLM as a &lt;em&gt;compiler that translates from English to a high-level language&lt;/em&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I&rsquo;ve been thinking about a fruitful way to frame the act of writing code in the age of Copilot/Codex, and I don&rsquo;t think &ldquo;autocomplete on steriods&rdquo; is it. <em>Prompt-driven programming</em> with an LLM is better thought of as a <strong>compiler</strong>. Just like what we understand as a compiler today translates from a high-level programming language like C++ or Java to machine code (actually, assembly language), you could view an LLM as a <em>compiler that translates from English to a high-level language</em>.</p>
<!-- Karpathy tweet on English as a programming language -->
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">The hottest new programming language is English</p>&mdash; Andrej Karpathy (@karpathy) <a href="https://twitter.com/karpathy/status/1617979122625712128?ref_src=twsrc%5Etfw">January 24, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>Programming in assembly language used to be a skill. That skill became irrelevant when good optimizing compilers could translate high-level languages to performant assembly (and when whatever tiny difference remained got swamped by gains in CPU speed). Nobody argues today that programming should be done in assembly.</p>
<p>Today we&rsquo;re living through a similar transition to a higher level of abstraction. <strong>Code in HLLs is becoming the <em>output</em> of an even higher-level language&ndash; the natural language prompt to an LLM.</strong></p>
<p>Here are a few examples to drive the point home:</p>
<p><strong>Copilot easily passes &ldquo;Intro to CS&rdquo; courses:</strong> In <a href="https://arxiv.org/pdf/2210.15157.pdf">this paper</a>, the authors found that on a set of CS101-level programming problems, Copilot solved half of them right away (just feeding it the problem description itself), and solved 60% of the rest with only changes to the problem description.</p>
<p><a href="https://arxiv.org/abs/2108.05198">Other</a>  <a href="https://dl.acm.org/doi/abs/10.1145/3491101.3519665">observations</a> have shown that when the output from tools like Copilot is wrong, developers avoid debugging the generated code, and either fiddle with the prompt until it works, or rewrite the code from scratch.</p>
<!-- Video Copilot solving CS1 problems -->
<iframe width="560" height="315" src="https://www.youtube.com/embed/Wgf_3NuZ-NM" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
<p>And here is Prof. Crista Lopes (<a href="https://tagide.com/education/writing-a-grammar-with-chatgpt/">1</a>, <a href="https://tagide.com/education/the-end-of-programming-as-we-know-it/">2</a>, <a href="https://tagide.com/education/writing-a-tokenizer-with-chatgpt/">3</a>, <a href="https://tagide.com/research/chatgpt-game-changer/">4</a>) trying to grab the CS education community by the shoulders and shake them, after getting surprisingly good results with ChatGPT when implementing a lexer and parser for a toy programming language&ndash; a problem common in graduate-level compilers courses.</p>
<blockquote>
<p>The neural network was able to understand the concrete symbolic reasoning of a Lox tokenizer purely by examples; it was able to generalize well beyond the examples; it was able to correct my specification mistakes; … bottom line: it is able to tokenize Lox programs without a single line of code being written.</p>
<p>Obviously, I am “programming” it by teaching it the rules using a combination of natural language and examples. But this is not programming as we know it. This is a blend of old ideals such as “do what I mean” and programming by example, but on steroids. While I am very familiar with these old ideals, I never thought I would live to see the day where they were a reality!</p></blockquote>
<p>Taking the compiler analogy even further are systems like <a href="https://arxiv.org/abs/2212.10561">Parsel</a>, which takes in a spec that mimics the way human programmers think, in that the spec decomposes the problem to be solved into smaller sub-problems, along with function signatures and a few input-output examples (i.e. unit tests), and produces code for that higher-level problem. The authors have recently made advances that let you <a href="https://twitter.com/ericzelikman/status/1622605951835705344">omit the input-output examples</a>, and even <a href="https://twitter.com/ericzelikman/status/1625593237946912768">omit the function signatures</a>, generating code from a natural language breakdown of the problem!</p>
<!-- Zelikman tweet on Parsel omitting function signatures -->
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Parsel🐍 update: you now don&#39;t need to write function names/args at all - it&#39;s literally just indented natural language!<br><br>Images show 4 lines of Parsel and the generated 114-line Python code<br>Try or contribute here! <a href="https://t.co/vZ33rNFzuX">https://t.co/vZ33rNFzuX</a><br>Last thread: <a href="https://t.co/SAJzbD9lKL">https://t.co/SAJzbD9lKL</a> <a href="https://t.co/LsASh6OBhI">pic.twitter.com/LsASh6OBhI</a></p>&mdash; Eric Zelikman (@ericzelikman) <a href="https://twitter.com/ericzelikman/status/1625593237946912768?ref_src=twsrc%5Etfw">February 14, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<!-- Video on Parsel, and follow up -->
<iframe width="560" height="315" src="https://www.youtube.com/embed/ByEiEGTbcwM" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
<!-- Video on Parsel, and follow up -->
<iframe width="560" height="315" src="https://www.youtube.com/embed/nKvNqKOMT6Q" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
<p>Of course, Copilot is not perfect. It still generates incorrect code, even though the hit-rate is pretty good. The question is: do you think it&rsquo;ll get better or worse in the future? Programmers today never have to peel back the curtain to debug the assembly language generated by modern compilers (unless you&rsquo;re a compiler writer). Sooner or later, code LLMs will achieve the same level of reliability, truly making them compilers from English to working code.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>A spiritual successor to Emacs</title>
      <link>http://vivekhaldar.com/articles/a-spiritual-successor-to-emacs/</link>
      <pubDate>Tue, 14 Feb 2023 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/a-spiritual-successor-to-emacs/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been writing Python since version 1.5.2, and I think Guido von
Rossum is one of the best language designers of our time, but I was a
bit taken aback when on a recent &lt;a href=&#34;https://youtu.be/G5mtQhWNezQ?t=312&#34;&gt;Lex Fridman podcast&lt;/a&gt; he said, &amp;ldquo;To me,
VS Code, in a sense, is a spiritual successor to Emacs.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;His rationale for that claim:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The key part of Emacs is that it&amp;rsquo;s mostly written in Lisp &amp;hellip; There&amp;rsquo;s a core
implementation that can read the file, put bits on the screen, and
manage memory and buffers. Then, what makes it an editor full of
features is all the lisp packages and, of course, the design of how
the lisp packages interact with each other and with that base layer of
the core immutable engine.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I&rsquo;ve been writing Python since version 1.5.2, and I think Guido von
Rossum is one of the best language designers of our time, but I was a
bit taken aback when on a recent <a href="https://youtu.be/G5mtQhWNezQ?t=312">Lex Fridman podcast</a> he said, &ldquo;To me,
VS Code, in a sense, is a spiritual successor to Emacs.&rdquo;</p>
<p>His rationale for that claim:</p>
<blockquote>
<p>The key part of Emacs is that it&rsquo;s mostly written in Lisp &hellip; There&rsquo;s a core
implementation that can read the file, put bits on the screen, and
manage memory and buffers. Then, what makes it an editor full of
features is all the lisp packages and, of course, the design of how
the lisp packages interact with each other and with that base layer of
the core immutable engine.</p>
<p>&hellip; almost everything in that core engine in Emacs&rsquo; case, can still be
overridden or replaced. And so, VS Code has a similar architecture,
where there is like a base engine &hellip; and it has a sort of a package
manager and a whole series of interfaces for packages and an
additional series of conventions for how packages should interact with
the lower layers and with each other.</p>
<p>&hellip;. And so, the sort of extreme extensibility and the package
ecosystem that you see in VS Code is a mirror of very similar
architectural features in Emacs.</p></blockquote>
<p>I agree that VS Code has a similar <em>architecture</em> to Emacs, in that it consists of a core language runtime, with most functionality built on top of that. For Emacs, that is Lisp. For Visual Code, JavaScript. But the Zen of Emacs (like the <a href="https://peps.python.org/pep-0020/">Zen of Python</a>), is very, very different.</p>
<p>If I were to distill Emacs down to its two core ideas, they would be: barrier-less extension, and <a href="https://mbork.pl/2023-01-30_The_benefits_of_everything_being_a_buffer">everything</a> is a <a href="https://www.masteringemacs.org/article/why-emacs-has-buffers">buffer</a>.</p>
<p><strong>Barrier-less extension</strong>: The way you change behavior in Emacs is by writing and evaluating Emacs Lisp expressions. You can do this <em>anywhere</em> in Emacs, which is to say, in any buffer in Emacs. Write elisp. Mark it. <code>M-x eval-region</code>. And now your editor is in a new universe. If you like that universe, you save that little elisp snippet in a designated place (<code>init.el</code> or something similar) so that you don&rsquo;t lose it and Emacs evaluates it when it starts up again. This is ingrained into every longtime Emacs user. It is probably the second thing a newbie Emacser learns after the basic key bindings. This mode of changing the editor <em>immediately</em> by evaluating Lisp expressions is central to Emacs&rsquo; customizability and power.</p>
<p><strong>Everything is a buffer</strong>: Emacs turns its full power towards fine-grained surgery on text. So why keep <em>any</em> part of it outside the reach of that power? The buffer as a central organizing concept is both simple and powerful. Every piece of text everywhere is in a buffer. It is subject to the same text manipulation. This includes shells and Dired.</p>
<p>When you combine the above two simple principles, you get nearly unbounded combinatorial power. Every shell interaction and its output becomes a text buffer. A directory listing in Dired can be edited (and then those changes persisted back!) just like a regular Emacs buffer. You can start climbing the <a href="https://vivekhaldar.com/articles/the-levels-of-emacs-proficiency/">levels of Emacs proficiency</a>, a ladder that has no end. Because of this, Emacs can be <a href="https://thoughtbot.com/blog/the-editor-of-a-lifetime">the editor of a lifetime</a>. You mold it to your usage over time. It becomes your tool forge.</p>
<p>VS Code lacks both of these ideas. But clearly, judging by its popularity and mindshare it has found success by doubling down on its strengths. It has just picked a <a href="https://www.murilopereira.com/the-values-of-emacs-the-neovim-revolution-and-the-vscode-gorilla/">different set of values</a> than Emacs.</p>
<p>VS Code is a product from a giant tech company: Microsoft. One with a <a href="https://www.youtube.com/watch?v=Vhh_GeBPOhs">history of focus on developers</a>, because they realized early how crucial developer mindshare was to maintaining the appeal of Windows. So VS Code has what Emacs doesn&rsquo;t&ndash; <em>product managers</em>. People who create, articulate and then execute a strategy to capture a given market.</p>
<p>Emacs, by comparison, is the rag-tag Rebel Alliance. Maybe it also suffers from <a href="http://www.winestockwebdesign.com/Essays/Lisp_Curse.html">the Lisp Curse</a>: Lisp is so powerful that problems which are technical issues in other programming languages are social issues in Lisp. That&rsquo;s why instead of one canonical, well-maintained, bug-free implementation for a set of functionality (e.g. completion!!), it has twenty, with five of those actually solid and reliable enough for regular use, but with very differing philosphies and feature sets. Some might view that as a strength. Others may be turned off by it and turn to VS Code because It Just Works.</p>
<p>Speaking for myself, I&rsquo;ve had to begrudgingly use VS Code once in a while simply because it is so prevalent and becoming the canonical editor (with all the tooling support that goes along with it) in more and more scenarios. But the paucity of its abstractions grates on me at every turn. The command pallette is a shadow of <code>M-x</code> in Emacs. There are no macros. The terminal doesn&rsquo;t act like any text &ldquo;buffer&rdquo;. To &ldquo;extend&rdquo; it you have to write an extension, and there&rsquo;s a ton of process and setup around it. You can&rsquo;t just write JS expressions in a file and evaluate them to change the behavior of the editor. And on and on.</p>
<p>So no, I don&rsquo;t think VS Code is the spiritual successor to Emacs.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Augmenting LLMs with APIs</title>
      <link>http://vivekhaldar.com/articles/augmenting-llms-with-apis/</link>
      <pubDate>Sun, 12 Feb 2023 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/augmenting-llms-with-apis/</guid>
      <description>&lt;p&gt;Libraries like &lt;a href=&#34;https://github.com/hwchase17/langchain&#34;&gt;LangChain&lt;/a&gt; show how to use the output of LLMs to drive actions through external tools and APIs. I did a quick video on that last week:&lt;/p&gt;
&lt;!-- Video on LangChain and LamdaPrompt --&gt;
&lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#34;https://www.youtube.com/embed/XgD5AuzBvs8&#34; title=&#34;YouTube video player&#34; frameborder=&#34;0&#34; allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;Just a few days ago, the folks over at Meta AI released a paper that takes that much further, by incorporating external API calls into the &lt;em&gt;training&lt;/em&gt; and &lt;em&gt;inference&lt;/em&gt; steps of the LLM itself. Their system is called &lt;a href=&#34;https://arxiv.org/abs/2302.04761&#34;&gt;ToolFormer&lt;/a&gt;, and here&amp;rsquo;s a short video on it:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Libraries like <a href="https://github.com/hwchase17/langchain">LangChain</a> show how to use the output of LLMs to drive actions through external tools and APIs. I did a quick video on that last week:</p>
<!-- Video on LangChain and LamdaPrompt -->
<iframe width="560" height="315" src="https://www.youtube.com/embed/XgD5AuzBvs8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
<p>Just a few days ago, the folks over at Meta AI released a paper that takes that much further, by incorporating external API calls into the <em>training</em> and <em>inference</em> steps of the LLM itself. Their system is called <a href="https://arxiv.org/abs/2302.04761">ToolFormer</a>, and here&rsquo;s a short video on it:</p>
<!-- Video on ToolFormer -->
<iframe width="560" height="315" src="https://www.youtube.com/embed/ZCdqfIuT81A" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
<p>Their topline result is that when augmented with APIs in this way, smaller models like GPT-J (6B parameters) can outperform models like GPT-3 (175B parameters), that are an order of magnitude larger, on a variety of tasks.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Prompt LLMs for code, not arithmetic</title>
      <link>http://vivekhaldar.com/articles/prompt-llms-for-code--not-arithmetic/</link>
      <pubDate>Wed, 25 Jan 2023 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/prompt-llms-for-code--not-arithmetic/</guid>
      <description>&lt;p&gt;It is now well-known that &lt;a href=&#34;https://github.com/openai/openai-cookbook/blob/main/techniques_to_improve_reliability.md&#34;&gt;arithmetic is a weak spot&lt;/a&gt; for LLMs. If you directly prompt an LLM with calculation, or even simple arithmetic word problems, it will often get it wrong.&lt;/p&gt;
&lt;p&gt;But &lt;a href=&#34;https://arxiv.org/abs/2211.10435&#34;&gt;this paper&lt;/a&gt; argues that trying to get an LLM to do calculations is a misunderstanding of its strengths. LLMs are meant for &lt;em&gt;understanding language&lt;/em&gt;, not calculation. The key idea is to separate the problem into two parts: understanding, and computation (or solving). Let the LLM do what it is good at&amp;ndash; understanding&amp;ndash; and then offload the computation to an actual programming language.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>It is now well-known that <a href="https://github.com/openai/openai-cookbook/blob/main/techniques_to_improve_reliability.md">arithmetic is a weak spot</a> for LLMs. If you directly prompt an LLM with calculation, or even simple arithmetic word problems, it will often get it wrong.</p>
<p>But <a href="https://arxiv.org/abs/2211.10435">this paper</a> argues that trying to get an LLM to do calculations is a misunderstanding of its strengths. LLMs are meant for <em>understanding language</em>, not calculation. The key idea is to separate the problem into two parts: understanding, and computation (or solving). Let the LLM do what it is good at&ndash; understanding&ndash; and then offload the computation to an actual programming language.</p>
<p>Check  out below the quick video summary I posted last week. Also see <a href="https://github.com/reasoning-machines/pal">their GitHub</a> for the full source prompts they use.</p>
<!-- Video on Program-aided language models -->
<iframe width="560" height="315" src="https://www.youtube.com/embed/fU5czqhRkIw" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
<p>Let&rsquo;s see a few examples of how that works.</p>
<p>But first, an example of where LLMs fail (all examples in this post come from the <code>text-davinci</code> model. The LLM&rsquo;s answers are demarcated with 🤖💬 and 🤖🛑).</p>
<pre>
Question: Roger has 5 tennis balls. He buys 2 more cans of tennis
balls. Each can has 3 tennis balls. How many tennis balls does he have
now?

Answer: Roger started with 5 tennis balls. 2 cans of 3 tennis balls
each is 6 tennis balls. 5 + 6. The answer is 11.

Question: The bakers at the Beverly Hills Bakery baked 200 loaves of
bread on Monday morning. They sold 93 loaves in the morning and 39
loaves in the afternoon. A grocery store returned 6 unsold loaves. How
many loaves of bread did they have left?

Answer:
🤖💬
The bakers started with 200 loaves of bread. They sold 93 loaves in
the morning and 39 loaves in the afternoon. 6 loaves were
returned. 200 - (93 + 39 + 6) = 62 loaves of bread left.
🤖🛑
</pre>
<p>Instead, we prompt it to not compute the answer, but to provide Python code to compute the answer.</p>
<pre>
Question: Roger has 5 tennis balls. He buys 2 more cans of tennis
balls. Each can has 3 tennis balls. How many tennis balls does he have
now?

Solution in Python:
def solution():
  """Roger has 5 tennis balls. He buys 2 more cans of tennis
balls. Each can has 3 tennis balls. How many tennis balls does he have
now?"""
  # Roger started with 5 tennis balls.
  tennis_balls = 5
  # 2 cans of 3 tennis balls each is
  bought_balls = 2 * 3
  # tennis balls. The answer is
  answer = tennis_balls + bought_balls
  return answer

Q: The bakers at the Beverly Hills Bakery baked 200 loaves of bread on
Monday morning. They sold 93 loaves in the morning and 39 loaves in
the afternoon. A grocery store returned 6 unsold loaves. How many
loaves of bread did they have left?

Solution in Python:
🤖💬
def solution():
  """The bakers at the Beverly Hills Bakery baked 200 loaves of bread
on Monday morning. They sold 93 loaves in the morning and 39 loaves in
the afternoon. A grocery store returned 6 unsold loaves. How many
loaves of bread did they have left?"""
  # The bakers started with 200 loaves of bread.
  bread = 200
  # They sold 93 loaves in the morning and 39 loaves in the afternoon.
  sold_bread = 93 + 39
  # A grocery store returned 6 unsold loaves.
  returned_bread = 6
  # The answer is
  answer = bread - sold_bread + returned_bread
  return answer
🤖🛑
</pre>
<p>You can check that running the Python code gives the correct answer (74).</p>
<p>You can do the same thing with logical problems, not just arithmetic:</p>
<pre>
Question: say "java" twice and "data" once, and then repeat all of
this three times.

Answer: java java data java java data java java data


Question: Repeat the word duck four times, but halfway through also
say quack

Answer:
🤖💬
duck quack duck duck quack duck
🤖🛑
</pre>
<p>OK it failed that. Let&rsquo;s try the same with code-style prompts.</p>
<pre>
Question: say java twice and data once, and then repeat all of this
three times.

# solution using Python:

def solution():
    """Question: say java twice and data once, and then repeat all of
    this three times."""
    result = []
    tmp = ["java", "java", "data"]
    for i in range(3):
        result.extend(tmp)
    return " ".join(result)


Question: Repeat the word duck four times, but halfway through also
say quack


# solution using Python:
🤖💬
def solution():
    """Question: Repeat the word duck four times, but halfway through
    also say quack"""
    result = []
    for i in range(4):
        if i == 2:
            result.append("quack")
        result.append("duck")
    return " ".join(result)
🤖🛑
</pre>
<p>tl;dr&ndash; use LLMs for what they were meant to do&ndash; understand and predict natural language&ndash; and <em>then</em> leverage that for computation.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Moving off Tumblr</title>
      <link>http://vivekhaldar.com/articles/moving-off-tumblr/</link>
      <pubDate>Sun, 22 Jan 2023 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/moving-off-tumblr/</guid>
      <description>&lt;p&gt;Took a bit of elbow grease with miscellaneous Emacs macros and tiny bits of elisp, but I&amp;rsquo;d been meaning to move my writing off Tumblr and on to a properly self-hosted place. So I went and did that a couple of weekends ago. All the pieces from &lt;a href=&#34;https://blog.vivekhaldar.com&#34;&gt;the old blog&lt;/a&gt; should now live here, under &lt;a href=&#34;https://vivekhaldar.com&#34;&gt;vivekhaldar.com&lt;/a&gt;. I&amp;rsquo;m still going to leave the old blog up, but all new pieces will go up here. As for setup, I&amp;rsquo;m using ox-hugo driven by org files, pushing static HTML to my hosting provider.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Took a bit of elbow grease with miscellaneous Emacs macros and tiny bits of elisp, but I&rsquo;d been meaning to move my writing off Tumblr and on to a properly self-hosted place. So I went and did that a couple of weekends ago. All the pieces from <a href="https://blog.vivekhaldar.com">the old blog</a> should now live here, under <a href="https://vivekhaldar.com">vivekhaldar.com</a>. I&rsquo;m still going to leave the old blog up, but all new pieces will go up here. As for setup, I&rsquo;m using ox-hugo driven by org files, pushing static HTML to my hosting provider.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Hardware Acquisition Hacks</title>
      <link>http://vivekhaldar.com/articles/hardware-acquisition-hacks/</link>
      <pubDate>Mon, 28 Dec 2020 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/hardware-acquisition-hacks/</guid>
      <description>&lt;p&gt;Here&amp;rsquo;s a collection of some hardware acquisition hacks I&amp;rsquo;ve been using over the last few years. By no means are these original ideas–they&amp;rsquo;re quite well-known within their own niches. But all the same, they don&amp;rsquo;t seem to be very widespread among the other techie folks I talk to.&lt;/p&gt;
&lt;p&gt;The goal of these hacks is to construct a computing setup that is &lt;em&gt;inexpensive&lt;/em&gt;,  &lt;em&gt;upgradable&lt;/em&gt; and &lt;em&gt;repairable&lt;/em&gt;. This makes them tinkerable. It&amp;rsquo;s easier (and more fun!) to play around and risk breaking old cheap hardware than that latest $2k shiny laptop. Computing and storage have made such vast leaps that for everyone but a tiny fraction of users anything made within the last decade is more than enough to be their daily computing driver. This is not aimed at those slinging around 4k video and needing color-accurate displays. It is for web browsing (isn&amp;rsquo;t every computer basically a Chromebook with some small extras at this point?), watching videos, and run-of-the-mill productivity stuff like word processing and spreadsheets.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Here&rsquo;s a collection of some hardware acquisition hacks I&rsquo;ve been using over the last few years. By no means are these original ideas–they&rsquo;re quite well-known within their own niches. But all the same, they don&rsquo;t seem to be very widespread among the other techie folks I talk to.</p>
<p>The goal of these hacks is to construct a computing setup that is <em>inexpensive</em>,  <em>upgradable</em> and <em>repairable</em>. This makes them tinkerable. It&rsquo;s easier (and more fun!) to play around and risk breaking old cheap hardware than that latest $2k shiny laptop. Computing and storage have made such vast leaps that for everyone but a tiny fraction of users anything made within the last decade is more than enough to be their daily computing driver. This is not aimed at those slinging around 4k video and needing color-accurate displays. It is for web browsing (isn&rsquo;t every computer basically a Chromebook with some small extras at this point?), watching videos, and run-of-the-mill productivity stuff like word processing and spreadsheets.</p>
<h1>Laptops</h1>
<p>Old Thinkpads FTW, &lsquo;nuff said.</p>
<p>They&rsquo;re built like tanks so you don&rsquo;t have to worry about dropping them once in a while. Back lid pops off easy so you can upgrade/replace RAM and disk (and even the CPU on most of them). The Thinkpad keyboard is miles ahead of any other laptop keyboard, even the latest ones. There are tons of videos on YouTube walking through how to upgrade every model out there. People have even swapped out the display and trackpad to match their liking.</p>
<p>You can find old Thinkpads in good condition for low 100s of dollars on eBay. If you go deep into the Old Thinkpad rabbit hole, you can even find plenty of non-functioning ones on eBay that are ~10s of dollars that can be scavenged for parts.</p>
<p>Some notable YouTube channels that focus on old Thinkpads (comparing models, reviewing them, upgrading them): <a href="https://www.youtube.com/channel/UC-wmf-Avorzz9QPKzdYFgeg">Laptop Retrospective</a>, <a href="https://www.youtube.com/user/SebisGameReviews">Sebi&rsquo;s Random Tech</a>.</p>
<h1>Desktop</h1>
<p>I recently discovered the 1-litre (ultra-small) form factor via <a href="https://www.servethehome.com/introducing-project-tinyminimicro-home-lab-revolution/">ServeTheHome&rsquo;s</a> <a href="https://www.youtube.com/playlist?list=PLC53fzn9608B-MT5KvuuHct5MiUDO8IF4">Project TinyMiniMicro</a>. They&rsquo;re pretty much desktop machines, but in a much smaller form factor, while still retaining upgradability.</p>
<p>I haven&rsquo;t looked at every brand in detail, but from a quick comparison it looks like Lenovo carried some of their Thinkpad philosophy into their Tiny line, in that they&rsquo;re easier to open up and upgrade than the HPs and Dells. I recently bought an M710Q Tiny second-hand, and it was super-easy to add RAM and SSD. You can get in with one screw, and the SSD and RAM slots are tool-less, so no more messing with screws in there.</p>
<p>You can find a pretty decent used Tiny/Mini/Micro for around $200-$300 on eBay, and for that much you&rsquo;ll typicall get a 6th or 7th gen Intel Core processor, 8 GB RAM and around 200GB SSD. Not all models have WiFi though, so watch out for that.</p>
<p>Or you could just dock your old Thinkpad.</p>
<h1>Displays</h1>
<p>I personally find that the element of my computing setup that most affects my productivity is the display. More specifically, having a large display. Turns out there&rsquo;s <a href="https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/interact2003-productivitylargedisplays.pdf">empirical data to support that</a>. There&rsquo;s a tradeoff there between screen real estate and ergonomics so that you don&rsquo;t end craning your neck from one side of the display to the other. I&rsquo;ve found that at typical desk viewing distances (~3ft), 40-43 inches works pretty well. This will be different for everyone so you should experiment and find what works best for you.</p>
<p>But the hack is that 4k TVs (not computer monitors) of size 39-43 inches are around $200 these days, which is less than half of what a comparable monitor goes for. Around Black Friday you can easily find deals on the former for as low as $150. Yes, you can probably tell the difference if you pixel peep, but you&rsquo;ll have to squint pretty hard.</p>
<p>Note that the default settings on these are optimized for TV viewing, not use as a computer monitor. Typically, you&rsquo;ll need to turn down the saturation to something in the middle of the range, and the sharpness all the way down. Some of the recent makes and models seem to have caught on to the fact that they&rsquo;ll get used as monitors and have settings bundled into &ldquo;modes&rdquo; for TV, PC and gaming.</p>
<p>May your hardware dollars go far and bring you joy!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Automatically edit out silence (dead air) from videos</title>
      <link>http://vivekhaldar.com/articles/automatically-edit-out-silence-dead-air-from-videos/</link>
      <pubDate>Fri, 21 Aug 2020 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/automatically-edit-out-silence-dead-air-from-videos/</guid>
      <description>&lt;p&gt;Over on my &lt;a href=&#34;https://www.youtube.com/c/vivekhaldar&#34;&gt;YouTube channel&lt;/a&gt;, I make talking head videos, covering various computer science topics, mostly research papers. One of the most time-consuming yet mindnumbingly boring parts of that process is finding out all the dead air in the original video and editing it out. That&amp;rsquo;s got to be automatable, right? I&amp;rsquo;d been looking for a while but couldn&amp;rsquo;t find a good solution.&lt;/p&gt;
&lt;p&gt;Massive props to &lt;a href=&#34;https://youtu.be/ak52RXKfDw8&#34;&gt;Donald Feury&lt;/a&gt; who created a &lt;a href=&#34;https://gitlab.com/dak425/scripts/-/blob/master/trim_silenceV2&#34;&gt;script&lt;/a&gt; that combines ffmpeg and &lt;a href=&#34;https://zulko.github.io/moviepy/&#34;&gt;MoviePy&lt;/a&gt; to do just that.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Over on my <a href="https://www.youtube.com/c/vivekhaldar">YouTube channel</a>, I make talking head videos, covering various computer science topics, mostly research papers. One of the most time-consuming yet mindnumbingly boring parts of that process is finding out all the dead air in the original video and editing it out. That&rsquo;s got to be automatable, right? I&rsquo;d been looking for a while but couldn&rsquo;t find a good solution.</p>
<p>Massive props to <a href="https://youtu.be/ak52RXKfDw8">Donald Feury</a> who created a <a href="https://gitlab.com/dak425/scripts/-/blob/master/trim_silenceV2">script</a> that combines ffmpeg and <a href="https://zulko.github.io/moviepy/">MoviePy</a> to do just that.</p>
<p>I&rsquo;ve been using that to edit the last couple of videos I created, and also been making minor improvements to it:</p>
<ul><li>the original script depends on the &ldquo;silencedetect&rdquo; filter in ffmpeg, which in my experience can sometimes leave long stretches of silence undetected, forcing me to edit the video manually and then render it again</li>
<li>the original script uses a two-step process: first run the ffmpeg silencedetect filter, then use the output of that with MoviePy to render the final video</li>
</ul><p>I&rsquo;ve addressed those issues in <a href="https://gist.github.com/vivekhaldar/595af6c6aa06ed061f6f3f6c97d087c3">this script</a> which does the silence-detection using MoviePy&rsquo;s audio APIs, eliminating the dependency on ffmpeg, while also making the script self-contained such that it does the job in one invocation. It has proven to be much more reliable at detecting all silent periods in the original video.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Remapping arbitrary keys in Mac OS X</title>
      <link>http://vivekhaldar.com/articles/remapping-arbitrary-keys-in-mac-os-x/</link>
      <pubDate>Wed, 22 Jul 2020 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/remapping-arbitrary-keys-in-mac-os-x/</guid>
      <description>&lt;p&gt;Just thought I&amp;rsquo;d put this tip out in the Internet&amp;hellip;&lt;/p&gt;
&lt;p&gt;So I recently got a &lt;a href=&#34;https://www.lenovo.com/us/en/accessories-and-monitors/new-arrivals/KBD-BO-TrackPoint-KBD-US-Eng/p/4Y40X49493&#34;&gt;Thinkpad Trackpoint II keyboard&lt;/a&gt;, which I like to use with my MacBook when docked to an external monitor. Yes, I realize that&amp;rsquo;s mixed up.&lt;/p&gt;
&lt;p&gt;But it happens to have a &amp;ldquo;PrtSc&amp;rdquo; key right on the space-bar row that is perfectly placed to be the &amp;ldquo;Cmd&amp;rdquo; key. Mac OS X, in its Keyboard Preferences, lets you remap some standard keys (Caps Lock to Ctrl, for example), but not PrtSc.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Just thought I&rsquo;d put this tip out in the Internet&hellip;</p>
<p>So I recently got a <a href="https://www.lenovo.com/us/en/accessories-and-monitors/new-arrivals/KBD-BO-TrackPoint-KBD-US-Eng/p/4Y40X49493">Thinkpad Trackpoint II keyboard</a>, which I like to use with my MacBook when docked to an external monitor. Yes, I realize that&rsquo;s mixed up.</p>
<p>But it happens to have a &ldquo;PrtSc&rdquo; key right on the space-bar row that is perfectly placed to be the &ldquo;Cmd&rdquo; key. Mac OS X, in its Keyboard Preferences, lets you remap some standard keys (Caps Lock to Ctrl, for example), but not PrtSc.</p>
<p>Following <a href="https://developer.apple.com/library/archive/technotes/tn2450/_index.html">this documentation</a>, this is the command I ended up with to map PrtSc to Cmd:</p>
<pre><code>hidutil property --set '{"UserKeyMapping":[{"HIDKeyboardModifierMappingSrc":0x700000046,"HIDKeyboardModifierMappingDst":0x7000000E7}]}'
</code></pre>
<p>The keycode for PrtSc is 0x46, and for &ldquo;Right GUI&rdquo; aka Cmd is 0xE7, and you have to OR them into 0x700000000.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>How Unix Won</title>
      <link>http://vivekhaldar.com/articles/how-unix-won/</link>
      <pubDate>Mon, 04 May 2020 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/how-unix-won/</guid>
      <description>&lt;p&gt;Unix has won in every conceivable way. And in true mythic style, it contains the seeds of its own eclipse. This is my &lt;em&gt;subjective&lt;/em&gt; historical narrative of how that happened.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m using the name &amp;ldquo;Unix&amp;rdquo; to include the entire family of operating systems descended from it, or that have been heavily influenced by it. That includes Linux, SunOS, Solaris, BSD, Mac OS X, and many, many others.&lt;/p&gt;
&lt;p&gt;Both major mobile OSs, Android and iOS, have Unix roots. Their billions of users dwarf those using clunky things like laptops and desktops, but even there, Windows is only the non-Unix viable OS. Almost everything running server-side in giant datacenters is Linux.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Unix has won in every conceivable way. And in true mythic style, it contains the seeds of its own eclipse. This is my <em>subjective</em> historical narrative of how that happened.</p>
<p>I&rsquo;m using the name &ldquo;Unix&rdquo; to include the entire family of operating systems descended from it, or that have been heavily influenced by it. That includes Linux, SunOS, Solaris, BSD, Mac OS X, and many, many others.</p>
<p>Both major mobile OSs, Android and iOS, have Unix roots. Their billions of users dwarf those using clunky things like laptops and desktops, but even there, Windows is only the non-Unix viable OS. Almost everything running server-side in giant datacenters is Linux.</p>
<p>How did Unix win?</p>
<ul><li><p>It was built by programmers, for programmers. If you read the <a href="https://youtu.be/P01T4G5I2lk">early papers describing Unix</a>, you will see how the key abstractions (hierarchical filesystems, permissions, processes, interactive shells, pipes) have lasted conceptually unsullied for decades. That could only have happened if it exerted such a force field over geek minds that they propagated it.</p></li>
<li><p>The majority of it was written not in assembly language, but in C, a higher-level language, hence making it portable. This enabled relatively easy ports to a wide variety of hardware.</p></li>
<li><p>A freak historical accident. AT&amp;T Labs, where it was developed, was forbidden under its anti-trust settlement from commercializing products unrelated to its core telecom business. Hence, Unix was licensed very cheaply to universities, including UC Berkeley, which subsequently built one of the more influential branches of the Unix family tree—BSD. Apparently, AT&amp;T classified Unix as <a href="https://twitter.com/nuthaven/status/1254897999290892289?s=09">industrial waste</a> for tax purposes when licensing it!</p></li>
<li><p>Unix spread through academia, and those students spread it through corporations after they graduated. It&rsquo;s a strategy that has been used by every major tech company, only in this case it was organic.</p></li>
<li><p>And then came the Internet, and the whole universe of daemons, tools, protocols, and utilities that undergirded it was built natively on Unix. That wasn&rsquo;t a huge surprise because a lot of the people that built the Net were Unix natives. BSD open-sourced its TCP/IP stack, kicking off its wide adoption outside the military.</p></li>
<li><p>By the late 90s and early 2000s, Linux started taking over the server-side. It has become the ultimate virtuous cycle in open source. When picking a new kernel one is virtually forced to go with Linux because of the huge community and massive engineering that has gone into solidifying it. That&rsquo;s probably why Android picked Linux even though it was running on the other end of the hardware spectrum.</p></li>
</ul><p>So how and why would we move past Unix?</p>
<ul><li><p>Unix, which got standardized into the POSIX spec, has accreted a tremendous amount of complexity over the decades. The <a href="http://www.open-std.org/jtc1/sc22/open/n4217.pdf">POSIX spec</a> is <em>3000 pages</em> long. Linux now has nearly 400 system calls. What started as a clean, pure, minimal and elegant set of system abstractions has become a complex beast.</p></li>
<li><p>The very idea of the OS providing general-purpose abstractions with wide applicability is being challenged. When Unix was created, IO was orders of magnitude slower than CPU. There were enough CPU cycles to burn to provide these high-level abstractions, like a complex hierarchical filesystem. <a href="https://youtu.be/SM3PhGGllL0">Now IO can easily saturate CPU</a>. At least on the server side, folks just want to get the fastest performance out of their hardware. That&rsquo;s leading to the rise of frameworks like <a href="http://spdk.io">SPDK</a> and <a href="http://dpdk.org">DPDK</a> that bypass heavy OS abstractions for storage and networking in favor of applications directly accessing the raw hardware, and rolling whatever abstraction they do need on their own.</p></li>
<li><p>The entire ecosystem in which an OS exists is changing. Application-level experiences are hermetic and make the underlying OS more or less irrelevant. Just look at Android or iOS or ChromeOS. Programming to a virtual machine (like the Java VM) makes programmers much more invested in their PL/runtime than the OS.</p></li>
<li><p>The above two points raise an interesting question: what does a modern operating system want? Look, for example, at <a href="https://fuchsia.dev/fuchsia-src/reference/kernel_objects/objects">Fuchsia</a>, which is going in the direction of a microkernel with capabilities, that pushes most drivers and OS services out to userspace. These are ideas that have been floating in academic OS research for decades, but could never gain real mainstream acceptance because of the high barrier to making a viable real-world OS. This is the effect Rob Pike was talking about in his <a href="http://doc.cat-v.org/bell_labs/utah2000/">&ldquo;Systems Research is Irrelevant&rdquo;</a> talk. But the prior two trends are finally dislodging the iron grip of Unix, and OSs are becoming interesting again!</p></li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Manifesto for my channel</title>
      <link>http://vivekhaldar.com/articles/manifesto-for-my-channel/</link>
      <pubDate>Mon, 15 Apr 2019 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/manifesto-for-my-channel/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been putting up a video a week on &lt;a href=&#34;https://www.youtube.com/channel/UCpXfS8bu7ILGCuOtsnJMtxQ?view_as=subscriber&#34;&gt;my YouTube channel&lt;/a&gt; since about December 2018, and I suppose I should write out a clear manifesto for why I&amp;rsquo;m doing that and where I want to go with it.&lt;/p&gt;
&lt;p&gt;I started putting out videos for the same reason I have a blog: I want to share knowledge, and learn from the feedback. I have learned so much from stuff other people have published, and I want to put a few drops back into that ocean.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I&rsquo;ve been putting up a video a week on <a href="https://www.youtube.com/channel/UCpXfS8bu7ILGCuOtsnJMtxQ?view_as=subscriber">my YouTube channel</a> since about December 2018, and I suppose I should write out a clear manifesto for why I&rsquo;m doing that and where I want to go with it.</p>
<p>I started putting out videos for the same reason I have a blog: I want to share knowledge, and learn from the feedback. I have learned so much from stuff other people have published, and I want to put a few drops back into that ocean.</p>
<p>Also, committing to a regular cadence of putting out content (once a week, every week) is a calming antidote to the general chaos of modern life.</p>
<p>Why YouTube? Why videos? Because I feel that&rsquo;s where the river of attention is. And because it lets me experiment with a new medium. I believe Kevin Kelly when he says that <a href="https://www.nytimes.com/2008/11/23/magazine/23wwln-future-t.html">screen literacy</a> is a necessary modern skill, and should be taken seriously. I&rsquo;m constantly amazed at what a fantastic place YouTube is for pedagogy, and the vast range of creators with their own unique voices and personalities putting out videos that can teach you everything under the sun.</p>
<p>As someone raised firmly within the walls-of-text tradition, it was very uncomfortable for me at first. But this was a different flavor of discomfort: this was unlike a fear a public speaking, which I don&rsquo;t have any problems with. I can&rsquo;t quite put my finger on it. <a href="https://youtu.be/UuJoOGOVjsg">My first video</a> didn&rsquo;t even have a voiceover. My later ones have my talking head in a rectangle in the corner. Maybe I&rsquo;ll progress to the stage of being comfortable with me taking up the entire frame.</p>
<p>The majority of my videos so far have been part of my <a href="https://www.youtube.com/playlist?list=PLOuhQnxVenf1pRG42qUD3eLNw9NveF1hh">&ldquo;Read a paper&rdquo; series</a>. I pick a technical paper, and walk through it, highlighting parts as I go along. So far they have all been computer science papers, with a strong bent towards old classics published in the late sixties and early-mid seventies, usually by Turing Award winners. I intend to branch out, both to more recent CS papers, as well as papers outside CS that I&rsquo;ve found interesting and profound.</p>
<p>Why am I reading papers in videos? It was a format I instinctively gravitated towards. Only later could I shake an articulatable rationale out of my head. The thing is: for the longest time I&rsquo;ve harbored deep misgivings about popular science and technology writing. I&rsquo;ve come to the conclusion that if you really want to understand a new technical topic, you cannot rely on a pop-sci reading of it, and must bite the bullet and go read technical texts.  And I realize that&rsquo;s hard and seems intimidating. I want to play the part of someone holding your hand as you walk through a technical paper, beginning to end, without simplifications, with the original words of the author in front of you. I guess this is where my walls-of-text upbringing comes to the fore again: even though these are videos, my goal is to pull you into the text, and stress the primacy of it.</p>
<p>I do eventually want to make more opinionated videos (kind of like the blog), but I need to get more comfortable with this medium before I can do that. Sticking to the straight technical details makes it a bit easier for me right now.</p>
<p>I can&rsquo;t get myself to beg for likes and subs on camera, but I&rsquo;ll do it here: I hope you&rsquo;ll join me on a whimsical journey into real technical details with real technical papers. <a href="https://www.youtube.com/channel/UCpXfS8bu7ILGCuOtsnJMtxQ?view_as=subscriber%3Fsub_confirmation%3D1">Please subscribe!</a></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Laptops with touchscreen keyboards</title>
      <link>http://vivekhaldar.com/articles/laptops-with-touchscreen-keyboards/</link>
      <pubDate>Wed, 16 May 2018 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/laptops-with-touchscreen-keyboards/</guid>
      <description>&lt;p&gt;I love a good keyboard. The entire reason I reach for a laptop rather than a tablet is that I need to bang out some text. Which is why I’ve been following the &lt;a href=&#34;https://theoutline.com/post/2402/the-new-macbook-keyboard-is-ruining-my-life?zd=1&amp;amp;zi=eq2isy26&#34;&gt;recent tales of woe related to the MacBook keyboard&lt;/a&gt;. I wonder how Apple is going to “fix” this. I also wonder if the touchbar was a teaser of what they intend to do.&lt;/p&gt;
&lt;p&gt;Here’s what I’d like to see next in laptops: make the keyboard area a full-on touch screen. Something like the &lt;a href=&#34;https://en.wikipedia.org/wiki/Microsoft_Courier&#34;&gt;Microsoft Courier&lt;/a&gt;, but meant to be used in a laptop, typing-first form-factor rather than a vertical booklet form-factor.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I love a good keyboard. The entire reason I reach for a laptop rather than a tablet is that I need to bang out some text. Which is why I’ve been following the <a href="https://theoutline.com/post/2402/the-new-macbook-keyboard-is-ruining-my-life?zd=1&amp;zi=eq2isy26">recent tales of woe related to the MacBook keyboard</a>. I wonder how Apple is going to “fix” this. I also wonder if the touchbar was a teaser of what they intend to do.</p>
<p>Here’s what I’d like to see next in laptops: make the keyboard area a full-on touch screen. Something like the <a href="https://en.wikipedia.org/wiki/Microsoft_Courier">Microsoft Courier</a>, but meant to be used in a laptop, typing-first form-factor rather than a vertical booklet form-factor.</p>
<p>This would get over the biggest UX complaint with the current generation of touchscreen laptops, which is that raising your arms to reach out and touch the screen is something that would tire your shoulders if you had to do it very often, and breaks from the rhythm of whatever you were typing on the keyboard.</p>
<p>You can project a full-touch keyboard on the screen. With some form of haptic feedback it could be made to feel halfway like a real one. But because it’s drawn on the screen, it can support all the modern features we’re used to from phone/tablet keyboards, like suggestions, swiping, and altering layout for special characters and emojis.</p>
<p>When not typing, you could use the entire bottom of the laptop as a touch pad. In general, for apps that use a lot of manipulation rather than typing (photo and video editing), you could get rid of the keyboard and use the entire bottom of the laptop as a gesture input area.</p>
<p>When learning keyboard shortcuts, they can be highlighted on the virtual keyboard.</p>
<p>And hopefully, you’ll never have to worry about spilling a drink on your laptop keyboard and ruining it!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Review of Chaos Monkeys</title>
      <link>http://vivekhaldar.com/articles/review-of-chaos-monkeys/</link>
      <pubDate>Sat, 07 Oct 2017 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/review-of-chaos-monkeys/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://www.amazon.com/Chaos-Monkeys-Obscene-Fortune-Failure-ebook/dp/B019MMUAAQ&#34;&gt;Chaos Monkeys: Obscene Fortune and Random Failure in Silicon, by Antonio Garcia Martinez&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;People outside Silicon Valley may think of this book as entertaining and illuminating, but if you&amp;rsquo;re part of it (even if not geographically but within it&amp;rsquo;s extended mind sphere), this book will mostly read as &lt;em&gt;real&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Every industry needs a metaphorical gaslamp to draw moths. That is the only way it can sustain itself from generation to generation. Actors have LA. Techies have Silicon Valley. Or more specifically, the Silicon Valley startup.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://www.amazon.com/Chaos-Monkeys-Obscene-Fortune-Failure-ebook/dp/B019MMUAAQ">Chaos Monkeys: Obscene Fortune and Random Failure in Silicon, by Antonio Garcia Martinez</a></p>
<p>People outside Silicon Valley may think of this book as entertaining and illuminating, but if you&rsquo;re part of it (even if not geographically but within it&rsquo;s extended mind sphere), this book will mostly read as <em>real</em>.</p>
<p>Every industry needs a metaphorical gaslamp to draw moths. That is the only way it can sustain itself from generation to generation. Actors have LA. Techies have Silicon Valley. Or more specifically, the Silicon Valley startup.</p>
<p>This book even taught me a lot about the ins and outs of the byzantine world of online advertising and targeting. The narrative of Twitter and early Facebook fumbling their way through trying to stay solvent by digging into various crevices of the online ads world is not just entertaining but also has some very pedagogically instructive passages.</p>
<p>The author makes a page turner out of his startup experience. He even makes a page turner out of his post-startup big-company experience. Because truth is stranger than fiction.</p>
<p>The biggest compliment I can pay the author is that he made me finish a book, something I hadn’t done in months. Kudos!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Airspace</title>
      <link>http://vivekhaldar.com/articles/airspace/</link>
      <pubDate>Mon, 08 Aug 2016 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/airspace/</guid>
      <description>&lt;p&gt;Some scattered thoughts after reading about  the &lt;a href=&#34;http://www.theverge.com/2016/8/3/12325104/airbnb-aesthetic-global-minimalism-startup-gentrification&#34;&gt;airspace aesthetic&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;We could call this strange geography created by technology &amp;ldquo;AirSpace.&amp;rdquo; It&amp;rsquo;s the realm of coffee shops, bars, startup offices, and co-live / work spaces that share the same hallmarks everywhere you go: a profusion of symbols of comfort and quality, at least to a certain connoisseurial mindset. Minimalist furniture. Craft beer and avocado toast. Reclaimed wood. Industrial lighting. Cortados. Fast internet. The homogeneity of these spaces means that traveling between them is frictionless&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Some scattered thoughts after reading about  the <a href="http://www.theverge.com/2016/8/3/12325104/airbnb-aesthetic-global-minimalism-startup-gentrification">airspace aesthetic</a>.</p>
<blockquote>
  <p>We could call this strange geography created by technology &ldquo;AirSpace.&rdquo; It&rsquo;s the realm of coffee shops, bars, startup offices, and co-live / work spaces that share the same hallmarks everywhere you go: a profusion of symbols of comfort and quality, at least to a certain connoisseurial mindset. Minimalist furniture. Craft beer and avocado toast. Reclaimed wood. Industrial lighting. Cortados. Fast internet. The homogeneity of these spaces means that traveling between them is frictionless</p>
</blockquote>
<ul><li><p>Airspace itself, and the underlying phenomena behind that aesthetic is much older than Airbnb and Foursquare. Airspace is the aesthetic of how the the western multi-national corporation wants to be seen, both overtly and subconsciously: powerful yet gentle, controlling yet subservient, sharp yet organic, but above all&mdash;spanning the globe and scaling to massive flows of products, materials and ideas. It is the aesthetic of the functional and comfortable office, every one as similar as possible to the home office, so an employee has to never spend any mental effort to adapt.</p></li>
<li><p>I personally view airspace as a huge boon and am thankful for it. I am thankful that I can expect to get a non-fat vanilla latte in Delhi or Shanghai or Dubai that is guaranteed (by an immense and complex machinery of people, machines, processes and incentives) to taste exactly the same as the one that kickstarts my mornings in my Californian suburb. I am thankful that when I check into a big chain hotel in a city I&rsquo;ve never been to I can expect a well-known and recognized room, amenities and level of service. Some may find this stultifying and stifling, may say that it eradicates the local flavor and imposes a sameness on everything and every place. But the local flavor and organic chaos is still out there, outside the hotels and the Starbucks and on the crazy streets, or in a national park far away from those, and I can go seek it if I wish.</p></li>
<li><p>This homogeneous aesthetic extends not just to physical spaces, but also to lifestyles, life scripts and people&rsquo;s desires. Go to any well-developed city with a strong middle class, and people there have mostly the same lifestyles (work, commute, weekend) and want the same material things (houses, cars, vacations). When was the last time you personally met someone whose lifestyle and desires were a huge surprise to you?</p></li>
<li><p>Speaking for myself, the &ldquo;aesthetic&rdquo; that speaks to me is that of intimate and private spaces (even if they are in public view). Work desks with old food, empty soda cans, three-month old post-its with todo notes, and coffee circles. Sinks with dishes. The constant aftermath of a yard where kids play. This is the aesthetic of messes. And a mess is personal and intensely revealing. Every clean and designed space is a wall behind which to hide one&rsquo;s true personality. But look at someone&rsquo;s mess closely for a while and you feel like you&rsquo;ve known them for ages.</p></li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Church numerals in ES6</title>
      <link>http://vivekhaldar.com/articles/church-numerals-in-es6/</link>
      <pubDate>Mon, 14 Mar 2016 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/church-numerals-in-es6/</guid>
      <description>&lt;p&gt;Just because it&amp;rsquo;s fun to play with the natural numbers in wildly impractical ways.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://gist.github.com/vivekhaldar/ce824497e0084bc226f7&#34;&gt;Gist&lt;/a&gt;. Also pasted below.&lt;/p&gt;
&lt;pre&gt;
/*jshint esversion: 6 */
&#39;use strict&#39;;

// Church numerals in ES6.
// c.f. &lt;a href=&#34;https://en.wikipedia.org/wiki/Church_encoding&#34;&gt;https://en.wikipedia.org/wiki/Church_encoding&lt;/a&gt;

// Zero is the identity function.
let zero = (f =&amp;gt; x =&amp;gt; x);

// Successor: apply function one more time.
let succ = (n =&amp;gt; f =&amp;gt; x =&amp;gt; f(n(f)(x)));

let one = succ(zero);

// Convert a Church numeral into a concrete integer.
let plus1 = x =&amp;gt; x + 1;
let church2int = n =&amp;gt; n(plus1)(0);

// Convert a concrete integer into a church numeral.
function int2church(i) {
  if (i === 0) {
    return zero;
  } else {
    return succ(int2church(i - 1));
  }
}

// Add two Church numerals.
let add = m =&amp;gt; n =&amp;gt; f =&amp;gt; x =&amp;gt; n(f)(m(f)(x));

// Multiply two Church numerals.
let mult = m =&amp;gt; n =&amp;gt; f =&amp;gt; x =&amp;gt; n(m(f))(x);

// Exponentiation: n^m
let exp = m =&amp;gt; n =&amp;gt; n(m);

/////////////////// Some random operations.
console.log(church2int(int2church(10)));
console.log(church2int(zero));
console.log(church2int(one));

let c11 = int2church(11);
let c22 = int2church(22);
let plus_11_22 = add(c11)(c22);
console.log(&#34;11 + 22 = &#34; + church2int(plus_11_22));

let mult_11_22 = mult(c11)(c22);
console.log(&#34;11 * 22 = &#34; + church2int(mult_11_22));

let two = succ(one);
let ten = int2church(10);
let c_two_e_10 = exp(two)(ten);

console.log(&#34;2 ^^ 10 = &#34; + church2int(c_two_e_10));
&lt;/pre&gt;</description>
      <content:encoded><![CDATA[<p>Just because it&rsquo;s fun to play with the natural numbers in wildly impractical ways.</p>
<p><a href="https://gist.github.com/vivekhaldar/ce824497e0084bc226f7">Gist</a>. Also pasted below.</p>
<pre>
/*jshint esversion: 6 */
'use strict';

// Church numerals in ES6.
// c.f. <a href="https://en.wikipedia.org/wiki/Church_encoding">https://en.wikipedia.org/wiki/Church_encoding</a>

// Zero is the identity function.
let zero = (f =&gt; x =&gt; x);

// Successor: apply function one more time.
let succ = (n =&gt; f =&gt; x =&gt; f(n(f)(x)));

let one = succ(zero);

// Convert a Church numeral into a concrete integer.
let plus1 = x =&gt; x + 1;
let church2int = n =&gt; n(plus1)(0);

// Convert a concrete integer into a church numeral.
function int2church(i) {
  if (i === 0) {
    return zero;
  } else {
    return succ(int2church(i - 1));
  }
}

// Add two Church numerals.
let add = m =&gt; n =&gt; f =&gt; x =&gt; n(f)(m(f)(x));

// Multiply two Church numerals.
let mult = m =&gt; n =&gt; f =&gt; x =&gt; n(m(f))(x);

// Exponentiation: n^m
let exp = m =&gt; n =&gt; n(m);

/////////////////// Some random operations.
console.log(church2int(int2church(10)));
console.log(church2int(zero));
console.log(church2int(one));

let c11 = int2church(11);
let c22 = int2church(22);
let plus_11_22 = add(c11)(c22);
console.log("11 + 22 = " + church2int(plus_11_22));

let mult_11_22 = mult(c11)(c22);
console.log("11 * 22 = " + church2int(mult_11_22));

let two = succ(one);
let ten = int2church(10);
let c_two_e_10 = exp(two)(ten);

console.log("2 ^^ 10 = " + church2int(c_two_e_10));
</pre>
]]></content:encoded>
    </item>
    
    <item>
      <title>Treating algorithms fairly</title>
      <link>http://vivekhaldar.com/articles/treating-algorithms-fairly/</link>
      <pubDate>Wed, 18 Mar 2015 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/treating-algorithms-fairly/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://marginalrevolution.com/marginalrevolution/2015/02/algorithm-aversion.html&#34;&gt;Via Marginal Revolution&lt;/a&gt;, I came across &lt;a href=&#34;http://papers.ssrn.com/sol3/papers.cfm?abstract_id=2466040&#34;&gt;this paper&lt;/a&gt; on a phenomena known as &lt;em&gt;algorithm aversion&lt;/em&gt;:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;… evidence-based algorithms more accurately predict the future than do human forecasters. Yet, when forecasters are deciding whether to use a human forecaster or a statistical algorithm, they often choose the human forecaster. This phenomenon, which we call algorithm aversion, is costly, and it is important to understand its causes. We show that people are especially averse to algorithmic forecasters after seeing them perform, &lt;em&gt;even when they see them outperform a human forecaster&lt;/em&gt;. This is because people more quickly lose confidence in algorithmic than human forecasters after seeing them make the same mistake.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://marginalrevolution.com/marginalrevolution/2015/02/algorithm-aversion.html">Via Marginal Revolution</a>, I came across <a href="http://papers.ssrn.com/sol3/papers.cfm?abstract_id=2466040">this paper</a> on a phenomena known as <em>algorithm aversion</em>:</p>
<blockquote>
  <p>… evidence-based algorithms more accurately predict the future than do human forecasters. Yet, when forecasters are deciding whether to use a human forecaster or a statistical algorithm, they often choose the human forecaster. This phenomenon, which we call algorithm aversion, is costly, and it is important to understand its causes. We show that people are especially averse to algorithmic forecasters after seeing them perform, <em>even when they see them outperform a human forecaster</em>. This is because people more quickly lose confidence in algorithmic than human forecasters after seeing them make the same mistake.</p>
</blockquote>
<p>(emphasis mine)</p>
<p>As someone who makes a living from designing and implementing algorithms and presenting their results to people, this worries me (as it should any programmer!).</p>
<p>How can we beat this irrational bias against algorithms? The authors stop short:</p>
<blockquote>
  <p>Finally, our research has little to say about how best to reduce algorithm aversion among those who have seen the algorithm err. This is the next (and great) challenge for future research.</p>
</blockquote>
<p>Note that <em>demonstrating the superiority of an algorithm</em> is not a solution, because people discount that and still prefer inferior results based on human judgment.</p>
<p>Some ideas off the top of my head:</p>
<ul><li><strong>“Humanize” algorithms:</strong> highlight the people and teams that build them, and their dedication and hard work. Just like people associate “taxi” more with their human drivers rather than the mechanical cars they drive.</li>
<li><strong>Put humans between the algorithms and those consuming their output:</strong> Consider a core group of rationals who do not suffer from algorithm aversion, and share and forward the results of algorithms. This may not work for real-time lookups.</li>
<li><strong>Tie an algorithm’s fallibility to human error</strong> by the algorithm’s designer/implementer.</li>
</ul><p>Any other ideas?</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>IDEs in the cage</title>
      <link>http://vivekhaldar.com/articles/ides-in-the-cage/</link>
      <pubDate>Mon, 27 Oct 2014 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/ides-in-the-cage/</guid>
      <description>&lt;p&gt;I’m making my way through Nicholas Carr’s latest book, &lt;a href=&#34;http://www.nicholascarr.com/?page_id=18&#34;&gt;The Glass Cage&lt;/a&gt;&amp;ndash;slowly, because life. I was pleasantly surprised to see him quote &lt;a href=&#34;http://blog.vivekhaldar.com/post/66660163006/sharp-tools-dull-minds&#34;&gt;one of my blog posts&lt;/a&gt; about how IDEs are “automating” programming.&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;Some software writers worry that their profession’s push to ease the strain of thinking is taking a toll on their own skills. Programmers today often use… IDEs to aid them in composing code… they typically incorporate auto-complete, error-correction and debugging routines and… refactoring. But as the applications take over the work of coding, programmers lose opportunities to practice their craft and sharpen their challenge.  “Modern IDEs are getting ‘helpful’ enough that at times I feel like an IDE operator rather than a programmer,” writes Vivek Haldar, a veteran software developer with Google. “The behavior all these tools encourage is not ‘think deeply about your code and write it carefully,’ but ‘just write a crappy first draft of your code, and then the tools will tell you not just what’s wrong with it, but also how to make it better.’” His verdict: “Sharp tools, dull minds.”&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I’m making my way through Nicholas Carr’s latest book, <a href="http://www.nicholascarr.com/?page_id=18">The Glass Cage</a>&ndash;slowly, because life. I was pleasantly surprised to see him quote <a href="http://blog.vivekhaldar.com/post/66660163006/sharp-tools-dull-minds">one of my blog posts</a> about how IDEs are “automating” programming.</p>
<blockquote>
  <p>Some software writers worry that their profession’s push to ease the strain of thinking is taking a toll on their own skills. Programmers today often use… IDEs to aid them in composing code… they typically incorporate auto-complete, error-correction and debugging routines and… refactoring. But as the applications take over the work of coding, programmers lose opportunities to practice their craft and sharpen their challenge.  “Modern IDEs are getting ‘helpful’ enough that at times I feel like an IDE operator rather than a programmer,” writes Vivek Haldar, a veteran software developer with Google. “The behavior all these tools encourage is not ‘think deeply about your code and write it carefully,’ but ‘just write a crappy first draft of your code, and then the tools will tell you not just what’s wrong with it, but also how to make it better.’” His verdict: “Sharp tools, dull minds.”</p>
</blockquote>
<p>Thanks for the citation!</p>
<p>Lest that makes me sound like I’m advocating going back to not using IDEs, my position is a little more complicated than that. <a href="http://blog.vivekhaldar.com/post/66660163006/sharp-tools-dull-minds">Later in that post</a>:</p>
<blockquote>
  <p>Am I arguing for primitive tools? No. What I’ve described in the previous paragraph are my personal feelings while writing code. The tools (at least, the good ones) encode the knowledge and hard-won lessons of an entire army of programmers. They often point me to issues I’m blind to while writing code because I’m in such a rush to just make the damn thing work. In aggregate, they lead to a cleaner codebase.</p>
  <p>So what am I saying then? I’m saying that we should let the tools help us without becoming crutches, to let us write sharp code without dulling our minds. That sounds paradoxical. It is a subtle mental stance one takes towards one’s work, tools, and output.</p>
</blockquote>
<p>At some level the basic lesson of Carr’s book is the same: to not let automation make you complacent and loose the basic understanding of the thing being automated. It’s just hard to do.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>De-skilling</title>
      <link>http://vivekhaldar.com/articles/deskilling/</link>
      <pubDate>Mon, 06 Oct 2014 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/deskilling/</guid>
      <description>&lt;p&gt;Nicholas Carr’s new book, &lt;a href=&#34;http://www.nicholascarr.com/?page_id=18&#34;&gt;The Glass Cage&lt;/a&gt;, opens with a discussion of &lt;a href=&#34;http://www.faa.gov/other_visit/aviation_industry/airline_operators/airline_safety/safo/all_safos/media/2013/SAFO13002.pdf&#34;&gt;the FAA’s recent 1-page alert&lt;/a&gt; that cautions pilots to do more manual flying. Long, routine hours of flying on autopilot was atrophying their skills to the point where when something went wrong and manual intervention &lt;em&gt;was&lt;/em&gt; required, many did not know what to do.&lt;/p&gt;
&lt;p&gt;Here’s an idea that sounds implausible today but might be practical in a decade or so: have pilots fly all commercial jets remotely from a “flight center” on the ground. There might be one such center for a designated geographical area. They might hand planes off to one another. &lt;a href=&#34;http://en.wikipedia.org/wiki/Creech_Air_Force_Base&#34;&gt;Air Force pilots already fly drone missions halfway across the world remotely from a base in Nevada&lt;/a&gt;, so at least an early version of this idea is already being practiced.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Nicholas Carr’s new book, <a href="http://www.nicholascarr.com/?page_id=18">The Glass Cage</a>, opens with a discussion of <a href="http://www.faa.gov/other_visit/aviation_industry/airline_operators/airline_safety/safo/all_safos/media/2013/SAFO13002.pdf">the FAA’s recent 1-page alert</a> that cautions pilots to do more manual flying. Long, routine hours of flying on autopilot was atrophying their skills to the point where when something went wrong and manual intervention <em>was</em> required, many did not know what to do.</p>
<p>Here’s an idea that sounds implausible today but might be practical in a decade or so: have pilots fly all commercial jets remotely from a “flight center” on the ground. There might be one such center for a designated geographical area. They might hand planes off to one another. <a href="http://en.wikipedia.org/wiki/Creech_Air_Force_Base">Air Force pilots already fly drone missions halfway across the world remotely from a base in Nevada</a>, so at least an early version of this idea is already being practiced.</p>
<p>That would mean pilots are fully engaged and active during their shift, rather than being lulled by hours of autopilot after a 2-minute manual takeoff. When something goes wrong on  a flight, there will be a roomful of pilots to help out.</p>
<p>The major hurdle to implementing this will probably not be technical but getting people to board a commercial jet that doesn’t have a pilot on-board.</p>
<p>The issue with automating certain jobs is that their scope doesn’t expand. For example, a pilot performs certain actions, and if you automate 90% of those, the pilot is left with the same amount of time but only 10% of their prior workload. Contrast this with software development. Many tasks that were manual a decade ago are now handled by tools:  automated build/test/deploy, IDEs that understand code and can perform sophisticated refactorings, infrastructure for rent etc. But today’s software developer still has their hands full because the overall complexity of developing software and the scope of problems that software tackles has grown too. Autocomplete in the IDE might have made them soft when it comes to remembering the APIs, but they do have bigger problems to grapple with.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>How software grows</title>
      <link>http://vivekhaldar.com/articles/how-software-grows/</link>
      <pubDate>Sun, 17 Aug 2014 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/how-software-grows/</guid>
      <description>&lt;p&gt;I have often wondered &lt;a href=&#34;http://blog.vivekhaldar.com/post/9518243342/how-things-grow&#34;&gt;how things grow&lt;/a&gt;, and specifically, how software projects grow. Some initial looks at specific projects had pointed out that they grew super-linearly.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&#34;http://www.plosone.org/article/info%3Adoi%2F10.1371%2Fjournal.pone.0103023&#34;&gt;recent paper&lt;/a&gt; looks at a large cross-section of open source projects to analyze how adding people to projects affects their productivity.&lt;/p&gt;
&lt;p&gt;They find that &lt;em&gt;production intensity&lt;/em&gt; , as measured by number of commits, grows super-linearly with the number of project members. The median exponent was 4/3, which works out to a productivity boost of a factor of 2.5 when number of members is doubled.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I have often wondered <a href="http://blog.vivekhaldar.com/post/9518243342/how-things-grow">how things grow</a>, and specifically, how software projects grow. Some initial looks at specific projects had pointed out that they grew super-linearly.</p>
<p>A <a href="http://www.plosone.org/article/info%3Adoi%2F10.1371%2Fjournal.pone.0103023">recent paper</a> looks at a large cross-section of open source projects to analyze how adding people to projects affects their productivity.</p>
<p>They find that <em>production intensity</em> , as measured by number of commits, grows super-linearly with the number of project members. The median exponent was 4/3, which works out to a productivity boost of a factor of 2.5 when number of members is doubled.</p>
<p>Not surprisingly, the exponent was smaller (but still super-linear) for larger projects, but also showed less variability.</p>
<p>(For the link, I thank <a href="http://radar.oreilly.com/2014/08/four-short-links-5-august-2014.html">Nat Torkington’s Four Short Links</a>. He somehow manages to come up with four interesting links <em>every day</em>.)</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>When to do a rewrite</title>
      <link>http://vivekhaldar.com/articles/when-to-do-a-rewrite/</link>
      <pubDate>Tue, 22 Jul 2014 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/when-to-do-a-rewrite/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.joelonsoftware.com/articles/fog0000000069.html&#34;&gt;Spolsky’s famous screed against rewriting from scratch&lt;/a&gt; is now canonical. All the same, there are valid reasons to do a rewrite:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Your understanding of the domain, or the domain itself, has changed drastically&lt;/strong&gt; in the process of building the first version.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The scale for which you built the initial system has grown by more than an order of magnitude.&lt;/strong&gt; The right design for millions of users is very different than that for thousands.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Newer languages and runtimes make the product much better&lt;/strong&gt; along some dimension: deliver better performance, be more maintainable etc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;You have accumulated so much technical debt&lt;/strong&gt; that starting from scratch is easier than untangling the mess you have. This is often the most misleading reason, because engineers always prefer a system they wrote from scratch to inheriting one which works just fine. But even so, it does happen.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;None of the above takes away from what Spolsky wrote. A rewrite is still a risky endeavor, even if one or more of the above conditions hold true, and should always be approached with caution and humility.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://www.joelonsoftware.com/articles/fog0000000069.html">Spolsky’s famous screed against rewriting from scratch</a> is now canonical. All the same, there are valid reasons to do a rewrite:</p>
<ul><li><strong>Your understanding of the domain, or the domain itself, has changed drastically</strong> in the process of building the first version.</li>
<li><strong>The scale for which you built the initial system has grown by more than an order of magnitude.</strong> The right design for millions of users is very different than that for thousands.</li>
<li><strong>Newer languages and runtimes make the product much better</strong> along some dimension: deliver better performance, be more maintainable etc.</li>
<li><strong>You have accumulated so much technical debt</strong> that starting from scratch is easier than untangling the mess you have. This is often the most misleading reason, because engineers always prefer a system they wrote from scratch to inheriting one which works just fine. But even so, it does happen.</li>
</ul><p>None of the above takes away from what Spolsky wrote. A rewrite is still a risky endeavor, even if one or more of the above conditions hold true, and should always be approached with caution and humility.</p>
<p>His argument was much stronger in the era of software that was shrink-wrapped to PCs, because the slow rate of change of the surrounding environment made many of the above reasons inapplicable.</p>
<p>But server-side software that powers online services is always in a constant state of flux. There is rarely any concept of “done”. The product might look more or less the same from the outside, while the backend code constantly churns to deal with growing scale, new stacks, and other services it depends on.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Learning your life</title>
      <link>http://vivekhaldar.com/articles/learning-your-life/</link>
      <pubDate>Mon, 21 Jul 2014 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/learning-your-life/</guid>
      <description>&lt;p&gt;If you are a “regular” person living and working in modern civilization, it is &lt;em&gt;likely&lt;/em&gt; that your life has a few recurring patterns:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;on weekdays, you travel from home to work in the morning, and back in the evening; perhaps punctuated with a school or daycare drop-off and pick-up.&lt;/li&gt;
&lt;li&gt;on weekends, you either mostly stay at home or frequent a small set of haunts (beaches, restaurants etc).&lt;/li&gt;
&lt;li&gt;infrequently, you break out of this pattern by leaving the orbit of work-home to go on a vacation.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;This is easy to figure out by observing someone for a short period of time. Of course, your phone already does this.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>If you are a “regular” person living and working in modern civilization, it is <em>likely</em> that your life has a few recurring patterns:</p>
<ul><li>on weekdays, you travel from home to work in the morning, and back in the evening; perhaps punctuated with a school or daycare drop-off and pick-up.</li>
<li>on weekends, you either mostly stay at home or frequent a small set of haunts (beaches, restaurants etc).</li>
<li>infrequently, you break out of this pattern by leaving the orbit of work-home to go on a vacation.</li>
</ul><p>This is easy to figure out by observing someone for a short period of time. Of course, your phone already does this.</p>
<p>The above model of your life could be described in a few kilobytes. It is a zeroth-order machine learning problem. Is that depressing? Does that mean your whole life has a few kilobytes worth of complexity?</p>
<blockquote class="twitter-tweet" lang="en"><p>Free will can now be defined as the ability to surprise a prediction model.</p>— Vivek Haldar (@vivekhaldar) <a href="https://twitter.com/vivekhaldar/statuses/466618012699602944">May 14, 2014</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script><p><a href="http://www.john-foreman.com/blog/data-privacy-machine-learning-and-the-destruction-of-mysterious-humanity">John Foreman, in his poignantly named piece “Data Privacy, Machine Learning and the Destruction of Mysterious Humanity”</a>, takes a view of the field from the inside, and it sounds like that of a physicist working on the <a href="http://en.wikipedia.org/wiki/Manhattan_Project">Manhattan Project</a> worrying about the impact of what they’re building.</p>
<blockquote>
  <p>Our past data betrays our future actions, and rather than put us in a police state, corporations have realized that if they say just the right thing, we’ll put the chains on ourselves… Yet this loss of our internal selves to the control of another is the promise of AI in the hands of the private sector. In the hands of machine learning models, we become nothing more than a ball of probabilistic mechanisms to be manipulated with carefully designed inputs that lead to anticipated outputs&hellip; <em>The promise of better machine learning is not to bring machines up to the level of humans but to bring humans down to the level of machines.</em></p>
</blockquote>
<p>That is a dim, if plausible, view.</p>
<p>It is based on a pessimistic view of humans as always giving in to nudges to behave as our worst selves. I hope that we are better than that. We are already surrounded by advertising for junk food, and yet a substantial fraction of us manage to ignore that and eat healthy. I hope machine predictions that try to nudge us face a similar fate: <em>predictions that look down on us will be indistinguishable from low-quality ones</em>. The quality and tone of predictions will become an important part of the brand identity of the company emitting them. Do you really want to be the company known for peddling fatty, salty food, legal addictive substances, and predatory loans?</p>
<p>A tangential point: naming matters. <a href="http://blog.nullspace.io/should_i_machine_learn.html">Statistical inference</a>, which is what machine learning really is, is a less scary name. “Statistical inference” conjures images of bean-counters with taped glasses; “machine learning” of an inevitable army of terminators.</p>
<p>Circling back to the question I posed above: is your life really describable in a few kilobytes in a predictive model? No. A model is a probabilistic abstraction. <strong>You, and your life, are not a sequence of probabilities</strong>, in much the same way that hiking a trail is a much richer, “realer” experience than tracing your way through a detailed trail map.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Garland Words</title>
      <link>http://vivekhaldar.com/articles/garland-words/</link>
      <pubDate>Tue, 24 Jun 2014 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/garland-words/</guid>
      <description>&lt;p&gt;I define a &lt;em&gt;garland word&lt;/em&gt; to be one which can be formed by chopping off the last few letters and &amp;ldquo;wrapping around&amp;rdquo; to the start.&lt;/p&gt;
&lt;p&gt;For example: You can chop off the the trailing &amp;ldquo;on&amp;rdquo; from &amp;ldquo;onion&amp;rdquo; and still form the word by wrapping around to the starting &amp;ldquo;on&amp;rdquo;. In other words, you can write the letters &amp;ldquo;o&amp;rdquo;, &amp;ldquo;n&amp;rdquo;, &amp;ldquo;i&amp;rdquo; in a circle, in that order, and form the word &amp;ldquo;onion&amp;rdquo;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I define a <em>garland word</em> to be one which can be formed by chopping off the last few letters and &ldquo;wrapping around&rdquo; to the start.</p>
<p>For example: You can chop off the the trailing &ldquo;on&rdquo; from &ldquo;onion&rdquo; and still form the word by wrapping around to the starting &ldquo;on&rdquo;. In other words, you can write the letters &ldquo;o&rdquo;, &ldquo;n&rdquo;, &ldquo;i&rdquo; in a circle, in that order, and form the word &ldquo;onion&rdquo;.</p>
<p>I say that a garland word is of <em>degree n</em> if you can do the above with the last n letters of the word.</p>
<p>It turns out that garland words are fairly rare. In the English dictionary that came installed on my Ubuntu machine, there were 99171 words, only 199 words were garland words of degree 2 or above. The highest garland degree was 4.</p>
<p>The exact distribution was: there were only 3 words of degree 4, 32 of degree 3, and 164 of degree 2.</p>
<p>The degree 4 garland words were: &ldquo;hotshots&rdquo;, &ldquo;beriberi&rdquo; and &ldquo;abracadabra&rdquo;.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Lurking Smalltalk</title>
      <link>http://vivekhaldar.com/articles/lurking-smalltalk/</link>
      <pubDate>Mon, 23 Jun 2014 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/lurking-smalltalk/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.cl.cam.ac.uk/~srk31/&#34;&gt;Stephen Kell’s&lt;/a&gt; &lt;a href=&#34;http://plosworkshop.org/2013/preprint/kell.pdf&#34;&gt;paper at PLOS 2013&lt;/a&gt; meditates on one of CS’ oldest design questions: what should be in the operating system, and what in the programming language and runtime? The paper was a breath of fresh air; one of those &lt;a href=&#34;http://tagide.com/blog/2014/02/the-evolution-of-cs-papers/&#34;&gt;opinionated design thinking papers&lt;/a&gt; that one rarely sees in academic CS venues. Do read the whole thing.&lt;/p&gt;
&lt;p&gt;This question comes into stark relief if you look at what a modern language or VM runtime does: among other things, it multiplexes resources, and protect access to them. But that’s also exactly what the OS is supposed to do!&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://www.cl.cam.ac.uk/~srk31/">Stephen Kell’s</a> <a href="http://plosworkshop.org/2013/preprint/kell.pdf">paper at PLOS 2013</a> meditates on one of CS’ oldest design questions: what should be in the operating system, and what in the programming language and runtime? The paper was a breath of fresh air; one of those <a href="http://tagide.com/blog/2014/02/the-evolution-of-cs-papers/">opinionated design thinking papers</a> that one rarely sees in academic CS venues. Do read the whole thing.</p>
<p>This question comes into stark relief if you look at what a modern language or VM runtime does: among other things, it multiplexes resources, and protect access to them. But that’s also exactly what the OS is supposed to do!</p>
<p>The paper riffs on an earlier idea from Dan Ingalls: “An operating system is a collection of things that don’t ﬁt into a language. There shouldn’t be one.” The central problem tackled in the paper is that of having more generic object bindings in the OS, as opposed to the “static” filesystem bindings for most operations. Kell uses the following example:</p>
<blockquote>
  <p>Suppose we wish to search some object for text matching a pattern. If the object is a directory tree of text files, grep -r does exactly that. But suppose instead our directory tree contains a mixture of zipped and non-zipped files, or is actually some non-directory collection of text-searchable objects, such as a mailbox. In Smalltalk parlance, how can we make these diverse objects “understand” (via a collection of interposed objects) the messages of our grep -r (and vice versa)?</p>
</blockquote>
<p>This would indeed be elegant. But I’m afraid the engineer in me isn’t terribly excited by that.</p>
<p><a href="http://www.dmst.aueb.gr/dds/pubs/inbook/beautiful_code/html/Spi07g.html">“All problems in computer science can be solved by another level of indirection”</a> is a famous quote in computer science. The next sentence is much lesser known: &ldquo;But that usually will create another problem.&rdquo;
What Kell is proposing adds flexibility in binding by introducing indirection.</p>
<p>Indirection is controlled by some sort of <em>configuration</em> the binds each side of it. And configuration implies a lot of <em>added complexity</em>. The UNIX model of “everything is a stream of bytes and can be treated like a file” might be simple and unstructured, but that is precisely what <a href="http://blog.vivekhaldar.com/post/5542454900/the-perils-of-closed-worlds">enabled</a> a multitude of structure to be built on top of it.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Heartbeats</title>
      <link>http://vivekhaldar.com/articles/heartbeats/</link>
      <pubDate>Sun, 15 Jun 2014 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/heartbeats/</guid>
      <description>&lt;p&gt;It’s commencement&amp;ndash;and commencement speech&amp;ndash;season. The one that’s been on my mind the most this year has been &lt;a href=&#34;http://contentsmagazine.com/articles/10-timeframes/&#34;&gt;Paul Ford’s speech to a graduating class of interaction designers&lt;/a&gt;. His unifying thread is our conception of time:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;The only unit of time that matters is heartbeats. Even if the world were totally silent, even in a dark room covered in five layers of foam, you’d be able to count your own heartbeats.&lt;/p&gt;
  &lt;p&gt;When you get on a plane and travel you go 15 heartbeats per mile. That is, in the time it takes to travel a mile in flight your heart beats 15 times. On a train your heart might beat 250 times per mile…&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>It’s commencement&ndash;and commencement speech&ndash;season. The one that’s been on my mind the most this year has been <a href="http://contentsmagazine.com/articles/10-timeframes/">Paul Ford’s speech to a graduating class of interaction designers</a>. His unifying thread is our conception of time:</p>
<blockquote>
  <p>The only unit of time that matters is heartbeats. Even if the world were totally silent, even in a dark room covered in five layers of foam, you’d be able to count your own heartbeats.</p>
  <p>When you get on a plane and travel you go 15 heartbeats per mile. That is, in the time it takes to travel a mile in flight your heart beats 15 times. On a train your heart might beat 250 times per mile…</p>
  <p>… If we are going to ask people, in the form of our products, in the form of the things we make, to spend their heartbeats—if we are going to ask them to spend their heartbeats on us, on our ideas, how can we be sure, far more sure than we are now, that they spend those heartbeats wisely?</p>
</blockquote>
<p>Turns out, heartbeats are a great unit of time for another reason: <a href="http://blog.longnow.org/02011/07/26/geoffrey-b-west-%E2%80%9Cwhy-cities-keep-on-growing-corporations-always-die-and-life-gets-faster%E2%80%9D/">all animals have approximately the same number of heartbeats in a lifetime</a>.</p>
<blockquote>
  <p>With each increase in animal size there is a slowing of the pace of life. A shrew’s heart beats 1,000 times a minute, a human’s 70 times, and an elephant heart beats only 28 times a minute. The lifespans are proportional; shrew life is intense but brief, elephant life long and contemplative. Each animal, independent of size, gets about a billion heartbeats per life.</p>
</blockquote>
<p>I find that deeply poetic.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Why technologists want to secede</title>
      <link>http://vivekhaldar.com/articles/why-technologists-want-to-secede/</link>
      <pubDate>Sat, 17 May 2014 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/why-technologists-want-to-secede/</guid>
      <description>&lt;p&gt;Tech’s secessionist streak has recently got a lot of attention. &lt;a href=&#34;http://www.cnet.com/news/a-radical-dream-for-making-techno-utopias-a-reality/&#34;&gt;Balaji Srinivasan thinks we should build a new society based on technology, breaking free from the “legacy” institutions we’re currently hobbled with.&lt;/a&gt; &lt;a href=&#34;http://www.wired.com/2013/05/on-google-island/&#34;&gt;Larry Page hopes for experimental societies where change and experimentation can proceed much faster.&lt;/a&gt; &lt;a href=&#34;http://www.cnet.com/news/elon-musks-plan-for-life-on-mars/&#34;&gt;Elon Musk wants to go live on Mars.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Most reactions to this have been along the lines of “look at these rich powerful elites thinking they can up and leave and do without all the rest of us!” I want to focus not on the politics behind this, but the motivation.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Tech’s secessionist streak has recently got a lot of attention. <a href="http://www.cnet.com/news/a-radical-dream-for-making-techno-utopias-a-reality/">Balaji Srinivasan thinks we should build a new society based on technology, breaking free from the “legacy” institutions we’re currently hobbled with.</a> <a href="http://www.wired.com/2013/05/on-google-island/">Larry Page hopes for experimental societies where change and experimentation can proceed much faster.</a> <a href="http://www.cnet.com/news/elon-musks-plan-for-life-on-mars/">Elon Musk wants to go live on Mars.</a></p>
<p>Most reactions to this have been along the lines of “look at these rich powerful elites thinking they can up and leave and do without all the rest of us!” I want to focus not on the politics behind this, but the motivation.</p>
<p>These ideas are getting attention now because rich and powerful titans of tech are espousing them. But these are the secret fantasies of every geek, rich or not, powerful or not.</p>
<p>Geeks have deep isolationist tendencies. They prefer losing themselves in sci-fi worlds to hanging out with friends. They build an early affinity with machines and programs. They sense that <a href="http://pages.cs.wisc.edu/~remzi/Naur.pdf">programming is the ultimate in world-building</a>, and what’s more, it’s executable! They build elaborate towers of abstraction. They are drunk on the clean rationality of the world that the machine and they have built and understand.</p>
<p>Eventually, they secretly wish for a more ordered world. A world that is not messy or unpredictable. A world where one might have to work hard to establish the priors, but once they are, everything follows.</p>
<p>It is telling that one of the central activities in programming is <em>abstraction</em>. Abstraction is nothing but taking a jumble of intricate detail, putting it in a tightly sealed box, and then poking very small, well-defined holes in the box to interact with that jumble. So clean! So much better!</p>
<p>But every abstraction is leaky. Ints carry the baggage of their bit-width. In a perfect world, every int would be a BigInt with unlimited range. But we live in a world where it matters whether ints fit in a hardware register or not. <a href="http://en.wikipedia.org/wiki/Fallacies_of_Distributed_Computing">Networks carry the baggage of not being perfect links.</a> In a perfect world, a link between two machines would be an immutable, always-available channel for sending messages between them. But we live in a world where wires break.</p>
<p>This is the central tension in the mind of every geek. The constant need to abstract, to order, to rationalize, pitted against the necessary realization the world and entropy will eventually thwart you.</p>
<p>Secession is simply the same need for order and abstraction carried into the geek’s mental model for society.</p>
<p><a href="http://blog.vivekhaldar.com/post/29133221398/the-lure-of-work">I wrote previously</a>:</p>
<blockquote>
  <p>The world of humans is messy, unpredictable, and—this is the part that infuriates you the most, the part you simply don’t get, the part that will forever make you an outsider—unreasonable. Humans are unreasonable. Your whole life, you’ve trusted one thing to save you. And saved you it has, again and again, without fail. That one thing is reason. Computers are a tool of reason, to be handled by people who obey the code of reason. People who are involved with computers, they’re reasonable, just like you. You all share a deep, unspoken bond. You’re all worshipers in the church of reason.</p>
</blockquote>
<p>Please don’t hold that against us.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Bleeding buffers</title>
      <link>http://vivekhaldar.com/articles/bleeding-buffers/</link>
      <pubDate>Sat, 03 May 2014 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/bleeding-buffers/</guid>
      <description>&lt;p&gt;A lot has been written about Heartbleed. Here are my two cents.&lt;/p&gt;
&lt;p&gt;The problem is that &lt;em&gt;all&lt;/em&gt; our modern computing infrastructure is written in a language, C,  that was designed to be a thin layer over assembly and hence has no &lt;a href=&#34;http://en.wikipedia.org/wiki/Memory_safety&#34;&gt;memory safety&lt;/a&gt;. A memory-safe language, which is to say, any modern post-C/C++ language, still allows writing buggy code that can be exploited&amp;ndash;for example, look at the raft of SQL injection attacks in Java backends&amp;ndash;but the bar for exploitation is much higher and the space of possible attacks much smaller when an attacker can&amp;rsquo;t turn array dereferences into a way to read and write arbitrary memory addresses.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>A lot has been written about Heartbleed. Here are my two cents.</p>
<p>The problem is that <em>all</em> our modern computing infrastructure is written in a language, C,  that was designed to be a thin layer over assembly and hence has no <a href="http://en.wikipedia.org/wiki/Memory_safety">memory safety</a>. A memory-safe language, which is to say, any modern post-C/C++ language, still allows writing buggy code that can be exploited&ndash;for example, look at the raft of SQL injection attacks in Java backends&ndash;but the bar for exploitation is much higher and the space of possible attacks much smaller when an attacker can&rsquo;t turn array dereferences into a way to read and write arbitrary memory addresses.</p>
<p>Type and memory safe languages have existed for a while now. Language based security and static analysis is still a thriving research area, but it is also mature enough that a broad set of results and techniques have been found to be generally useful, many of which have even made it into mainstream languages and tools. Why then are we still in this state?</p>
<p>The two immediate answers that come to mind&ndash;improving the safety of C/C++, and writing infrastructure in safe languages&ndash;are, upon closer inspection,riddled with complexities.</p>
<p><a href="http://blog.regehr.org/archives/939">Making C/C++ memory safe is possible</a>, but it is not as simple as flipping a switch. There is a price to be paid in performance, of course, but even if one were willing to pay that, there might be scores of subtle behavior changes in code made safe this way. There is probably tons of code out there that <em>depends</em> on unsafe behavior.</p>
<p>Writing SSL in a safe&reg; language is possible. But everything that would want to link it (browsers and web servers) is written in C. One could use cross-language calling facilities, but that is rarely clean due to impedance mismatches, and of course, that still leaves the calling code memory-unsafe. You’d have to rewrite all the net’s critical infrastructure in a safe language and runtime. That’s wishful thinking.</p>
<p>When physical infrastructure decays it is visible. A new road uses the latest knowledge and practices for building roads, not those from thirty years ago. Neither is the case for our computing and network infrastructure.</p>
<p>In a strange inversion of the commonly held belief that hardware is hard to change and software is easily changed, some burden for safety might eventually fall on the processor. One example was when <a href="http://en.m.wikipedia.org/wiki/NX_bit">CPUs started supporting the no-execute bit to prevent code injection attacks.</a> I wouldn&rsquo;t be surprised to see more hardware features along those lines.</p>
<p>Relevant links:</p>
<ul><li><a href="http://blog.cryptographyengineering.com/2014/04/attack-of-week-openssl-heartbleed.html">Great overall explanation of the bug</a></li>
<li><a href="http://blog.regehr.org/archives/1128">John Regehr on using static analysis to find Heartbleed</a></li>
<li><a href="http://security.coverity.com/blog/2014/Apr/on-detecting-heartbleed-with-static-analysis.html">Coverity on how they tweaked their analysis to find Heartbleed</a></li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>You can&#39;t run with the machines</title>
      <link>http://vivekhaldar.com/articles/you-cant-run-with-the-machines/</link>
      <pubDate>Sun, 13 Apr 2014 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/you-cant-run-with-the-machines/</guid>
      <description>&lt;p&gt;I recently read &lt;a href=&#34;http://www.amazon.com/The-Second-Machine-Age-Technologies/dp/1480577472&#34;&gt;“The Second Machine Age” by Erik Brynjolfsson  and Andrew McAfee&lt;/a&gt;. The major points the book makes&amp;ndash;that information technology and digitization is exponential, that automation is rapidly expanding into even cognitive tasks that until recently were thought doable only by humans, that the digital worldwide economy rewards winners and leaves even close seconds in the dust&amp;ndash;are all quite well-known by now, but the authors have tied them together with a narrative that makes the book a good single place to read about them.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I recently read <a href="http://www.amazon.com/The-Second-Machine-Age-Technologies/dp/1480577472">“The Second Machine Age” by Erik Brynjolfsson  and Andrew McAfee</a>. The major points the book makes&ndash;that information technology and digitization is exponential, that automation is rapidly expanding into even cognitive tasks that until recently were thought doable only by humans, that the digital worldwide economy rewards winners and leaves even close seconds in the dust&ndash;are all quite well-known by now, but the authors have tied them together with a narrative that makes the book a good single place to read about them.</p>
<p>I particularly looked forward to the chapter titled “Racing With The Machines: Recommendations for Individuals”, in which they suggest what kind of work will be left for humans to do, and what skills we should try and develop to stay ahead of automation. I really wanted to know if they had cracked the nut of how we would stay gainfully employed. I was disappointed.</p>
<p>The the authors looked at prior attempts by <a href="http://press.princeton.edu/titles/7704.html">Levy and Murnane</a> that tried to predict limits on what activities would still require humans. They said that computers are good at following rules and bad at pattern-recognition, giving the example of driving a car as being too cognitively and sensorially complex to be automated. As the authors say in the book: “<a href="http://en.wikipedia.org/wiki/Google_driverless_car">so much for <em>that</em> distinction</a>.” Then they go right ahead and make their own prediction of the <em>next</em> frontier that computers will be unable to cross:</p>
<blockquote>
  <p>Our recommendations about how people can remain valuable knowledge workers in the new machine age are straightforward: work to improve the skills of ideation, large-frame pattern recognition, and complex communication instead of just the three Rs. And whenever possible, take advantage of self-organizing learning environments, which have a track record of developing these skills in people.</p>
</blockquote>
<p>The biggest problem with this advice is that it is skating to where the puck is, not where it is going to be.</p>
<p>The example they lean on the most is <a href="http://en.wikipedia.org/wiki/Advanced_Chess">freestyle chess</a> where teams of humans and chess programs compete against each other (hence the title of the chapter). It turns out that the combination of a chess program guided by a human is more powerful than either alone. <a href="http://marginalrevolution.com/marginalrevolution/2013/11/what-are-humans-still-good-for-the-turning-point-in-freestyle-chess-may-be-approaching.html">Freestyle chess is also a central example in Tyler Cowen’s latest book</a>. Unlike Brynjolfsson  and McAfee, Cowen wonders if this is just a transitional phase, and if humans will ultimately not add any value in this pairing.</p>
<p>Their recommendation about “ideation” and “large-frame pattern recognition” is not concrete enough. What does that mean specifically for someone choosing a college major today? And more importantly, can we be sure that those activities will remain out of the reach of computers by the time they graduate?</p>
<p>The debate about whether human thought is computable is an open one, but the vast majority of human cognitive activity does not happen anywhere near that threshold. In an ironic similarity to the <a href="http://en.wikipedia.org/wiki/Cantor's_diagonal_argument">diagonal cut</a>, perhaps the only people secure in their isolation from automation are mathematicians probing the bounds of what is computable, and how.</p>
<p>But each one of the rest of us has to wonder if, within our lifetimes, our jobs are automatable. I program for a living, and while a good fraction of what I do is intellectually challenging, there is also some that makes me feel like <a href="http://blog.vivekhaldar.com/post/67030281981/automating-software-engineering">just</a> <a href="http://blog.vivekhaldar.com/post/79843441901/the-automatic-corporation">an</a> <a href="http://blog.vivekhaldar.com/post/56222096673/the-perils-of-being-a-knowledge-worker">operator</a>.</p>
<p>Many non-technical authors think of Kasparov losing to Big Blue as a major milestone in AI, but that was largely due arriving at a point in time that Moore’s Law delivered enough computing beef to “solve” an exponentially complex game like chess. A more meaningful threshold would be when <em>insight</em> can be computed. For example, could a computer propose an algorithm with the simple elegance of Quicksort?</p>
<p>“Running with the machines” is a temporary strategy at best. That is simply the halfway house between humans doing something and it being fully automated. A more accurate phrase would be “run by the machines”, because <a href="http://www.thenation.com/article/178241/how-crowdworkers-became-ghosts-digital-machine">cheap human labor is crowdsourced</a> for the kinds of problems that are just barely outside a computer’s (current) reach.</p>
<p>I see two strategies for staying ahead of automation:</p>
<p>The first is to be the one doing the automation. In other words, to be a programmer. (Massive disclaimer: of course I would say that, being a programmer.) More bluntly, be the hunter instead of the hunted. The problem is that not everybody is able or willing to do that.</p>
<p>The second strategy is to be a <em>doctor</em> of machines. <a href="http://blog.vivekhaldar.com/post/6972614229/large-computer-systems-are-organic">Large computing systems show organic behavior</a>, and tending to them often requires the same mindset and behaviors as a doctor diagnosing and tending to patients. I like to draw an analogy to cities. A (relatively) small number of people initially construct the infrastructure (pipes, wires, roads), but a much larger number of people maintain them continuously.</p>
<p>We will have interesting lives.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>More on fat vs thin clients</title>
      <link>http://vivekhaldar.com/articles/more-on-fat-vs-thin-clients/</link>
      <pubDate>Mon, 07 Apr 2014 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/more-on-fat-vs-thin-clients/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www-cs-students.stanford.edu/~amitp/&#34;&gt;Ex-Googler Amit Patel&lt;/a&gt; made an insightful &lt;a href=&#34;http://blog.vivekhaldar.com/post/74002389276/fat-client-thin-client#comment-1310958012&#34;&gt;comment&lt;/a&gt; on my post about &lt;a href=&#34;http://blog.vivekhaldar.com/post/74002389276/fat-client-thin-client&#34;&gt;fat and thin clients&lt;/a&gt; that I totally agree with, and so I&amp;rsquo;m just going to reproduce it here in full:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;Some thoughts:&lt;/p&gt;
  &lt;p&gt;1 - Net connectivity does not necessarily mean &amp;ldquo;thin client&amp;rdquo;. I can use net connectivity for data and still do a lot of processing on the client.&lt;/p&gt;
  &lt;p&gt;2 - The server/client power ratio doesn&amp;rsquo;t matter unless I&amp;rsquo;m actually trying to solve those large problems.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://www-cs-students.stanford.edu/~amitp/">Ex-Googler Amit Patel</a> made an insightful <a href="http://blog.vivekhaldar.com/post/74002389276/fat-client-thin-client#comment-1310958012">comment</a> on my post about <a href="http://blog.vivekhaldar.com/post/74002389276/fat-client-thin-client">fat and thin clients</a> that I totally agree with, and so I&rsquo;m just going to reproduce it here in full:</p>
<blockquote>
  <p>Some thoughts:</p>
  <p>1 - Net connectivity does not necessarily mean &ldquo;thin client&rdquo;. I can use net connectivity for data and still do a lot of processing on the client.</p>
  <p>2 - The server/client power ratio doesn&rsquo;t matter unless I&rsquo;m actually trying to solve those large problems.</p>
  <p>3 - There are <em>some</em> problems that need large machines and there are also some problems that could fit on either side. We&rsquo;re not trying to figure out whether web search is going to be running on the phone. The real question is where the small things run.</p>
  <p>4 - I <em>do</em> use my phone and tablet when I don&rsquo;t have net connectivity. They are not bricks (maybe this is different in Androidland). Most of the things I do aren&rsquo;t big problems. Even some previously big problems that only fit on a big computer now fit on my phone (like maps).</p>
  <p>5 - Bandwidth and storage keeps getting better. Latency and availability aren&rsquo;t improving much. Bandwidth and storage makes the &ldquo;sync all my data among all my devices&rdquo; model work for a larger and larger subset of my data. My data is not growing as quickly as storage, so I can see <em>all</em> my data fitting on my phone within a decade.</p>
  <p>For any given problem, do I ever want to give up low latency and high availability to have it run on the server instead of my client? Generally, not unless it&rsquo;s a <em>much</em> better experience to compensate for the slowness and unavailability. For most everything I do (text editing, word processing, photo processing, web browsing, games, email, social networking), it&rsquo;s hard to justify.</p>
  <p>Unfortunately most of today&rsquo;s client apps are based on the old model assuming no networking. You email files around if you want to share. I think we can do <em>much</em> better by using synchronization among multiple clients as a fundamental building block. Data and compute stay local but when you have connectivity you synchronize with other places the data is stored. Google Wave was a stab at this. OneNote too, I think. Git does this for programming. DropBox is built on this model but it handles only simple synchronization at the moment. They have the potential to build infrastructure for apps to synchronize in a more structured way (like Wave), but I don&rsquo;t know if they&rsquo;re planning to do this.</p>
</blockquote>
]]></content:encoded>
    </item>
    
    <item>
      <title>Asynchronous Learning is More Inclusive</title>
      <link>http://vivekhaldar.com/articles/asynchronous-learning-is-more-inclusive/</link>
      <pubDate>Sat, 05 Apr 2014 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/asynchronous-learning-is-more-inclusive/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.hybridpedagogy.com/journal/affinity-asynchronous-learning/&#34;&gt;Maha Bala and Brad Meier take on the default assumption that synchronous modes are best for online learning&lt;/a&gt;. They make the argument that when expanded to a worldwide audience, enforcing synchronicity is incredibly biased: against certain time zones, against people with families who want to choose their own time, and against people who do not have the hardware or bandwidth for streaming audio-visuals. Asynchronous modes not only even out that bias but also promote deeper reflection.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://www.hybridpedagogy.com/journal/affinity-asynchronous-learning/">Maha Bala and Brad Meier take on the default assumption that synchronous modes are best for online learning</a>. They make the argument that when expanded to a worldwide audience, enforcing synchronicity is incredibly biased: against certain time zones, against people with families who want to choose their own time, and against people who do not have the hardware or bandwidth for streaming audio-visuals. Asynchronous modes not only even out that bias but also promote deeper reflection.</p>
<blockquote>
  <p>[one of the authors] has had experiences facilitating web-based video dialogue, and even though she sees it could have enormous potential when it works well, very often it does not. When we learn online, we are not together in one room, and we need to recognize not only the limitations of that, but the openness of its possibilities.</p>
  <p>The strengths of online learning, especially in massive courses such as MOOCs, and especially for adult learners, might lie in their asynchronous interactive components.</p>
</blockquote>
<p><a href="http://www.hybridpedagogy.com/journal/affinity-asynchronous-learning/">Read the whole thing.</a></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>The Automatic Corporation</title>
      <link>http://vivekhaldar.com/articles/the-automatic-corporation/</link>
      <pubDate>Sun, 16 Mar 2014 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-automatic-corporation/</guid>
      <description>&lt;p&gt;Corporations can be thought of as information-processing feedback loops. They propose products, introduce them into the marketplace, learn from the performance of the products, and adjust. They do this while trying to maximize some value function, typically profit.&lt;/p&gt;
&lt;p&gt;So why can’t they be completely automated? I mean that literally. Could we have software that carries out all those functions?&lt;/p&gt;
&lt;p&gt;Software could propose new products within a design space. It could monitor the performance of those products in the marketplace, and then learn from the feedback and adjust accordingly, all while maximizing its value function. If the product is a webapp, most of these steps are already within the reach of full automation. For physical products, what’s missing is APIs that allow a program to order physical products, and move them around in the physical world.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Corporations can be thought of as information-processing feedback loops. They propose products, introduce them into the marketplace, learn from the performance of the products, and adjust. They do this while trying to maximize some value function, typically profit.</p>
<p>So why can’t they be completely automated? I mean that literally. Could we have software that carries out all those functions?</p>
<p>Software could propose new products within a design space. It could monitor the performance of those products in the marketplace, and then learn from the feedback and adjust accordingly, all while maximizing its value function. If the product is a webapp, most of these steps are already within the reach of full automation. For physical products, what’s missing is APIs that allow a program to order physical products, and move them around in the physical world.</p>
<p>A limited version of what I’m describing already exists. High-frequency trading firms are already pure software, mostly beyond human control or comprehension. The <a href="http://en.wikipedia.org/wiki/2010_Flash_Crash">flash crash of 2010</a> demonstrated this. Companies that are centered around logistics, like FedEx or Walmart, can be already thought of as complex software entities where human worker bees carry out the machine’s instructions.</p>
<p>This happens naturally, because over time more and more of the business logic of a company becomes encoded in software. Humans still have some control (or so they think) but mostly what they’re doing is supplying parameters to the computation. A modern corporation is so complex that it does not fit in the brain of a single person (or a small number of persons). Software carries the slack.</p>
<p>The intermediate step to a fully automated corporation is one where tasks requiring humans are performed not by employees but are broken into micro-tasks and fulfilled by crowdsourcing (using, for example, services like Mechanical Turk).</p>
<p><a href="http://longnow.org/seminars/02011/jul/25/why-cities-keep-growing-corporations-always-die-and-life-gets-faster/">Corporations do not scale, and eventually die</a>. That’s because they scale sub-linearly. Their productivity metrics scale by an exponent of ⅘ on the number of employees.</p>
<p>I hypothesize that the management overhead which makes corporations grow sub-linearly is due to the limited information processing capability of <em>individual</em> humans. People at the top do not have local on-the-ground information: how are individual products performing, what are customers’ complaints etc. And the rank-and-file folks on the ground do not have the relevant high-level information: how does what I’m doing translate to the value that the corporation as a whole seeks to maximize? In fact, the the flow of value and information is so complex that employees have pretty much given up on determining that relationship, and know of it only at a macro P&amp;L-center level.</p>
<p>An algorithm will have no such problems with acting on both global as well as fine-grained local information. In fact, I suspect that the more information it gets to act on, the better decisions it will make, making automatic corporations grow <em>super-linearly.</em></p>
<p>One objection to being a purely automatic corporation might be that it precludes visionary, groundbreaking products, because it resembles incremental hill climbing and is susceptible to get stuck in local maxima. But a visionary, groundbreaking product is (initially) indistinguishable from picking a new random point in the product space, and hill-climbing from there. There is no reason why the automatic corporation couldn’t allocate some fraction of its resources to exploring new points in the space completely unrelated to its current neighborhood.</p>
<p>The CEO of an automatic corporation will be a devops engineer: fixing software bugs, writing “features” (i.e. new ways for the corporation to behave), watching performance dashboards (imagine all the pretty graphs!), and providing some vestige of human input to tune parameters used by the software. Eventually they can take their hands off the steering wheel, having configured everything to run on auto-pilot, and set up alerts to page their phone if something really goes wrong.</p>
<p>Automatic corporations will start within narrow domains, where the product design area and value functions are relatively simple. But they will gradually move upmarket. This is a familiar pattern in the dissemination of most new technologies. There will be a smattering of small automatic corporations by the end of the decade.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Pebbles and Projects</title>
      <link>http://vivekhaldar.com/articles/pebbles-and-projects/</link>
      <pubDate>Thu, 13 Mar 2014 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/pebbles-and-projects/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m growing increasingly frustrated with how little today&amp;rsquo;s patchwork of messaging/email and docs matches my workflow needs.&lt;/p&gt;
&lt;p&gt;What I really need to keep track of are not emails and docs and appointments, but &lt;em&gt;projects&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Imagine these emails/docs as pebbles, and each project as a collection of pebbles. This project is red pebbles. That one is blue pebbles. Yet another one is yellow pebbles. Then imagine throwing all of them on the floor. Then imagine being asked &amp;ldquo;can you construct for me a coherent state of all the yellow pebbles?&amp;rdquo; That&amp;rsquo;s how it feels trying get a high-level view of a project from all these pebbles flying around.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I&rsquo;m growing increasingly frustrated with how little today&rsquo;s patchwork of messaging/email and docs matches my workflow needs.</p>
<p>What I really need to keep track of are not emails and docs and appointments, but <em>projects</em>.</p>
<p>Imagine these emails/docs as pebbles, and each project as a collection of pebbles. This project is red pebbles. That one is blue pebbles. Yet another one is yellow pebbles. Then imagine throwing all of them on the floor. Then imagine being asked &ldquo;can you construct for me a coherent state of all the yellow pebbles?&rdquo; That&rsquo;s how it feels trying get a high-level view of a project from all these pebbles flying around.</p>
<p>I feel like email and shared docs are like assembly language, and we need an abstraction above them. The analogy is fitting, because a high-level language is restrictive: you can do more things and have more control in assembly. But with the restriction comes freedom to express more complexity more succintly.</p>
<p>The problem with every project management solution that I&rsquo;ve seen is this: it assumes it is the only thing in the world. &ldquo;If you use this tool, and only this tool, and capture every little detail as it happens, then this tool will give you a coherent state of the world, yaaay!&rdquo; Of course, life never works that way.</p>
<p>I&rsquo;m not saying this is an easy problem to solve. I don&rsquo;t even know what a first approximation of the solution would look like. But I do know there an opportunity here.﻿</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Shedding</title>
      <link>http://vivekhaldar.com/articles/shedding/</link>
      <pubDate>Wed, 12 Mar 2014 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/shedding/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been following &lt;a href=&#34;http://ribbonfarm.com&#34;&gt;Venkatesh Rao&amp;rsquo;s writing&lt;/a&gt; since he achieved net stardom with his &lt;a href=&#34;http://www.ribbonfarm.com/2009/10/07/the-gervais-principle-or-the-office-according-to-the-office/&#34;&gt;Gervais Principle essay&lt;/a&gt;. Gotta be honest&amp;ndash;it&amp;rsquo;s heavy reading and requires way more concentration than the regular popcorn the net serves up.&lt;/p&gt;
&lt;p&gt;But in a departure from his usually cold hard intellectual style, &lt;a href=&#34;http://www.ribbonfarm.com/2014/02/27/demons-by-candelight/&#34;&gt;his recent piece about how the quality of light affects our work and our rhythms&lt;/a&gt; really tugged at my heart. A lot of that was because of the most powerful  rhetoric device&amp;ndash;nostalgia. Because I grew up in India in the 80s and 90s and also went through those load-shedding hours. It was inconvenience,  boredom, excitement and respite all rolled into one.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I&rsquo;ve been following <a href="http://ribbonfarm.com">Venkatesh Rao&rsquo;s writing</a> since he achieved net stardom with his <a href="http://www.ribbonfarm.com/2009/10/07/the-gervais-principle-or-the-office-according-to-the-office/">Gervais Principle essay</a>. Gotta be honest&ndash;it&rsquo;s heavy reading and requires way more concentration than the regular popcorn the net serves up.</p>
<p>But in a departure from his usually cold hard intellectual style, <a href="http://www.ribbonfarm.com/2014/02/27/demons-by-candelight/">his recent piece about how the quality of light affects our work and our rhythms</a> really tugged at my heart. A lot of that was because of the most powerful  rhetoric device&ndash;nostalgia. Because I grew up in India in the 80s and 90s and also went through those load-shedding hours. It was inconvenience,  boredom, excitement and respite all rolled into one.</p>
<blockquote>
  <p>Dark evenings without power were a special time for children. The candle-lit hours on porches and balconies were a strange mix of an ethereal kind of intimacy,  beckoning darkness, and thoughts that retreated from both sunlight and electric lights.</p>
  <p>You could do nothing useful during those hours. There was no TV or radio. Reading was difficult. Candle-lit meals tended to be either quick, simple affairs whipped up in semi-darkness, or leftovers. Families who turned the blacked-out evenings into family time generally sat out on the porch. Adults would use the time to tell family stories to children. Teenagers and some couples would stroll up and down the street, occasionally stopping to chat with neighbors. Younger kids would run around squealing and playing, seemingly possessed by the strange euphoria-inducing forces leaking in from another world. Or they would huddle together and try to scare each other with ghost stories.</p>
</blockquote>
]]></content:encoded>
    </item>
    
    <item>
      <title>The tool divergence</title>
      <link>http://vivekhaldar.com/articles/the-tool-divergence/</link>
      <pubDate>Sat, 08 Mar 2014 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-tool-divergence/</guid>
      <description>&lt;p&gt;It used to be that the platform on which most software was developed was also the one on which most of it was deployed&amp;mdash;the personal desktop computer. As a developer you only needed one machine.&lt;/p&gt;
&lt;p&gt;Now, the target deployment platform is an app for a phone or tablet. But you still need a big desktop machine to develop them.&lt;/p&gt;
&lt;p&gt;The first effect of this development-deployment divergence is that it cements the new position of the desktop as a specialized factory machine.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>It used to be that the platform on which most software was developed was also the one on which most of it was deployed&mdash;the personal desktop computer. As a developer you only needed one machine.</p>
<p>Now, the target deployment platform is an app for a phone or tablet. But you still need a big desktop machine to develop them.</p>
<p>The first effect of this development-deployment divergence is that it cements the new position of the desktop as a specialized factory machine.</p>
<p>But another effect is that it raises the barrier to casual hacking. In the PC age a kid who wanted to write software just needed to download a bunch of simple tools and was off running. But today that kid would need to setup a complicated toolchain on a beefy desktop. And that too in an age when they think of desktops as something quaint, and might very well not even have one, because their &ldquo;primary device&rdquo; is just their phone or tablet.</p>
<p>Even the term &ldquo;primary device&rdquo; probably sounds funny to them. Growing up if someone asked me what my primary device was I&rsquo;d laugh at them because my PC was my only device and it was all I needed or wanted.</p>
<p>So here&rsquo;s my wish&mdash;and challenge. Make it so that a young person who gets the urge can code and build something on their phone or tablet. I suspect it will be easier with the extra screen real estate on a tablet, but the big problem is the same. Make it so that some of that infinite interstitial time that their phone soaks up can be filled with programming. What if at the end of that Apple ad the teenager presented his family with a cool app rather than a movie?</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>The Programming Language Consensus</title>
      <link>http://vivekhaldar.com/articles/the-programming-language-consensus/</link>
      <pubDate>Sun, 23 Feb 2014 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-programming-language-consensus/</guid>
      <description>&lt;p&gt;If you look at features in mainstream programming languages over the last couple of decades, they seem to be converging around a common set of core features, surrounded by fashion, preference and whim. These core features are:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;first class functions&lt;/li&gt;
&lt;li&gt;lists and maps are part of the language&lt;/li&gt;
&lt;li&gt;succinctness&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;These features first originated in dynamically typed scripting languages like Python. (Well, they originated in Lisp, but then everything originated in Lisp.) Then they gradually found their way into statically typed compiled languages like &lt;a href=&#34;http://blog.vivekhaldar.com/post/36517698671/the-new-c&#34;&gt;C++&lt;/a&gt;&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; and Java. Some of the most anticipated features of &lt;a href=&#34;http://openjdk.java.net/projects/jdk8/features&#34;&gt;Java 8&lt;/a&gt; are &lt;a href=&#34;http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-final.html&#34;&gt;lambda expressions&lt;/a&gt; and &lt;a href=&#34;http://openjdk.java.net/jeps/101&#34;&gt;type inference&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>If you look at features in mainstream programming languages over the last couple of decades, they seem to be converging around a common set of core features, surrounded by fashion, preference and whim. These core features are:</p>
<ul><li>first class functions</li>
<li>lists and maps are part of the language</li>
<li>succinctness</li>
</ul><p>These features first originated in dynamically typed scripting languages like Python. (Well, they originated in Lisp, but then everything originated in Lisp.) Then they gradually found their way into statically typed compiled languages like <a href="http://blog.vivekhaldar.com/post/36517698671/the-new-c">C++</a><sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> and Java. Some of the most anticipated features of <a href="http://openjdk.java.net/projects/jdk8/features">Java 8</a> are <a href="http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-final.html">lambda expressions</a> and <a href="http://openjdk.java.net/jeps/101">type inference</a>.</p>
<p>There is a subtle distinction between succinctness and expressivity. Expressivity almost always leads to succinct code. My favorite example is list comprehensions. But succinctness is also about omitting unnecessary verbiage. A good example is type inference enabling the omission of spelling out types.</p>
<p>Go had all three from the get-go.</p>
<p>Two things that are not yet part of this common core are objects and concurrency. I almost added “object orientation” to the list above, but then Go’s model of defining structs and interfaces made me think otherwise. It reminds me of Niklaus Wirth’s philosophy of understanding programs by looking at their data structures first. As for concurrency, there are wildly different ways of expressing it, but I have a hunch that the CSP model adopted by Go (and Erlang) will prevail. Maybe in another few years there will be five items on the list of common language features.</p>
<p>This is a good thing, because it looks like we’re gradually finding our way towards abstractions and constructs that are proving to be widely useful and broadly applicable. It is also rendering irrelevant many of the PL community’s fiercest debates. The agitation over static vs dynamic types starts fading when a C++ or Java code snippet with range-based for loops, lambdas and omitted type declarations looks very much like a Python or Ruby one. I was also surprised to see that while Go is very much a systems language, in chatting with other programmers I found Go eating more share from Java and Python than C++.</p>
<div class="footnotes" role="doc-endnotes">
<hr><ol><li id="fn:1" role="doc-endnote">
<p>Yes, lists and maps are not technically part of the core C++ language, but of the STL, which is pretty fundamental to the actual use of C++. I wouldn’t be surprised if a future spec introduced core-language syntax for lists and maps. Same goes for Java. <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol></div>
]]></content:encoded>
    </item>
    
    <item>
      <title>Technium</title>
      <link>http://vivekhaldar.com/articles/technium/</link>
      <pubDate>Wed, 19 Feb 2014 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/technium/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve followed Kevin Kelly&amp;rsquo;s work for a while, and in my humble opinion he is our foremost apologist for technology. If you want an introduction to his work, &lt;a href=&#34;http://edge.org/conversation/the-technium&#34;&gt;this Edge interview&lt;/a&gt; is a dense yet readable summary.&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;I call myself a protopian, not a utopian. I believe in progress in an incremental way where every year it&amp;rsquo;s better than the year before but not by very much—just a micro amount. I don&amp;rsquo;t believe in utopia where there&amp;rsquo;s any kind of a world without problems brought on by technology. Every new technology creates almost as many problems that it solves. For most people that statement would suggest that technology is kind of a wash. It&amp;rsquo;s kind of neutral, because if you&amp;rsquo;re creating as many problems as it solves, then it&amp;rsquo;s a 50/50 wash, but the difference in my protopian view versus, say, a neutral view is that all these new technologies bring new possibilities that did not exist before, including the new possibility of doing harm versus good.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I&rsquo;ve followed Kevin Kelly&rsquo;s work for a while, and in my humble opinion he is our foremost apologist for technology. If you want an introduction to his work, <a href="http://edge.org/conversation/the-technium">this Edge interview</a> is a dense yet readable summary.</p>
<blockquote>
  <p>I call myself a protopian, not a utopian. I believe in progress in an incremental way where every year it&rsquo;s better than the year before but not by very much—just a micro amount. I don&rsquo;t believe in utopia where there&rsquo;s any kind of a world without problems brought on by technology. Every new technology creates almost as many problems that it solves. For most people that statement would suggest that technology is kind of a wash. It&rsquo;s kind of neutral, because if you&rsquo;re creating as many problems as it solves, then it&rsquo;s a 50/50 wash, but the difference in my protopian view versus, say, a neutral view is that all these new technologies bring new possibilities that did not exist before, including the new possibility of doing harm versus good.</p>
</blockquote>
]]></content:encoded>
    </item>
    
    <item>
      <title>Hand-drawn maps</title>
      <link>http://vivekhaldar.com/articles/handdrawn-maps/</link>
      <pubDate>Tue, 18 Feb 2014 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/handdrawn-maps/</guid>
      <description>&lt;p&gt;Many years ago, before I had a GPS-enabled smartphone with maps, we went on a roadtrip along the coast of Maine, stopping at nearly a dozen &lt;a href=&#34;https://maps.google.com/maps/ms?ie=UTF8&amp;amp;hl=en&amp;amp;msa=0&amp;amp;msid=115131657453505441948.0004589bab77a630b49cc&amp;amp;ll=44.386692,-68.873291&amp;amp;spn=4.365231,7.305908&amp;amp;t=p&amp;amp;z=7&amp;amp;dg=feature&#34;&gt;lighthouses&lt;/a&gt;. When I look back, I myself am surprised that I was able to pull that off without clutching my phone the whole way. But it was a memorable roadtrip. We saw all the lighthouses we wanted to see, and got a glorious experience of the Maine coast.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Many years ago, before I had a GPS-enabled smartphone with maps, we went on a roadtrip along the coast of Maine, stopping at nearly a dozen <a href="https://maps.google.com/maps/ms?ie=UTF8&amp;hl=en&amp;msa=0&amp;msid=115131657453505441948.0004589bab77a630b49cc&amp;ll=44.386692,-68.873291&amp;spn=4.365231,7.305908&amp;t=p&amp;z=7&amp;dg=feature">lighthouses</a>. When I look back, I myself am surprised that I was able to pull that off without clutching my phone the whole way. But it was a memorable roadtrip. We saw all the lighthouses we wanted to see, and got a glorious experience of the Maine coast.</p>
<p>How did I navigate? In the days (weeks?) before the trip, I drew maps on paper of our entire route, with all the places we wanted to see. I used Google Maps as the source. It was probably tens of pages of hand-drawn maps. It was tedious, but it did have advantages:</p>
<ul><li>I omitted unnecessary details. Just the streets I was going to be on.</li>
<li>I highlighted relevant details: landmarks, distances.</li>
<li>The canvas was large: letter paper.</li>
<li><a href="http://well.blogs.nytimes.com/2010/02/18/how-vacations-affect-your-happiness/">Preparing the maps and planning the trip was fun</a>.</li>
</ul><p>I wish I had saved that paper, because it would be a memento as evocative as the pictures from that trip.</p>
<p>(In 2001, <a href="http://graphics.stanford.edu/papers/routemaps/">LineDrive</a> tried to address some of these issues by automatically generating driving directions in a style similar to hand-drawn maps.)</p>
<p>I tell you this story not to reminisce about my travels (well, maybe a little bit) but to point out that analog artifacts still have <a href="http://en.wikipedia.org/wiki/Affordance">affordances</a> that give them advantages over digital devices. Even today, for complex multi-hop trips I prefer to hand-draw maps on paper.</p>
<p>I want my digital interfaces to be more organic and analog, and my analog experiences to make it into my digital corpus effortlessly.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Star Trek vs Babylon 5</title>
      <link>http://vivekhaldar.com/articles/star-trek-vs-babylon-5/</link>
      <pubDate>Thu, 23 Jan 2014 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/star-trek-vs-babylon-5/</guid>
      <description>&lt;p&gt;Star Trek and Babylon 5 are two space operas that offer very different views of humans, technology and the relationship between them. That one is hugely popular, has entire conventions dedicated to it, still gets reruns and has spilled over into popular culture beyond just geek circles, while the other is likely to draw blank stares when one mentions it says a lot.&lt;/p&gt;
&lt;p&gt;Star Trek is an expression of the idea that &lt;em&gt;technology cleanses people&lt;/em&gt;.  It is technology manifested outwards to people and society. And technology is clean and rational.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Star Trek and Babylon 5 are two space operas that offer very different views of humans, technology and the relationship between them. That one is hugely popular, has entire conventions dedicated to it, still gets reruns and has spilled over into popular culture beyond just geek circles, while the other is likely to draw blank stares when one mentions it says a lot.</p>
<p>Star Trek is an expression of the idea that <em>technology cleanses people</em>.  It is technology manifested outwards to people and society. And technology is clean and rational.</p>
<p>Star Trek depicts a clean world. Not just physically clean, but also emotionally and socially clean. There are no politics. (Did Picard ever have to contend for limited resources with other Star Fleet captains?) There is no heartbreak or jealousy. There is no class. There are no vices, no addictions, no crime. The Enterprise does not have a dark, seedy corner. There is no soul-searching. It’s telling that the non-human Data is often the most reflective character. Good and evil are clear. Star Fleet and everyone it in is good. All problems and all evil comes from the outside (Q, the Borg, other civilizations etc etc).</p>
<p>Babylon 5 is an expression of the idea that <em>human nature is independent of technology</em>. It is technology as one part of people and society. And people are messy and irrational.</p>
<p>Babylon 5 depicts a world of humans with all their failings. In it, technology has brought us far into space, but we are all still humans. Life is still messy and unpredictable and hard. Politics, within the humans, and among the space-faring races, is central. Society is stratified. There are haves and have-nots. It is not always clear which side is “right”. People experience joy, sorrow, heartbreak and the full range of human emotions. They battle demons and addictions.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Fat Client, Thin Client</title>
      <link>http://vivekhaldar.com/articles/fat-client-thin-client/</link>
      <pubDate>Mon, 20 Jan 2014 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/fat-client-thin-client/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://stratechery.com/2014/battle-box/&#34;&gt;Ben Thompson’s latest post&lt;/a&gt; is about Dropbox, Box and focusing on consumers vs enterprise as customers. I don’t have anything to say about that. I do, however, want to talk about his opening paragraphs:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;The problem with the old thin client model was the assumption that processing power was scarce. In fact, Moore’s Law and the rise of ARM has made the exact opposite the case – processing is abundant&amp;hellip;
  &amp;hellip;Thus, over the last few years as the number of fat clients has multiplied – phones, tablets, along with traditional computers – the idea of a thin client with processing on the server seems positively quaint; however, in the context of our data, that is the exact model more and more of us are using: centralized data easily accessible to multiple “fat” devices distinguished by their user experience.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://stratechery.com/2014/battle-box/">Ben Thompson’s latest post</a> is about Dropbox, Box and focusing on consumers vs enterprise as customers. I don’t have anything to say about that. I do, however, want to talk about his opening paragraphs:</p>
<blockquote>
  <p>The problem with the old thin client model was the assumption that processing power was scarce. In fact, Moore’s Law and the rise of ARM has made the exact opposite the case – processing is abundant&hellip;
  &hellip;Thus, over the last few years as the number of fat clients has multiplied – phones, tablets, along with traditional computers – the idea of a thin client with processing on the server seems positively quaint; however, in the context of our data, that is the exact model more and more of us are using: centralized data easily accessible to multiple “fat” devices distinguished by their user experience.</p>
</blockquote>
<p>Calling today’s phones and tablets “fat” is, I think, quaint. It is an easy trap to fall into. They are many orders of magnitude more powerful than those a decade ago. If the Palm Pilot was a thin client, certainly a modern iPhone cannot also be called “thin”.</p>
<p>But the thin client computing model was never about the <em>absolute</em> processing power, or lack thereof, of the clients. The crucial factor was the <em>relative</em> difference in processing power and storage between the client and the server. No matter how powerful the device we’re holding in our hands is, the <a href="http://research.google.com/pubs/pub35290.html">warehouse-scale computer</a> on which it depends is many, many more times more powerful. And without knowing what datacenters two decades ago looked like, I think it’s safe to say that the server/client power ratio has only increased over time, and is likely to continue increasing.</p>
<p>A smartphone or tablet’s impressive computing power goes largely into pushing pixels around, and giving us a great experience by responding quickly. It would be useless without all the backend services (app stores, cloud storage, social networks… the list is endless) it derives its usefulness from. A phone or tablet without net connectivity if pretty much a brick. And so, by definition, it <a href="http://en.wikipedia.org/wiki/Thin_client">“depends heavily on some other computer (its server) to fulfill its computational roles”</a>.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>The Contours of My Attention</title>
      <link>http://vivekhaldar.com/articles/the-contours-of-my-attention/</link>
      <pubDate>Sun, 19 Jan 2014 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-contours-of-my-attention/</guid>
      <description>&lt;p&gt;Lately I’ve felt lost when in front of the computer. I feel like every time I turn to the screen, I&amp;rsquo;m at the bottom of a deep ravine and the sky is blocked off but for a thin strip between its high walls. I have to claw my way back to the top to see the lay of the land, and where I am located on it.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../media/73918206153_0.png&#34; alt=&#34;&#34;/&gt;&lt;/p&gt;
&lt;p&gt;What was I doing? What do I need to do next? These are the most important questions when I&amp;rsquo;m working. And modern interfaces make it easy to lose track of them when I&amp;rsquo;m in the thick of it, and downright hard to answer them when I try to come back after a break, or an interruption.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Lately I’ve felt lost when in front of the computer. I feel like every time I turn to the screen, I&rsquo;m at the bottom of a deep ravine and the sky is blocked off but for a thin strip between its high walls. I have to claw my way back to the top to see the lay of the land, and where I am located on it.</p>
<p><img src="../../media/73918206153_0.png" alt=""/></p>
<p>What was I doing? What do I need to do next? These are the most important questions when I&rsquo;m working. And modern interfaces make it easy to lose track of them when I&rsquo;m in the thick of it, and downright hard to answer them when I try to come back after a break, or an interruption.</p>
<p>The contours of my attention are varied and varying. They have peaks and valleys and plateaus. They are changing, rising and falling. Some things are central, some peripheral. Some things are important, some urgent, and some whimsical. Some peripheral things might be important. Some whimsical things might become central.</p>
<p>The modern UI does not know about the contours of my attention. It is a vast plain, with no distinguishing marks.</p>
<p>(Note that this is a different problem than that of being distracted, and being on a device where distraction is so easy. Not that I don&rsquo;t suffer from that problem too but that&rsquo;s a whole different story.)</p>
<p>I&rsquo;ve taken to going analog. Writing things down. I got a couple of nice fountain pens that lightly tickle my nostalgia bone and that make me enjoy the sensual pleasure of putting wet ink on smooth paper. Underlines. Doodles. Boxes. Large writing. Small writing. They all tell a story. They all anchor thought, and recollect it.</p>
<p>Rather than the keyboard driving, I let the paper drive. I write tasks and designs and box and arrow diagrams. Then I go do one little thing on the computer. Then I come back to the paper. And so on. This is very similar to the idea of having <a href="http://www.johndcook.com/blog/2012/03/13/digital-desk-analog-desk/">an analog desk and a digital desk</a>.</p>
<p>This is the next challenge in designing UIs: making them recognize and adjust to the contours of my attention.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Go lang</title>
      <link>http://vivekhaldar.com/articles/go-lang/</link>
      <pubDate>Sat, 11 Jan 2014 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/go-lang/</guid>
      <description>&lt;p&gt;So I finally got to use Go at work, which was a great excuse to learn the language. Here are some newbie impressions after all of three weeks with it.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href=&#34;http://golang.org&#34;&gt;the documentation&lt;/a&gt; is fantastic. Having a tutorial where one can execute (and edit!) the examples on the webpage itself really helps.&lt;/li&gt;
&lt;li&gt;the syntax favors terseness. It is a relief after the chattering verboseness of something like Java. Types don&amp;rsquo;t need to be always declared and are inferred wherever possible. There are a few quirky choices: I didn&amp;rsquo;t think I&amp;rsquo;d see &amp;ldquo;:=&amp;rdquo; after I moved on from Pascal. And the biggest breakthrough of all: the automatic formatter &amp;ldquo;gofmt&amp;rdquo; saves Go programmers quintillions of hours in avoided debates about formatting style and micro-futzing with spacing in the editor.&lt;/li&gt;
&lt;li&gt;concurrency is part of the language in the form of channels and goroutines. About time too, since we&amp;rsquo;re in the 21st century and &lt;a href=&#34;http://www.hpl.hp.com/techreports/2004/HPL-2004-209.pdf&#34;&gt;threads cannot be implemented as a library&lt;/a&gt;(or at least, it&amp;rsquo;s always clunky when they are).&lt;/li&gt;
&lt;li&gt;like Python, the cognitive size of the language is small enough to fit in one brain without constantly thrashing out. I write Go in an editor (Emacs), not an IDE, and that works just fine. With Java there was a heavy productivity hit to opting out of something like Eclipse and auto-complete. I felt like the IDE was an earth mover for code.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;If one is writing a new system (especially a backend) from scratch that doesn&amp;rsquo;t have to call existing C++ or Java code (or only calls them via RPC), then Go is a pretty compelling option right now. That is great after a decade of no other viable options.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>So I finally got to use Go at work, which was a great excuse to learn the language. Here are some newbie impressions after all of three weeks with it.</p>
<ul><li><a href="http://golang.org">the documentation</a> is fantastic. Having a tutorial where one can execute (and edit!) the examples on the webpage itself really helps.</li>
<li>the syntax favors terseness. It is a relief after the chattering verboseness of something like Java. Types don&rsquo;t need to be always declared and are inferred wherever possible. There are a few quirky choices: I didn&rsquo;t think I&rsquo;d see &ldquo;:=&rdquo; after I moved on from Pascal. And the biggest breakthrough of all: the automatic formatter &ldquo;gofmt&rdquo; saves Go programmers quintillions of hours in avoided debates about formatting style and micro-futzing with spacing in the editor.</li>
<li>concurrency is part of the language in the form of channels and goroutines. About time too, since we&rsquo;re in the 21st century and <a href="http://www.hpl.hp.com/techreports/2004/HPL-2004-209.pdf">threads cannot be implemented as a library</a>(or at least, it&rsquo;s always clunky when they are).</li>
<li>like Python, the cognitive size of the language is small enough to fit in one brain without constantly thrashing out. I write Go in an editor (Emacs), not an IDE, and that works just fine. With Java there was a heavy productivity hit to opting out of something like Eclipse and auto-complete. I felt like the IDE was an earth mover for code.</li>
</ul><p>If one is writing a new system (especially a backend) from scratch that doesn&rsquo;t have to call existing C++ or Java code (or only calls them via RPC), then Go is a pretty compelling option right now. That is great after a decade of no other viable options.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>The Human Resolution Threshold</title>
      <link>http://vivekhaldar.com/articles/the-human-resolution-threshold/</link>
      <pubDate>Wed, 08 Jan 2014 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-human-resolution-threshold/</guid>
      <description>&lt;p&gt;CES is upon us. &lt;a href=&#34;http://www.theverge.com/2014/1/7/5285692/ces-supercuts-major-events-in-five-minutes-or-less&#34;&gt;And it is CEO after CEO blasting us with specs, specs, more specs, better specs, larger specs.&lt;/a&gt; More GB. More pixels. More more more!&lt;/p&gt;
&lt;p&gt;I never thought I’d say this, but its exhausting. Even worse, it’s boring.&lt;/p&gt;
&lt;p&gt;Seeing as I make my living in the field, this conundrum spurred some soul-searching in me. I don’t want to be the software engineer who bitches and moans about tech.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>CES is upon us. <a href="http://www.theverge.com/2014/1/7/5285692/ces-supercuts-major-events-in-five-minutes-or-less">And it is CEO after CEO blasting us with specs, specs, more specs, better specs, larger specs.</a> More GB. More pixels. More more more!</p>
<p>I never thought I’d say this, but its exhausting. Even worse, it’s boring.</p>
<p>Seeing as I make my living in the field, this conundrum spurred some soul-searching in me. I don’t want to be the software engineer who bitches and moans about tech.</p>
<p>My first computer had a monochrome (green!) monitor with a resolution of <a href="http://en.wikipedia.org/wiki/Hercules_Graphics_Card">720x348</a> pixels. Moving up to <a href="http://en.wikipedia.org/wiki/Color_Graphics_Adapter">4-bit color</a> was a <em>huge</em> step up. Fast forward to today, with millions of colors and resolution indistinguishable from natural surfaces, what remains for flat displays to accomplish? The next interesting thing to do is take displays to places they haven’t been to yet, like inside your eyes.</p>
<p>Once displays crossed the threshold of human resolution, they were essentially “done”.</p>
<p><img src="../../media/72746706892_0.jpg" alt=""/></p>
<p>Something similar has now happened with computers. For the vast majority of users, specs like amount of RAM and CPU speed simply don’t matter any more. At some level, even individual computers don’t matter any more. What’s more interesting is what you can build with <a href="http://research.google.com/pubs/pub35290.html">giant warehouses full of them</a>. Capabilities like Google Now and Siri (powered by warehouse computers) have pushed what we can do with phones more than a faster SnapDragon processor.</p>
<p>And that’s the source of my ennui with CES. A lot of what they’re showing is pushing past the human resolution threshold. More of more. We need to go to new places, even if it is with less.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>The Distraction Addiction</title>
      <link>http://vivekhaldar.com/articles/the-distraction-addiction/</link>
      <pubDate>Wed, 01 Jan 2014 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-distraction-addiction/</guid>
      <description>&lt;p&gt;I recently finished reading &lt;a href=&#34;http://www.amazon.com/Distraction-Addiction-Information-Communication-Colleagues/dp/0316208264/&#34;&gt;&amp;ldquo;The Distraction Addiction&amp;rdquo;&lt;/a&gt; by &lt;a href=&#34;http://contemplativecomputing.org&#34;&gt;Alex Soojung-Kim Pang&lt;/a&gt;. It&amp;rsquo;s a comprehensive look at both the technology and human sides of why our devices and how we use them make us so scatterbrained. The refreshing angle is the even-handed focus on how to use both technology (better software and tools) and ourselves (being more mindful, cultivating better tech habits). The chapter on mindfulness and meditation gave me a perspective on it I hadn&amp;rsquo;t read before. He ended the book with eight principles, not tools and toys, for getting a better grip on our minds and our devices. Had me nodding my head in agreement throughout. Overall a good read, with tons of examples and perspectives from folks he spoke with.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I recently finished reading <a href="http://www.amazon.com/Distraction-Addiction-Information-Communication-Colleagues/dp/0316208264/">&ldquo;The Distraction Addiction&rdquo;</a> by <a href="http://contemplativecomputing.org">Alex Soojung-Kim Pang</a>. It&rsquo;s a comprehensive look at both the technology and human sides of why our devices and how we use them make us so scatterbrained. The refreshing angle is the even-handed focus on how to use both technology (better software and tools) and ourselves (being more mindful, cultivating better tech habits). The chapter on mindfulness and meditation gave me a perspective on it I hadn&rsquo;t read before. He ended the book with eight principles, not tools and toys, for getting a better grip on our minds and our devices. Had me nodding my head in agreement throughout. Overall a good read, with tons of examples and perspectives from folks he spoke with.</p>
<p>If anything, I think he oversold parts of it, but that&rsquo;s probably because someone who hangs out in my corner of the internet already knows that yes, we obsessively and compulsively use our connected devices, and yes, it hurts our focus and even our relationships, and yes, there are tools like Freedom and WriteRoom that claim to help.</p>
<p>I also wish he had delved a bit more into a word from the title of the book: addiction. About how we use our devices and connections in addictive ways, with no tangible benefit. About how, just like addiction to other substances, one needs to come face-to-face with the empty void that&rsquo;s sucking them in before they come to their senses. How is a compulsive itch to swipe-to-unlock your phone different from a yearning for a shot of cocaine? You would&rsquo;d sneak out a flask of whiskey from your jacket and take a swig in the middle of a meeting, but it&rsquo;s completey acceptable to peek at your cellphone.</p>
<p>Reading the book reminded me and made me go back and read this <a href="http://www.ubiq.com/hypertext/weiser/acmfuture2endnote.htm">manifesto for calm computing, written back in 1996</a>. (At the risk of sounding pedantic, I&rsquo;ll say that was a glaring omission from Pang&rsquo;s citations). In it, the authors foresee our current crisis of attention, more than a full decade before the onslaught of net-connected smartphones. And they correctly identify the need for technologies that, as they say, &ldquo;both encalm and inform.&rdquo; The central principle they identify is that our interfaces need to show us both a center and its periphery, and appropriately move items between them. That&rsquo;s what makes it not overwhelming when we perceive the natural world, or when we walk down a busy city street. Things naturally flow from the periphery to the center of our attention and back. Indeed, I know of no modern prevalent UI that does this, nearly two decades after the authors wrote this. Modern UIs are what I like to call <em>attention-flat</em>: everything is arranged on the screen either in a way that pulls attention equally (many windows visible) or in a way that completely obscures the periphery (one window maximized, hiding all others).</p>
<p>That makes me think there&rsquo;s much more we can do on the technology front, particulary with UIs, to tackle the issue.</p>
<p>Great read. Recommended.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Best of 2013</title>
      <link>http://vivekhaldar.com/articles/best-of-2013/</link>
      <pubDate>Mon, 30 Dec 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/best-of-2013/</guid>
      <description>&lt;p&gt;Here are the most popular posts of 2013. I thank you all for reading. Have a great 2014!&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href=&#34;http://blog.vivekhaldar.com/post/42007984829/computer-science-phd-trends&#34;&gt;Computer Science PhD treands&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.vivekhaldar.com/post/54192213683/the-laziness-of-synchronous-work&#34;&gt;The laziness of synchronous work&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.vivekhaldar.com/post/29296581613/what-is-life-like-for-phds-in-computer-science-who-go&#34;&gt;What is life like for PhDs in Computer Science who go into industry?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.vivekhaldar.com/post/56972066006/empirical-analysis-of-programming-language-adoption&#34;&gt;Empirical analysis of programming language adoption&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.vivekhaldar.com/post/49821678549/future-programming&#34;&gt;Future programming&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;This was also the year I started a &lt;a href=&#34;http://blog.vivekhaldar.com/post/62065180139/why-you-should-subscribe-to-my-newsletter&#34;&gt;newsletter&lt;/a&gt; where I send out occasional tidbits of raw thought not ready for posting yet.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Here are the most popular posts of 2013. I thank you all for reading. Have a great 2014!</p>
<ul><li><a href="http://blog.vivekhaldar.com/post/42007984829/computer-science-phd-trends">Computer Science PhD treands</a></li>
<li><a href="http://blog.vivekhaldar.com/post/54192213683/the-laziness-of-synchronous-work">The laziness of synchronous work</a></li>
<li><a href="http://blog.vivekhaldar.com/post/29296581613/what-is-life-like-for-phds-in-computer-science-who-go">What is life like for PhDs in Computer Science who go into industry?</a></li>
<li><a href="http://blog.vivekhaldar.com/post/56972066006/empirical-analysis-of-programming-language-adoption">Empirical analysis of programming language adoption</a></li>
<li><a href="http://blog.vivekhaldar.com/post/49821678549/future-programming">Future programming</a></li>
</ul><p>This was also the year I started a <a href="http://blog.vivekhaldar.com/post/62065180139/why-you-should-subscribe-to-my-newsletter">newsletter</a> where I send out occasional tidbits of raw thought not ready for posting yet.</p>
<p>Every blogger has posts where they bleed, but that don&rsquo;t get enough hits. Mine were:</p>
<ul><li><a href="http://blog.vivekhaldar.com/post/42828214104/productivity-isnt">Some of my peeves with the idea of &ldquo;productivity.&rdquo;</a></li>
<li><a href="http://blog.vivekhaldar.com/post/56222096673/the-perils-of-being-a-knowledge-worker">My insecurities about my job being automated away</a></li>
<li><a href="http://blog.vivekhaldar.com/post/55117706302/balance">The Hydra problem of balancing &ldquo;life&rdquo; and &ldquo;work&rdquo;</a></li>
<li><a href="http://blog.vivekhaldar.com/post/59591341869/talented-beast">Startups aren&rsquo;t all they&rsquo;re cranked up to be: says the comfortable corporate citizen</a></li>
<li><a href="http://blog.vivekhaldar.com/post/69861267837/generation-ad">On being torn between the digital and the analog</a></li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Generation AD</title>
      <link>http://vivekhaldar.com/articles/generation-ad/</link>
      <pubDate>Thu, 12 Dec 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/generation-ad/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://en.wikipedia.org/wiki/Millennials&#34;&gt;Millennials were born from early 1980s to the early 2000s&lt;/a&gt;.  The generation before that, &lt;a href=&#34;http://en.wikipedia.org/wiki/Generation_X&#34;&gt;Generation X, consists of people born from early 1960s to the early 1980s&lt;/a&gt;. Notice the fuzzy boundaries. I was born right between them.&lt;/p&gt;
&lt;p&gt;There is endless debate about the characteristics of each generation, but how can one assign characteristics to something as broad as an entire set of humans born in three designated decades? But one can at least try to assign characteristics to &lt;em&gt;their times&lt;/em&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://en.wikipedia.org/wiki/Millennials">Millennials were born from early 1980s to the early 2000s</a>.  The generation before that, <a href="http://en.wikipedia.org/wiki/Generation_X">Generation X, consists of people born from early 1960s to the early 1980s</a>. Notice the fuzzy boundaries. I was born right between them.</p>
<p>There is endless debate about the characteristics of each generation, but how can one assign characteristics to something as broad as an entire set of humans born in three designated decades? But one can at least try to assign characteristics to <em>their times</em>.</p>
<p>I feel like part of neither Gen X nor the <a href="http://en.wikipedia.org/wiki/Millennials">millennials</a>. Gen X feels too old, more like my parents’ generation. And most millennials feel too young.</p>
<p>I feel like part of the analog-digital generation. I’m calling it Generation AD. The generation before was firmly analog. The generation after are digital natives. Generation AD is the confused one in the middle.</p>
<p>I define Generation AD to consist of those who spent their early youth (approximately up to high school) living a largely analog lifestyle, and transitioned to a largely digital one thereafter.</p>
<p>The internet had not caught on when they were young. There wasn’t a cellphone in everyone’s hands. No screens in the classroom! They had to call their friends on landline phones, make concrete plans about when and where to meet, and then go there. They learned cursive handwriting in school. They were taught that penmanship was important.</p>
<p>And then, by the time they were in their late teens and early twenties, a giant switch got flipped in the span of a few years. The internet exploded. Mobile devices proliferated. Digital took over. Typing replace handwriting. Cellphones meant everything could be planned in real time and nothing needed to be planned of ahead of time.</p>
<p>Generation AD deeply understands the advantages of being cleanly digital, and yet feels a nostalgic pull to analog things like pens and paper. This results in Frankenstein workflows like making heavy use of notebooks… and then scanning them for posterity. Bits, after all, are much lighter than atoms, and moving a hard disk is much easier than lugging boxes of notebooks.</p>
<p>Generation AD is the last and only one familiar enough with both sides of the digital/analog divide to truly reason about each. Gen X is analog at heart and puts up with digital life mostly because it has to. Millennials skipped analog altogether. Neither are in a position to produce nuanced critiques of our digital lifestyles. Only Gen AD knows which nooks and crannies analog fills better, and hence truly appreciates those where going digital has more impact. Gen AD consists of people who remember concepts or quotes from books spatially (“it was on the top of the left page, somewhere near the middle of the book”), but who will gladly ditch the dead-tree version and sling their tablets when they travel.</p>
<p>We will be perpetually stuck in the middle.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>To tool or not to tool?</title>
      <link>http://vivekhaldar.com/articles/to-tool-or-not-to-tool/</link>
      <pubDate>Tue, 10 Dec 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/to-tool-or-not-to-tool/</guid>
      <description>&lt;p&gt;Cal Newport, &lt;a href=&#34;http://blog.vivekhaldar.com/post/40460692580/so-good-they-cant-ignore-you-review&#34;&gt;an author and blogger for whom I have great respect&lt;/a&gt;, recently wrote about &lt;a href=&#34;http://calnewport.com/blog/2013/09/18/why-i-never-joined-facebook/&#34;&gt;how he allows new technological tools into his life&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;in an age of personal technological revolution, we all need a more explicit philosophy for adopting tools. Without this clarity, we run the risk of drowning in a sea of distracting apps and shiny web sites. My philosophy — to only adopt tools that solve a major pre-existing problem — has served me well. I use e-mail, for example, because the ability to communicate asynchronously with people around the world is quite important for my work. E-mail solves this problem. I don’t use Twitter, however, because the ability to have short, casual interactions with many people I don’t know well is not that important to my work.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Cal Newport, <a href="http://blog.vivekhaldar.com/post/40460692580/so-good-they-cant-ignore-you-review">an author and blogger for whom I have great respect</a>, recently wrote about <a href="http://calnewport.com/blog/2013/09/18/why-i-never-joined-facebook/">how he allows new technological tools into his life</a>:</p>
<blockquote>
  <p>in an age of personal technological revolution, we all need a more explicit philosophy for adopting tools. Without this clarity, we run the risk of drowning in a sea of distracting apps and shiny web sites. My philosophy — to only adopt tools that solve a major pre-existing problem — has served me well. I use e-mail, for example, because the ability to communicate asynchronously with people around the world is quite important for my work. E-mail solves this problem. I don’t use Twitter, however, because the ability to have short, casual interactions with many people I don’t know well is not that important to my work.</p>
</blockquote>
<p><a href="http://calnewport.com/blog/2013/10/03/why-im-still-not-going-to-join-facebook-four-arguments-that-failed-to-convince-me/">He addressed some more arguments in a follow-on post.</a></p>
<p>On the face of it, that’s a reasonable position to take, especially for an academic whose job is to think deep thoughts and solve big problems. But it also strikes me as showing a lack of <em>playfulness</em>, which is important to cultivate, even if only in small doses. It might also miss out on entirely new ways to seed and develop academic ideas.</p>
<p>Take, for example, <a href="http://blogs.lse.ac.uk/impactofsocialsciences/2013/09/25/how-to-be-a-scholar-daniels/">this account of how an idea started with a tweet and ended up becoming a full journal paper</a>:</p>
<blockquote>
  <p>My experience with the germ of an idea shared as a Tweet at an academic conference that became a blog post, then a series of blog posts, and (eventually) a peer-reviewed article is just one example of the changing nature of scholarship.  From where I sit, being a scholar now involves creating knowledge in ways that are more open, more fluid, and more easily read by wider audience.</p>
</blockquote>
<p>Newport is making a stand for the lone academic solving problems all by himself, and one who is hence fiercely protective of his solitary time. But the <a href="http://blog.vivekhaldar.com/post/18541470199/team-science">era of the groundbreaking single-author paper (or any type of single-author paper) is long over, and science currently is advanced by vast teams.</a></p>
<p><a href="http://kk.org/thetechnium/archives/2009/02/amish_hackers_a.php">Kevin Kelly talks about how even the Amish, famous for being luddites, have a process for evaluating and adopting new technologies</a>:</p>
<blockquote>
  <p>The Amish have the undeserved reputation of being luddites, of people who refuse to employ new technology. It&rsquo;s well known the strictest of them don&rsquo;t use electricity, or automobiles, but rather farm with manual tools and ride in a horse and buggy.  In any debate about the merits of embracing new technology, the Amish stand out as offering an honorable alternative of refusal. Yet Amish lives are anything but anti-technological. In fact on my several visits with them, I have found them to be ingenious hackers and tinkers, the ultimate makers and do-it-yourselfers and surprisingly pro technology.</p>
  <p>Ten years ago when I was editing Wired I sent Howard Rheingold to investigate the Amish take on cell phones. His report published in January 1999 makes it clear that the Amish had not decided on cell phones yet. Ten years later they are still deciding, still trying it out. This is how the Amish determine whether technology works for them. Rather than employ the precautionary principle, which says, unless you can prove there is no harm, don&rsquo;t use new technology, the Amish rely on the enthusiasm of Amish early adopters to try stuff out until they prove harm.</p>
</blockquote>
<p>We all need a small budget of time for playing and evaluating tools with an open mind. We might discover uses we hadn’t thought of, and solve problems we didn’t know we had.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Automating software engineering</title>
      <link>http://vivekhaldar.com/articles/automating-software-engineering/</link>
      <pubDate>Thu, 14 Nov 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/automating-software-engineering/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.roughtype.com/?p=3984&#34;&gt;Nicholas Carr was kind enough to respond&lt;/a&gt; to &lt;a href=&#34;http://blog.vivekhaldar.com/post/66660163006/sharp-tools-dull-minds&#34;&gt;my post about automation as it applies to software engineers&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;Software writers themselves don’t seem immune from the new de-skilling wave.  His comments point to the essential tension that has always characterized technological de-skilling: the very real benefits of labor-saving technology come at the cost of a loss of human talent. The hard challenge is knowing where to draw the line—or just realizing that there is a line to be drawn.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://www.roughtype.com/?p=3984">Nicholas Carr was kind enough to respond</a> to <a href="http://blog.vivekhaldar.com/post/66660163006/sharp-tools-dull-minds">my post about automation as it applies to software engineers</a>:</p>
<blockquote>
  <p>Software writers themselves don’t seem immune from the new de-skilling wave.  His comments point to the essential tension that has always characterized technological de-skilling: the very real benefits of labor-saving technology come at the cost of a loss of human talent. The hard challenge is knowing where to draw the line—or just realizing that there is a line to be drawn.</p>
</blockquote>
<p>The comment thread on his post has some great discussion. You should go read it. In it, Carr raises two more questions, which I will try to address here.</p>
<p><strong>Climbing to higher levels of abstraction</strong></p>
<blockquote>
  <p>re: “each advance opens up more new opportunities than it removes”
  This is a common defense of automation in pretty much all fields. (See the quote from Alfred North Whitehead in my Atlantic piece.) And it’s a good defense, as it’s very often true. But there are also a couple of counterarguments:</p>
  <p>At some point, as the capabilities of automation software advance, the software aid begins to take over essential tasks – sensing, analysis, diagnosis, judgment making – and the human shifts to more routine functions such as input and monitoring. In other words, with the automation of skilled work there’s a point at which there are no “higher-level tasks” for the human to climb to.</p>
</blockquote>
<p>In the world of software there is always a higher level to climb to. But an individual software engineer has to have both foresight and will to do it.</p>
<p>For example, not so long ago, we were building regular CRUD web applications by hand every time. Soon common patterns emerged, and were codified in web frameworks like Ruby On Rails and Django. The level of abstraction for coding web apps was lifted. The interval of interest is between web apps becoming common but <em>before</em> a large part of the boilerplate was extracted into frameworks. If you were a web app developer during that period, the repetitive nature of coding web apps should have made you feel that a large part of your current job was ripe for automation.</p>
<p>As in every arena where automation takes over, in software engineering too the pattern is familiar: as an activity becomes widespread, the repetitive and “non-thinking” parts of it are recognized and extracted. In the case of industry, they are extracted into a machine or robot. In the case of software, they are extracted into a layer of abstraction or framework. There is an uncanny valley just before that happens when workers get the feeling that they’re just going through the motions.</p>
<p>The alphas are those who extract common repetitiveness into automation. The betas are those who raise their skills to adding value <em>on top</em> of the newly automated tasks. Everyone else gets left behind.</p>
<p><strong>Cutting across layers of abstraction</strong></p>
<blockquote>
  <p>Lower-level tasks may be seen as mere drudge work by the experienced expert, but they can actually be essential to the development of rich expertise by a person learning the trade. Automation can, in other words, benefit the master, but harm the apprentice (as R. Carey suggests in the preceding comment). And in some cases even the master begins to experience skill loss by not practicing the “lower level” tasks. (This has been seen among veteran pilots depending on autopilot systems, for example.)</p>
</blockquote>
<p>I think this is a real danger. Teaching new students high-level languages is great to get them started, but for for true systems-building one needs to understand the whole stack.</p>
<p>The thing about computer science is that <a href="http://www.joelonsoftware.com/articles/LeakyAbstractions.html">all abstractions are leaky</a>. We can’t use our abstractions without understanding their underlying implementation and limits. This happens at every layer. An integer shows its implementation as a 32-bit word on the microprocessor when adding to MAXINT wraps around. A garbage collector in a VM frees us from manual memory management, but shows up when the app experiences unpredictable pauses. Even the CPU, the bedrock abstraction, leaks its implementation details when things like speculative execution and branch prediction affect performance. The examples are endless.</p>
<p>The other thing is: <a href="http://dtrace.org/resources/bmc/systems.pdf">as Bryan Cantrill points out</a>, failing and pathological systems are the ones which truly teach us. They lay bare our tower of abstractions. One has to understand all the layers and their implementations to debug them.</p>
<p>So becoming comfortable and knowledgeable in just one layer is brittle, and that brittleness is exposed the moment one has to solve or debug a significant problem.</p>
<p>For the apprentice, this means learning and working with as many different layers of abstraction as possible. For the more experienced, it means not letting the day-to-day job in one layer make you rusty with the others. These are both challenges.</p>
<p><strong>Peeking into the future of automating software engineering</strong></p>
<p>The peculiar thing about computing and software is that it can recursively coil around to build upon itself. <a href="http://2013.msrconf.org/program.php">Large amounts of code are used as data</a> to gain insight into the process of writing and changing software. Sophisticated algorithms can learn from this code/data to <a href="http://blog.vivekhaldar.com/post/56332595744/patch-generation-is-an-essential-software">automatically generate changes and fix bugs in existing software</a>. And the fledgling field of <a href="http://blog.vivekhaldar.com/post/66972643372/computational-creativity-is-an-emerging-branch-of">computational creativity</a> can ingest the mountains of now digitized human creative output to guide the “creativity” of an algorithm. A paper from the 80s was prescient when it claimed that <a href="http://blog.vivekhaldar.com/post/450355817/software-processes-are-software-too">software processes are software too</a>.</p>
<p>So, more computing power and more sophisticated algorithms and more data allow you to build even more powerful computers and even more sophisticated algorithms. This is unlike physical industry. A tall building doesn’t help in building even taller buildings.</p>
<p>It is in this line of thinking&ndash;connecting the individual programmer to a datacenter’s worth of data, analysis and computational power&ndash;that I think the future of automating the process of writing software lies. My hope is that the combination of human and machine will be more potent than either alone, much like <a href="https://en.wikipedia.org/wiki/Advanced_Chess">advanced chess</a>.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Sharp tools, dull minds</title>
      <link>http://vivekhaldar.com/articles/sharp-tools-dull-minds/</link>
      <pubDate>Sun, 10 Nov 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/sharp-tools-dull-minds/</guid>
      <description>&lt;p&gt;What keeps me coming back to the &lt;a href=&#34;http://roughtype.com&#34;&gt;writing of Nicholas Carr&lt;/a&gt; is that he splits me in two, violently agreeing and disagreeing at the same time. And then I have to step back and tell myself, “don’t rush to agree or disagree, just try to understand what he’s saying.” He has rapidly become one of the most thoughtful and balanced critics of our current digital age.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://www.theatlantic.com/magazine/archive/2013/11/the-great-forgetting/309516/&#34;&gt;His latest piece in The Atlantic talks about the perils of automation, and what it means for human capabilities and skill&lt;/a&gt;:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>What keeps me coming back to the <a href="http://roughtype.com">writing of Nicholas Carr</a> is that he splits me in two, violently agreeing and disagreeing at the same time. And then I have to step back and tell myself, “don’t rush to agree or disagree, just try to understand what he’s saying.” He has rapidly become one of the most thoughtful and balanced critics of our current digital age.</p>
<p><a href="http://www.theatlantic.com/magazine/archive/2013/11/the-great-forgetting/309516/">His latest piece in The Atlantic talks about the perils of automation, and what it means for human capabilities and skill</a>:</p>
<blockquote>
  <p>Psychologists have found that when we work with computers, we often fall victim to two cognitive ailments—complacency and bias—that can undercut our performance and lead to mistakes. Automation complacency occurs when a computer lulls us into a false sense of security. Confident that the machine will work flawlessly and handle any problem that crops up, we allow our attention to drift. We become disengaged from our work, and our awareness of what’s going on around us fades. Automation bias occurs when we place too much faith in the accuracy of the information coming through our monitors. Our trust in the software becomes so strong that we ignore or discount other information sources, including our own eyes and ears. When a computer provides incorrect or insufficient data, we remain oblivious to the error.</p>
</blockquote>
<p>How automation is creeping higher up the labor stack to so-called white-collar knowledge jobs, especially programming, <a href="http://blog.vivekhaldar.com/post/8950163616/gui-vs-cli-operation-vs-expression">has been</a> <a href="http://blog.vivekhaldar.com/post/450355817/software-processes-are-software-too">on my</a> <a href="http://blog.vivekhaldar.com/post/56222096673/the-perils-of-being-a-knowledge-worker">mind for a</a> <a href="http://blog.vivekhaldar.com/post/3339907908">while</a>. Modern IDEs are getting “helpful” enough that at times I feel like an IDE operator rather than a programmer. They have support for advanced refactoring. Linters can now tell you about design issues and code smells. The behavior all these tools encourage is not “think deeply about your code and write it carefully”, but “just write a crappy first draft of your code, and then the tools will tell you not just what’s wrong with it, but also how to make it better.”</p>
<p>I’ve been on both sides. There are times when I fire up Eclipse just so that I can auto-complete my way to put out some code <em>now</em>. There are other times when I stare at the stark screen of a text editor (<em>not</em> IDE), the blinking cursor accosting me: “what the hell are you going to do now without all your fancy crutches?” But after the initial stab of fear and helplessness, I revel in the freedom of it, and savor the delicious rebellion of writing code without an IDE nagging me with suggestions and hints and corrections at every damn keypress like a 21st century Clippy from a horror movie.</p>
<p>Am I arguing for primitive tools? No. What I’ve described in the previous paragraph are my <em>personal feelings</em> while writing code. The tools (at least, the good ones) encode the knowledge and hard-won lessons of an entire army of programmers. They often point me to issues I’m blind to while writing code because I’m in such a rush to <em>just make the damn thing work.</em> In aggregate, they lead to a cleaner codebase.</p>
<p>So what am I saying then? I’m saying that we should let the tools help us <em>without</em> becoming crutches, to let us write sharp code <em>without</em> dulling our minds. That sounds paradoxical. It is a subtle mental stance one takes towards one’s work, tools, and output.</p>
<p>The most guru programmers I’ve seen have this paradoxical zen-like stance: they use the tools to the full extent possible (because, well, that’s what they’re there for), but understand enough about <em>what those tools do and how they work</em> to be perfectly productive even without them. It reminds me of the concept of <a href="https://en.wikipedia.org/wiki/Moh">moh</a>, and non-attachment, <em>while</em> being an active participant.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Malcolm Gladwell and the narrative fallacy</title>
      <link>http://vivekhaldar.com/articles/malcolm-gladwell-and-the-narrative-fallacy/</link>
      <pubDate>Mon, 04 Nov 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/malcolm-gladwell-and-the-narrative-fallacy/</guid>
      <description>&lt;p&gt;I admire the writing of Malcolm Gladwell because he picks eclectic topics to delve into, peppers his narrative with memorable anecdotes, and weaves it with just enough pop science to make me feel like I’m learning something new, without making it heavy enough to put down the book.&lt;/p&gt;
&lt;p&gt;And when it’s finished, I feel somewhat tricked and uncomfortable. I can’t find one single glaring problem, but the final feeling I’m left with is that there just &lt;em&gt;have&lt;/em&gt; to be a ton of simplifications and glossed-over complexities.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I admire the writing of Malcolm Gladwell because he picks eclectic topics to delve into, peppers his narrative with memorable anecdotes, and weaves it with just enough pop science to make me feel like I’m learning something new, without making it heavy enough to put down the book.</p>
<p>And when it’s finished, I feel somewhat tricked and uncomfortable. I can’t find one single glaring problem, but the final feeling I’m left with is that there just <em>have</em> to be a ton of simplifications and glossed-over complexities.</p>
<p>This is a problem with pop sci (or pop sociology) in general, but particularly with the specific strain as practiced by writers who themselves do not have a technical background.</p>
<p>In a recent <a href="http://longform.org/posts/longform-podcast-62-malcolm-gladwell">Longform podcast</a> (<a href="http://jimromenesko.com/2013/10/01/malcolm-gladwell-i-am-everything-i-once-despised/">transcript</a>) Gladwell says that his central concern is the richness of the story he is telling. He gushes with admiration for Michael Lewis because he can tell a story without citing papers.</p>
<blockquote>
  <p>My great hero as a writer is Michael Lewis. I just think Michael Lewis, believe it or not, is the most underrated writer of my generation. I think he is the one who will be read 50 years from now. And I think what he does is so extraordinary, from a kind of degree of difficulty standpoint. The Big Short is a gripping book, fascinating, utterly gripping book about derivatives. It blows me away how insanely hard that book was to do, and it’s brilliant. The Blind Side, I think, it might be the most perfect book I’ve read in 25 years. I don’t think there’s a single word in that that I would change. I just think it has everything. But he uses no science, right? Very little.
  It’s all story. But he does more work in his stories, makes much more profound points than I do by dragging in all these sociologists and psychologists. He’s proved to me that, if you can tell a story properly, you don’t need this kind of scaffolding. You can just tell the story. And so, I’ve been trying, not entirely successfully, but trying to move in that direction over the last couple books.</p>
</blockquote>
<p>That’s the classic <a href="http://wiki.lesswrong.com/wiki/Narrative_fallacy">narrative fallacy</a>&ndash;seeing a connecting narrative where none exists.</p>
<p>As I’ve said before, <a href="http://blog.vivekhaldar.com/post/4112670117/the-shy-scientist">researchers and scientists themselves are too shy to write in this manner</a>, but</p>
<blockquote>
  <p>Authors want to believe. They want to find the parts of a dense technical paper that help them build a colorful story and support a somewhat related generalization.</p>
</blockquote>
<p>I’d like to think that I can understand something by reading summaries of it or narratives about it, but time and I again I keep realizing that there is no substitute for the original source material.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>The 1964 origins of responsive design</title>
      <link>http://vivekhaldar.com/articles/the-1964-origins-of-responsive-design/</link>
      <pubDate>Sat, 02 Nov 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-1964-origins-of-responsive-design/</guid>
      <description>&lt;p&gt;The book &lt;a href=&#34;http://t-y-p-o-g-r-a-p-h-y.org/library.html?id=20&#34;&gt;&lt;em&gt;Designing Programmes&lt;/em&gt;, by Karl Gerstner&lt;/a&gt;, was published in 1964. It lays out many of the same ideas that form the basis for &lt;a href=&#34;http://alistapart.com/article/responsive-web-design/&#34;&gt;responsive design on the web today&lt;/a&gt;. The author talks about how to construct a &lt;em&gt;system&lt;/em&gt; of design that can adapt to different conditions, while retaining its core aesthetic.&lt;/p&gt;
&lt;p&gt;The opening paragraph of the book puts it best:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;Instead of solutions for problems, programmes for solutions&amp;hellip; for no problem is there an absolute solution. Reason: the possibilities cannot be delimited absolutely. There is always a group of solutions, one of which is best under certain conditions.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The book <a href="http://t-y-p-o-g-r-a-p-h-y.org/library.html?id=20"><em>Designing Programmes</em>, by Karl Gerstner</a>, was published in 1964. It lays out many of the same ideas that form the basis for <a href="http://alistapart.com/article/responsive-web-design/">responsive design on the web today</a>. The author talks about how to construct a <em>system</em> of design that can adapt to different conditions, while retaining its core aesthetic.</p>
<p>The opening paragraph of the book puts it best:</p>
<blockquote>
  <p>Instead of solutions for problems, programmes for solutions&hellip; for no problem is there an absolute solution. Reason: the possibilities cannot be delimited absolutely. There is always a group of solutions, one of which is best under certain conditions.</p>
</blockquote>
<p>For example, this logo for a music shop adapts to various paper sizes and layouts, while conveying an identity.</p>
<p><img src="../../media/65861355347_0.jpg" alt=""/></p>
<p>He also talks about how to think of design as choosing points in space of axes, where the axes are things like color, layout, type, size, contrast etc. That was the inspiration for my <a href="http://blog.vivekhaldar.com/post/65417337744/a-tiny-step-towards-automating-web-design">earlier post on automating web design</a>.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>What changed in 1991 in India?</title>
      <link>http://vivekhaldar.com/articles/what-changed-in-1991-in-india/</link>
      <pubDate>Wed, 30 Oct 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/what-changed-in-1991-in-india/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.econtalk.org/archives/2013/08/bhagwati_on_ind.html&#34;&gt;A recent EconTalk podcast&lt;/a&gt; interviewed Jagdish Bhagwati about his new &lt;a href=&#34;http://www.amazon.com/Why-Growth-Matters-Developing-Countries/dp/161039271X/ref=sr_1_1?ie=UTF8&amp;amp;qid=1367451889&amp;amp;sr=8-1&amp;amp;keywords=why+growth+matters&#34;&gt;book&lt;/a&gt; chronicling the economic path of India, particularly since the &lt;a href=&#34;https://en.wikipedia.org/wiki/Economic_liberalisation_in_India&#34;&gt;1991 reforms&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Russ Roberts, the host, asked Bhagwati, “&amp;hellip;What changed in 1991?”, to which he replied:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;&amp;hellip;the Prime Minister himself … said, look, I have lots of my own family abroad, sons and daughters and nephews and nieces, and this is true virtually of everybody in the upper classes in India&amp;ndash;they have family abroad. They keep coming back and saying: How come we have such idiotic policies? With such enormous restrictions on diversification, on capacity expansion, etc., etc., which are driving us into the ground? And so, the diaspora effect is what I call it. A lot of young people coming back said: You really cannot have this. Because India is really losing rapidly its position in the world economy. Because if you are not performing well, nobody is going to pay attention to you. And the second thing I think was that increasing as people went … abroad and they would find that nobody took India seriously. So the Indian politicians and bureaucrats were increasingly running into situations where they were simply disregarded and looked down upon.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://www.econtalk.org/archives/2013/08/bhagwati_on_ind.html">A recent EconTalk podcast</a> interviewed Jagdish Bhagwati about his new <a href="http://www.amazon.com/Why-Growth-Matters-Developing-Countries/dp/161039271X/ref=sr_1_1?ie=UTF8&amp;qid=1367451889&amp;sr=8-1&amp;keywords=why+growth+matters">book</a> chronicling the economic path of India, particularly since the <a href="https://en.wikipedia.org/wiki/Economic_liberalisation_in_India">1991 reforms</a>.</p>
<p>Russ Roberts, the host, asked Bhagwati, “&hellip;What changed in 1991?”, to which he replied:</p>
<blockquote>
  <p>&hellip;the Prime Minister himself … said, look, I have lots of my own family abroad, sons and daughters and nephews and nieces, and this is true virtually of everybody in the upper classes in India&ndash;they have family abroad. They keep coming back and saying: How come we have such idiotic policies? With such enormous restrictions on diversification, on capacity expansion, etc., etc., which are driving us into the ground? And so, the diaspora effect is what I call it. A lot of young people coming back said: You really cannot have this. Because India is really losing rapidly its position in the world economy. Because if you are not performing well, nobody is going to pay attention to you. And the second thing I think was that increasing as people went … abroad and they would find that nobody took India seriously. So the Indian politicians and bureaucrats were increasingly running into situations where they were simply disregarded and looked down upon.</p>
</blockquote>
<p>That might be <em>a</em> factor, but it strikes me as a weak one. The much larger factor was that the Gulf War brought cable TV to India, and with it, the culture and mores of the West. When you go from decades of <em>one</em> state-sponsored TV channel that broadcast eight hours a day to <em>dozens</em> that run 24 hours a day, the impact is enough to move a nation. If you grew up in India during the 90s, there is absolutely no question about the impact of cable TV.  <a href="http://blog.vivekhaldar.com/post/2985760921/how-the-first-gulf-war-brought-modernity-to-india">Like I wrote before</a>:</p>
<blockquote>
  <p>And when we were not watching the military-industrial complex peacocking, we were soaking in its cultural counterpart. Baywatch. MTV. Moonlighting. We didn’t even have to filter the crap. Only the hits were re-broadcast. Suddenly our culture seemed parochial. Suddenly our things seemed archaic, clunky.</p>
</blockquote>
]]></content:encoded>
    </item>
    
    <item>
      <title>(A tiny step towards) Automating Web Design</title>
      <link>http://vivekhaldar.com/articles/a-tiny-step-towards-automating-web-design/</link>
      <pubDate>Tue, 29 Oct 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/a-tiny-step-towards-automating-web-design/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve spent an inordinate amount of time fiddling with the theme and look of this blog, and so I decided to see what happens if I try to automate my experimentation.&lt;/p&gt;
&lt;p&gt;To that end, I cooked up some simple Javascript to &lt;em&gt;randomly&lt;/em&gt; pick style choices from a given range and apply them to a page. The style choices for now are simple: text width and alignment, typefaces for headers and body text, type scale and color pallette.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I&rsquo;ve spent an inordinate amount of time fiddling with the theme and look of this blog, and so I decided to see what happens if I try to automate my experimentation.</p>
<p>To that end, I cooked up some simple Javascript to <em>randomly</em> pick style choices from a given range and apply them to a page. The style choices for now are simple: text width and alignment, typefaces for headers and body text, type scale and color pallette.</p>
<p><a href="https://googledrive.com/host/0B3WXjOnHiSHBbS1QTGcyd0pRWTg/">You can play with the page here</a> (you might have to allow the browser to run the embedded script). Every reload will give you a completely new, randomly generated look.</p>
<p>Yes, there are a few horrible-looking duds, but a surprising fraction of the generated styles don&rsquo;t look half bad, a few even look very good.</p>
<p>One can imagine stretching this in many interesting directions. For example, you could perform sentiment/mood analysis on the body text, and match it with a typeface that has similar characteristics. Of course, there are also the million other CSS variables that I didn&rsquo;t change.</p>
<p><a href="http://blog.vivekhaldar.com/post/56222096673/the-perils-of-being-a-knowledge-worker">I&rsquo;ve argued previously that a lot of what today&rsquo;s creative professionals do is variation within a theme</a>, and that can be easily replaced with an algorithmic system that incorporates enough randomness to make the output look organic. This is another small example along those lines.</p>
<p>Here are some screenshots, starting with the vanilla unstyled page. I used the page from the <a href="http://www.csszengarden.com/">CSS Zen Garden</a>.</p>
<p><img src="../../media/65417337744_0.png" alt=""/></p>
<p><img src="../../media/65417337744_1.png" alt=""/></p>
<p><img src="../../media/65417337744_2.png" alt=""/></p>
<p><img src="../../media/65417337744_3.png" alt=""/></p>
<p><img src="../../media/65417337744_4.png" alt=""/></p>
<p><img src="../../media/65417337744_5.png" alt=""/></p>
<p><img src="../../media/65417337744_6.png" alt=""/></p>
<p><img src="../../media/65417337744_7.png" alt=""/></p>
<p><img src="../../media/65417337744_8.png" alt=""/></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Rules for Computing Happiness</title>
      <link>http://vivekhaldar.com/articles/rules-for-computing-happiness/</link>
      <pubDate>Wed, 23 Oct 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/rules-for-computing-happiness/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://al3x.net/2008/09/08/al3xs-rules-for-computing-happiness.html&#34;&gt;Inspired by Alex Payne’s rules.&lt;/a&gt; This is a distillation of and update to a much longer &lt;a href=&#34;http://blog.vivekhaldar.com/post/23021969189/my-setup&#34;&gt;description of my setup&lt;/a&gt;. This is from the point of view of my personal, not professional, usage.  I want to frame this in terms of general principles, rather than specific prescriptive implementations, which will be different for everyone.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hardware&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;We’re in a transitory period now, which is why there are still people who like to use machines with tons of local storage. That is about to become irrelevant. The datacenter is your compute and storage. The device in your hand (be it a phone, a tablet, or a laptop) is your modern “dumb terminal” with pretty graphics that acts as a conduit to all that data. Local, on-device storage is just a cache.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.vivekhaldar.com/post/8339897599/do-you-have-an-rsi-prevention-plan&#34;&gt;Find a computing setup that does not harm or injure your body&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Data&lt;/strong&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://al3x.net/2008/09/08/al3xs-rules-for-computing-happiness.html">Inspired by Alex Payne’s rules.</a> This is a distillation of and update to a much longer <a href="http://blog.vivekhaldar.com/post/23021969189/my-setup">description of my setup</a>. This is from the point of view of my personal, not professional, usage.  I want to frame this in terms of general principles, rather than specific prescriptive implementations, which will be different for everyone.</p>
<p><strong>Hardware</strong></p>
<ul><li>We’re in a transitory period now, which is why there are still people who like to use machines with tons of local storage. That is about to become irrelevant. The datacenter is your compute and storage. The device in your hand (be it a phone, a tablet, or a laptop) is your modern “dumb terminal” with pretty graphics that acts as a conduit to all that data. Local, on-device storage is just a cache.</li>
<li><a href="http://blog.vivekhaldar.com/post/8339897599/do-you-have-an-rsi-prevention-plan">Find a computing setup that does not harm or injure your body</a>.</li>
</ul><p><strong>Data</strong></p>
<ul><li><em>Treat service providers like banks</em>. When you store your money in a bank rather than under your mattress, you are trusting them, while buying yourself the convenience and flexibility of not lugging around sacks of cash. But there are also a number of safeguards and incentives in place for the banks to keep your money safe and liquid. It is the same with cloud services holding your data. Also, <a href="http://gigaom.com/2013/01/26/the-delusions-that-companies-have-about-the-cloud/">they know this stuff much better than you</a>. Corollary: run from providers that make it hard to get your data out.</li>
<li><a href="http://blog.vivekhaldar.com/post/63421538562/how-will-you-read-your-files-in-a-hundred-years">Data longevity is a hard problem</a>, but you can improve your chances by using plain text as much as possible (preferably in a long-term-friendly encoding like ASCII or UTF-8), and the most-used file formats for images (I think that’s JPEG).</li>
<li><a href="http://blog.vivekhaldar.com/post/52044416254/backup-in-the-age-of-the-cloud">Keep one local backup of all your cloud data</a> for the ultimate apocalypse scenario.</li>
</ul><p><strong>Software</strong></p>
<ul><li>Over the long run, it is your data that matters, not the software. That’s why this goes last. That wedding photograph from 1999 is more important than the image editor you used to touch it up. Pick one for each of your common activities (writing, image management, browsing etc.) and stick with it. Don’t listen to the lifehackers and productivity gurus&ndash;moving to the latest shiny editor will not make your prose better.</li>
<li>Corollary of the above: never use software that locks you into proprietary formats, or if you must, make sure to export your files out to a more portable format. The chance that you will be able to run the same hardware/software/version snowflake in a decade to decode your data is close to zero.</li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Should I do a PhD?</title>
      <link>http://vivekhaldar.com/articles/should-i-do-a-phd/</link>
      <pubDate>Thu, 17 Oct 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/should-i-do-a-phd/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://stiglerdiet.com&#34;&gt;Tim Hopper&lt;/a&gt; recently posted a &lt;a href=&#34;http://stiglerdiet.com/blog/2013/Aug/22/should-i-do-a-phd/&#34;&gt;series&lt;/a&gt; of interviews with folks from both academia and industry, posing this question to them. (I&amp;rsquo;ve &lt;a href=&#34;http://blog.vivekhaldar.com/post/29296581613/wha-is-life-like-for-phds-in-computer-science-who-go&#34;&gt;written&lt;/a&gt; &lt;a href=&#34;http://blog.vivekhaldar.com/post/25136762019/advice-to-prospective-grad-students&#34;&gt;about&lt;/a&gt; &lt;a href=&#34;http://blog.vivekhaldar.com/post/42007984829/computer-science-phd-trends&#34;&gt;the topic&lt;/a&gt; myself.) If you are pondering the question, you could do worse than read the entire series. &lt;a href=&#34;http://stiglerdiet.com/blog/2013/Sep/19/should-i-do-a-phd-laura-mclay/&#34;&gt;1&lt;/a&gt;, &lt;a href=&#34;http://stiglerdiet.com/blog/2013/Sep/17/should-i-do-a-phd-paul-harper/&#34;&gt;2&lt;/a&gt;, &lt;a href=&#34;http://stiglerdiet.com/blog/2013/Sep/05/should-i-do-a-phd-melissa-santos/&#34;&gt;3&lt;/a&gt;, &lt;a href=&#34;http://stiglerdiet.com/blog/2013/Sep/03/should-i-do-a-phd-carl-vogel/&#34;&gt;4&lt;/a&gt;, &lt;a href=&#34;http://stiglerdiet.com/blog/2013/Aug/27/should-i-do-a-phd-eric-jonas/&#34;&gt;5&lt;/a&gt;, &lt;a href=&#34;http://stiglerdiet.com/blog/2013/Aug/25/should-i-do-a-phd-paul-rubin/&#34;&gt;6&lt;/a&gt;, &lt;a href=&#34;http://stiglerdiet.com/blog/2013/Aug/22/should-i-do-a-Ph.D.-john-d-cook/&#34;&gt;7&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The opening question to everyone:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;A 22-year old college student has been accepted to a Ph.D. program in a technical field. He&amp;rsquo;s academically talented, and he&amp;rsquo;s always enjoyed school and his subject matter. His acceptance is accompanied with 5-years of guaranteed funding. He doesn&amp;rsquo;t have any job offers but suspects he could get a decent job as a software developer. He&amp;rsquo;s not sure what to do. What advice would you give him, or what questions might you suggest he ask himself as he goes about making the decision?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://stiglerdiet.com">Tim Hopper</a> recently posted a <a href="http://stiglerdiet.com/blog/2013/Aug/22/should-i-do-a-phd/">series</a> of interviews with folks from both academia and industry, posing this question to them. (I&rsquo;ve <a href="http://blog.vivekhaldar.com/post/29296581613/wha-is-life-like-for-phds-in-computer-science-who-go">written</a> <a href="http://blog.vivekhaldar.com/post/25136762019/advice-to-prospective-grad-students">about</a> <a href="http://blog.vivekhaldar.com/post/42007984829/computer-science-phd-trends">the topic</a> myself.) If you are pondering the question, you could do worse than read the entire series. <a href="http://stiglerdiet.com/blog/2013/Sep/19/should-i-do-a-phd-laura-mclay/">1</a>, <a href="http://stiglerdiet.com/blog/2013/Sep/17/should-i-do-a-phd-paul-harper/">2</a>, <a href="http://stiglerdiet.com/blog/2013/Sep/05/should-i-do-a-phd-melissa-santos/">3</a>, <a href="http://stiglerdiet.com/blog/2013/Sep/03/should-i-do-a-phd-carl-vogel/">4</a>, <a href="http://stiglerdiet.com/blog/2013/Aug/27/should-i-do-a-phd-eric-jonas/">5</a>, <a href="http://stiglerdiet.com/blog/2013/Aug/25/should-i-do-a-phd-paul-rubin/">6</a>, <a href="http://stiglerdiet.com/blog/2013/Aug/22/should-i-do-a-Ph.D.-john-d-cook/">7</a>.</p>
<p>The opening question to everyone:</p>
<blockquote>
  <p>A 22-year old college student has been accepted to a Ph.D. program in a technical field. He&rsquo;s academically talented, and he&rsquo;s always enjoyed school and his subject matter. His acceptance is accompanied with 5-years of guaranteed funding. He doesn&rsquo;t have any job offers but suspects he could get a decent job as a software developer. He&rsquo;s not sure what to do. What advice would you give him, or what questions might you suggest he ask himself as he goes about making the decision?</p>
</blockquote>
<p>Kudos to Tim for creating a great resource on this topic.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>My review: The Year Without Pants</title>
      <link>http://vivekhaldar.com/articles/my-review-the-year-without-pants/</link>
      <pubDate>Sat, 12 Oct 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/my-review-the-year-without-pants/</guid>
      <description>&lt;p&gt;I just finished reading &lt;a href=&#34;http://scottberkun.com/&#34;&gt;Scott Berkun’s&lt;/a&gt; &lt;em&gt;&lt;a href=&#34;http://scottberkun.com/books/&#34;&gt;The Year Without Pants&lt;/a&gt;&lt;/em&gt;. This is my review.&lt;/p&gt;
&lt;p&gt;I want to start by saying that I greatly admire Berkun’s work in general, and have read almost all his books (I think everything but &lt;em&gt;Confessions of a Public Speaker&lt;/em&gt;). That said, I don’t think YWP is his best to date.&lt;/p&gt;
&lt;p&gt;YWP is an excellent account of, well, Berkun’s time at Automattic, and its culture and techniques viewed through the eyes of a “traditional” project manager. There is a disconnect in the way the book was pitched and what it actually contains. It was pitched partly as a book about remote work being the future of work, and partly as a book about how to make work more fun. It is &lt;em&gt;tangentially&lt;/em&gt; about both those things, but the primary thrust of the book is the personal narrative of the author working and shipping at Automattic.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I just finished reading <a href="http://scottberkun.com/">Scott Berkun’s</a> <em><a href="http://scottberkun.com/books/">The Year Without Pants</a></em>. This is my review.</p>
<p>I want to start by saying that I greatly admire Berkun’s work in general, and have read almost all his books (I think everything but <em>Confessions of a Public Speaker</em>). That said, I don’t think YWP is his best to date.</p>
<p>YWP is an excellent account of, well, Berkun’s time at Automattic, and its culture and techniques viewed through the eyes of a “traditional” project manager. There is a disconnect in the way the book was pitched and what it actually contains. It was pitched partly as a book about remote work being the future of work, and partly as a book about how to make work more fun. It is <em>tangentially</em> about both those things, but the primary thrust of the book is the personal narrative of the author working and shipping at Automattic.</p>
<p>What was missing was any discussion of how to take Automattic’s specific culture and tools and ways of working, and extrapolate them to other settings, such as a new company, or an existing traditional one. (<a href="http://scottberkun.com/2013/how-to-change-a-company/">He later wrote about this on his blog</a>.)</p>
<p>Also, for a book that wants to sell the idea of a distributed company, a significant fraction of it ends up detailing the meet-ups where teammates physically met and worked together for a few days. All team-members would come to a given city for a week, camp out in a large hotel room or apartment, and basically code, eat and drink (and maybe sleep a little) the whole time. That might be exciting and fun, but it sounds like a <em>horrible</em> way to work (even for one week) for someone older or with a family.</p>
<p>So it was a great account of how Automattic has had success with the distributed team model, but left me wanting much more. Berkun particularly shines when talking about team dynamics, leadership and project management, and I did learn quite a few new ideas and techniques from that.</p>
<p>Some interesting questions that I think a book on distributed teams and remote working should address:</p>
<ul><li><strong>how can an existing company either accommodate or make the transition to being distributed?</strong> This is the big one. Because existing companies dwarf new ones. If one wants to change the way work works, one has to tackle this thorny problem.</li>
<li><strong>how can distributed work scale?</strong> By now it is not controversial to claim that distributed teams and remote work is effective for small to medium companies. But how can we scale it to larger teams and companies, going from hundreds to thousands of employees?</li>
<li><strong>learn from the Linux kernel</strong>. To me, the most successful <em>large</em> distributed team ever is the one that builds the Linux kernel. The artifact is complex and is now the substrate for the modern internet, and the team building it has <em>thousands</em> of contributors. And it has been delivering new releases and features and bugfixes steadily for more than a decade. And it has been doing this with almost no overarching oversight, other than Linus and the subsystem lieutenants weighing in on technical matters. The amount of physical proximity with other kernel hackers is small compared even to the case of Automattic&ndash;most kernel hackers will meet their fellow hackers once a year at a Linux conference. To those living on LKML and slinging patches around, this is a completely natural way to work and has become second nature. To anyone outside, it seems like an impossible feat, especially when it seems to be so hard to ship <em>any</em> software even with physically co-located teams and tons of oversight. Anyone who wants to understand distributed teams <em>has</em> to take a long, hard look at the Linux kernel community and try and learn from what they are doing.</li>
</ul><p>But all the same, I do look forward to Berkun’s future work.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>How will you read your files in a hundred years?</title>
      <link>http://vivekhaldar.com/articles/how-will-you-read-your-files-in-a-hundred-years/</link>
      <pubDate>Mon, 07 Oct 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/how-will-you-read-your-files-in-a-hundred-years/</guid>
      <description>&lt;p&gt;Jeff Rothenberg might very well have written everything there was to write about the topic of &lt;a href=&#34;http://www.panix.com/~jeffr/Prof/digilong.html&#34;&gt;digital longevity and preservation&lt;/a&gt;. And it is downright depressing. &lt;a href=&#34;http://www.clir.org/pubs/archives/ensuring.pdf&#34;&gt;Consider this&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;The year is 2045, and my grandchildren (as yet unborn) are exploring the attic of my house (as yet unbought). They ﬁnd a letter dated 1995 and a CD-ROM (compact disk). The letter claims that the disk contains a document that provides the key to obtaining my fortune (as yet unearned). My grandchildren are understandably excited, but they have never seen a CD before—except in old movies—and even if they can somehow ﬁnd a suitable disk drive, how will they run the software necessary to interpret the information on the disk? How can they read my obsolete digital document?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Jeff Rothenberg might very well have written everything there was to write about the topic of <a href="http://www.panix.com/~jeffr/Prof/digilong.html">digital longevity and preservation</a>. And it is downright depressing. <a href="http://www.clir.org/pubs/archives/ensuring.pdf">Consider this</a>:</p>
<blockquote>
  <p>The year is 2045, and my grandchildren (as yet unborn) are exploring the attic of my house (as yet unbought). They ﬁnd a letter dated 1995 and a CD-ROM (compact disk). The letter claims that the disk contains a document that provides the key to obtaining my fortune (as yet unearned). My grandchildren are understandably excited, but they have never seen a CD before—except in old movies—and even if they can somehow ﬁnd a suitable disk drive, how will they run the software necessary to interpret the information on the disk? How can they read my obsolete digital document?</p>
</blockquote>
<p>From there <a href="http://www.clir.org/pubs/archives/ensuring.pdf">the paper</a> goes down a twisty maze of reasoning to lay out exactly how difficult it is to preserve digital documents for the long term, i.e. hundreds or even thousands of years. We have stone and paper documents dating back thousands of years, but it is extremely unlikely that today’s digital documents will make it that far into the future.</p>
<p>There are problems at every level of abstraction. The physical media on which the bits are stored will decay. The documents have funky encodings and metadata that can only be parsed and displayed by the programs that were used to author them. Those programs will only run on certain OSs. Those OSs will only run on certain hardware. <em>If</em> each of those hurdles are overcome, we have some hope of recovering the old document.</p>
<p>That’s like raising an already small probability to the fifth power.</p>
<p>Like I said, it’s depressing.</p>
<p>And the biggest issue is that digital preservation is an active, ongoing task. I could print something on archival paper, store it in a safe deposit box, and be reasonably sure it will be readable in a century. Trying to do the same for a digital document would require fiddling (copying to newer media, maybe changing formats and encodings) every 2-5 years.</p>
<p>Maybe the Library of Congress will go to all this trouble to preserve digital documents it deems significant to the record of our civilization and times. What hope do I as an individual have to carry forward my digital life to the point where I could hand it over to a grown child, or even grandchildren?</p>
<p>I learned a small lesson early in my digital life and have been putting as much as possible in plain text files. <a href="http://stackoverflow.com/questions/90838/how-can-i-detect-the-encoding-codepage-of-a-text-file">But “plain text” can be one of many encodings, and you need to know it independently of the file.</a></p>
<p>On the table where I write this, I have a black and white photograph of my mother when she was about twelve years old, with my then young grandparents. Will I be able to give my twenty-year old child photographs of the vacation we went on when he was a toddler?</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>  &#34;The Mundanity of Excellence&#34;
  </title>
      <link>http://vivekhaldar.com/articles/the-mundanity-of-excellence/</link>
      <pubDate>Tue, 01 Oct 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-mundanity-of-excellence/</guid>
      <description>&lt;p&gt;I just finished reading this paper&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; where the author embeds himself with a group of swimmers and tries to understand how they move up (or not) through the levels.&lt;/p&gt;
&lt;p&gt;The overall message has many similarities to &lt;a href=&#34;http://psycnet.apa.org/index.cfm?fa=buy.optionToBuy&amp;amp;uid=1993-40718-001&#34;&gt;Ericsson et al’s famous paper about deliberate practice&lt;/a&gt; (of which I wrote a &lt;a href=&#34;http://blog.vivekhaldar.com/post/3881908748/tldr-summary-the-role-of-deliberate-practice-in-the&#34;&gt;summary&lt;/a&gt;), in that “innate talent” as something that one is born with is a useless concept used to mystify the systematic, methodical and disciplined practice of otherwise mundane habits. Hence the title of the paper.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I just finished reading this paper<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> where the author embeds himself with a group of swimmers and tries to understand how they move up (or not) through the levels.</p>
<p>The overall message has many similarities to <a href="http://psycnet.apa.org/index.cfm?fa=buy.optionToBuy&amp;uid=1993-40718-001">Ericsson et al’s famous paper about deliberate practice</a> (of which I wrote a <a href="http://blog.vivekhaldar.com/post/3881908748/tldr-summary-the-role-of-deliberate-practice-in-the">summary</a>), in that “innate talent” as something that one is born with is a useless concept used to mystify the systematic, methodical and disciplined practice of otherwise mundane habits. Hence the title of the paper.</p>
<p>The author concludes that:</p>
<ul><li>The levels of achievement (juniors, seniors, nationals, Olympics) are discrete rather than continuous, and the practices and attitudes within each are different enough to make them disjoint parallel worlds.</li>
<li>The jump from one level to the next one comes not from <em>quantitative improvements</em> (i.e. doing more of the same thing, or doing it faster), but from <em>qualitative shifts</em> such as new and different techniques, attitudes and practices.</li>
<li>Other than that, <strong>there is no secret to achieving excellence</strong>, and indeed, the primary psychological barrier to achieving it is to get over the sheer mundanity of it.</li>
<li><strong>“Talent” is indistinguishable from its effects</strong>. We only call someone “talented” if their achievements already make it obvious. The cult of talent is actually harmful because it obscures the true, achievable (but mundane) path to excellence.</li>
</ul><div class="footnotes" role="doc-endnotes">
<hr><ol><li id="fn:1" role="doc-endnote">
<p>The Mundanity of Excellence: An Ethnographic Report on Stratification and Olympic Swimmers. Daniel F. Chambliss. Sociological Theory, Vol. 7, No. 1 (Spring, 1989), pp. 70-86. (<a href="http://www.lillyfellows.org/Portals/0/Chambliss-Mundanity%20of%20Excellence.pdf">PDF</a>) <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol></div>
]]></content:encoded>
    </item>
    
    <item>
      <title>Why you should subscribe to my newsletter</title>
      <link>http://vivekhaldar.com/articles/why-you-should-subscribe-to-my-newsletter/</link>
      <pubDate>Mon, 23 Sep 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/why-you-should-subscribe-to-my-newsletter/</guid>
      <description>&lt;p&gt;I feel all cheesy and content-market-ish just writing that headline, but hear me out.&lt;/p&gt;
&lt;p&gt;I read a lot, because &lt;a href=&#34;http://blog.vivekhaldar.com/post/2525332092/minimalism-is-no-a-viable-intellectual-strategy&#34;&gt;I don’t believe minimalism is a great intellectual strategy&lt;/a&gt;. I have thoughts and opinions about what I’ve read, and sometimes about other stuff that springs unprompted in my head. I want to post those on the great wide internet for all to see, because, well, that’s what it’s for, isn’t it?&lt;/p&gt;
&lt;p&gt;I also want to keep a high bar for posts on this blog. That means I polish it (as much as one can polish a blog post) and try to be coherent and have a complete thought. That takes time, and often the latency between initial spark and hitting “publish” is weeks or months.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I feel all cheesy and content-market-ish just writing that headline, but hear me out.</p>
<p>I read a lot, because <a href="http://blog.vivekhaldar.com/post/2525332092/minimalism-is-no-a-viable-intellectual-strategy">I don’t believe minimalism is a great intellectual strategy</a>. I have thoughts and opinions about what I’ve read, and sometimes about other stuff that springs unprompted in my head. I want to post those on the great wide internet for all to see, because, well, that’s what it’s for, isn’t it?</p>
<p>I also want to keep a high bar for posts on this blog. That means I polish it (as much as one can polish a blog post) and try to be coherent and have a complete thought. That takes time, and often the latency between initial spark and hitting “publish” is weeks or months.</p>
<p>However, in my own narcissistic way I do believe all that raw material (sometimes just a list of links, sometimes half-baked thoughts) might be valuable and interesting in and of itself.</p>
<p><a href="http://tinyletter.com/vivekhaldar">And that’s where the newsletter comes in</a>. I want it to be a more intimate channel to share thoughts that that are not yet ready for the harsh glare of the public web, and maybe even start a conversation and learn something.</p>
<p>If you <a href="http://tinyletter.com/vivekhaldar">subscribe</a>, you can expect around 1-2 emails a week, on much the same set of topics that I write about on this blog: programming, technology, modern work, and occasional side-trips into culture and criticism.</p>
<p><a href="http://tinyletter.com/vivekhaldar">I invite you to subscribe.</a></p>
<form action="https://tinyletter.com/vivekhaldar" method="post" target="popupwindow" onsubmit="window.open('https://tinyletter.com/vivekhaldar', 'popupwindow', 'scrollbars=yes,width=800,height=600');return true"><p><input type="text" style="width:140px" placeholder="Enter your email" name="email" id="tlemail"><input type="hidden" value="1" name="embed"><input type="submit" value="Subscribe"></p></form>
]]></content:encoded>
    </item>
    
    <item>
      <title>Research Roundup: Programming and Remote Teams</title>
      <link>http://vivekhaldar.com/articles/research-roundup-programming-and-remote-teams/</link>
      <pubDate>Mon, 16 Sep 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/research-roundup-programming-and-remote-teams/</guid>
      <description>&lt;p&gt;In no particular order, brief summaries of some papers I’ve been reading lately on the topic of programming and distributed/remote teams. Note that this is not opinion, but backed up by empirical data.&lt;/p&gt;
&lt;p&gt;I’d love to hear of any other good references on the topic.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;“Conventional wisdom … holds that distributed software development is riskier and more challenging than collocated development… [We compare] the post-release failures of components that were developed in a distributed fashion with those that were developed by collocated teams. &lt;strong&gt;We found a negligible difference&lt;/strong&gt; in failures. This difference becomes even less significant when controlling for the number of developers working on a binary. Furthermore, we also found that component characteristics (such as code churn, complexity, dependency information, and test code coverage) differ very little between distributed and collocated components.” The paper goes on to detail some of the practices that contributed to making this difference small. Among other things, “developers made heavy use of synchronous communication daily. Employees took on the responsibility
of staying at work late or arriving early for a status conference call on a rotating basis, changing the site that needed to keep odd hours every week. Keeping in close and frequent
contact increases the level of awareness and the feeling of ‘teamness’. This also helps to convey status and resolve issues quickly before they escalate. In addition, Engineers also regularly traveled between remote sites during development for important meetings.” &lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A decade ago, distance mattered, a lot.&lt;/strong&gt; In spite of that, since then, distributed work has only grown, fueled by both economic and other considerations (e.g. the talent may not be where you want them to be). A range of technologies has made this easier: shared documents and calendars, instant messaging, video conferencing over the net; but also a realization that &lt;strong&gt;distributed, virtual leadership is a distinct and valuable skill.&lt;/strong&gt; &lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;Distributed development was “considered harmful”, but recent rechecking of those results has revealed that “the effect size of the differences seen in the collocated and distributed software was so small that it need not concern industrial practitioners. Our conclusion is that … &lt;strong&gt;distributed development is not considered harmful&lt;/strong&gt;.” &lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;Among the behaviors that have the biggest impact on effectively working remotely: communicating changes and status to downstream dependencies, clear communication of who owns what, responsiveness to emails and IMs, and co-operation (which means actually helping and unblocking someone). &lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;(All emphasis mine.)&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>In no particular order, brief summaries of some papers I’ve been reading lately on the topic of programming and distributed/remote teams. Note that this is not opinion, but backed up by empirical data.</p>
<p>I’d love to hear of any other good references on the topic.</p>
<ul><li>“Conventional wisdom … holds that distributed software development is riskier and more challenging than collocated development… [We compare] the post-release failures of components that were developed in a distributed fashion with those that were developed by collocated teams. <strong>We found a negligible difference</strong> in failures. This difference becomes even less significant when controlling for the number of developers working on a binary. Furthermore, we also found that component characteristics (such as code churn, complexity, dependency information, and test code coverage) differ very little between distributed and collocated components.” The paper goes on to detail some of the practices that contributed to making this difference small. Among other things, “developers made heavy use of synchronous communication daily. Employees took on the responsibility
of staying at work late or arriving early for a status conference call on a rotating basis, changing the site that needed to keep odd hours every week. Keeping in close and frequent
contact increases the level of awareness and the feeling of ‘teamness’. This also helps to convey status and resolve issues quickly before they escalate. In addition, Engineers also regularly traveled between remote sites during development for important meetings.” <sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></li>
<li><strong>A decade ago, distance mattered, a lot.</strong> In spite of that, since then, distributed work has only grown, fueled by both economic and other considerations (e.g. the talent may not be where you want them to be). A range of technologies has made this easier: shared documents and calendars, instant messaging, video conferencing over the net; but also a realization that <strong>distributed, virtual leadership is a distinct and valuable skill.</strong> <sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup></li>
<li>Distributed development was “considered harmful”, but recent rechecking of those results has revealed that “the effect size of the differences seen in the collocated and distributed software was so small that it need not concern industrial practitioners. Our conclusion is that … <strong>distributed development is not considered harmful</strong>.” <sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup></li>
<li>Among the behaviors that have the biggest impact on effectively working remotely: communicating changes and status to downstream dependencies, clear communication of who owns what, responsiveness to emails and IMs, and co-operation (which means actually helping and unblocking someone). <sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup></li>
</ul><p>(All emphasis mine.)</p>
<div class="footnotes" role="doc-endnotes">
<hr><ol><li id="fn:1" role="doc-endnote">
<p><a href="http://research.microsoft.com/apps/pubs/default.aspx?id=138224">Does Distributed Development Affect Software Quality? An Empirical Case Study of Windows Vista. Christian Bird, Nachiappan Nagappan, Premkumar Devanbu, Harald Gall, and Brendan Murphy. May 2009.</a> <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:2" role="doc-endnote">
<p><a href="http://research.microsoft.com/apps/pubs/default.aspx?id=78697">What Still Matters about Distance?Gary M. Olson, Judith S. Olson, and Gina Venolia. February 2009</a> <a href="#fnref:2" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:3" role="doc-endnote">
<p><a href="http://research.microsoft.com/apps/pubs/default.aspx?id=180284">Distributed Development Considered Harmful?Ekrem Kocaguneli, Thomas Zimmermann, Christian Bird, Nachiappan Nagappan, and Tim Menzies. May 2013</a> <a href="#fnref:3" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:4" role="doc-endnote">
<p><a href="http://research.microsoft.com/apps/pubs/default.aspx?id=102772">Coordination in Large-Scale Software Development: Helpful and Unhelpful Behaviors. Andrew Begel and Nachiappan Nagappan. 28 September 2009</a> <a href="#fnref:4" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol></div>
]]></content:encoded>
    </item>
    
    <item>
      <title>Is there a STEM worker shortage?</title>
      <link>http://vivekhaldar.com/articles/is-there-a-stem-worker-shortage/</link>
      <pubDate>Thu, 12 Sep 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/is-there-a-stem-worker-shortage/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://spectrum.ieee.org/at-work/education/the-stem-crisis-is-a-myth&#34;&gt;How do you reconcile the consistent cries of “not enough STEM workers” from industry with some recent studies that claim that there are plenty?&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;You must have seen the warning a thousand times: Too few young people study scientific or technical subjects, businesses can’t find enough workers in those fields, and the country’s competitive edge is threatened.&lt;/p&gt;
  &lt;p&gt;It pretty much doesn’t matter what country you’re talking about—the United States is facing this crisis, as is Japan, the United Kingdom, Australia, China,Brazil, South Africa, Singapore, India…the list goes on. In many of these countries, the predicted shortfall of STEM (short for science, technology, engineering, and mathematics) workers is supposed to number in the hundreds of thousands or even the millions…&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://spectrum.ieee.org/at-work/education/the-stem-crisis-is-a-myth">How do you reconcile the consistent cries of “not enough STEM workers” from industry with some recent studies that claim that there are plenty?</a></p>
<blockquote>
  <p>You must have seen the warning a thousand times: Too few young people study scientific or technical subjects, businesses can’t find enough workers in those fields, and the country’s competitive edge is threatened.</p>
  <p>It pretty much doesn’t matter what country you’re talking about—the United States is facing this crisis, as is Japan, the United Kingdom, Australia, China,Brazil, South Africa, Singapore, India…the list goes on. In many of these countries, the predicted shortfall of STEM (short for science, technology, engineering, and mathematics) workers is supposed to number in the hundreds of thousands or even the millions…</p>
  <p>And yet, alongside such dire projections, you’ll also find reports suggesting just the opposite—that there are more STEM workers than suitable jobs. One study found, for example, that wages for U.S. workers in computer and math fields have largely stagnated since 2000. Even as the Great Recession slowly recedes, STEM workers at every stage of the career pipeline, from freshly minted grads to mid- and late-career Ph.D.s, still struggle to find employment as many companies, including Boeing, IBM, and Symantec, continue to lay off thousands of STEM workers.</p>
</blockquote>
<p><img src="../../media/61027056759_0.jpg" alt=""/></p>
<p>The flaw is in the assumption that every STEM <em>degree holder</em> is a qualified candidate for a STEM job. Carried through to its logical conclusion this implies that simply presenting a STEM degree should be enough to get one placed in a STEM job, which is absurd.</p>
<p>This becomes readily apparent if one has ever been on the <em>evaluation</em> side &ndash; grading students, or conducting interviews for jobs. I’ve been a TA for a number of CS classes while in grad school, and I’ve conducted many interviews for software engineer positions. Just from my narrow anecdotal window, it is amazing how many CS students just want to figure out the bare minimum to pass the class; and how many grads do not have a decent grasp of elementary algorithms and data structures, and are not comfortable with code.</p>
<p>When CEOs of tech companies complain that there are not enough STEM workers to fill their open positions, what they’re really saying is that it is very hard to find the <em>right calibre</em> candidate, the glut of credentialed STEM graduates notwithstanding.</p>
<p><strong>Update:</strong> <a href="https://news.ycombinator.com/item?id=6375195">HN has some great comments</a>, many from people in the trenches.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Rangers</title>
      <link>http://vivekhaldar.com/articles/rangers/</link>
      <pubDate>Tue, 10 Sep 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/rangers/</guid>
      <description>&lt;p&gt;I am an unabashed fan of the American &lt;a href=&#34;http://www.nps.gov/&#34;&gt;National Parks Service&lt;/a&gt;, not just because of the precious beauty of the parks themselves, but because of the rangers who work there.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../media/60848032576_0.jpg&#34; alt=&#34;&#34;/&gt;&lt;/p&gt;
&lt;p&gt;I’ve lost count of how many national parks and monuments I’ve seen over more than a decade, but at each and every one of them, without fail, the rangers were just flat out brimming with pride and joy.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../media/60848032576_1.jpg&#34; alt=&#34;&#34;/&gt;&lt;/p&gt;
&lt;p&gt;They wanted me to &lt;em&gt;see&lt;/em&gt;, truly see, not just the visual scenic beauty, but the deeper connections in the ecosystem, and the geological history that made the place what it is.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I am an unabashed fan of the American <a href="http://www.nps.gov/">National Parks Service</a>, not just because of the precious beauty of the parks themselves, but because of the rangers who work there.</p>
<p><img src="../../media/60848032576_0.jpg" alt=""/></p>
<p>I’ve lost count of how many national parks and monuments I’ve seen over more than a decade, but at each and every one of them, without fail, the rangers were just flat out brimming with pride and joy.</p>
<p><img src="../../media/60848032576_1.jpg" alt=""/></p>
<p>They wanted me to <em>see</em>, truly see, not just the visual scenic beauty, but the deeper connections in the ecosystem, and the geological history that made the place what it is.</p>
<p><img src="../../media/60848032576_2.jpg" alt=""/></p>
<p>Some shared personal stories about how and why they became rangers.</p>
<p><img src="../../media/60848032576_3.jpg" alt=""/></p>
<p>Some quoted John Muir and Thoreau extensively.</p>
<p><img src="../../media/60848032576_4.jpg" alt=""/></p>
<p>Some spoke of the simple grandeur and solitude of living miles from civilization for months.</p>
<p><img src="../../media/60848032576_5.jpg" alt=""/></p>
<p>All of them spoke of the delicate preciousness of their park, looking over it with loving watchfulness.</p>
<p><img src="../../media/60848032576_6.jpg" alt=""/></p>
<p>All of them were humble, emphasizing how much they don’t understand about nature, and how little they do.</p>
<p><img src="../../media/60848032576_7.jpg" alt=""/></p>
<p>Surely they have challenges and frustrations in their line of work. It’s just that I’ve never seen it as a visitor.</p>
<p><img src="../../media/60848032576_8.jpg" alt=""/></p>
<p>There is so much ink spilt writing about how to be happy at work. But what I see in them makes the word “happy” seem flat. It must be what one feels when one is tasked with looking after something precious and lovely, yet delicate and needing protection.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Taking your company completely remote</title>
      <link>http://vivekhaldar.com/articles/taking-your-company-completely-remote/</link>
      <pubDate>Mon, 09 Sep 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/taking-your-company-completely-remote/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m aghast that a few people read what I write, so it was a treat to see &lt;a href=&#34;http://nicolaiarocci.com/&#34;&gt;Nicola Iarocci&lt;/a&gt; quote some of my writing on &lt;a href=&#34;http://blog.vivekhaldar.com/post/60349166782/we-are-all-remote-workers&#34;&gt;remote work&lt;/a&gt; and &lt;a href=&#34;http://blog.vivekhaldar.com/post/26291176846/working-asynchronously&#34;&gt;asynchronous working&lt;/a&gt; in a &lt;a href=&#34;http://nicolaiarocci.com/we-are-all-remote-workers/&#34;&gt;recent talk he gave about taking his company completely remote&lt;/a&gt;. I&amp;rsquo;ve only seen the slides, but it is a cogent walk through the rationale for and techniques of remote working, no matter whether you work in an office or not.&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p&gt;We Are All Remote Workers &lt;a href=&#34;http://t.co/KuBQgfMkWg&#34;&gt;http://t.co/KuBQgfMkWg&lt;/a&gt; &amp;lt; my talk at &lt;a href=&#34;https://twitter.com/search?q=%23romagnacamp&amp;amp;src=hash&#34;&gt;#romagnacamp&lt;/a&gt;, also inspired by the works by &lt;a href=&#34;https://twitter.com/vivekhaldar&#34;&gt;@vivekhaldar&lt;/a&gt; &lt;a href=&#34;https://twitter.com/joelgascoigne&#34;&gt;@joelgascoigne&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I&rsquo;m aghast that a few people read what I write, so it was a treat to see <a href="http://nicolaiarocci.com/">Nicola Iarocci</a> quote some of my writing on <a href="http://blog.vivekhaldar.com/post/60349166782/we-are-all-remote-workers">remote work</a> and <a href="http://blog.vivekhaldar.com/post/26291176846/working-asynchronously">asynchronous working</a> in a <a href="http://nicolaiarocci.com/we-are-all-remote-workers/">recent talk he gave about taking his company completely remote</a>. I&rsquo;ve only seen the slides, but it is a cogent walk through the rationale for and techniques of remote working, no matter whether you work in an office or not.</p>
<blockquote class="twitter-tweet"><p>We Are All Remote Workers <a href="http://t.co/KuBQgfMkWg">http://t.co/KuBQgfMkWg</a> &lt; my talk at <a href="https://twitter.com/search?q=%23romagnacamp&amp;src=hash">#romagnacamp</a>, also inspired by the works by <a href="https://twitter.com/vivekhaldar">@vivekhaldar</a> <a href="https://twitter.com/joelgascoigne">@joelgascoigne</a></p>— Nicola Iarocci (@nicolaiarocci) <a href="https://twitter.com/nicolaiarocci/statuses/375970667734519808">September 6, 2013</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
]]></content:encoded>
    </item>
    
    <item>
      <title>Long form on the web</title>
      <link>http://vivekhaldar.com/articles/long-form-on-the-web/</link>
      <pubDate>Fri, 06 Sep 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/long-form-on-the-web/</guid>
      <description>&lt;p&gt;Clearly there has been a renaissance lately in long-form publishing on the web. Just take a look at &lt;a href=&#34;http://longform.org&#34;&gt;longform.org&lt;/a&gt; every morning.&lt;/p&gt;
&lt;p&gt;But even though the web is the delivery mechanism for long-form pieces, I almost never actually read them in the browser. It just doesn&amp;rsquo;t feel right. First of all, I&amp;rsquo;m not in the frame of mind to read long-form when browsing. Secondly, no matter how clean and tasteful the page design, I prefer something even more stripped down, like &lt;a href=&#34;http://readability.com&#34;&gt;Readability&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Clearly there has been a renaissance lately in long-form publishing on the web. Just take a look at <a href="http://longform.org">longform.org</a> every morning.</p>
<p>But even though the web is the delivery mechanism for long-form pieces, I almost never actually read them in the browser. It just doesn&rsquo;t feel right. First of all, I&rsquo;m not in the frame of mind to read long-form when browsing. Secondly, no matter how clean and tasteful the page design, I prefer something even more stripped down, like <a href="http://readability.com">Readability</a>.</p>
<p>When I come by a long-form piece I want to read, I add it to my <a href="http://getpocket.com">Pocket</a> queue, and usually read it on my tablet, laid back, without any other distractions on the screen.</p>
<p>So the Web has become an excellent delivery mechanism for long-form content, but its actual enjoyment happens elsewhere.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>We are all remote workers</title>
      <link>http://vivekhaldar.com/articles/we-are-all-remote-workers/</link>
      <pubDate>Thu, 05 Sep 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/we-are-all-remote-workers/</guid>
      <description>&lt;p&gt;tl;dr: whether you know it or not, a non-trivial fraction of your work is remote. So, build remote working skills.&lt;/p&gt;
&lt;p&gt;Who is a remote worker? What qualifies a piece of work as remote, as opposed to situated? The answer is more subtle than it appears at first glance. The first criteria that comes to mind is: physical proximity to collaborators. But access rapidly drops off. It works well if you can turn your chair around and talk to a colleague, but if they’re on another floor or in another building, then they might as well be in another city. Add to that the cult of “respect the headphones”, especially for programmers. More often than not programmers in the same room will have giant ear muffler headphones on and communicate with each other via chat and email.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>tl;dr: whether you know it or not, a non-trivial fraction of your work is remote. So, build remote working skills.</p>
<p>Who is a remote worker? What qualifies a piece of work as remote, as opposed to situated? The answer is more subtle than it appears at first glance. The first criteria that comes to mind is: physical proximity to collaborators. But access rapidly drops off. It works well if you can turn your chair around and talk to a colleague, but if they’re on another floor or in another building, then they might as well be in another city. Add to that the cult of “respect the headphones”, especially for programmers. More often than not programmers in the same room will have giant ear muffler headphones on and communicate with each other via chat and email.</p>
<p>No system is an island, and modern code will typically build upon a number of other services or libraries. If you’re writing code against a number of other services and libraries, the chances that the people you need to collaborate with for <em>all</em> of them are physically close to you are infinitesimally small.</p>
<p>Hence, a good fraction of your work is likely “remote”. So whether you’re a remote worker or not, it will help you if you build skills for effectively working remotely.</p>
<p>The most important mental shift is towards <a href="http://blog.vivekhaldar.com/post/26291176846/working-asynchronously">working asynchronously</a>. This is hard, because it requires some thought and planning, and is a lot more proactive than synchronous work. <a href="http://blog.vivekhaldar.com/post/54192213683/the-laziness-of-synchronous-work">Working synchronously by default is lazy and ineffective</a>.</p>
<p>A corollary of working asynchronously is that communication shifts away from verbal and towards the written word. Writing coherently is harder than informal conversation. Polish your writing skills.</p>
<p>And when you finally do meet those far flung colleagues, remember not to just talk shop! Build the trust and rapport that will enable you to work through the ether.</p>
<p>P.S. I’m looking forward to two books about remote working scheduled to release this fall: Scott Berkun’s <a href="http://scottberkun.com/2013/sept-17th-official-launch-for-the-year-without-pants-details/">“The Year Without Pants”</a>, and 37 Signals’ <a href="http://37signals.com/remote">“Remote”</a>.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Talented Beast</title>
      <link>http://vivekhaldar.com/articles/talented-beast/</link>
      <pubDate>Wed, 28 Aug 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/talented-beast/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://techcrunch.com/2013/03/16/bring-out-the-beast/&#34;&gt;This piece by Redfin CEO Glenn Kelman&lt;/a&gt; did the rounds recently. He thinks engineers in the Valley are getting spoilt by high salaries and lavish perks. They’re too comfortable, too soft.&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;Before most computer science graduates ever walk across a stage to get their diplomas, they’re set for life. This is especially true in 2013, which will be the first year in which most companies pay top engineering graduates in Silicon Valley $100,000 or more per year in salary.
  For the companies, for Redfin, the engineers are worth every penny. And for the engineers, the money is nice to have. But how many engineers hired from Stanford or Berkeley in the past year will ever feel the savage need to make something happen, to bust out of the matrix, to push the limits of their abilities?
  &lt;strong&gt;The problem is that the young engineers earning that much become well-fed farm animals at the very moment in their lives when they should be running like wild horses.&lt;/strong&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://techcrunch.com/2013/03/16/bring-out-the-beast/">This piece by Redfin CEO Glenn Kelman</a> did the rounds recently. He thinks engineers in the Valley are getting spoilt by high salaries and lavish perks. They’re too comfortable, too soft.</p>
<blockquote>
  <p>Before most computer science graduates ever walk across a stage to get their diplomas, they’re set for life. This is especially true in 2013, which will be the first year in which most companies pay top engineering graduates in Silicon Valley $100,000 or more per year in salary.
  For the companies, for Redfin, the engineers are worth every penny. And for the engineers, the money is nice to have. But how many engineers hired from Stanford or Berkeley in the past year will ever feel the savage need to make something happen, to bust out of the matrix, to push the limits of their abilities?
  <strong>The problem is that the young engineers earning that much become well-fed farm animals at the very moment in their lives when they should be running like wild horses.</strong></p>
</blockquote>
<p>(Emphasis mine.)</p>
<p>The piece plays into several stereotypes:</p>
<ul><li>The Startup is the apogee of all possible corporate forms.</li>
<li>The Startup is the only place where an engineer can do hard, challenging work.</li>
<li>Above benefits are great enough that one should take on significant risk, financial and personal.</li>
<li>If you are young, you have nothing to lose, so roll the dice with a (preferably my) startup!</li>
</ul><p>This is the Overarching Valley Myth. But reality is much more varied, much more complex, and not as disappointing.</p>
<p>If hard technical problems in the real world are what you seek&ndash;and that is indeed what you <em>should</em> seek if you’re a fresh CS grad&ndash;then a startup is possibly the <em>worst</em> place for you. Startups are about product definition and finding a business model. They are only tangentially about technology. Given all the risk that a startup takes on the business side, the last thing it needs is to take take on more risk on the technology side. Corollary: startups prefer middle-of-the-road, mature technology.</p>
<p>On the other hand, large tech behemoths are good places to dwell on hard technical problems. They operate at a scale where such problems actually manifest themselves. They also have enough resources that they can comfortably push the envelope on new and risky fundamental technologies without worrying about whether they have enough money to make payroll next month. That’s why they make a much better training ground than startups.</p>
<p>For example, there is no doubt that you will learn much more about planet-scale distributed systems at places like Amazon, Facebook, Twitter and Google, than any startup under the Sun.</p>
<p>Kelman is also downplaying the significant risk one takes on with an early stage startup. Financially, a big chunk of compensation at a startup is equity, which of course will be worthless if the startup fails. The flip side is that you could hit the jackpot and become wildly rich. But you know the odds. Also know that if successful, rewards go disproportionately to investors and founders. So why not <em>make</em> a startup instead of joining one?</p>
<p>But there are personal costs too. The perfect counterpoint to Kelman is <a href="https://al3x.net/2013/05/23/letter-to-a-young-programmer.html">Alex Payne’s <em>Letter To A Young Programmer Considering A Startup</em></a>, which takes a harrowing personal look at the toll of the Valley Myth.</p>
<blockquote>
  <p>I’ve seen firsthand the damage that startups can do to relationships. I’ve watched marriages and friendships fall apart, seen children and partners pushed aside, and failed those in my life in all kinds of ways when work came to the fore. I’ve listened as people who are the very picture of startup success – visible in the press and social media, headlining conferences, forever founding and exiting – have confided their utter loneliness despite being seemingly at the social center of the entrepreneurial community.</p>
</blockquote>
<p>There are two sides to every story. The truth is probably somewhere in the middle.</p>
<p>Kelman is also reinforcing the Valley age stereotype, what with all the imagery and metaphors around young, wild horses. Yes, when you’re fresh out of school, with no family and no mortgage, you have nothing to lose. But I think he’s completely missing the other side of the age/risk curve, which is engineers who have spent a decade or so at a large company, and built a comfortable financial cushion. They’ve built up an appetite for risk by then, <em>and</em> they’re experienced. They won’t run around like wild horses. They don’t need to. They know exactly how to build your system right the very first time, with a minimum of wildness.</p>
<p>Last but not least, Kelman has a massive bias: he’s complaining because he runs a startup, and startups are finding it hard to hire and retain engineers because all these other large companies in the Valley have soaked them up with pumped-up salaries and cushy perks.</p>
<p>Buried deep in Kelman’s piece is a sentiment I agree with: don’t get comfortable. Keep stretching yourself. Being showered with perks doesn’t mean you cannot keep seeking out hard problems. Even while burping from your gourmet meal during a mid-afternoon massage.</p>
<p>[Full Disclosure of Personal Bias: I happen to be happily ensconced in a large tech company. That’s partly why Kelman’s piece pricked me. Whether it has made me comfortable and soft time will tell.]</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Asset allocation is everything</title>
      <link>http://vivekhaldar.com/articles/asset-allocation-is-everything/</link>
      <pubDate>Mon, 26 Aug 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/asset-allocation-is-everything/</guid>
      <description>&lt;p&gt;This sounds like a trivial observation, but it took me a long time to fully understand this: in the long-term, asset allocation affects outcomes with high probability.&lt;/p&gt;
&lt;p&gt;There are many examples:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;As Burton Malkiel points out in his book &amp;ldquo;Random Walk&amp;rdquo;, asset allocation accounts for &amp;gt; 90% of the returns of an investment portfolio.&lt;/li&gt;
&lt;li&gt;Google is famous for its 70/20/10 allocation: 70% on the core business, 20% on related businesses, and 10% for wild, blue-sky projects.&lt;/li&gt;
&lt;li&gt;The projects you personally deal with will make progress in proportion to the fraction of your time you devote to them.&lt;/li&gt;
&lt;/ul&gt;</description>
      <content:encoded><![CDATA[<p>This sounds like a trivial observation, but it took me a long time to fully understand this: in the long-term, asset allocation affects outcomes with high probability.</p>
<p>There are many examples:</p>
<ul><li>As Burton Malkiel points out in his book &ldquo;Random Walk&rdquo;, asset allocation accounts for &gt; 90% of the returns of an investment portfolio.</li>
<li>Google is famous for its 70/20/10 allocation: 70% on the core business, 20% on related businesses, and 10% for wild, blue-sky projects.</li>
<li>The projects you personally deal with will make progress in proportion to the fraction of your time you devote to them.</li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Maintenance is not a bad word</title>
      <link>http://vivekhaldar.com/articles/maintenance-is-not-a-bad-word/</link>
      <pubDate>Wed, 21 Aug 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/maintenance-is-not-a-bad-word/</guid>
      <description>&lt;p&gt;One of the worries I hear most from fresh grads going into industry is whether they’ll be “stuck doing maintenance projects.” Let’s dig into what exactly that means, and what exactly they should be worried about.&lt;/p&gt;
&lt;p&gt;That seemingly simple issue is actually the tip of the iceberg for a bundle of intertwined complex ones. It usually encompasses some or all of the following:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Maintenance is boring, bad, and uninteresting.&lt;/li&gt;
&lt;li&gt;I only want to work on new and interesting stuff. I want sexy projects.&lt;/li&gt;
&lt;li&gt;I want to work on projects that will advance my career, and maintenance projects are not it.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Maintenance is boring, bad, and uninteresting.&lt;/strong&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>One of the worries I hear most from fresh grads going into industry is whether they’ll be “stuck doing maintenance projects.” Let’s dig into what exactly that means, and what exactly they should be worried about.</p>
<p>That seemingly simple issue is actually the tip of the iceberg for a bundle of intertwined complex ones. It usually encompasses some or all of the following:</p>
<ul><li>Maintenance is boring, bad, and uninteresting.</li>
<li>I only want to work on new and interesting stuff. I want sexy projects.</li>
<li>I want to work on projects that will advance my career, and maintenance projects are not it.</li>
</ul><p><strong>Maintenance is boring, bad, and uninteresting.</strong></p>
<p>No, maintenance is <em>important</em>.</p>
<p>Look around you, at the modern civilization you live in. <strong>The primary activity of civilization is maintenance.</strong> A new building or a new road pales in comparison to an existing city. They also have to connect with the existing city. Engineers who work with things other than software (mechanical, civil etc) seem to have a deeper understanding of the primacy of building on existing infrastructures.</p>
<p>All this is to say that maintenance doesn’t get its due. Software now is just as much a part of the infrastructure of civilization as roads, bridges and cities. As time goes on, its maintenance will get more important, not less.</p>
<p><strong>I only want to work on new and interesting stuff. I want sexy projects.</strong></p>
<p>Innovation is often misunderstood. We have a tendency to mythologize innovation as a “Eureka!” story, but zoomed in, innovation looks like a <a href="http://www.amazon.com/gp/product/1449389627">long thread of small, incremental steps</a>.</p>
<p>In a <a href="http://research.microsoft.com/pubs/75113/sigcse-begel-2008.pdf">paper delving into the challenges that new grads faced in their first software engineering jobs</a>, the authors found that:</p>
<blockquote>
  <p>Our study reveals that new developers find themselves in situations that differ considerably from the university [software engineering] class… We see new developers joining large, preexisting teams of software developers as the most inexperienced member, and spending their first several months resolving bugs that predate their employment, with little access to easily consumable documentation. Many of the problems they have are not due to lack of experience in programming, design or debugging. In fact, all of our study subjects said their university preparation in these areas was more than adequate. The problems instead centered around the particular social conditions of a new software job.
  Instead of a greenfield project, a more valuable experience would provide students a large pre-existing codebase to which they must fix bugs (injected or real) and write additional features.</p>
</blockquote>
<p>Of course, this is true not just of fresh grads, but of experienced engineers as well. The vast majority of their time is spent extending existing systems.</p>
<p>Truly green-field projects are <em>rare</em>. And they are <em>risky</em>, which helps make them rarer. But the fact is that you would make a crappy green-field project if you had no experience maintaining a real system. Because&ndash;guess what&ndash;very soon your green-field system won’t be green-field any more and you will have to maintain and extend it.</p>
<p>The shift away from clients towards large cloud systems only increases the slant towards incremental changes, because an online service cannot be replaced in one shot. It has to be changed piecemeal, akin to changing parts on a plane while it is flying.</p>
<p>How will you tell a “sexy” project from one that’s not? All the things you <em>think</em> will indicate a “sexy” project&ndash;management excitement, newness&ndash;have no correlation with the ultimate success and impact of a project. When you say you want to work on a sexy project what you’re really saying is that you want to be on a successful, celebrated project. And you can’t spot those a priori.</p>
<p><strong>I want to work on projects that will advance my career, and maintenance projects are not it.</strong></p>
<p>So far I’ve been debunking. But this part of the concern is actually valid.</p>
<p>You want to be judged by impact of the projects you worked on. Whether they are “maintenance” projects or not is immaterial. Instead of specific projects to work on, look for a place that has a performance process that is objective, gauges impact, peer-based and not reliant on just your manager.</p>
<p>Previous related post: <a href="http://blog.vivekhaldar.com/post/30917937031/shitty-legacy-maintenance">Shitty legacy maintenance.</a></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>The cost of memory safety</title>
      <link>http://vivekhaldar.com/articles/the-cost-of-memory-safety/</link>
      <pubDate>Mon, 19 Aug 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-cost-of-memory-safety/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://blog.regehr.org/archives/939&#34;&gt;John Regehr asks&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;If the cost of memory safety bugs in C/C++ codes is significant, and if solutions are available, why aren’t we using them in production systems?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;He offers several possible reasons:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;The cost of enforcement-related slowdowns is greater than the cost of vulnerabilities.&lt;/p&gt;
  &lt;p&gt;The cost due to slowdown is not greater than the cost of vulnerabilities, but people act like it is because the performance costs are up-front whereas security costs are down the road.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://blog.regehr.org/archives/939">John Regehr asks</a>:</p>
<blockquote>
  <p>If the cost of memory safety bugs in C/C++ codes is significant, and if solutions are available, why aren’t we using them in production systems?</p>
</blockquote>
<p>He offers several possible reasons:</p>
<blockquote>
  <p>The cost of enforcement-related slowdowns is greater than the cost of vulnerabilities.</p>
  <p>The cost due to slowdown is not greater than the cost of vulnerabilities, but people act like it is because the performance costs are up-front whereas security costs are down the road.</p>
  <p>Memory safety tools are not ready for prime time for other reasons, like maybe they crash a lot or raise false alarms.</p>
  <p>Plain old inertia: unsafety was good enough 40 years ago and it’s good enough now.</p>
</blockquote>
<p>I’ve been thinking about this too. This was a hot research topic not so long ago, but seems to have faded away. I think there are a few additional factors at play here:</p>
<ul><li><a href="http://blog.vivekhaldar.com/post/22307062036/bug-finding-and-static-analysis-in-the-real-world">The cost of memory unsafety is much higher for client software than for server software</a>. As our world moves towards thin and light clients (browsers, apps) that access heavy backend services, the urgency of the memory safety problem has diminished. Paying a small overhead (say, 5-10%) for memory safety on a laptop or desktop does not sound like much, but adding 5% CPU to an entire datacenter is material. At the other extreme, on phones and tablets, conserving battery is important and any drain on that needs a strong justification.</li>
<li>In tandem, <em>other</em> security problems&ndash;cross-site scripting, SQL injection&ndash;have become important to tackle.</li>
<li>Tools like <a href="https://code.google.com/p/address-sanitizer/">address sanitizer</a> have done a pretty good job of weeding out the vast majority of memory safety bugs early in development (with unit tests), taking the overhead from runtime to compile/build/test-time. The tradeoff is giving up soundness, i.e. you are not guaranteed to catch every bug.</li>
</ul><p>All these combined haven’t “solved” the C/C++ memory safety problem, but they have brought it down to the level where it is manageable, and its current cost is judged to be comparatively low.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>How Hugh Mac­Leod got my money</title>
      <link>http://vivekhaldar.com/articles/how-hugh-macleod-got-my-money/</link>
      <pubDate>Thu, 15 Aug 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/how-hugh-macleod-got-my-money/</guid>
      <description>&lt;p&gt;I’ve been a fan of Hugh MacLeod’s work since the early 2000s, back when he was actually making &lt;a href=&#34;http://gapingvoid.com/2004/06/27/company-hierarchy/&#34;&gt;cartoons on the backs of business cards&lt;/a&gt; and putting them up on gapingvoid.com. Back when gapingvoid.com looked much simpler. I remember when he broke out of the card format. When he first used color. I adored how he mixed dark, caustic bitterness with a tinge of humor and hope. (There are times in grad school when one really needs that.)&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I’ve been a fan of Hugh MacLeod’s work since the early 2000s, back when he was actually making <a href="http://gapingvoid.com/2004/06/27/company-hierarchy/">cartoons on the backs of business cards</a> and putting them up on gapingvoid.com. Back when gapingvoid.com looked much simpler. I remember when he broke out of the card format. When he first used color. I adored how he mixed dark, caustic bitterness with a tinge of humor and hope. (There are times in grad school when one really needs that.)</p>
<p>I took color printouts of his cartoons and stuck them on my cubicle walls. I felt somewhat guilty about him not making anything off that, but then, the <a href="http://www.gapingvoidart.com/gallery/have-something-to-say-2/">real prints</a> were kind of expensive. I bought his <a href="http://gapingvoid.com/books-by-hugh-macleod/">books</a> to redeem myself, but they were worth it on their own.</p>
<p>So when he came out with something I had been looking for for a while, a <a href="http://www.gapingvoidart.com/gallery/macbook-air-11-laptop-decal-copy/">unique decal for my laptop</a>, at a price I didn’t have to think too hard about, I jumped at it. The landscape looks barren when the fifty laptops around the conference room all sport combinations of the same ten stickers.</p>
<p><img src="../../media/58348088719_0.jpg" alt=""/></p>
<p>In nearly a decade, during which time he has given me something cool and new to look at <em>nearly every day</em>, he has made less than a hundred dollars from me. That’s a ridiculously small amount of money given the consistent pleasure I have derived from his work over a long period of time. But that’s <a href="http://kk.org/thetechnium/archives/2008/03/1000_true_fans.php">emblematic of the new economy</a>.</p>
<p>As MacLeod himself says, <a href="http://www.gapingvoidart.com/gallery/have-something-to-say-2/">“Have something to say, have something to sell”</a>. He lives that. And I thank him.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>The difference between a herd and a crowd</title>
      <link>http://vivekhaldar.com/articles/the-difference-between-a-herd-and-a-crowd/</link>
      <pubDate>Mon, 12 Aug 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-difference-between-a-herd-and-a-crowd/</guid>
      <description>&lt;p&gt;I recently came across this paper&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; that carries out an experiment to examine how early voting on a comment in an HN/Reddit-style website affects its final score. They randomly up- or down-voted comments when they were created, leaving some untouched to serve as the control group. They found:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;comments that were initially down-voted were corrected, so that their final ratings were not statistically different from that of the control group.&lt;/li&gt;
&lt;li&gt;comments that were initially up-voted saw more benefits: their final ratings were on average 25% higher than the control group.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;This reminded me of a couple of papers&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt; by Duncan Watts and Matthew Salganik&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt; a few years ago that look at a similar question in the context of songs: how do social signals (like ratings and prior downloads) affect the success of a song in an online market?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I recently came across this paper<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> that carries out an experiment to examine how early voting on a comment in an HN/Reddit-style website affects its final score. They randomly up- or down-voted comments when they were created, leaving some untouched to serve as the control group. They found:</p>
<ul><li>comments that were initially down-voted were corrected, so that their final ratings were not statistically different from that of the control group.</li>
<li>comments that were initially up-voted saw more benefits: their final ratings were on average 25% higher than the control group.</li>
</ul><p>This reminded me of a couple of papers<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup><sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup> by Duncan Watts and Matthew Salganik<sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup> a few years ago that look at a similar question in the context of songs: how do social signals (like ratings and prior downloads) affect the success of a song in an online market?</p>
<p>They used a slightly different metric, the <a href="http://en.wikipedia.org/wiki/Gini_coefficient">Gini coefficient</a>, to measure inequality in the resulting market. In the control case, people downloaded songs without being shown how often they had been downloaded in the past. In the social influence case, prior downloads were presented. Not surprisingly, “influence worlds exhibit greater inequality—meaning popular songs are more popular and unpopular songs are less popular—than the world in which individuals make decisions independently.”</p>
<p>But more interestingly, Watts and Salganik found that social signals increased the <em>unpredictability</em> of success. They created “parallel worlds” of users for each case. The variability of the success of a given song across worlds was much greater in the social influence worlds than in the independent ones.</p>
<p>And their final insight was the relationship between “quality” and success. They measured quality of a song by its success in the independent worlds. They report that “in general, the best songs never do very badly, and the worst songs never do extremely well, but almost any
other result is possible.”</p>
<p>Ever since <a href="https://en.wikipedia.org/wiki/The_Wisdom_of_Crowds">James Surowiecki published “The Wisdom of Crowds”</a>, I’ve often heard the glib “rule” that “many minds are smarter than one.” But as Surowiecki constantly stresses in the book, crowds are wise only if each individual judgment is <em>uncorrelated</em> with the others. When the judgements are correlated, you don’t have a wise crowd, just a stupid herd.</p>
<div class="footnotes" role="doc-endnotes">
<hr><ol><li id="fn:1" role="doc-endnote">
<p><a href="http://www.sciencemag.org/content/341/6146/647.abstract">Social Influence Bias: A Randomized Experiment, Lev Muchnik et al. Science 341, 647 (2013)</a> <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:2" role="doc-endnote">
<p><a href="http://www.princeton.edu/~mjs3/salganik_watts08.pdf">Leading the herd astray: An experimental study of self-fulfilling prophecies in an artificial cultural market. Matthew J. Salganik and Duncan J. Watts. Social Psychology Quarterly, 71:338-355, 2008.</a> <a href="#fnref:2" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:3" role="doc-endnote">
<p><a href="http://www.sciencemag.org/cgi/content/short/311/5762/854">Experimental study of inequality and unpredictability in an artificial cultural market. Matthew J. Salganik, Peter S. Dodds, and Duncan J. Watts. Science, 311:854-856, 2006.</a> <a href="#fnref:3" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:4" role="doc-endnote">
<p>Indeed, the authors cite Watts&rsquo; work and mention him in the acknowledgements. <a href="#fnref:4" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol></div>
]]></content:encoded>
    </item>
    
    <item>
      <title>HTTP 2.0 marks the end of an era</title>
      <link>http://vivekhaldar.com/articles/http-20-marks-the-end-of-an-era/</link>
      <pubDate>Fri, 09 Aug 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/http-20-marks-the-end-of-an-era/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.chmod777self.com/2013/07/http2-status-update.html&#34;&gt;As James Snell points out&lt;/a&gt;, apart from all the new features like multiplexing and flow control, the biggest visible change in the &lt;a href=&#34;http://http2.github.io/http2-spec/&#34;&gt;HTTP 2.0&lt;/a&gt; spec is that it is now a &lt;em&gt;binary&lt;/em&gt; protocol, not a &lt;em&gt;text-based&lt;/em&gt; one like HTTP 1.1. See his post for an example of the binary stream that represents what would have been a &amp;ldquo;GET&amp;rdquo; request in 1.1.&lt;/p&gt;
&lt;p&gt;With 1.1, you could literally read off what was on the wire and make sense of it, because it was just plain text. Now you&amp;rsquo;ll see a stream of opaque bytes.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://www.chmod777self.com/2013/07/http2-status-update.html">As James Snell points out</a>, apart from all the new features like multiplexing and flow control, the biggest visible change in the <a href="http://http2.github.io/http2-spec/">HTTP 2.0</a> spec is that it is now a <em>binary</em> protocol, not a <em>text-based</em> one like HTTP 1.1. See his post for an example of the binary stream that represents what would have been a &ldquo;GET&rdquo; request in 1.1.</p>
<p>With 1.1, you could literally read off what was on the wire and make sense of it, because it was just plain text. Now you&rsquo;ll see a stream of opaque bytes.</p>
<p>To me, this marks the end of an era. The early web was designed to be legible to humans, at the expense of some machine resources. Plain text was surely not a compact representation, but it was the simplest one. Chatter between machines and <em>humans</em> was as important as chatter among machines. The web has now reached the maturity and scale that the cost equation has flipped.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>The Organic Digital</title>
      <link>http://vivekhaldar.com/articles/the-organic-digital/</link>
      <pubDate>Thu, 01 Aug 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-organic-digital/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://blog.vivekhaldar.com/post/57074714349/the-real-new-aesthetic&#34;&gt;Apropos my last post on the organic new aesthetic&lt;/a&gt;, the new Moto X phone has a number of options for wooden back panels.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../media/57135376182_0.jpg&#34; alt=&#34;&#34;/&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../media/57135376182_1.jpg&#34; alt=&#34;&#34;/&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../media/57135376182_2.jpg&#34; alt=&#34;&#34;/&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://arstechnica.com/gadgets/2013/08/motorolas-big-move-hands-on-with-the-moto-x/&#34;&gt;Pictures are from Arstechnica&amp;rsquo;s review of the Moto X&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://blog.vivekhaldar.com/post/57074714349/the-real-new-aesthetic">Apropos my last post on the organic new aesthetic</a>, the new Moto X phone has a number of options for wooden back panels.</p>
<p><img src="../../media/57135376182_0.jpg" alt=""/></p>
<p><img src="../../media/57135376182_1.jpg" alt=""/></p>
<p><img src="../../media/57135376182_2.jpg" alt=""/></p>
<p><a href="http://arstechnica.com/gadgets/2013/08/motorolas-big-move-hands-on-with-the-moto-x/">Pictures are from Arstechnica&rsquo;s review of the Moto X</a>.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>The Real New Aesthetic</title>
      <link>http://vivekhaldar.com/articles/the-real-new-aesthetic/</link>
      <pubDate>Thu, 01 Aug 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-real-new-aesthetic/</guid>
      <description>&lt;p&gt;I’m fascinated by &lt;a href=&#34;http://new-aesthetic.tumblr.com/about&#34;&gt;the&lt;/a&gt; &lt;a href=&#34;http://www.riglondon.com/blog/2011/05/06/the-new-aesthetic/&#34;&gt;New&lt;/a&gt; &lt;a href=&#34;http://www.wired.com/beyond_the_beyond/2012/04/an-essay-on-the-new-aesthetic/&#34;&gt;Aesthetic&lt;/a&gt;. And yet, I can’t quite put my finger on what exactly it &lt;em&gt;is&lt;/em&gt;. I suppose any aesthetic movement defies a crisp definition. Can you really tell where Impressionism ends and Postimpressionism begins? The crude definition I’m happy with for now is that the New Aesthetic tries to capture the ways in which the world of the digital ethereal spills into the world of the physical material.&lt;/p&gt;
&lt;p&gt;There are problems with pegging your aesthetic to technology though. It moves too fast. For example, the earliest NA pieces were heavily influenced by digitization and quantization, the fundamental process by which physically continuous objects are ingested into the discrete digital universe. The pixel became a common NA artistic element.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I’m fascinated by <a href="http://new-aesthetic.tumblr.com/about">the</a> <a href="http://www.riglondon.com/blog/2011/05/06/the-new-aesthetic/">New</a> <a href="http://www.wired.com/beyond_the_beyond/2012/04/an-essay-on-the-new-aesthetic/">Aesthetic</a>. And yet, I can’t quite put my finger on what exactly it <em>is</em>. I suppose any aesthetic movement defies a crisp definition. Can you really tell where Impressionism ends and Postimpressionism begins? The crude definition I’m happy with for now is that the New Aesthetic tries to capture the ways in which the world of the digital ethereal spills into the world of the physical material.</p>
<p>There are problems with pegging your aesthetic to technology though. It moves too fast. For example, the earliest NA pieces were heavily influenced by digitization and quantization, the fundamental process by which physically continuous objects are ingested into the discrete digital universe. The pixel became a common NA artistic element.</p>
<p><img src="../../media/57074714349_0.jpg" alt=""/></p>
<p><img src="../../media/57074714349_1.jpg" alt=""/></p>
<p>Of course, with the spread of high-resolution retina displays, the pixel is now a quaint artifact of the previous decade.</p>
<p>The NA movement has adapted though. It’s current thrust seems to be moving away from literal digital graphical views, and instead interpreting the ways in which machines read our world for their own purposes, recognizing streets, objects, faces and barcodes.</p>
<p><strong>Retro New Aesthetic</strong></p>
<p>In an ironic twist, the NA has taken a retro turn, trying to bring crafted old-school analog warmth to our cold mass-manufactured digital devices. They are warm organic shells for cold steel.</p>
<p>The prime example is the <a href="http://www.etsy.com/shop/usbtypewriter">USB Typewriter</a>. At nearly a thousand dollars each, they are priced like pieces from an art gallery too.</p>
<p><img src="../../media/57074714349_2.jpg" alt=""/></p>
<p><img src="../../media/57074714349_3.jpg" alt=""/></p>
<p>Will your typewritten words feel more organic if their conduit is one of these <a href="http://oreedesign.com/products/oree-board-maple">wooden keyboards</a>, “made from a single piece of wood to preserve wood grain across shell and keys”?</p>
<p><img src="../../media/57074714349_4.jpg" alt=""/></p>
<p>Or consider the smartphone, our umbilical to the digital matrix, <a href="http://www.theverge.com/2012/10/25/3353350/adzero-ad-bamboo-phone-kieron-scott-woodhouse-jerry-lao">made out of bamboo</a>:</p>
<p><img src="../../media/57074714349_5.jpg" alt=""/></p>
<p>That is going to fit into one’s cabin in the woods so much better than the glass-and-steel iPhone.</p>
<p><strong>What we make, makes us</strong></p>
<p>Where does this go next? The most promising direction seems to be how our physical world is carved, sometimes literally, by our digital understructure. <a href="http://www.ted.com/talks/kevin_slavin_how_algorithms_shape_our_world.html">Kevin Slavin does a wonderful job of explaining that in his TED talk</a>:</p>
<iframe width="640" height="360" src="//www.youtube.com/embed/TDaFwnOiKVE?rel=0" frameborder="0" allowfullscreen></iframe>
<p>But algorithms can carve more than just our physical world. They can shape <em>us</em>, as humans.</p>
<p>If you carry this line of thought to it’s logical conclusion, the next step is inverting the machine-human relationship to where people become <em>parameters</em> for algorithms. <a href="https://www.mturk.com/mturk/welcome">Amazon’s Mechanical Turk is a crude first version of that vision.</a> There are plenty of scenarios where human brain power is cheaper than burning CPU. RPC is the abbreviation for “remote procedure call”, but it could also mean “remote person call.”</p>
<p>Our algorithms shape us, and they shape our culture. Would you really ever have seen that niche documentary or gotten into that indie band if Netflix or Pandora had not recommended them to you? Would you <em>choose</em> them? Is the machine aiding or subverting your free will? If recommendations are perfect and encompass everything, not just movies and songs, what does free will even mean?</p>
<p>Those are the questions the NA has to deal with. It has to define what art is in a world where humans make machines and machines make humans and the digital and physical have no clear boundary.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Empirical Analysis of Programming Language Adoption</title>
      <link>http://vivekhaldar.com/articles/empirical-analysis-of-programming-language-adoption/</link>
      <pubDate>Wed, 31 Jul 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/empirical-analysis-of-programming-language-adoption/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.eecs.berkeley.edu/~lmeyerov/&#34;&gt;Leo Meyerovich&lt;/a&gt; has some hard data on the factors that affect programming language adoption, in a &lt;a href=&#34;http://www.eecs.berkeley.edu/~lmeyerov/projects/socioplt/papers/adoptquant.pdf&#34;&gt;paper&lt;/a&gt; in the upcoming &lt;a href=&#34;http://splashcon.org/2013/program/oopsla-research-papers&#34;&gt;OOPSLA 2013&lt;/a&gt;. For anyone interested in programming languages, the &lt;a href=&#34;http://www.eecs.berkeley.edu/~lmeyerov/projects/socioplt/papers/adoptquant.pdf&#34;&gt;entire paper&lt;/a&gt; is worth reading.&lt;/p&gt;
&lt;p&gt;Some points that jumped out at me:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;extrinsic properties like library availability and social factors are much more important than intrinsic factors like language features&lt;/li&gt;
&lt;li&gt;C++ was by far the hardest language to master. Java, JavaScript and C# were in the middle. Python and Ruby were the easiest.&lt;/li&gt;
&lt;li&gt;There was almost no variation with age in the number of languages one is proficient in. Good data to use against ageism.&lt;/li&gt;
&lt;li&gt;There is a high correlation between enjoying a language and its expressivity.&lt;/li&gt;
&lt;li&gt;Static typing still has a massive PR problem. Only ⅓ of developers find static types valuable, compared with ⅔ who find unit-testing valuable. “This suggests that today’s type systems may err too much on the side of catching bad programs rather than enabling ﬂexible development styles.”&lt;/li&gt;
&lt;li&gt;Performance was ranked the 2nd most important feature (after libraries), but specific language features that help performance ranked much lower, which shows a “gap between the importance of performance and the language features used to achieve it today.”&lt;/li&gt;
&lt;li&gt;Advice for language designers: “Since languages grow niche-by-niche, designers should focus their marketing and library-creation efforts on particular communities. Growth comes by expanding to new domains.” Examples are numpy for scientific programming in Python, and Ruby on Rails for webapps.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Previous related posts:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://www.eecs.berkeley.edu/~lmeyerov/">Leo Meyerovich</a> has some hard data on the factors that affect programming language adoption, in a <a href="http://www.eecs.berkeley.edu/~lmeyerov/projects/socioplt/papers/adoptquant.pdf">paper</a> in the upcoming <a href="http://splashcon.org/2013/program/oopsla-research-papers">OOPSLA 2013</a>. For anyone interested in programming languages, the <a href="http://www.eecs.berkeley.edu/~lmeyerov/projects/socioplt/papers/adoptquant.pdf">entire paper</a> is worth reading.</p>
<p>Some points that jumped out at me:</p>
<ul><li>extrinsic properties like library availability and social factors are much more important than intrinsic factors like language features</li>
<li>C++ was by far the hardest language to master. Java, JavaScript and C# were in the middle. Python and Ruby were the easiest.</li>
<li>There was almost no variation with age in the number of languages one is proficient in. Good data to use against ageism.</li>
<li>There is a high correlation between enjoying a language and its expressivity.</li>
<li>Static typing still has a massive PR problem. Only ⅓ of developers find static types valuable, compared with ⅔ who find unit-testing valuable. “This suggests that today’s type systems may err too much on the side of catching bad programs rather than enabling ﬂexible development styles.”</li>
<li>Performance was ranked the 2nd most important feature (after libraries), but specific language features that help performance ranked much lower, which shows a “gap between the importance of performance and the language features used to achieve it today.”</li>
<li>Advice for language designers: “Since languages grow niche-by-niche, designers should focus their marketing and library-creation efforts on particular communities. Growth comes by expanding to new domains.” Examples are numpy for scientific programming in Python, and Ruby on Rails for webapps.</li>
</ul><p>Previous related posts:</p>
<p><a href="http://blog.vivekhaldar.com/post/18778436817/whither-programming-language-research">Whither programming language research?</a></p>
<p><a href="http://blog.vivekhaldar.com/post/19345320355/innovators-dilemma-in-programming-languages">Innovator’s dilemma in programming languages</a></p>
<p><a href="http://blog.vivekhaldar.com/post/14809797775/how-to-make-your-new-programming-language-successful">How to make your new programming language successful</a></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Native mobile apps are a stopgap</title>
      <link>http://vivekhaldar.com/articles/native-mobile-apps-are-a-stopgap/</link>
      <pubDate>Tue, 30 Jul 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/native-mobile-apps-are-a-stopgap/</guid>
      <description>&lt;p&gt;Do you remember when software came in &lt;em&gt;boxes&lt;/em&gt;, on discs that you had to pop into your computer and &lt;em&gt;install&lt;/em&gt;? When your puny little computer was the entire computational universe for it?&lt;/p&gt;
&lt;p&gt;And then came the network, and everybody and everything else with it, and it was like that software had broken out of the playpen and could now run around the house, the neighborhood, the entire city.&lt;/p&gt;
&lt;p&gt;It was only logical that the element whose entire raison d’etre was connectivity to this new computational universe, the browser, ended up subsuming and becoming the container for all our applications. We moved from apps to &lt;em&gt;webapps&lt;/em&gt;, but by now the &lt;em&gt;web&lt;/em&gt; prefix already seems redundant. The majority of people can function just fine in both the office and the home working completely in the browser.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Do you remember when software came in <em>boxes</em>, on discs that you had to pop into your computer and <em>install</em>? When your puny little computer was the entire computational universe for it?</p>
<p>And then came the network, and everybody and everything else with it, and it was like that software had broken out of the playpen and could now run around the house, the neighborhood, the entire city.</p>
<p>It was only logical that the element whose entire raison d’etre was connectivity to this new computational universe, the browser, ended up subsuming and becoming the container for all our applications. We moved from apps to <em>webapps</em>, but by now the <em>web</em> prefix already seems redundant. The majority of people can function just fine in both the office and the home working completely in the browser.</p>
<p>We’re seeing a similar battle between two types of apps in the mobile world. Native vs webapps. Which is the better fit for mobile? Which should you build first?</p>
<p>What’s different is that connectivity is now the default. Whether your app is contained in a browser or not is less important. What’s more important is the networked computational universe they have access to. Most apps are pretty data frontends to vast remote backends that do most of the heavy lifting.</p>
<p>In a somewhat ironic twist, webapps are getting better and better at working offline, for those rare times when you don’t have a connection. Some have argued that <a href="http://5by5.tv/bigwebshow/95">apps should be designed to function offline first, treating the network as just another progressive enhancement.</a></p>
<p>We’re in the same place with mobile now that we were when GMail was first released on the desktop. The browser showed us a glimmer of what was possible, but it had yet to take on the abstractions and power that would make it a decent platform for real apps. The browsers on mobile devices still don’t have full access to the raw hardware (gyro, camera, various other sensors), but it’s just a matter of time before those differences are erased.</p>
<p>That’s why I think native mobile apps are just a stopgap until mobile browsers catch up.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>The perils of being a knowledge worker</title>
      <link>http://vivekhaldar.com/articles/the-perils-of-being-a-knowledge-worker/</link>
      <pubDate>Tue, 23 Jul 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-perils-of-being-a-knowledge-worker/</guid>
      <description>&lt;p&gt;When I was a graduate student, it struck me as particularly strange that &lt;a href=&#34;http://www.grad.uci.edu/funding/employment%20-%20faculty%20and%20staff/student.html&#34;&gt;we were represented by a union, the Union of Auto Workers (UAW)&lt;/a&gt;. But we were &lt;em&gt;graduate students&lt;/em&gt;! We &lt;em&gt;thought&lt;/em&gt; for a living! We were more than just &lt;em&gt;labor&lt;/em&gt;, weren’t we? We didn’t need &lt;em&gt;collective bargaining&lt;/em&gt;! Turns out, in at least one sense, &lt;a href=&#34;http://blog.vivekhaldar.com/post/4986502776/side-effects-of-phd-programs&#34;&gt;graduate students were just labor&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;That was when I began to sour on the term “knowledge worker.”&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>When I was a graduate student, it struck me as particularly strange that <a href="http://www.grad.uci.edu/funding/employment%20-%20faculty%20and%20staff/student.html">we were represented by a union, the Union of Auto Workers (UAW)</a>. But we were <em>graduate students</em>! We <em>thought</em> for a living! We were more than just <em>labor</em>, weren’t we? We didn’t need <em>collective bargaining</em>! Turns out, in at least one sense, <a href="http://blog.vivekhaldar.com/post/4986502776/side-effects-of-phd-programs">graduate students were just labor</a>.</p>
<p>That was when I began to sour on the term “knowledge worker.”</p>
<p>There is an implicit connotation that knowledge work is higher-skill and higher-status. <a href="http://blog.vivekhaldar.com/post/13241026081/the-programming-assembly-line">Matt Crawford stuck a nail into that notion in his book “Shop Class as Soul Craft”</a>, in which he delved into both why “knowledge work” can be dull and soul-crushing, and working with your hands on physical objects can be extremely cognitively challenging.</p>
<p>As a programmer, most of what I do is challenging and interesting, but once in a while I get the <a href="http://blog.vivekhaldar.com/post/450355817/software-processes-are-software-too">creepy feeling</a> that all I’m doing at my computer is <a href="http://blog.vivekhaldar.com/post/8950163616/gui-vs-cli-operation-vs-expression">pulling levers</a>. Think about how much code you can churn out in a modern IDE by just auto-completing, then think about the frightfully small distance to go before even than can be automated. <a href="http://5by5.tv/quit">Dan Benjamin often mentions on his podcast</a> how easily replaceable Java developers are. “When you’re gone, the floor will part and another Java dev will appear, shrink-wrapped with his chair. They’ll wheel him to your cubicle, take off the shrink-wrap, and business will continue as normal.”</p>
<p><a href="http://blog.vivekhaldar.com/post/12541821721/the-origins-of-silicon-valley">The culture of Silicon Valley can be traced back to Robert Noyce</a>, and <a href="http://www.stanford.edu/class/e140/e140a/content/noyce.html">he was dead-set against unions</a>:</p>
<blockquote>
  <p>As the work force grew at Intel, and the profits soared, labor unions &hellip;made several attempts to organize Intel. Noyce made it known, albeit quietly, that he regarded unionization as a death threat to Intel, and to the semiconductor industry generally. Labor-management battles were part of the ancient terrain of the East. If Intel were divided into workers and bosses, with the implication that each side had to squeeze its money out of the hides of the other, the enterprise would be finished. Motivation would no longer be internal; it would be objectified in the deadly form of work rules and grievance procedures. The one time it came down to a vote, the union lost out by the considerable margin of four to one. Intel&rsquo;s employees agreed with Noyce. Unions were part of the dead hand of the past.</p>
</blockquote>
<p>This ethic carries on today. The idea of unionizing tech workers is still considered oxymoronic. And that is a good sign because the hankering for unionization is a leading indicator that your field is going to get eaten by automation. It means that the only bargaining chip you have left is control over the <em>aggregate supply of labor</em>, not skills or creativity.</p>
<p>For another example, take law. What was once thought of as purely human and beyond the touch of machines is crumbling to automation. <a href="http://www.robotandhwang.com/wp-content/uploads/2013/06/The-Laws-of-Legal-Robotics.pdf">Robot lawyers are creeping into the bottom end (routine contract generation, search and discovery) and gradually climbing up the value chain.</a></p>
<blockquote>
  <p>Claims made about the impact of automation on the law are not entirely speculative, nor
  are they new. E-discovery, which applies modern search technologies to help manage the
  massive amounts of data in litigation, has already seen significant coverage both within and
  beyond the legal industry in the past decade&hellip; However, what may be more novel is that automation is moving increasingly beyond  incremental improvements to tools used by lawyers in the “back office.” Automation more and  more touches the actual work product received by clients, as well as “front office” interfaces that the public uses to access legal services and the legal system at large.</p>
</blockquote>
<p>This isn’t manufacturing and factory workers the author is talking about.</p>
<p>Clearly, the moat of security around being a “knowledge worker” is drying up fast.</p>
<p>At this point, if you are a knowledge worker, you should be wondering whether your job can be saved, and how you’ll know.</p>
<p><a href="http://www.ribbonfarm.com/2013/07/10/you-are-not-an-artisan/">Venkat Rao has a deep meditation on this very topic.</a> Go read the whole thing. The tl;dr is that while we worry about saving the sexy a.k.a creative work from automation, the real opportunity for human gainful employment lies in <a href="http://hci.stanford.edu/publications/2013/CrowdWork/futureofcrowdwork-cscw2013.pdf">dull, unsexy, schlep work around the fringes of what machines do and that are not worth automating</a>. In other words, exploiting the arbitrage when your brain is cheaper than CPU time. The best example of this is <a href="http://journal.code4lib.org/articles/6004">humans doing image processing on Mechanical Turk</a>. The essay is an excellent deconstruction of the platitude that “computers can’t take over creative work.” If you dig deep down, a lot of creative work isn’t creative at all.</p>
<p>A lot of what people think of as creativity is variation within a theme. Computers can actually be pretty good at it. Consider the following three computer-generated pieces of art:</p>
<p><img src="../../media/56222096673_0.png" alt=""/><img src="../../media/56222096673_1.png" alt=""/><img src="../../media/56222096673_2.png" alt=""/></p>
<p>All that intricacy and variation was generated by the following <a href="http://azarask.in/projects/algorithm-ink/#f72ce2a9">code and a sprinkling of randomness</a>:</p>
<pre><code>startshape S
background { b -.5 sat 1}
rule MYSQUARE {
    SQUARE { b -1 }
    SQUARE { s 0.5 }
}
rule MYCIRCLE {
    CIRCLE { b -1 }
    CIRCLE { s 0.5 }
}
rule S {
    X1 { x -.5 y -.5 }
    X1 { x -.5 y .5  }
    X1 { x .5  y -.5 }
    X1 { x .5 y  .5  }
}
rule X1 .13  { MYCIRCLE { b 1} }
rule X1 .13  {
    MYSQUARE{ b 1}
}
rule X1 .74  { S { s .5 b .3}  }
</code></pre>
<p>A good fraction of human creativity follows the same pattern of generative expansion from a small kernel. Is it that hard to imagine a program that generates pleasing web designs and puts web designers out of business? You would need a generative component&ndash;one that would generate a large number of designs given a small spec&ndash;and a filtering component that would whittle them down to a small number of top designs that a human could then select from based on whimsy. The first component is easy to write today. The second component becomes possible if one feeds a large number of “good” web designs to a machine-learning program.</p>
<p>So creativity isn’t going to save knowledge workers. That moat is looking thinner and dryer.</p>
<p>A useful direction to look at is <em>ambiguity</em>. Dealing with ambiguity is the step <em>before</em> creativity. The creative process comes after beating down the ambiguity of what to create and the constraints within which it must exist. In a sense it is <em>meta</em>-creativity. I’m still stumbling through this idea, but my gut tells me that chasing ambiguity is likely to be an effective hedge against machines eating your job. Stay tuned.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>C&#43;&#43;14</title>
      <link>http://vivekhaldar.com/articles/c14/</link>
      <pubDate>Sat, 20 Jul 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/c14/</guid>
      <description>&lt;p&gt;C++ keeps marching down the road to be more higher level and &amp;ldquo;scripty&amp;rdquo;. A couple of features in the next standard, &lt;a href=&#34;http://en.wikipedia.org/wiki/C%2B%2B14&#34;&gt;C++14&lt;/a&gt; that I&amp;rsquo;m really looking forward to:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Lambdas with generic types&lt;/strong&gt;. ML can eat it&amp;rsquo;s heart out. This will become possible in C++:&lt;/p&gt;
&lt;p&gt;auto lambda = [](auto x, auto y) {return x + y;}&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Extending auto to infer the return type of functions.&lt;/strong&gt; Though a part of me still wants to see them just for documentation.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>C++ keeps marching down the road to be more higher level and &ldquo;scripty&rdquo;. A couple of features in the next standard, <a href="http://en.wikipedia.org/wiki/C%2B%2B14">C++14</a> that I&rsquo;m really looking forward to:</p>
<ul><li><p><strong>Lambdas with generic types</strong>. ML can eat it&rsquo;s heart out. This will become possible in C++:</p>
<p>auto lambda = [](auto x, auto y) {return x + y;}</p></li>
<li><p><strong>Extending auto to infer the return type of functions.</strong> Though a part of me still wants to see them just for documentation.</p></li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>How I do email</title>
      <link>http://vivekhaldar.com/articles/how-i-do-email/</link>
      <pubDate>Wed, 17 Jul 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/how-i-do-email/</guid>
      <description>&lt;p&gt;&lt;em&gt;It’s not information overload, it’s filter failure&lt;/em&gt;. &amp;ndash; &lt;a href=&#34;http://blip.tv/web2expo/web-2-0-expo-ny-clay-shirky-shirky-com-it-s-not-information-overload-it-s-filter-failure-1283699&#34;&gt;Clay Shirky&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Nobody tells you how to handle email in a large modern organization. You learn through pain, osmosis and experimentation and end up with your own unique snowflake of subscriptions, filters and settings. Picking an email platform and setup is like voting&amp;ndash;there’s no candidate or party that &lt;em&gt;exactly&lt;/em&gt; matches your views, but you just pick the one that least offends your humanity and decency.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>It’s not information overload, it’s filter failure</em>. &ndash; <a href="http://blip.tv/web2expo/web-2-0-expo-ny-clay-shirky-shirky-com-it-s-not-information-overload-it-s-filter-failure-1283699">Clay Shirky</a></p>
<p>Nobody tells you how to handle email in a large modern organization. You learn through pain, osmosis and experimentation and end up with your own unique snowflake of subscriptions, filters and settings. Picking an email platform and setup is like voting&ndash;there’s no candidate or party that <em>exactly</em> matches your views, but you just pick the one that least offends your humanity and decency.</p>
<p>Working on the assumption that what I’ve ended up with might be useful to others, here’s how I do email. I’m only dealing with incoming messages here. There are many other fine articles on the web delving into the art of crafting an elegant, effective electronic message. Also, this is for work email. Personal email is much easier.</p>
<p>First of all, don’t even call all your email “email.” The term has hidden connotations and expectations of responsivity. The truth is that only a tiny fraction of the messages in your inbox are “email” in the traditional (1990s) sense.</p>
<p><strong>The golden rule</strong></p>
<p>Before we get to nuts and bolts we have to lay down the overarching principle. And that is: <em>your inbox and how you deal with it must reflect your professional goals and priorities</em>. Which is to say that you have to categorize your email by where it falls in your professional pecking order. Usually, it goes something like this, from most important to least:</p>
<ul><li><strong>messages where I am explicitly on the “To:” line</strong>. This means it impacts my day-to-day work, helps me make progress on what I’m doing right now, or I’m expected to respond in some way. The response could be simply chiming in with an opinion that others will take into consideration, or a straight answer to a straight question, a clear decision, or&hellip; something else. If it’s something else, then email might help you get to the bottom of it, but you will usually need something stronger, like IM, video chat, or even a face-to-face to truly resolve it.</li>
<li><strong>messages to my team’s mailing list</strong>. The hub of most modern teams’ day-to-day heartbeat is their mailing list. I’m not going to be explicitly on the “To:” line here, but the expectation is that every team member peruses this at least a couple of times a day to stay abreast of what’s going on in their immediate professional environment. Is the build broken? Did someone send out a new design for review? Look at this massive change coming down the pipe!</li>
<li><strong>messages to the mailing lists of teams that my team interacts with.</strong> These might be teams whose work you build upon, or those who build on yours, company-wide infrastructure, ops etc. Occasional perusal (a couple of times a week) is all you need here.</li>
<li><strong>everything else</strong>. This is just organizational atmosphere. Usually not even technical. And if something really big happens, you’ll probably hear about it before reading the email.</li>
</ul><p><strong>Rules of the road</strong></p>
<p>There are a couple of other ground rules if you are to stay sane while dealing with the hose of modern email:</p>
<ul><li><strong>email is a terrible place for a todo list</strong>. I really don’t get how one can tack on GTD to email. An email is <em>not</em> actionable. Once you read it and understand it, you might end up with a clear action, but your inbox is not the place to shove it.</li>
<li><strong>email is not the place where other people get to create work for you to do</strong>. I suspect this is the primary reason everyone is so stressed out by email. If every message is a chunk of work falling on you, no wonder it drives you mad. It took me a long time to realize this. The work you are supposed to do is discussed, clarified and assigned via other channels, usually chats with your manager. Email is for carrying out those predetermined responsibilities. Random people do not get to put tasks on your todo-list by simply sending you an email. You  must hold a steady stance with this. If they do, you have to push back, politely, and clarify the situation through other channels. (I suppose an exception is if you are in some sort of customer-support/CRM role.)</li>
</ul><p><strong>Implementation</strong></p>
<p>I use GMail, so everything below is going to be in terms of that. It’s pretty simple really. I have filters for each of the organizational circles described above. It’s important to be fluent with <a href="https://support.google.com/mail/answer/6594?hl=en">GMail’s handy keyboard shortcuts</a> so that you can switch between views quickly.</p>
<p>For example, everything to “my-team-list@foo.com” gets labeled “myteam”. I can quickly switch to that view by pressing “gl” followed by the first few letters of “myteam.”</p>
<p>The unread counts mean nothing to me. Everything is a stream. Some messages go by unread because I get what I need from the subject line. The only exception is below.</p>
<p>The view I use for the innermost circle (i.e. messages explicitly to me) is the one where I spend the majority of my inbox time. The filter is use for that is <em>“to:me is:unread newer_than:7d”</em>, which gives me all messages explicitly to me sent in the last week that are unread. If I want blinders to just zoom in, I can drill down to just “newer_than:1d” for just today’s messages. Or I can use a larger number of days to zoom out.</p>
<p>Go do email. Don’t stress.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Balance</title>
      <link>http://vivekhaldar.com/articles/balance/</link>
      <pubDate>Wed, 10 Jul 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/balance/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;../../media/55117706302_0.jpg&#34; alt=&#34;&#34;/&gt;&lt;/p&gt;
&lt;p&gt;I recently turned thirty-five. I never thought I’d live to see the day. By that, I don’t mean that I expected to die by now, but that even in my twenties, the number 35 seemed too far to fathom or think about or impact my twenty-something day-to-day.&lt;/p&gt;
&lt;p&gt;I also recently became a father. Becoming a parent is a singularity-like event. Those not there have no idea what it’s like. Those past the point of no return can’t get the message back out. It instantly changes the world you live in and the person you thought you were and what’s important and precious.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><img src="../../media/55117706302_0.jpg" alt=""/></p>
<p>I recently turned thirty-five. I never thought I’d live to see the day. By that, I don’t mean that I expected to die by now, but that even in my twenties, the number 35 seemed too far to fathom or think about or impact my twenty-something day-to-day.</p>
<p>I also recently became a father. Becoming a parent is a singularity-like event. Those not there have no idea what it’s like. Those past the point of no return can’t get the message back out. It instantly changes the world you live in and the person you thought you were and what’s important and precious.</p>
<p>That’s how the issue of “work-life balance” went from being funny stuff old people talked about to front and center in my life. (I put the term in quotes because I hate it. But it has entered the parlance, so I’ll stick with it.) Here I just want to commit some thoughts to blog (in other words, a rant). I won’t pretend to offer any solutions, just observations.</p>
<p>First things first: this is not an issue for <a href="http://www.theatlantic.com/business/archive/2012/06/single-people-deserve-work-life-balance-too/259071/">single people</a>, and even couples without kids. Sorry. Let’s not even dilute the debate by including them in it. For them, achieving work-life balance is a nice-to-have, like that fancy car or exotic vacation. Sure things would be better with it, but it’s not exactly crucial. If the twenty-something me waxed eloquent about work-life balance to the present me, I’d smack him on the head. Your own self, or even you plus a partner, have infinite control over the contours of your time. An adult partner has way more flexibility in the timing and quantity of care and feeding, emotional or physical, they need from you. A baby, on the other hand, needs what it needs when it needs it, full stop. Needing to cancel Friday night club hopping because you had to crunch on your project is not in the same league as missing your toddler’s doctor’s appointment.</p>
<p><a href="http://www.theatlantic.com/magazine/print/2012/07/why-women-still-cant-have-it-all/309020/">Ann-Marie Slaughter has pretty much written the last word on the topic in her Atlantic piece, <em>Why Women Still Can’t Have It All</em>.</a> If you care about this issue at all, you have to read that it its entirety, and then let it sit in your head for a few days. It is insightful, thoughtful, and <em>comprehensive</em>.</p>
<p>But the debate is still largely gendered. Maternity leaves are much longer than paternity leaves. Mothers stressing out about their babies is considered normal, dads doing the same is considered saintly. Why the low standard for fathers? Only lately have I started reading about <a href="http://www.thenewdad.org/">working dads</a> and how this issue looks through the <a href="http://www.businessweek.com/printer/articles/121190-alpha-dads-men-get-serious-about-work-life-balance">lens</a> of <a href="http://www.theatlantic.com/magazine/archive/2013/07/the-masculine-mystique/309401/?single_page=true">fatherhood</a>. The signs are encouraging. I see more dads around me “flaunt” their fatherhood more openly, and be less shy about openly declaring that they’ll take care of a certain piece of work <em>after</em> they’ve attended their kid’s school play.</p>
<p>I see corporate policies and environments, at least in the small tech echo chamber I inhabit, moving in the right direction. Managers are supportive of parents and their need for flexible schedules. Usually it is the parents who are hard on themselves, and can never outrun the feeling that they’re shortchanging both work and family.</p>
<p>There is an “invisible hand” in the modern workplace that values <em>velocity</em> above all else (and <a href="http://blog.vivekhaldar.com/post/27415471917/on-vagueness">I can understand why</a>), and creates pressure for more, more, more without any one individual or manager breathing down your neck. The paradox is that every single individual one interacts with at work might be reasonable in their expectations, yet, in aggregate, expectations always build up to where they’re overwhelming. The problem with velocity is that, when cognitive bandwidth is constrained (which is a fancy way of saying “when your brain is fried”) <em>activity</em> and just dumb number of hours put in is mistaken as a substitute.</p>
<p>To break out of this, one has to judge the value of work by the result and impact achieved, not the hours put in, or where they were put in. And that is easier said than done. A big part of modern work is defining what the work is. Time is thought of as a combustible resource&ndash;put more in, get more out&ndash;even if that has now shown to be not true for knowledge workers. Here’s a thought experiment: if you or your team achieved all your goals for the quarter in the first two months, could you all take the remaining month off? You’re probably laughing at me because the answer is “of course not, we’d just find <em>more</em> work to do in that extra month.” But <a href="http://blog.vivekhaldar.com/post/13855406981/the-0-1-developer">10x developers</a> don’t pull off their magic by working long hours. They do it by figuring out what’s important and focusing on that.</p>
<p><a href="http://blog.vivekhaldar.com/post/36280004299/a-programmers-thanksgiving">I thoroughly enjoy my work</a>. I don’t even usually think of it as work, and I know I’m fortunate in that respect. Stepping away from it is a struggle. But when I look back over the last few years, the times that stand out the most are my travels with my family. Everything else, work or not, pales in comparison. If I looked back again in a few years, what would I regret more: not putting in enough hours for that project (and maybe pulling down some more money), or missing my son’s first tooth or first steps or first words?</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>  &#34;We don&#39;t do email, email does us&#34;
  </title>
      <link>http://vivekhaldar.com/articles/we-dont-do-email-email-does-us/</link>
      <pubDate>Mon, 08 Jul 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/we-dont-do-email-email-does-us/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.ics.uci.edu/~gmark/&#34;&gt;Gloria Mark&lt;/a&gt; et al have done the unthinkable: empirically observed people working in a modern environment &lt;em&gt;without email&lt;/em&gt; for a &lt;em&gt;whole work week:&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;We report on an empirical study where we cut off email  usage for five workdays for 13 information workers in an organization.&lt;/strong&gt; &amp;hellip;Our results show that without email, people multitasked less and had a longer
  task focus, as measured by a lower frequency of shifting  between windows and a longer duration of time spent  working in each computer window. Further, we directly  measured stress using wearable heart rate monitors and  found that stress, as measured by heart rate variability, was
  lower without email. Interview data were consistent with  our quantitative measures, as participants reported being  able to focus more on their tasks.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://www.ics.uci.edu/~gmark/">Gloria Mark</a> et al have done the unthinkable: empirically observed people working in a modern environment <em>without email</em> for a <em>whole work week:</em></p>
<blockquote>
  <p><strong>We report on an empirical study where we cut off email  usage for five workdays for 13 information workers in an organization.</strong> &hellip;Our results show that without email, people multitasked less and had a longer
  task focus, as measured by a lower frequency of shifting  between windows and a longer duration of time spent  working in each computer window. Further, we directly  measured stress using wearable heart rate monitors and  found that stress, as measured by heart rate variability, was
  lower without email. Interview data were consistent with  our quantitative measures, as participants reported being  able to focus more on their tasks.</p>
</blockquote>
<p>The results are not surprising, but it&rsquo;s good to have solid evidence to back what many suspected. What is astounding is that the experiment got carried out at all.</p>
<p><a href="http://www.ics.uci.edu/~gmark/Home_page/Research_files/CHI%202012.pdf">Full paper here.</a>.</p>
<p>(The quote in the title is by Sherry Turkle, taken from the paper.)</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Waiting faster</title>
      <link>http://vivekhaldar.com/articles/waiting-faster/</link>
      <pubDate>Sat, 06 Jul 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/waiting-faster/</guid>
      <description>&lt;p&gt;This is a follow-up from my post about &lt;a href=&#34;http://blog.vivekhaldar.com/post/54192213683/the-laziness-of-synchronous-work&#34;&gt;synchronous work&lt;/a&gt;. (There was some &lt;a href=&#34;https://news.ycombinator.com/item?id=5963161&#34;&gt;interesting discussion on Hacker News&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://monkey.org/~marius/&#34;&gt;Marius Eriksen&lt;/a&gt; &lt;a href=&#34;https://twitter.com/marius/status/351047985607622656&#34;&gt;tweeted me&lt;/a&gt; the &lt;a href=&#34;http://research.microsoft.com/en-us/people/thoare/concurrentprogramswaitfaster.ppt&#34;&gt;slides for a talk&lt;/a&gt; by &lt;a href=&#34;http://research.microsoft.com/en-us/people/thoare/&#34;&gt;Tony Hoare&lt;/a&gt; that talks about how concurrent programs see reduced wait times, or &amp;ldquo;wait faster.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;The money slide:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../media/54777370452_0.jpg&#34; alt=&#34;&#34;/&gt;&lt;/p&gt;
&lt;p&gt;(At this point you should be wondering what the probability distribution for arrival time is. That&amp;rsquo;s explained in the very next slide.)&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>This is a follow-up from my post about <a href="http://blog.vivekhaldar.com/post/54192213683/the-laziness-of-synchronous-work">synchronous work</a>. (There was some <a href="https://news.ycombinator.com/item?id=5963161">interesting discussion on Hacker News</a>.)</p>
<p><a href="http://monkey.org/~marius/">Marius Eriksen</a> <a href="https://twitter.com/marius/status/351047985607622656">tweeted me</a> the <a href="http://research.microsoft.com/en-us/people/thoare/concurrentprogramswaitfaster.ppt">slides for a talk</a> by <a href="http://research.microsoft.com/en-us/people/thoare/">Tony Hoare</a> that talks about how concurrent programs see reduced wait times, or &ldquo;wait faster.&rdquo;</p>
<p>The money slide:</p>
<p><img src="../../media/54777370452_0.jpg" alt=""/></p>
<p>(At this point you should be wondering what the probability distribution for arrival time is. That&rsquo;s explained in the very next slide.)</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>NPS</title>
      <link>http://vivekhaldar.com/articles/nps/</link>
      <pubDate>Tue, 02 Jul 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/nps/</guid>
      <description>&lt;p&gt;I don&amp;rsquo;t think it&amp;rsquo;s a stretch to call the National Park System &lt;a href=&#34;http://www.nps.gov/americasbestidea/&#34;&gt;America&amp;rsquo;s best idea&lt;/a&gt;. Some of my most cherished memories are of trips to national parks.&lt;/p&gt;
&lt;p&gt;And part of what makes them great are the rangers. Their love for the parks shines through, and that is what makes them want to make every visitor love the parks just as much as they do. I still remember the joy bubbling in a ranger almost as much as the geysers in &lt;a href=&#34;http://www.nps.gov/yell/index.htm&#34;&gt;Yellowstone&lt;/a&gt; as he gave us a tour.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I don&rsquo;t think it&rsquo;s a stretch to call the National Park System <a href="http://www.nps.gov/americasbestidea/">America&rsquo;s best idea</a>. Some of my most cherished memories are of trips to national parks.</p>
<p>And part of what makes them great are the rangers. Their love for the parks shines through, and that is what makes them want to make every visitor love the parks just as much as they do. I still remember the joy bubbling in a ranger almost as much as the geysers in <a href="http://www.nps.gov/yell/index.htm">Yellowstone</a> as he gave us a tour.</p>
<p>So reading this account (in <a href="http://thirtysomethingadventures.tumblr.com/post/53277680902/how-i-found-myself-working-for-nps-part-i-getting">two</a> <a href="http://thirtysomethingadventures.tumblr.com/post/53932665642/how-i-found-myself-working-for-nps-part-ii-foot-in-the">parts</a>) of how one ranger got the job was an interesting inside glimpse.</p>
<blockquote>
  <p>&hellip; “ranger” is lots of people’s dream job. (See last year’s Outside magazine jobs issue—this is referenced no fewer than three times.) Second, as far as I can tell, there is no “standard” way to come into rangering. This may be changing as there are starting to be university degree programs working in conjunction with NPS to funnel people into the profession via a specific college track, but right now literally everyone I know got here a different way.</p>
</blockquote>
]]></content:encoded>
    </item>
    
    <item>
      <title>The laziness of synchronous work</title>
      <link>http://vivekhaldar.com/articles/the-laziness-of-synchronous-work/</link>
      <pubDate>Sat, 29 Jun 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-laziness-of-synchronous-work/</guid>
      <description>&lt;p&gt;TL;DR:
Working synchronously &lt;em&gt;by default&lt;/em&gt; (as opposed to &lt;a href=&#34;http://blog.vivekhaldar.com/post/26291176846/working-asynchronously&#34;&gt;asynchronous working&lt;/a&gt;) is lazy and unproductive.&lt;/p&gt;
&lt;p&gt;Imagine that in the course of your day-to-day coding, you run into a problem that a teammate could help you out with. You revolve your chair around with a flick of your toes, look across your cubicle farm towards them. Most folks have their giant ear-muffler headphones on, the universal sign for “do not disturb, I’m trying to get stuff done.” But it’s your lucky day! The person you want to talk to is not wearing headphones! You walk over and present them with your difficulty.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>TL;DR:
Working synchronously <em>by default</em> (as opposed to <a href="http://blog.vivekhaldar.com/post/26291176846/working-asynchronously">asynchronous working</a>) is lazy and unproductive.</p>
<p>Imagine that in the course of your day-to-day coding, you run into a problem that a teammate could help you out with. You revolve your chair around with a flick of your toes, look across your cubicle farm towards them. Most folks have their giant ear-muffler headphones on, the universal sign for “do not disturb, I’m trying to get stuff done.” But it’s your lucky day! The person you want to talk to is not wearing headphones! You walk over and present them with your difficulty.</p>
<p>At this point one of two things can happen. Either they know <em>exactly</em> how to solve your problem, right off the top of their head, or they don’t know or can only give you vague pointers. The former is <em>much</em> less likely than the latter. In the first case you go back to work, zipping along your task, the obstacle a distant memory in your rear view mirror. Your teammate decides, what the hell, might as well look at email now, and maybe gets back to work an hour later.</p>
<p>Zap to an alternative universe.</p>
<p>You decide to actually think about it, and dig around yourself a little bit before turning to your teammate for help. You know that if you’re truly up against a wall someone from your team will be able to help you. So you dig further into the code and into the docs. Maybe you learn about parts of the codebase you didn’t know much about. Maybe you find code smells and make notes to come back and clean it up. Maybe you write some <a href="http://blog.vivekhaldar.com/post/40018875700/scaling-communication-email-vs-shared-documents">docs</a> about how to solve the problem, so that the next person has an easier time. And in the very worst case, if you absolutely must ask, your question went from “How do I do X?” to “I want to do X. I dug around and tried A, B, and C, but none of those seem to work. What am I missing?” And the latter usually elicits much kinder responses than the former.</p>
<p>Why do I spill so much virtual ink? The first scenario is typically what people have in mind when they talk about the advantages of a team working in close physical proximity. It’s a mode of working where <em><a href="http://blog.vivekhaldar.com/post/26291176846/working-asynchronously">synchronicity</a></em> is the <em>default</em>. The thing is: it’s a myth. Usually when you put 10 programmers together in a room you get 10 people with giant headphones communicating with each other largely through instant messaging and email.</p>
<p>There is a limited and rarely occurring set of circumstances when <a href="http://blog.vivekhaldar.com/post/46019327375/meetings-are-mutexes">strong synchronicity</a> is required and productive. The best example I can think of is responding to a live production emergency that spans multiple systems and requires the expertise and input of multiple people. Another is in the early stages of design, when things are ambiguous. That style should be recognized as a powerful weapon to be used only when absolutely required.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Mindfulness sells</title>
      <link>http://vivekhaldar.com/articles/mindfulness-sells/</link>
      <pubDate>Sat, 22 Jun 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/mindfulness-sells/</guid>
      <description>&lt;p&gt;Wired takes &lt;a href=&#34;http://www.wired.com/business/?p=82267&#34;&gt;a deep look at the rising uptake of meditation and mindfulness in Silicon Valley tech companies&lt;/a&gt;, and comes away somewhat discomfited at the way ancient Eastern philosophy is being remarketed for the privileged technorati. The whole piece is worth reading. I can certainly second the trend with my own observation.&lt;/p&gt;
&lt;p&gt;The West has &lt;em&gt;always&lt;/em&gt; had a fascination with Eastern philosophy. Remember the whole psychedelic phase of the Beatles? It has seemed like an exotic gateway into a realm not usually part of Western discourse and life. And especially once people&amp;rsquo;s material needs were well met in developed countries, they naturally turned towards more spiritual questions.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Wired takes <a href="http://www.wired.com/business/?p=82267">a deep look at the rising uptake of meditation and mindfulness in Silicon Valley tech companies</a>, and comes away somewhat discomfited at the way ancient Eastern philosophy is being remarketed for the privileged technorati. The whole piece is worth reading. I can certainly second the trend with my own observation.</p>
<p>The West has <em>always</em> had a fascination with Eastern philosophy. Remember the whole psychedelic phase of the Beatles? It has seemed like an exotic gateway into a realm not usually part of Western discourse and life. And especially once people&rsquo;s material needs were well met in developed countries, they naturally turned towards more spiritual questions.</p>
<p>Today, you see it most in what I like to call “yoga culture”. Every yoga instructor has their own hour-long unique pill of exercise, poses and pop spiritual advice. As an Indian the very first thing that strikes me as amusing about it is the rampant mispronunciation of Sanskrit and Hindi words and pose-names. It reaches a peak when someone decides to recite an entire <a href="http://en.wikipedia.org/wiki/Shloka">shlok</a> in an Anglicized accent. All this is neatly ensconced a high-end retail environment. There is the constant undertone that buying these $80 yoga pants will make you a better yogi and nudge you along the path to self actualization. This strategy has worked wonders for Lululemon Athletica, rocketing them to the nearly the top of <a href="http://seekingalpha.com/article/289542-ranking-the-top-20-u-s-chains-by-highest-retail-sales-per-square-foot">retailers ranked by sales per square foot per quarter</a>.</p>
<p>It&rsquo;s the same point the article makes: that being more mindful is a means to becoming a more productive worker, not an end unto itself. Somehow it&rsquo;s hard to shake the feeling that all this eastern philosophy is an elaborate ruse to just sell us more stuff, spiritual or physical.</p>
<p>But there is a genuine need though. People feel stressed and anxious and beleaguered, and want to find a way through it. Like the doctor said to Don Draper, &ldquo;people will do anything to alleviate their anxiety.&rdquo;</p>
<p>To me the reason it all feels fake is that it&rsquo;s all happy and pleasant. In Indian mythology, the idea of awakening or enlightened is inextricably tied to penance and suffering. Getting there is painful and hard work. The journey of every mythical hero has a phase where he or she realizes that to break through the barrier before them they need to go through a period of deep introspection and pain. The Hindi word is <a href="http://en.wikipedia.org/wiki/Tapas_(Sanskrit)"><em>tapasya</em></a>. (The two most common places for doing this are the woods, or for the really next level, the Himalayas. The Himalayas are to every other mountain range what a Ferrari is to a Ford Focus. You really have to see them.)</p>
<p>When you strip all that hard work and pain away, it loses all it’s potence. It becomes just another feel-good drug, putting you on just another <a href="http://en.wikipedia.org/wiki/Dukkha">cycle of suffering</a>.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>CPU pipelines and the structure of work</title>
      <link>http://vivekhaldar.com/articles/cpu-pipelines-and-the-structure-of-work/</link>
      <pubDate>Fri, 07 Jun 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/cpu-pipelines-and-the-structure-of-work/</guid>
      <description>&lt;p&gt;I want to expand on what I meant in the following tweet a few days ago.&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p&gt;The design of CPU pipelines can teach us some deep things about how work should be structured.&lt;/p&gt;— Vivek Haldar (@vivekhaldar) &lt;a href=&#34;https://twitter.com/vivekhaldar/status/333973932296261632&#34;&gt;May 13, 2013&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;//platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;&lt;p&gt;I think the modern CPU is an excellent parable for the nature of modern work itself. In a sense, it is the purest expression of Taylorism.&lt;/p&gt;
&lt;p&gt;(Prerequisite: none of this will make sense without a basic knowledge of computer architecture and how CPUs are structured at a high level as a series of stages (called &lt;a href=&#34;http://en.wikipedia.org/wiki/Pipeline_(computing)&#34;&gt;pipelines&lt;/a&gt;). The canonical reference is &lt;a href=&#34;http://www.amazon.com/Computer-Architecture-Quantitative-Approach-Edition/dp/0123704901&#34;&gt;Computer Architecture, by Hennessy and Patterson&lt;/a&gt;.)&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I want to expand on what I meant in the following tweet a few days ago.</p>
<blockquote class="twitter-tweet"><p>The design of CPU pipelines can teach us some deep things about how work should be structured.</p>— Vivek Haldar (@vivekhaldar) <a href="https://twitter.com/vivekhaldar/status/333973932296261632">May 13, 2013</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script><p>I think the modern CPU is an excellent parable for the nature of modern work itself. In a sense, it is the purest expression of Taylorism.</p>
<p>(Prerequisite: none of this will make sense without a basic knowledge of computer architecture and how CPUs are structured at a high level as a series of stages (called <a href="http://en.wikipedia.org/wiki/Pipeline_(computing)">pipelines</a>). The canonical reference is <a href="http://www.amazon.com/Computer-Architecture-Quantitative-Approach-Edition/dp/0123704901">Computer Architecture, by Hennessy and Patterson</a>.)</p>
<ol><li><p>The goals of structuring the work are efficiency (utilizing resources optimally), latency (reduce the time it takes from start to finish) and throughput (maximize the work completed per unit time).</p></li>
<li><p>In order to achieve these goals, work is structured into a sequence of <em>stages</em>, with each stage performing a narrow, well-defined sub-task that is relatively easy and simple.</p></li>
<li><p>Work should not pile up. Inventory is anathema. There is a well-defined and <em>bounded</em> buffer between stages to hold intermediate results.</p></li>
<li><p>The latency and throughput is limited by the slowest stage in the pipeline. Thus, it is important that each stage be roughly equal in complexity and complete work in about the same time. This also helps to minimize temporary inventory (3).</p></li>
<li><p>Specialization is key. As a corollary of all the above points, each stage is naturally pushed to a narrow specialization.</p></li>
<li><p>Complexity in the overall system is acceptable, and indeed often inevitable because the above rules gravitate naturally towards a deep pipeline with a large number of stages, as long as each stage is simple.</p></li>
</ol>
]]></content:encoded>
    </item>
    
    <item>
      <title>Backup in the age of the cloud</title>
      <link>http://vivekhaldar.com/articles/backup-in-the-age-of-the-cloud/</link>
      <pubDate>Mon, 03 Jun 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/backup-in-the-age-of-the-cloud/</guid>
      <description>&lt;p&gt;Since I &lt;a href=&#34;http://blog.vivekhaldar.com/post/44847040499/moving-to-chrome-os&#34;&gt;moved entirely to ChromeOS&lt;/a&gt; I’ve had to rethink &lt;a href=&#34;http://blog.vivekhaldar.com/post/23021969189/my-setup&#34;&gt;my backup strategy&lt;/a&gt;. I’ve gone from having beefy machines with tons of local storage to not-so-beefy-yet-capable machines where local storage is small, irrelevant and used as a secondary cache.&lt;/p&gt;
&lt;p&gt;The “golden copy” of my data used to be on local disk, remote copies being backups. Now things are a little different. In a cloud world, the golden copy is in the cloud. (In my specific case, “disk” is now Google Drive.) Files are not saved to local disk, they are &lt;a href=&#34;https://chrome.google.com/webstore/detail/save-to-google-drive/gmbmikajjgmnabiglmofipeabaddhgne?hl=en&#34;&gt;saved directly to the cloud&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Since I <a href="http://blog.vivekhaldar.com/post/44847040499/moving-to-chrome-os">moved entirely to ChromeOS</a> I’ve had to rethink <a href="http://blog.vivekhaldar.com/post/23021969189/my-setup">my backup strategy</a>. I’ve gone from having beefy machines with tons of local storage to not-so-beefy-yet-capable machines where local storage is small, irrelevant and used as a secondary cache.</p>
<p>The “golden copy” of my data used to be on local disk, remote copies being backups. Now things are a little different. In a cloud world, the golden copy is in the cloud. (In my specific case, “disk” is now Google Drive.) Files are not saved to local disk, they are <a href="https://chrome.google.com/webstore/detail/save-to-google-drive/gmbmikajjgmnabiglmofipeabaddhgne?hl=en">saved directly to the cloud</a>.</p>
<p>How should backup strategies and techniques change given the transition to the cloud?</p>
<p>The answer has to be motivated by the question: why do you need the backup? That sounds like a silly question, because, well, obviously you need the backup to avoid data loss in the event of losing one copy. But the deeper question is about the <em>risk profile</em> of your data’s copies.</p>
<p>In the large-local-disk scenario, the remote backup was protection against the array of physical risks associated with local storage&ndash;disk failure, accidental erasure, loss of laptop. In the cloud world, the risk profile is very different. If you’re using any decent provider, the chances of data loss in cloud storage are negligible. For one, cloud storage options usually employ some degree of redundancy. And more importantly, there is an an army of ops folks carrying pagers tending to the care and feeding of the machines and systems that contain your precious data. All this means that the chance of data loss is much, much smaller than local disk. Actual data integrity has taken a giant leap with cloud storage.</p>
<p>So what <em>is</em> the risk? It shifts, from loss of data to <em>loss of access</em> to data. They sound like the same thing, but the difference is that data loss is permanent, but loss of access may be temporary. There might be service outages. Your wifi or ISP might go down. You might forget your password. The cloud company might go out of business and you might not be able to get your data out in time.</p>
<p>How do you mitigate against these risks of cloud storage? Periodically make a full local copy! We’ve made a full reversal. From local disk as golden, to local disk as backup. This is progress overall, because I think the probability of data loss in a cloud world is much, much smaller, and also the entire setup is much simpler. There is also the incremental but very nice benefit of much higher chances of survival of non-backed-up data (that is saved to the golden source but not to backup yet), because the probability of your single disk failing is much higher than that of a cloud service losing your data.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>The One Thing</title>
      <link>http://vivekhaldar.com/articles/the-one-thing/</link>
      <pubDate>Wed, 22 May 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-one-thing/</guid>
      <description>&lt;p&gt;The first HTTP connection was made in November 1989 (Tim Berners-Lee had &lt;a href=&#34;http://www.w3.org/History/1989/proposal.html&#34;&gt;first proposed the idea in March of that year&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;The idea of hypertext was also an active research area at the time. Look at the proceedings for the &lt;a href=&#34;http://www.interaction-design.org/references/conferences/proceedings_of_acm_hypertext_89_conference.html&#34;&gt;ACM Hypertext Conference 1989&lt;/a&gt;, and you will find a plethora of papers delving into what the structure of hypertext documents should be, how they should be used, how linking should work etc. Going forward and backward through other years of the same conference will show you more and more variations and details on all aspects of hypermedia.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The first HTTP connection was made in November 1989 (Tim Berners-Lee had <a href="http://www.w3.org/History/1989/proposal.html">first proposed the idea in March of that year</a>).</p>
<p>The idea of hypertext was also an active research area at the time. Look at the proceedings for the <a href="http://www.interaction-design.org/references/conferences/proceedings_of_acm_hypertext_89_conference.html">ACM Hypertext Conference 1989</a>, and you will find a plethora of papers delving into what the structure of hypertext documents should be, how they should be used, how linking should work etc. Going forward and backward through other years of the same conference will show you more and more variations and details on all aspects of hypermedia.</p>
<p>HTTP and HTML bucked several established ideas that the academic community was convinced were good ones, if only they could find neat implementations of them. His crude implementation must have looked primitive for several reasons. For example, links were not brokered by some central entity, and there was no guarantee of them actually working. They could be incorrect, or simply break if the target moved. Quotations did not automatically preserve links back to the source. And so on. Of course, it was these very characteristics that enabled it to <em>scale</em> and spread without any central points of failure or bottlenecks.</p>
<p>The <a href="http://www.wired.com/wired/archive/3.06/xanadu_pr.html">doomed</a> <a href="http://xanadu.com/xanasimp">Project Xanadu</a> tried to bring several of these ideas to life, but failed, arguably under the weight of its own complexity. Consider the idea of canonicalizing the act of copying, and what a strain it was both conceptually and in terms of implementation and resource consumption:</p>
<blockquote>
  <p>Xanadu was to consist of easy-to-edit documents. Links would be available both to and from any part of any document. Anybody could create a link, even in a document they did not write. And parts of documents could be quoted in other documents without copying. The idea of quoting without copying was called transclusion, and it was the heart of Xanadu&rsquo;s most innovative commercial feature - a royalty and copyright scheme. Whenever an author wished to quote, he or she would use transclusion to &ldquo;virtually include&rdquo; the passage in his or her own document.</p>
  <p>Nelson was frequently frustrated by his failure to convince casual questioners of the importance of his transclusion idea. Transclusion functions like the &ldquo;make alias&rdquo; command familiar to Macintosh users. An alias works as a fully functioning copy of a file or application, but it is really just a pointer, or virtual copy. Click on the virtual copy, and the original file or application begins to run.</p>
  <p>The key to the Xanadu copyright and royalty scheme was that literal copying was forbidden in the Xanadu system. When a user wanted to quote a portion of document, that portion was transcluded. With fee for every reading.</p>
  <p>Transclusion was extremely challenging to the programmers, for it meant that there could be no redundancy in the grand Xanadu library. Every text could exist only as an original. Every user in the world would have to have instant access to the same underlying collection of documents.</p>
</blockquote>
<p>Of all the design axes of a hypermedia system, only two ended up mattering: simplicity, and scalability.</p>
<p>Of course, hindsight is perfect. But it takes courage and vision to neglect all the bustling activity in a field and pull out a tiny sliver of it&ndash;the right sliver.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Games as a hook into CS</title>
      <link>http://vivekhaldar.com/articles/games-as-a-hook-into-cs/</link>
      <pubDate>Thu, 16 May 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/games-as-a-hook-into-cs/</guid>
      <description>&lt;p&gt;From the &lt;a href=&#34;http://cacm.acm.org/magazines/2013/5/163773-human-centered-computing/abstract&#34;&gt;same article&lt;/a&gt; I was talking about in my previous post, a fascinating look at how videogames are a hook into CS, but it’s not &lt;em&gt;how much&lt;/em&gt; you play games, but &lt;em&gt;how&lt;/em&gt; you play them, that affects whether it steers you towards CS:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;&lt;a href=&#34;http://betsydisalvo.com/&#34;&gt;Betsy DiSalvo&lt;/a&gt; (now an assistant professor at Georgia Tech) starts from an interesting observation. Many computer scientists (who are mostly white or Asian, and male) say they became interested in computing because of video games. No demographic group plays more video games than African-American and Hispanic teenagers and men. But few African-American and Hispanic males become computer scientists. Why was that?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>From the <a href="http://cacm.acm.org/magazines/2013/5/163773-human-centered-computing/abstract">same article</a> I was talking about in my previous post, a fascinating look at how videogames are a hook into CS, but it’s not <em>how much</em> you play games, but <em>how</em> you play them, that affects whether it steers you towards CS:</p>
<blockquote>
  <p><a href="http://betsydisalvo.com/">Betsy DiSalvo</a> (now an assistant professor at Georgia Tech) starts from an interesting observation. Many computer scientists (who are mostly white or Asian, and male) say they became interested in computing because of video games. No demographic group plays more video games than African-American and Hispanic teenagers and men. But few African-American and Hispanic males become computer scientists. Why was that?</p>
  <p>DiSalvo explored her question with ethnographic methods. She observed African-American teen males playing video games and talked to them about how and why they played. She found they were playing video games differently than white teen males. Her participants never used &ldquo;cheat codes&rdquo; or modified their games in any way—they used video games like athletic competition. Manipulating the football or the field is cheating, so why would you change the video game?</p>
</blockquote>
<p><a href="http://betsydisalvo.com/wp-content/uploads/2012/08/FDG-African-American-Male-Play-Practices.pdf">The full paper is here.</a></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>What do you think computer science is?</title>
      <link>http://vivekhaldar.com/articles/what-do-you-think-computer-science-is/</link>
      <pubDate>Wed, 15 May 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/what-do-you-think-computer-science-is/</guid>
      <description>&lt;p&gt;Via &lt;a href=&#34;http://cacm.acm.org/magazines/2013/5/163773-human-centered-computing/abstract&#34;&gt;this article&lt;/a&gt; in the latest CACM, I came across &lt;a href=&#34;http://hewner.com/research/&#34;&gt;the work of Mike Hewner&lt;/a&gt;, who studies CS education, in particular the issue of what students think the field is about.&lt;/p&gt;
&lt;p&gt;Here are some (paraphrased) points from his &lt;a href=&#34;http://hewner.com/files/hewner_dissert_FINAL.pdf&#34;&gt;dissertation&lt;/a&gt; that I found particularly interesting:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt; There were three main conceptions of CS among students (with the percentage that held it):
    &lt;ol&gt;&lt;li&gt; Programming is central, with other subfields in supporting roles (41%)
&lt;/li&gt;&lt;li&gt; Broad view: CS consists of many computing-related subfields (27%)
&lt;/li&gt;&lt;li&gt; Theory: CS as the mathematical study of algorithms (8%)
&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt; As ever, there is still a deep tension between the programming and implementation-centric and algorithms and theory-centric view of CS. Theory still has a PR problem. “Many students did not understand the purpose of CS theory, and a few left it out of their description of CS entirely.”
&lt;/li&gt;&lt;li&gt; At the high-school level, application use was conflated with CS. E.g. believing that a CS degree could be used for a Photoshop job.
&lt;/li&gt;&lt;li&gt; Surprisingly, misconceptions about CS did not change long-term educational decisions, which were based on more immediate experiences like whether a course was enjoyable.
&lt;/li&gt;&lt;/ul&gt;</description>
      <content:encoded><![CDATA[<p>Via <a href="http://cacm.acm.org/magazines/2013/5/163773-human-centered-computing/abstract">this article</a> in the latest CACM, I came across <a href="http://hewner.com/research/">the work of Mike Hewner</a>, who studies CS education, in particular the issue of what students think the field is about.</p>
<p>Here are some (paraphrased) points from his <a href="http://hewner.com/files/hewner_dissert_FINAL.pdf">dissertation</a> that I found particularly interesting:</p>
<ul><li> There were three main conceptions of CS among students (with the percentage that held it):
    <ol><li> Programming is central, with other subfields in supporting roles (41%)
</li><li> Broad view: CS consists of many computing-related subfields (27%)
</li><li> Theory: CS as the mathematical study of algorithms (8%)
</li></ol></li><li> As ever, there is still a deep tension between the programming and implementation-centric and algorithms and theory-centric view of CS. Theory still has a PR problem. “Many students did not understand the purpose of CS theory, and a few left it out of their description of CS entirely.”
</li><li> At the high-school level, application use was conflated with CS. E.g. believing that a CS degree could be used for a Photoshop job.
</li><li> Surprisingly, misconceptions about CS did not change long-term educational decisions, which were based on more immediate experiences like whether a course was enjoyable.
</li></ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Future programming</title>
      <link>http://vivekhaldar.com/articles/future-programming/</link>
      <pubDate>Mon, 06 May 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/future-programming/</guid>
      <description>&lt;p&gt;When &lt;a href=&#34;http://blog.vivekhaldar.com/post/36517698671/the-ne-c&#34;&gt;lambdas make it into C++&lt;/a&gt;, it&amp;rsquo;s fair to say that the functional languages camp has &amp;ldquo;won&amp;rdquo;. A purely functional language may not have broken into the mainstream, but a large number of features that are functional in spirit are now part of almost every mainstream language. Hard core believers will grumble about macros, or other mechanisms that let you treat code as data to be manipulated, but we have still come a very long way.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>When <a href="http://blog.vivekhaldar.com/post/36517698671/the-ne-c">lambdas make it into C++</a>, it&rsquo;s fair to say that the functional languages camp has &ldquo;won&rdquo;. A purely functional language may not have broken into the mainstream, but a large number of features that are functional in spirit are now part of almost every mainstream language. Hard core believers will grumble about macros, or other mechanisms that let you treat code as data to be manipulated, but we have still come a very long way.</p>
<p>This is a battle that had been fought since the 60s, and for all practical purposes that chapter is closed now.</p>
<p>So I wonder, what will programming languages look like in 2050? What are the big problems we should be tackling?</p>
<p>I will put on my prognostication (or make-a-wish) cap, and if that makes me look like a fool down the road, so be it.</p>
<p><strong>Better Systems Programming</strong>: functional constructs made it into imperative languages, but lower-level systems programming is still stuck in the 70s. In good ol&rsquo; C. Languages like Go are trying to change that. But systems programming (by that I mean stuff like operating systems and virtual machines) is still done by a priesthood with an extremely high barrier to entry and experimentation. The last and only project I ever came across that tries to lower the barrier for experimenting with operating systems was <a href="http://www.cs.utah.edu/flux/oskit/">OSKIT from the University of Utah</a>. Imagine the flowers that would bloom if programmers could try out OS ideas with the same investment of effort as writing a Python script.</p>
<p>The current landscape has me pessimistic, for the same reasons Rob Pike laid out in <a href="http://herpolhode.com/rob/utah2000.pdf">Systems Software Research is Irrelevant</a>: that to even get to the starting line you have to support a huge mass of legacy stuff for compatibility.</p>
<p>One project I like is Microsoft’s <a href="http://research.microsoft.com/en-us/projects/singularity/">Singularity</a>, an attempt at building an OS from the ground up in a safe language.</p>
<p><strong>Treating large bodies of code as raw data for machine learning</strong>: Imagine a Clippy for programming. What if your IDE went: “Looks like you’re trying to write a for loop over this array, but you have an off-by-one error. Would you like me to fix it?” Or: “Looking at the signature of this method, here are the most likely methods you will need next to get to the type of the returned value.” That’s your editor understanding the semantics of your language and code base at a deep level.</p>
<p>The fun starts when you combine that with the millions of lines of openly available code and bug reports, feed it to a giant machine learning system, and build up machine knowledge about bug patterns, patterns of good and bad code, idioms and best practices (“Looks like you are trying to filter values from this list. A better way to do that is&hellip;”).</p>
<p>Think of it as coding with an entire datacenter behind you to help.</p>
<p><strong>Hardware will eat software from the bottom</strong>: Has been a long trend, and I don’t see it stopping. Common low-level software patterns gradually make it into the chip. Network and graphics cards have long been absorbing higher and higher level functionality into silicon. The latest example that’s quite exciting is <a href="http://software.intel.com/en-us/blogs/2012/02/07/transactional-synchronization-in-haswell">Intel’s version</a> of <a href="http://software.intel.com/en-us/blogs/2012/02/07/coarse-grained-locks-and-transactional-synchronization-explained/">transactional memory in hardware</a>, <a href="http://software.intel.com/sites/products/documentation/doclib/stdxe/2013/composerxe/compiler/cpp-win/GUID-A462FBC8-37F2-490F-A68B-2FFA8010DEBC.htm">hardware lock elision</a>.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Patterns of use</title>
      <link>http://vivekhaldar.com/articles/patterns-of-use/</link>
      <pubDate>Sun, 14 Apr 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/patterns-of-use/</guid>
      <description>&lt;p&gt;I find a clear pattern emerging in the way I use various computing devices.&lt;/p&gt;
&lt;p&gt;Laptops and desktops&amp;ndash;I put them in the same category because they are heavy, power hungry, and have full size keyboards&amp;ndash;are factory machines. They are what I use to get serious work done, the kind that gives me a paycheck. I almost never reach for them outside work situations.&lt;/p&gt;
&lt;p&gt;On the other end of the spectrum are phones. I don&amp;rsquo;t know why we still call them phones because I never use them to make phone calls, because in general I never make phone calls. They are rude, disruptive, and synchronous. There is a single digit number of people on the planet from whom I will accept phone calls. But these &amp;ldquo;phones&amp;rdquo; are perfect for being our assistants out in the physical world, where we need maps and directions and traffic updates. And that&amp;rsquo;s mostly what I use my phone for. I almost never use it indoors. Except as a camera. Because the crappy camera you have at arms reach&amp;ndash;and they&amp;rsquo;re getting less crappy by the day&amp;ndash;beats the expensive one in your closet.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I find a clear pattern emerging in the way I use various computing devices.</p>
<p>Laptops and desktops&ndash;I put them in the same category because they are heavy, power hungry, and have full size keyboards&ndash;are factory machines. They are what I use to get serious work done, the kind that gives me a paycheck. I almost never reach for them outside work situations.</p>
<p>On the other end of the spectrum are phones. I don&rsquo;t know why we still call them phones because I never use them to make phone calls, because in general I never make phone calls. They are rude, disruptive, and synchronous. There is a single digit number of people on the planet from whom I will accept phone calls. But these &ldquo;phones&rdquo; are perfect for being our assistants out in the physical world, where we need maps and directions and traffic updates. And that&rsquo;s mostly what I use my phone for. I almost never use it indoors. Except as a camera. Because the crappy camera you have at arms reach&ndash;and they&rsquo;re getting less crappy by the day&ndash;beats the expensive one in your closet.</p>
<p>Which leaves the great big middle of&hellip; everything else. This is where the tablet comes in. It has become my main non-work device. I use it for reading&ndash;tons of reading. I use it for writing. Gesture typing on Android has greatly improved the speed and accuracy with which I can heave words into the device. I probably spend as much time on the N7 as my laptop/desktop combined. And I think it will only grow. If we start seeing new interesting interfaces that make it viable to actually code on tablets&ndash;and we&rsquo;re beginning to&ndash;that will be another blow to laptops and desktops.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>  Abolish the &#34;Save&#34; icon
  </title>
      <link>http://vivekhaldar.com/articles/abolish-the-save-icon/</link>
      <pubDate>Sun, 07 Apr 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/abolish-the-save-icon/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.azarask.in/blog/post/the_end_of_an_icon/&#34;&gt;Aza Raskin on the ubiquitous &amp;ldquo;Save&amp;rdquo; icon&lt;/a&gt; :&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;It’s a floppy disk. There is only a tenuous connection between saving and a floppy disk even for those of us who know what a floppy is (and at the moment most of us remember them), but floppy disks are on their way to becoming as unknown as Charles Yerkes. Don’t know who I’m talking about? That’s my point.&lt;/p&gt;
  &lt;p&gt;Floppy disks were a stepping-stone medium — once ubiquitous, they have given way to larger, faster, and more convenient forms of storage. Soon, nobody is going to remember floppies, except for those of us re-living the good old days when we used to replace their magnetic sheets with sandpaper as a practical joke. When the new generation of users takes over, they’ll have no idea of what a floppy is, and the icon will have lost all meaning.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://www.azarask.in/blog/post/the_end_of_an_icon/">Aza Raskin on the ubiquitous &ldquo;Save&rdquo; icon</a> :</p>
<blockquote>
  <p>It’s a floppy disk. There is only a tenuous connection between saving and a floppy disk even for those of us who know what a floppy is (and at the moment most of us remember them), but floppy disks are on their way to becoming as unknown as Charles Yerkes. Don’t know who I’m talking about? That’s my point.</p>
  <p>Floppy disks were a stepping-stone medium — once ubiquitous, they have given way to larger, faster, and more convenient forms of storage. Soon, nobody is going to remember floppies, except for those of us re-living the good old days when we used to replace their magnetic sheets with sandpaper as a practical joke. When the new generation of users takes over, they’ll have no idea of what a floppy is, and the icon will have lost all meaning.</p>
</blockquote>
<p>His larger point in the post is about using words rather than symbols for icons, but I want to come back specifically to the idea of &ldquo;saving&rdquo; documents.</p>
<p>The idea of creating a digital artifact on a computer and it being ephemeral until one remembers to &ldquo;save&rdquo; it to a more persistent medium has caused countless people untold misery since the dawn of the computer age. I haven&rsquo;t met anyone who does not have their own personal story of loss. Inspiration strikes, you heave a thousand words into the computer, and in the heat and fluidity of the moment forget to save your precious words. And then, the computer crashes. Noooooooo&hellip;.</p>
<p>But, progress happens.</p>
<p>In most web apps, the concept of saving has simply gone away. You type your stuff, and the cloud captures it for posterity. You do not have to remember to save anything. At least, Gmail and Google docs work this way. This, of course, is how it should be.</p>
<p>I&rsquo;d go as far as to say that if an app made today has the concept of saving work, it is fundamentally broken and does not belong in the 21st century.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>RIP Ebert</title>
      <link>http://vivekhaldar.com/articles/rip-ebert/</link>
      <pubDate>Fri, 05 Apr 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/rip-ebert/</guid>
      <description>&lt;blockquote&gt;
  &lt;p&gt;Well, I loved this movie. I loved the way Coppola and her actors negotiated the hazards of romance and comedy, taking what little they needed and depending for the rest on the truth of the characters. I loved the way Bob and Charlotte didn&amp;rsquo;t solve their problems, but felt a little better anyway. I loved the moment near the end when Bob runs after Charlotte and says something in her ear, and we&amp;rsquo;re not allowed to hear it.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
  <p>Well, I loved this movie. I loved the way Coppola and her actors negotiated the hazards of romance and comedy, taking what little they needed and depending for the rest on the truth of the characters. I loved the way Bob and Charlotte didn&rsquo;t solve their problems, but felt a little better anyway. I loved the moment near the end when Bob runs after Charlotte and says something in her ear, and we&rsquo;re not allowed to hear it.</p>
  <p>We shouldn&rsquo;t be allowed to hear it. It&rsquo;s between them, and by this point in the movie, they&rsquo;ve become real enough to deserve their privacy.</p>
</blockquote>
<p><a href="http://rogerebert.suntimes.com/apps/pbcs.dll/article?AID=/20030912/REVIEWS/309120302/1023">That&rsquo;s Roger Ebert on &ldquo;Lost in Translation&rdquo;</a>, a movie that had me wandering in my head for weeks afterwards.</p>
<p>Often we are at a loss to understand and express why something touched us. We feel the sharp jab in our souls, but lack the words. &ldquo;I loved that movie!&rdquo;, is all we can say, flaccidly.</p>
<p>Roger Ebert filled that void. He gave words to feelings many of us didn&rsquo;t know we had, that were stirred by movies. We often mistake a movie review as pure opinion, as something everyone is entitled to his own distinct view of. But Ebert touched on the underlying universal constant that is the same in all of us.</p>
<p>That was his power as a human who felt, and then magnified that using his words.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Start here</title>
      <link>http://vivekhaldar.com/articles/start-here/</link>
      <pubDate>Sun, 24 Mar 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/start-here/</guid>
      <description>&lt;p&gt;I started writing here in 2008. And now when I look back, it pleasantly surprises me to see a body of work. But the reverse-chronological presentation of a blog is particularly hostile to new readers, or even regular readers looking for an overview.&lt;/p&gt;
&lt;p&gt;So here they are, all the long-form posts from this blog, categorized as best as I can. &lt;a href=&#34;http://blog.vivekhaldar.com/start&#34;&gt;Start here&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I started writing here in 2008. And now when I look back, it pleasantly surprises me to see a body of work. But the reverse-chronological presentation of a blog is particularly hostile to new readers, or even regular readers looking for an overview.</p>
<p>So here they are, all the long-form posts from this blog, categorized as best as I can. <a href="http://blog.vivekhaldar.com/start">Start here</a>.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>We are all Mad Men</title>
      <link>http://vivekhaldar.com/articles/we-are-all-mad-men/</link>
      <pubDate>Sat, 23 Mar 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/we-are-all-mad-men/</guid>
      <description>&lt;p&gt;For the longest time I couldn’t put my finger on what I loved about Mad Men. It wasn’t the acting or period accuracy or cinematography. There are plenty of shows that have those, but that never pull me in. Only after processing a run of five seasons in the lull until the sixth did I realize the true reason the show attracted me.&lt;/p&gt;
&lt;p&gt;Mad Men is an honest portrayal of the themes of modern work in all its glory and pain.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>For the longest time I couldn’t put my finger on what I loved about Mad Men. It wasn’t the acting or period accuracy or cinematography. There are plenty of shows that have those, but that never pull me in. Only after processing a run of five seasons in the lull until the sixth did I realize the true reason the show attracted me.</p>
<p>Mad Men is an honest portrayal of the themes of modern work in all its glory and pain.</p>
<p>I once described the show to someone who hadn’t seen it as a long, detailed and deliberate character study of one person: Don Draper. Now I realize it is more than that.</p>
<p>The lens through which that character study is done is his <em>work</em>. The main stage of the show is the <em>office</em>, with home filling in the interstices. The primary way in which characters relate to each other is through their work.</p>
<p>Along the way, Mad Men starkly reveals truth after truth about the nature of modern work. They are part of our daily life, but still so hard to see. We’re blind to them, just like a fish would be at a loss if asked about the nature of water.</p>
<p><strong>From building the physical to creating the imaginary</strong></p>
<p><em>Look at your hands – they’re as soft as a woman’s…What do you do? What do you make? You grow bullshit.</em>
&ndash; Don’s father, to Don.</p>
<p>Modern work deals largely with imaginary, sometimes ephemeral artifacts. Even where the final output is a physical object (a chip, a phone, or a car), the physical object is but the last link in a long chain of platonic objects. Often, that last link is not even thought of as “work”, but as “assembly”, ideally handled by robots.</p>
<p>3D printers now make it so that we can think of that last step as “compiling”. Just like you compile source code to get an executable, you compile your 3D design to manifest it into the world of atoms. The compiler is just another piece of automation.</p>
<p><em>Roy: Perpetuating the lie. How do you sleep at night?<br/>
Don Draper: On a bed made of money.</em></p>
<p>We use our hands not to move and arrange physical objects, but to command the manipulation of bits. At the beginning of this transformation, it was understandable for the real makers, the movers and arrangers of physical things, to look down upon people pushing around paper in an office and wonder, just like Don’s father did, <em>”What do you do? What do you make?”</em> Don is condescended to even by the “true creatives”, the starving bourgeois artists.</p>
<p>Some might still wonder, but the derision is gone (or at least, veiled), after the complete shift of power and wealth and attention from the old physical makers to the new bit-wranglers.</p>
<p><strong>The War for Talent</strong></p>
<p><em>Don Draper: It&rsquo;s your job. I give you money, you give me ideas.<br/>
Peggy Olson: And you never say thank you.<br/>
Don: That&rsquo;s what the money is for!</em></p>
<p>Each factory worker was more or less like every other factory worker. But a star creative director or copywriter or programmer is irreplaceable, and hence, valuable. If you lose them, you might, after much effort, get another great one to fill their position, but they will not be the same. They will have a different creative signature. Like a uniquely shaped diamond, each demands their own custom-made setting.</p>
<p>Don picked Peggy from the ranks of the secretaries and made her a copywriter. He challenged her, and forced her to grow. He was mean to her. He was tender and protective towards her. In the entire cast of characters, she is the one who understands (or comes closest to) what makes Don Draper tick. But while Don was a great grower of talent, he was not a great retainer of talent. Don eventually loses Peggy to a rival ad agency.</p>
<p>The overt reason is that she got a much better financial offer. But that is not the true reason. It’s not (only) about the money. It’s about what the money <em>signals</em>. Peggy doesn’t live a lavish life. She’s only in her apartment to sleep. She doesn’t have plans to spend all that money. But she does want to be perceived as valuable. She wants to be <em>wooed</em>. And Don did not give her that. The head of the other agency, a long-time rival of Don, spent time and effort trying to win her over. It was that treatment she fell for.</p>
<p><strong>The Primacy of Work</strong></p>
<p><em>I know what I&rsquo;m supposed to want, but it just never feels right, or as important as anything in that office.</em>
&ndash; Peggy Olson</p>
<p>All the characters in the show derive their self-worth through their work. All of them. There is not a single character that has any significant source of meaning outside their work. Those that have families are cast as providers and protectors rather than lovers and nurturers.</p>
<p>Peggy goes through a string of half-hearted relationships, each of them sacrificed to work. But the sacrifice is a willing one, not forced. There is a brief twinge of&hellip; what? Remorse? Regret?&hellip; before diving eagerly head-first back into work, into the comfortable rhythm and embrace of it.</p>
<p>Work is exciting. The office is a dynamic place. It is a place where you can reinvent yourself. New projects. New titles. New responsibilities. It is a place that always looks towards the future. It is sterile enough to be a place where you can regularly be born again. Home, on the other hand, is an anchor, a place where you are tied to your past, where you can never run away from the old you.</p>
<p>This is why Don’s relationship with Megan is an outlier, the curveball of the entire show. He does truly love her, more than any other woman in his life. More importantly, he <em>respects</em> her. While he didn’t think twice before cheating on his first wife, he actively shuns overtures from other women to remain faithful to Megan. Megan might be approaching, or even surpassing, the meaning and fulfilment he gets from work. And he has no compass to deal with that. It is uncharted territory for him. Which is why flashpoints with Megan leave Don (and the viewer) confused, but always end up reinforcing how much she means to him.</p>
<p>But at the end of it all, it is not enough. Whatever satisfaction and sense of worth work gives them leaves them searching for something else. They are anchorless, tumbling through dark waters, guided by faint and distant lighthouses. Whether they see a light or not, we will eagerly follow, if only to get clues for ourselves.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Meetings are mutexes</title>
      <link>http://vivekhaldar.com/articles/meetings-are-mutexes/</link>
      <pubDate>Fri, 22 Mar 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/meetings-are-mutexes/</guid>
      <description>&lt;p&gt;A meeting is a big honkin&amp;rsquo; mutex. Treat it like one.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;explain why it&amp;rsquo;s needed&lt;/li&gt;
&lt;li&gt;minimize the resources it locks&lt;/li&gt;
&lt;li&gt;hold it for as short a time as possible&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;And then go about your work.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>A meeting is a big honkin&rsquo; mutex. Treat it like one.</p>
<ul><li>explain why it&rsquo;s needed</li>
<li>minimize the resources it locks</li>
<li>hold it for as short a time as possible</li>
</ul><p>And then go about your work.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>STEM jobs</title>
      <link>http://vivekhaldar.com/articles/stem-jobs/</link>
      <pubDate>Wed, 20 Mar 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/stem-jobs/</guid>
      <description>&lt;p&gt;Via &lt;a href=&#34;http://lemire.me/blog/archives/2013/03/04/where-are-the-big-problem-jobs/&#34;&gt;Daniel Lemire’s blog&lt;/a&gt;, I came across this three-part series of posts by John F. McGowan that uses job posting data to analyze the STEM job market.&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;&lt;a href=&#34;http://math-blog.com/2013/01/21/what-is-really-hot-in-stem-jobs/&#34;&gt;What is really hot in STEM jobs?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://math-blog.com/2013/03/04/the-catch-22-stem-job-market/&#34;&gt;The Catch-22 STEM job market&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://math-blog.com/2013/03/11/what-do-stem-employers-want/&#34;&gt;What do STEM employers want?&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;blockquote&gt;
  &lt;p&gt;The key results of this brief survey of the Craig’s List San Francisco Bay Area job board are: very few entry-level or junior STEM jobs are posted. Most STEM job posts claim to require 2-7 years, often 3-5 years, of work experience in specific skills such as programming languages such as MATLAB or C++ and toolkits such as OpenCV or OpenGL. Very few jobs requesting more than 10 years of experience are posted. There is little or no interest indicated in a range of mathematical skills taught in high school and college math including algebra and especially calculus.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Via <a href="http://lemire.me/blog/archives/2013/03/04/where-are-the-big-problem-jobs/">Daniel Lemire’s blog</a>, I came across this three-part series of posts by John F. McGowan that uses job posting data to analyze the STEM job market.</p>
<ol><li><a href="http://math-blog.com/2013/01/21/what-is-really-hot-in-stem-jobs/">What is really hot in STEM jobs?</a></li>
<li><a href="http://math-blog.com/2013/03/04/the-catch-22-stem-job-market/">The Catch-22 STEM job market</a></li>
<li><a href="http://math-blog.com/2013/03/11/what-do-stem-employers-want/">What do STEM employers want?</a></li>
</ol><blockquote>
  <p>The key results of this brief survey of the Craig’s List San Francisco Bay Area job board are: very few entry-level or junior STEM jobs are posted. Most STEM job posts claim to require 2-7 years, often 3-5 years, of work experience in specific skills such as programming languages such as MATLAB or C++ and toolkits such as OpenCV or OpenGL. Very few jobs requesting more than 10 years of experience are posted. There is little or no interest indicated in a range of mathematical skills taught in high school and college math including algebra and especially calculus.</p>
  <p>STEM job posts with a high mathematical content are dominated by statistics and data analysis, primarily business data and some medical/healthcare data. Most machine learning, “big data”, and data scientist posts fall into the category of statistics and data analysis. There are remarkably few STEM jobs posts seeking to solve “big problems” such as alternative, cheaper energy sources, curing major diseases such as cancer, and the like. The few companies that arguably post “big problem” jobs are often backed by the government (e.g. Elon Musk’s Tesla Motors and SpaceX) or may have special relationships with the government (e.g. Robert Bigelow’s Bigelow Aerospace).</p>
  <p>Many of these results contradict common claims and themes in general news media articles, think tank reports, and other sources about STEM education, STEM employment, and alleged shortages of STEM workers (scientists, technologists, engineers, and mathematicians).</p>
</blockquote>
<p>The counterpoint is made by this <a href="http://www.jec.senate.gov/public/index.cfm?a=Files.Serve&amp;File_id=6aaa7e1f-9586-47be-82e7-326f47658320">Senate Committee Report</a>:</p>
<blockquote>
  <p>&hellip;the demand for STEM-skilled workers is expected to continue to increase in the future, as both the number and proportion of STEM jobs are projected to grow. New Bureau of Labor Statistics data show that employment in STEM  occupations is expected to expand faster than employment in non-STEM occupations from 2010 to
  2020 (by 17 versus 14 percent).
  In addition to government projections of employment growth in STEM fields, business organizations and other groups have issued numerous reports and surveys that suggest that there  is a heightening need for qualified STEM workers – both those with highly specialized skills as  well as those with a more general knowledge of STEM concepts. For example, even at the height of the recession, a survey of manufacturers found that over one-third were experiencing shortages of  engineers and scientists – and most of them anticipated greater shortages in the future. In
  addition, an earlier survey found that over half of manufacturers believe that the public education  system insufficiently prepares students with the math and science skills necessary to succeed in  the workplace. Furthermore, concerns regarding shortages of skilled workers are compounded  by the pending retirements of many baby boomers, an issue cited by both private industry and government officials.</p>
</blockquote>
<p>So which is it? A bit of both, I think.</p>
<p>Job listings are largely fantasies. Just because someone wants a domain expert with 10 years of experience doesn’t mean they’ll get one. Often, employers truly care about a small but important subset of the long list of “requirements” in a job listing.</p>
<iframe width="420" height="315" src="http://www.youtube.com/embed/x1TsOHyJPpw" frameborder="0" allowfullscreen></iframe>
<p>There being little demand for workers to tackle “big problems” does not imply that there isn’t a shortage of STEM workers. That might simply be a reflection of the fact that it takes <a href="http://blog.vivekhaldar.com/post/18541470199/team-science">huge teams to tackle large problems</a>, and there are rarely listings for “come cure cancer” or “come build the next-gen vehicle.” Open positions will likely focus on small niche sub-problems, which don’t seem as big and challenging.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Strong opinions, weakly held</title>
      <link>http://vivekhaldar.com/articles/strong-opinions-weakly-held/</link>
      <pubDate>Sun, 17 Mar 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/strong-opinions-weakly-held/</guid>
      <description>&lt;p&gt;It&amp;rsquo;s a lazy Sunday.&lt;/p&gt;
&lt;table style=&#34;width: 100%&#34;&gt;&lt;tr&gt;&lt;td&gt; &lt;/td&gt;
  &lt;td&gt;&lt;em&gt;Strongly held&lt;/em&gt;&lt;/td&gt;
  &lt;td&gt;&lt;em&gt;Weakly held&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;em&gt;Strong opinions&lt;/em&gt;&lt;/td&gt;
  &lt;td&gt; Bigot&lt;/td&gt;
  &lt;td&gt; &lt;a href=&#34;http://bobsutton.typepad.com/my_weblog/2006/07/strong_opinions.html&#34;&gt;Wisdom&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;em&gt;Weak opinions&lt;/em&gt;&lt;/td&gt;
  &lt;td&gt; Lemming&lt;/td&gt;
  &lt;td&gt; Spineless&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;</description>
      <content:encoded><![CDATA[<p>It&rsquo;s a lazy Sunday.</p>
<table style="width: 100%"><tr><td> </td>
  <td><em>Strongly held</em></td>
  <td><em>Weakly held</em></td>
</tr><tr><td><em>Strong opinions</em></td>
  <td> Bigot</td>
  <td> <a href="http://bobsutton.typepad.com/my_weblog/2006/07/strong_opinions.html">Wisdom</a></td>
</tr><tr><td><em>Weak opinions</em></td>
  <td> Lemming</td>
  <td> Spineless</td>
</tr></table>
]]></content:encoded>
    </item>
    
    <item>
      <title>Zero Knowledge</title>
      <link>http://vivekhaldar.com/articles/zero-knowledge/</link>
      <pubDate>Thu, 14 Mar 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/zero-knowledge/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.acm.org/news/featured/awards/turing-award-2012&#34;&gt;Shafi Goldwasser and Silvio Micali will receive the 2012 ACM Turing Award for their work in cryptography.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I encountered Goldwasser&amp;rsquo;s work during a graduate course in cryptography. I came across the idea of &lt;em&gt;zero knowledge proofs&lt;/em&gt;, which is a technique for Alice to prove possession of a secret to Bob &lt;em&gt;without actually giving away the secret&lt;/em&gt;. At the end of their interaction, Bob will be convinced that Alice possesses the secret, but will have no idea what it actually is. At first, this sounds completely paradoxical. How is that even possible? But it is.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://www.acm.org/news/featured/awards/turing-award-2012">Shafi Goldwasser and Silvio Micali will receive the 2012 ACM Turing Award for their work in cryptography.</a></p>
<p>I encountered Goldwasser&rsquo;s work during a graduate course in cryptography. I came across the idea of <em>zero knowledge proofs</em>, which is a technique for Alice to prove possession of a secret to Bob <em>without actually giving away the secret</em>. At the end of their interaction, Bob will be convinced that Alice possesses the secret, but will have no idea what it actually is. At first, this sounds completely paradoxical. How is that even possible? But it is.</p>
<p>Things like this still make me feel like crypto is the quantum mechanics of computer science, full of counter-intuitive and mind-bending results.</p>
<p>Here&rsquo;s a talk I gave to the class back then. Deepest apologies for the chintzy PowerPoint theme. I blame it on youth.</p>
<iframe src="https://docs.google.com/presentation/d/11I0_d5keugG_YCjBF9fJ2LJ_eKZpKzb1xMFgzEimdKo/embed?start=false&amp;loop=false&amp;delayms=3000" frameborder="0" width="480" height="389" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true"></iframe>
]]></content:encoded>
    </item>
    
    <item>
      <title>Addicted to work</title>
      <link>http://vivekhaldar.com/articles/addicted-to-work/</link>
      <pubDate>Tue, 12 Mar 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/addicted-to-work/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.nytimes.com/2013/03/10/opinion/sunday/is-there-life-after-work.html&#34;&gt;Erin Callan, the former CFO of Lehman Brothers, writes about her all-consuming workaholism in the New York Times&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;I didn’t start out with the goal of devoting all of myself to my job. It crept in over time. Each year that went by, slight modifications became the new normal. First I spent a half-hour on Sunday organizing my e-mail, to-do list and calendar to make Monday morning easier. Then I was working a few hours on Sunday, then all day. My boundaries slipped away until work was all that was left.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://www.nytimes.com/2013/03/10/opinion/sunday/is-there-life-after-work.html">Erin Callan, the former CFO of Lehman Brothers, writes about her all-consuming workaholism in the New York Times</a>:</p>
<blockquote>
  <p>I didn’t start out with the goal of devoting all of myself to my job. It crept in over time. Each year that went by, slight modifications became the new normal. First I spent a half-hour on Sunday organizing my e-mail, to-do list and calendar to make Monday morning easier. Then I was working a few hours on Sunday, then all day. My boundaries slipped away until work was all that was left.</p>
</blockquote>
<p><em>Workaholism</em> is the perfect term for this, because, like <em>alcoholism</em>, it connotes addiction. Nobody starts out <em>wanting</em> to become an alcoholic, or a workaholic. But you start down a path, and one fine day you wake up with a dry mouth and a splitting headache with no memory of the night before, or realize that you haven’t seen family or friends in days or weeks. You think you are in control of it, but eventually <em>it</em> is in control of <em>you</em>.</p>
<p>It happens through a series of small choices, each one seemingly inconsequential. And it is a choice, because I’ve rarely seen a workaholic creative professional doing 80-hour weeks because their boss was tightening the screws on them. <a href="http://blog.vivekhaldar.com/post/29133221398/the-lure-of-work">They did it to themselves</a>.</p>
<p>But why did they choose this? Not for the money. Workaholics are usually already well-paid, and hardly ever enjoy that money anyway.</p>
<p>What is the hook? Where is the high? It is the <a href="http://en.wikipedia.org/wiki/Need_for_cognition">need for cognition</a>, a <a href="http://www.uam.es/otros/persuasion/papers/2009%20need-cognition%20review%20.pdf">trait</a> that compels one to “understand and make reasonable the experiential world”. Every problem solved, every little checkbox marked off, every little question answered, every gap covered&ndash;these are all highs. And when the pile of work is infinite, and usually self-created, you can string together a series of such highs into a sixteen hour workday.</p>
<p>But just like addiction, workaholism is <em>an easy way out</em>. An easy way to ignore the work and time and compromise required for cultivating relationships. An easy way to pretend that there’s simply no time to step back and distinguish the urgent from the important. An easy way to distrust colleagues and do it all yourself. An easy way to deal with the stream of work as it arises, flowing in it, rather than putting in the time and deep thought required to prioritize and tackle items with potentially high impact.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>What I work on…</title>
      <link>http://vivekhaldar.com/articles/what-i-work-on/</link>
      <pubDate>Tue, 12 Mar 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/what-i-work-on/</guid>
      <description>&lt;p&gt;&amp;hellip; is deep infrastructure backend stuff. It is one of Google&amp;rsquo;s secret sauces, and when someone asked me, I usually just said &amp;ldquo;cluster management&amp;rdquo;, which sounds as inspiring as a damp towel.
&lt;/p&gt;&lt;p&gt;
Now &lt;a href=&#34;http://www.wired.com/wiredenterprise/2013/03/google-borg-twitter-mesos/all/&#34;&gt;Cade Metz over at Wired&lt;/a&gt; has saved me (and a bunch of others, I&amp;rsquo;m sure) by managing to go a bit deeper into what that means, adding some  color to The System That Shall Not Be Named.
&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>&hellip; is deep infrastructure backend stuff. It is one of Google&rsquo;s secret sauces, and when someone asked me, I usually just said &ldquo;cluster management&rdquo;, which sounds as inspiring as a damp towel.
</p><p>
Now <a href="http://www.wired.com/wiredenterprise/2013/03/google-borg-twitter-mesos/all/">Cade Metz over at Wired</a> has saved me (and a bunch of others, I&rsquo;m sure) by managing to go a bit deeper into what that means, adding some  color to The System That Shall Not Be Named.
</p><blockquote>
This software system is called Borg, and it’s one of the best-kept secrets of Google’s rapid evolution into the most dominant force on the web. Wilkes won’t even call it Borg. “I prefer to call it the system that will not be named,” he says. But he will tell us that Google has been using the system for a good nine or 10 years and that he and his team are now building a new version of the tool, codenamed Omega.
<p>Borg is a way of efficiently parceling work across Google’s vast fleet of computer servers, and according to Wilkes, the system is so effective, it has probably saved Google the cost of building an extra data center.</p>
</blockquote>
]]></content:encoded>
    </item>
    
    <item>
      <title>Moving to Chrome OS</title>
      <link>http://vivekhaldar.com/articles/moving-to-chrome-os/</link>
      <pubDate>Thu, 07 Mar 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/moving-to-chrome-os/</guid>
      <description>&lt;p&gt;I knew I was ready for jump to ChromeOS because I was already spending most of my time on any computer in Chrome. Yes, it could even do things like &lt;a href=&#34;https://chrome.google.com/webstore/detail/secure-shell/pnhechapfaindjhompbnflcldabbghjo?hl=en&#34;&gt;ssh&lt;/a&gt;, which was all the escape from the browser I ever needed. I used my laptop as a 21st century &lt;a href=&#34;http://en.wikipedia.org/wiki/Computer_terminal#Dumb_terminal&#34;&gt;dumb terminal&lt;/a&gt;. For heavy duty work coding, I had a heavy duty machine that I sat under my desk and was used remotely. For the rare occasion that I needed the full desktop experience of that remote machine, I used the &lt;a href=&#34;https://chrome.google.com/webstore/detail/chrome-remote-desktop/gbchcmhmhahfdphkhkmpfmihenigjmpp?hl=en&#34;&gt;Chrome Remote Desktop extension&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I knew I was ready for jump to ChromeOS because I was already spending most of my time on any computer in Chrome. Yes, it could even do things like <a href="https://chrome.google.com/webstore/detail/secure-shell/pnhechapfaindjhompbnflcldabbghjo?hl=en">ssh</a>, which was all the escape from the browser I ever needed. I used my laptop as a 21st century <a href="http://en.wikipedia.org/wiki/Computer_terminal#Dumb_terminal">dumb terminal</a>. For heavy duty work coding, I had a heavy duty machine that I sat under my desk and was used remotely. For the rare occasion that I needed the full desktop experience of that remote machine, I used the <a href="https://chrome.google.com/webstore/detail/chrome-remote-desktop/gbchcmhmhahfdphkhkmpfmihenigjmpp?hl=en">Chrome Remote Desktop extension</a>.</p>
<p>What pushed me over the edge was the <a href="http://www.google.com/intl/en/chrome/devices/chromebook-pixel/">Pixel</a>.</p>
<p>I will not review the Pixel here. <a href="http://www.theverge.com/2013/2/25/4023830/google-chromebook-pixel-review">Plenty of folks have done that in depth already</a>. I will just say that the hardware is <em>delicious</em>. Particularly the screen. I’m a bit of a typography nut, and seeing type on a screen of that resolution makes you realize what a waste it was looking at and picking out fonts for low-resolution screens. I now hate to connect to a large external monitor because it just looks so crappy.</p>
<p>(By the way, I’m biased. See my <a href="http://blog.vivekhaldar.com/about">“About”</a> page. Take all this for what it’s worth.)</p>
<p>Here I want to talk about how some of my workflows and habits have changed (or will need to change). I’ve had the Pixel as my full-time sole machine for a glorious four days now, so a lot of this might change as I find my way.</p>
<p>Whether ChromeOS is right for you depends entirely on whether you live on the web full time, or are still shackled to native apps. Even if you do live on the web full time or most of the time, like I do, when you are on a “regular” machine you fall into habits that reinforce the use of the local machine as a crutch. </p>
<p>There are two major factors that might tie someone to a “regular” machine. The first is native apps. In the spirit of aiming for where the puck is headed, I feel confident that those who are absolutely tied to native apps will continue to dwindle and be confined to highly specialized niches. High-end image editing, graphics, 3D rendering and video editing is the most obvious one. </p>
<p>The other major reason is the use of <em>local disk</em>. That gargantuan terabyte (or fraction thereof) of space attached to your machine&ndash;but only your machine. Local disk ties you to specific machines. Local disk makes you worry about backups. Local disk fills up. Local disk is 20th century. On my previous main machine (a 13-inch MacBook Air), I used local disk like a messy floor. The things I cared about would always find a place online, usually on Google Drive or PicasaWeb, and those that I was unsure about or were temporary in nature would get tossed on the floor, usually never to be looked at after the first time.</p>
<p>Even though the Pixel hardware is not cheap, there is a certain peace of mind that comes from knowing that a ChromeBook is disposable in the sense that I don’t have to worry about “all that stuff that was on that machine.”</p>
<p>That said, I plead guilty to being addicted to local disk. A lot of crucial things in <a href="http://blog.vivekhaldar.com/post/23021969189/my-setup">my setup</a> depend on local disk. Thankfully, they don’t <em>have</em> to. It’s a legacy workflow that will take me awhile to properly untangle. The first step is to use <a href="https://chrome.google.com/webstore/detail/save-to-google-drive/gmbmikajjgmnabiglmofipeabaddhgne?hl=en">“Save to Google Drive”</a> when “downloading” something from the web.</p>
<p>So how have my workflows changed? The big news is that they <em>haven’t</em>, for the most part. I used to spent 90% of my time in the browser before, and now I spend 100%. </p>
<p>The biggest thing I thought I would miss was dictation software. I used Dragon Dictate on the Mac. But the <a href="http://chrome.blogspot.com/2013/02/bringing-voice-recognition-to-web.html">spanking new WebSpeech API</a> looks like it will at least start to cover some of that ground. <a href="http://www.google.com/intl/en/chrome/demos/speech.html">Check out this demo of speech to text in the browser</a>.</p>
<p>There are still some odds and ends I miss. I got used to a bunch of trackpad gestures in MacOS X that don’t work on ChromeOS. Two and three-finger swipes, mostly. I’d also developed a deep habit of using sticky modifier keys (that’s when you can press and release “Ctrl” and then press “A” to emit the “Ctrl-A” key combo, rather than having to hold down “Ctrl” and then pressing “A” while “Ctrl” is held down). I still miss that.</p>
<p>But so far, living full time in the cloud has been great. It’s the future. Might as well start now.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>From the mouths of babes</title>
      <link>http://vivekhaldar.com/articles/from-the-mouths-of-babes/</link>
      <pubDate>Thu, 28 Feb 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/from-the-mouths-of-babes/</guid>
      <description>&lt;p&gt;A compendium of recent tweets:
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;ldquo;Son, in my time we wore eye glasses without computers in them.&amp;rdquo; &amp;ldquo;Dad, you talk funny.&amp;rdquo;&lt;/em&gt; &lt;a href=&#34;https://twitter.com/vivekhaldar/status/307534716154810368&#34;&gt;#&lt;/a&gt;
&lt;/p&gt;&lt;p&gt;&lt;em&gt;&amp;ldquo;Son, in my time we had to go to another place and sit there for 8 hrs everyday to earn money.&amp;rdquo; &amp;ldquo;Dad, you talk funny.&amp;rdquo;&lt;/em&gt; &lt;a href=&#34;http://twitter.com/vivekhaldar/statuses/307290855163695104&#34;&gt;#&lt;/a&gt;
&lt;/p&gt;&lt;p&gt;&lt;em&gt;&amp;ldquo;Son, in my time we learned logarithms and looked up logarithm tables to do complex calculations.&amp;rdquo; &amp;ldquo;Dad, you talk funny.&amp;rdquo;&lt;/em&gt; &lt;a href=&#34;http://twitter.com/vivekhaldar/statuses/297102758178340866&#34;&gt;#&lt;/a&gt;
&lt;/p&gt;&lt;p&gt;&lt;em&gt;&amp;ldquo;Son, in my time we traveled long distances to touch other people.&amp;rdquo; &amp;ldquo;Dad, you talk funny.&amp;rdquo;&lt;/em&gt; &lt;a href=&#34;http://twitter.com/vivekhaldar/statuses/296781604997718016&#34;&gt;#&lt;/a&gt;
&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>A compendium of recent tweets:
</p>
<p><em>&ldquo;Son, in my time we wore eye glasses without computers in them.&rdquo; &ldquo;Dad, you talk funny.&rdquo;</em> <a href="https://twitter.com/vivekhaldar/status/307534716154810368">#</a>
</p><p><em>&ldquo;Son, in my time we had to go to another place and sit there for 8 hrs everyday to earn money.&rdquo; &ldquo;Dad, you talk funny.&rdquo;</em> <a href="http://twitter.com/vivekhaldar/statuses/307290855163695104">#</a>
</p><p><em>&ldquo;Son, in my time we learned logarithms and looked up logarithm tables to do complex calculations.&rdquo; &ldquo;Dad, you talk funny.&rdquo;</em> <a href="http://twitter.com/vivekhaldar/statuses/297102758178340866">#</a>
</p><p><em>&ldquo;Son, in my time we traveled long distances to touch other people.&rdquo; &ldquo;Dad, you talk funny.&rdquo;</em> <a href="http://twitter.com/vivekhaldar/statuses/296781604997718016">#</a>
</p><p><em>&ldquo;Son, in my time I could multiply two three-digit numbers in my head.&rdquo; &ldquo;Dad, you talk funny.&rdquo;</em> <a href="http://twitter.com/vivekhaldar/statuses/296740377254313984">#</a>
</p><p><em>&ldquo;Son, in my time we used tiny sticks that squirted ink to make letter-like patterns by hand.&rdquo; &ldquo;Dad, you talk funny.&rdquo;</em> <a href="http://twitter.com/vivekhaldar/statuses/296663074453196801">#</a>
</p><p><em>&ldquo;Son, in my time we had to stay awake and drive these cars ourselves.&rdquo; &ldquo;Dad, you talk funny.&rdquo;</em> <a href="http://twitter.com/vivekhaldar/statuses/296419253341532162">#</a>
</p><p><em>&ldquo;Son, in my time we used to punch in words one letter at a time on boards with keys.&rdquo; &ldquo;Dad, you talk funny.&rdquo;</em> <a href="http://twitter.com/vivekhaldar/statuses/296378131244261376">#</a>
</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Factory machines</title>
      <link>http://vivekhaldar.com/articles/factory-machines/</link>
      <pubDate>Tue, 26 Feb 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/factory-machines/</guid>
      <description>&lt;p&gt;I’ve been trying to figure out the place of the desktop computer in my computing universe. For the last five (or more?) years, I have not had one at home. I have one at work. It runs headless under my desk, and serves up ssh and X sessions. (By “desktops” I mean computers in immobile boxes, so that would include servers in datacenters too.)&lt;/p&gt;
&lt;p&gt;I don’t see them completely going away. Very high-end work (video, graphics, big compiles) will probably always want something that’s hotter and faster than what can fit into a thin slab. &lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I’ve been trying to figure out the place of the desktop computer in my computing universe. For the last five (or more?) years, I have not had one at home. I have one at work. It runs headless under my desk, and serves up ssh and X sessions. (By “desktops” I mean computers in immobile boxes, so that would include servers in datacenters too.)</p>
<p>I don’t see them completely going away. Very high-end work (video, graphics, big compiles) will probably always want something that’s hotter and faster than what can fit into a thin slab. </p>
<p>To someone who didn’t grow up with them, desktops will look like <em>factory machines</em>. Heavy, ugly things that don’t belong in the everyday personal world, but solely in places of work, serving highly specialized requirements.</p>
<p>Keyboards and trackpads are headed the same way, I think.</p>
<p><strong>Update:</strong> Right after hitting &ldquo;Publish&rdquo; on this post, I saw <a href="http://cdixon.org/2013/02/26/pcs-are-going-to-be-like-trucks/">this post by Chris Dixon</a> (off HN) which makes more or less the same point. </p>
]]></content:encoded>
    </item>
    
    <item>
      <title>The new luxury</title>
      <link>http://vivekhaldar.com/articles/the-new-luxury/</link>
      <pubDate>Thu, 21 Feb 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-new-luxury/</guid>
      <description>&lt;p&gt;Imagine, if, in today’s world, you saw someone jotting down notes in a meeting with a fine fountain pen. You know, the kind that has a cartridge filled with liquid ink, that flows through a metallic nib, sometimes covered with a fine coat of a precious metal. The kind that seems strikingly, anachronistically out of place in a conference room with laptops and white boards and dry erase markers and cheap plastic ball point pens. The kind that would be more fitting in a dark room overhung with cigar smoke, with padded leather recliners and heavy wood paneling.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Imagine, if, in today’s world, you saw someone jotting down notes in a meeting with a fine fountain pen. You know, the kind that has a cartridge filled with liquid ink, that flows through a metallic nib, sometimes covered with a fine coat of a precious metal. The kind that seems strikingly, anachronistically out of place in a conference room with laptops and white boards and dry erase markers and cheap plastic ball point pens. The kind that would be more fitting in a dark room overhung with cigar smoke, with padded leather recliners and heavy wood paneling.</p>
<p>What would you think of such a person? What kind of a statement are they making?</p>
<p><strong>It is a renunciation of the digital in favor of the analog.</strong> They’re giving up on making their notes searchable and linkable and shareable. This is the sort of voluntary shift away from digital and towards the material analog that <a href="http://www.nytimes.com/2009/04/19/magazine/19wwln-medium-t.html">Bruce Sterling has characterized as the mark of the rich in today’s world</a>. Or conversely, <a href="http://blog.vivekhaldar.com/post/43660956543/connectivity-is-poverty-was-how-a-friend-of-mine">too much connection is a sign of poverty</a>.</p>
<p>They’re saying that they’re <a href="http://fieldnotesbrand.com/">not writing it down to remember it later, they’re writing it down to remember it now</a>. Maybe they’re important enough or smart enough to not have to grub through their notes from the last meeting (like you were doing on your laptop, trying to get some context).</p>
<p><strong>It is a status symbol.</strong> Just like watches became jewelry in the 21st century. Because why even go to the trouble of having a fountain pen if it isn’t an exquisite, expensive one?</p>
<p><strong>It is a sensuous oasis in a homogenous environment.</strong> If you’ve used one, do you remember the sensuous joy of writing with a fountain pen? The smooth slide of the nib on the paper, tempered just a little by the friction against it. The trail of wet ink, gleaming, drying a few seconds later. You could even smell it. You didn’t want to run out of words, because then you’d have to stop writing. It was a calming, almost meditative experience.</p>
<p>The same line of thought holds true for many analog things. Things for which we must leave behind the ethereal digital and embrace durable atoms. <a href="http://www.usbtypewriter.com/">Typewriters that are keyboards.</a> Face-to-face gatherings of humans. Large, heavy wooden desks. A thick hardbound book, with marginalia and bookmarks and its very own smell.</p>
<p>What is the mark of luxury? Rarity. Price. Being understated and not ostentatious while still making a bold statement and attracting attention. The analog physical will possess all of them. As we dive further into the digital, and as most of it becomes commonplace and cheap, coming across something from the old analog world will seem all the more striking.</p>
<p>Analog objects will be the new luxury.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Productivity isn&#39;t</title>
      <link>http://vivekhaldar.com/articles/productivity-isnt/</link>
      <pubDate>Sun, 10 Feb 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/productivity-isnt/</guid>
      <description>&lt;p&gt;It may be the devil or it may be the Lord&lt;br/&gt;
But you’re gonna have to serve somebody&lt;br/&gt;
– &lt;a href=&#34;http://www.bobdylan.com/us/songs/gotta-serve-somebody&#34;&gt;Bob Dylan.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Productivity has been on my mind (again) lately. I present some thoughts here, if only to get a load off my head.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Productivity is for peasants.&lt;/em&gt; Yes, that is a provocative framing, but the point stands: productivity is you being accountable to someone, and them measuring you by metrics they deem appropriate. The aristocracy in ages past explicitly shunned productivity. &lt;em&gt;Not&lt;/em&gt; doing anything and living a life of leisure was the true mark of high class.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>It may be the devil or it may be the Lord<br/>
But you’re gonna have to serve somebody<br/>
– <a href="http://www.bobdylan.com/us/songs/gotta-serve-somebody">Bob Dylan.</a></p>
<p>Productivity has been on my mind (again) lately. I present some thoughts here, if only to get a load off my head.</p>
<p><em>Productivity is for peasants.</em> Yes, that is a provocative framing, but the point stands: productivity is you being accountable to someone, and them measuring you by metrics they deem appropriate. The aristocracy in ages past explicitly shunned productivity. <em>Not</em> doing anything and living a life of leisure was the true mark of high class.</p>
<p><em>Productivity measurement made sense for factories; it doesn’t for offices.</em> The notion of “productivity”, and of measuring it, is a Taylorist invention. Break work down to its individual components, split it out into an assembly line, and then measure each section, and the whole. The idea is firmly rooted in the separation of thinking (design of the assembly line) and doing (operating machinery on the line). <a href="http://blog.vivekhaldar.com/post/41766621720/blue-collar-coders">Creative and ambiguous endeavors defy this scheme</a>.</p>
<p><em>Measuring productivity is impossible.</em> This is a stronger statement than <a href="http://www.johndcook.com/blog/2013/02/06/randomized-studies-of-productivity/">saying that it is just hard.</a> No matter what metric you pick, it can be perverted, and often is. Bugs, lines of code, hours worked, even revenue. These are <em>consequences</em> of being productive, <em>sometimes</em>, but one shouldn’t confuse them for the real thing. The root cause of this is that measurement and the numbers that emanate from it inherently lead to short-term local optimizations. For example, look at the all the pointless day-to-day activity around the stock market. True impact comes from long-term thinking, and while data can certainly inform that, it takes deep maturity to insulate oneself from small movements.</p>
<p><em>Productivity is about finding bottlenecks</em>. Almost every measurement of productivity, as I’ve noted above, is meaningless. They don’t tackle the bottleneck of a system. <a href="http://en.wikipedia.org/wiki/Theory_of_constraints">Trying to optimize the parts of a system that are not bottlenecks is a complete waste of effort</a>. Whatever purported gains are reported are probably due to the <a href="http://www.ribbonfarm.com/2012/07/13/the-generalized-hawthorne-effect/">Hawthorne effect</a>. So, first, find the bottleneck (at the level of the individual, team, factory, company, or whatever), then optimize just that one thing, until something else becomes the bottleneck.</p>
<p><em>Productivity is not work done per unit time.</em> My brain goes blank when people talk about “productivity”, in the same way a scientist might tune you out if you say something like “This stone weighs 20.” 20 <em>what</em>? Kilograms? Pounds? Everything I’ve read about productivity focuses on some sort of rate, a measure of work done per unit time. That is a <em>local</em> measure. It’s also the wrong unit. Productivity should be a dimensionless, unitless fraction between 0 and 1, representing how much of your potential maximum output you can achieve. (I suppose destructive people could have negative productivity.) Yes, I realize that makes it a relative measure that can’t be universally compared. Yes, like I said before, it is still hard to measure. </p>
<p><em>We should focus on work design, not productivity.</em> Universe A: you work 40 hours a week, make 80k a year, spend evenings and weekends with family and friends. Universe B: you work 80 hours a week, make 200k a year, neglect your family and have no friends. You will live long and be happy in Universe A, and Universe B will make you miserable and prematurely kill you. From an individual standpoint, <em>design</em> of life and work yields much higher returns than maximizing productivity. (Remember that when you spend those hours on “tips and tricks.”)</p>
<p><em>The 21st century will be about defining “work”.</em> The sweep of modern history so far has been about defining the common economic and political systems that civilization can live with. The various schools of thought duked it out over the last couple of centuries, and capitalism (tempered to various degrees by local taste) and democracy won, enshrining the idea of individual rights and liberty. It has now brought us to the point where the focus now turns inwards to what the individual should do. Work has now become tied to an individual’s self-worth. <a href="http://www.wired.com/gadgetlab/2012/12/ff-robots-will-take-our-jobs/all/">What does that mean if your job is automated away?</a></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Colorful geometry</title>
      <link>http://vivekhaldar.com/articles/colorful-geometry/</link>
      <pubDate>Wed, 06 Feb 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/colorful-geometry/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://openlibrary.org/books/OL24608640M/The_first_six_books_of_the_Elements_of_Euclid&#34;&gt;This geometry book from 1847&lt;/a&gt; (!!) uses “colored diagrams and symbols instead of letters for the greater ease of learners.”&lt;/p&gt;
&lt;p&gt;For example, consider this right-angled triangle…&lt;/p&gt;
&lt;figure class=&#34;tmblr-full&#34; data-orig-height=&#34;155&#34; data-orig-width=&#34;314&#34;&gt;&lt;img src=&#34;https://64.media.tumblr.com/cd117a1ccd3afaa64ec661777eb63dfd/2e8ef04ead2bf2f6-5e/s540x810/75837068f8a3448af4b6fc4b715499c2eed15e85.png&#34; data-orig-height=&#34;155&#34; data-orig-width=&#34;314&#34;/&gt;&lt;/figure&gt;&lt;p&gt;… and two ways of stating facts about it.&lt;/p&gt;
&lt;p&gt;The old way (quoting from the book):&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;The angle BAC, together with the angles BCA and ABC are equal to two right angles, or twice the angle ABC.&lt;/li&gt;
&lt;li&gt;The angle CAB added to the angle ACB will be equal to the angle ABC.&lt;/li&gt;
&lt;li&gt;The angle ABC is greater than either of the angles BAC or BCA.&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;And the new way:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://openlibrary.org/books/OL24608640M/The_first_six_books_of_the_Elements_of_Euclid">This geometry book from 1847</a> (!!) uses “colored diagrams and symbols instead of letters for the greater ease of learners.”</p>
<p>For example, consider this right-angled triangle…</p>
<figure class="tmblr-full" data-orig-height="155" data-orig-width="314"><img src="https://64.media.tumblr.com/cd117a1ccd3afaa64ec661777eb63dfd/2e8ef04ead2bf2f6-5e/s540x810/75837068f8a3448af4b6fc4b715499c2eed15e85.png" data-orig-height="155" data-orig-width="314"/></figure><p>… and two ways of stating facts about it.</p>
<p>The old way (quoting from the book):</p>
<ol><li>The angle BAC, together with the angles BCA and ABC are equal to two right angles, or twice the angle ABC.</li>
<li>The angle CAB added to the angle ACB will be equal to the angle ABC.</li>
<li>The angle ABC is greater than either of the angles BAC or BCA.</li>
</ol><p>And the new way:</p>
<figure class="tmblr-full" data-orig-height="367" data-orig-width="500"><img src="https://64.media.tumblr.com/95a2c651277909b75ee5e8deb9f2d884/2e8ef04ead2bf2f6-e8/s540x810/2f3378224f18b009c0091a1423c1452651ffff02.png" data-orig-height="367" data-orig-width="500"/></figure><p>I loved geometry in high school, but it was despite the drab textbooks. Why isn’t this the standard way geometry is taught everywhere?</p>
<p><a href="http://openlibrary.org/books/OL24608640M/The_first_six_books_of_the_Elements_of_Euclid">You can download the entire book, or view it online.</a></p>
<p>(via <a href="http://publicdomainreview.org/2012/06/21/the-first-six-books-of-the-elements-of-euclid-1847/">Public Domain Review</a>)</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Review: Close to the Machine</title>
      <link>http://vivekhaldar.com/articles/review-close-to-the-machine/</link>
      <pubDate>Tue, 05 Feb 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/review-close-to-the-machine/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.amazon.com/gp/product/B007FU83DY/ref=as_li_ss_tl?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B007FU83DY&amp;amp;linkCode=as2&amp;amp;tag=vivhalsblo-20&#34;&gt;The opening pages&lt;/a&gt;&lt;img src=&#34;http://www.assoc-amazon.com/e/ir?t=vivhalsblo-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=B007FU83DY&#34; width=&#34;1&#34; height=&#34;1&#34; border=&#34;0&#34; alt=&#34;&#34; style=&#34;border:none !important; margin:0px !important;&#34;/&gt;, where two programmers are completing each others sentences as they try to find the root cause of a bug, is the lure that will immediately pull any programmer into this book. But as you journey into the book, you find someone who can plumb the depths of the pathos of this tribe of people. A literary Sherry Turkle, if you will. And as she does that, her sparklingly detailed vignettes of the life and people of Silicon Valley (because where else could a book like this be set?) propel you forward.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://www.amazon.com/gp/product/B007FU83DY/ref=as_li_ss_tl?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B007FU83DY&amp;linkCode=as2&amp;tag=vivhalsblo-20">The opening pages</a><img src="http://www.assoc-amazon.com/e/ir?t=vivhalsblo-20&amp;l=as2&amp;o=1&amp;a=B007FU83DY" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;"/>, where two programmers are completing each others sentences as they try to find the root cause of a bug, is the lure that will immediately pull any programmer into this book. But as you journey into the book, you find someone who can plumb the depths of the pathos of this tribe of people. A literary Sherry Turkle, if you will. And as she does that, her sparklingly detailed vignettes of the life and people of Silicon Valley (because where else could a book like this be set?) propel you forward.</p>
<p>As the title suggests, a big part of the book is about the discontents of being enveloped in technology, and of spending your life building it. Like a fine Greek tragedy in which joy and sorrow are weaved fine, that is inextricably linked to what draws them in in the first place. When doing that it&rsquo;s easy to fall into the trap being nostalgic, of looking back with rose-tinted glasses and discounting the advantages of the present, and favouring the past simply because it was known and loved. Deep in their heart of hearts, everyone&rsquo;s ideal world is that of their childhood. That&rsquo;s the trap of nostalgia&ndash; to think that the world was simpler and purer, when actually it was us who were simpler and purer. Which is why it was refreshing to see the author take an unsentimental look at the side of technology that estranges us, makes us &ldquo;virtual.&rdquo;</p>
<p>I thoroughly enjoyed it.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Computer Science PhD trends</title>
      <link>http://vivekhaldar.com/articles/computer-science-phd-trends/</link>
      <pubDate>Thu, 31 Jan 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/computer-science-phd-trends/</guid>
      <description>&lt;p&gt;One of the most under-rated gems in professional computer science is the &lt;a href=&#34;http://www.cra.org/resources/taulbee/&#34;&gt;Taulbee Survey put out every year by the Computing Research Association&lt;/a&gt;. It is a treasure trove of statistics, hard data and trends about both the input (enrollment) and output (graduation and employment) of the computing education pipeline. The &lt;a href=&#34;http://cra.org/uploads/documents/resources/taulbee/CRA_Taulbee_2011-2012_Results.pdf&#34;&gt;latest one has data for the 2011–2012 time period&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You could spend hours diving into the data and drawing your own conclusions, but these are some of the things that jumped out at me:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>One of the most under-rated gems in professional computer science is the <a href="http://www.cra.org/resources/taulbee/">Taulbee Survey put out every year by the Computing Research Association</a>. It is a treasure trove of statistics, hard data and trends about both the input (enrollment) and output (graduation and employment) of the computing education pipeline. The <a href="http://cra.org/uploads/documents/resources/taulbee/CRA_Taulbee_2011-2012_Results.pdf">latest one has data for the 2011–2012 time period</a>.</p>
<p>You could spend hours diving into the data and drawing your own conclusions, but these are some of the things that jumped out at me:</p>
<ol><li>7% of new PhDs got into tenure-track faculty positions.</li>
<li>47% of new PhDs went to industry.</li>
<li>57% of PhD enrollments were nonresident aliens (an all-time high), as were nearly 50% of PhD graduates.</li>
</ol><p>What does this mean? Let’s take them in turn.</p>
<ol><li><p>The tenure-track faculty position is the top of the academic totem pole and coveted by fresh PhDs. The hard truth is that those positions are small in number and <a href="http://cacm.acm.org/magazines/2013/2/160156-the-explosive-growth-of-postdocs-in-computer-science/fulltext">getting smaller, leaving the very distant second choice of post-doc as the only viable option for those who want to stick with academia</a>:</p>
<blockquote>
<p>The data indicates tenure-track faculty positions for new Ph.D.’s have declined steadily since 2004 from 224 to 124 in 2011 while the number of postdoc positions greatly increased. In 2011, new Ph.D. graduates accepted twice as many postdoc positions as tenure-track positions. Around 2003 there were approximately 2.5 times more tenure-track positions than postdoc positions.</p>
</blockquote>
<p>Which brings us to…</p></li>
<li><p>At least in computer science, the slack has been picked up in large part by industry. This might have been looked down on in the past (“I have a PhD! I can’t work as a money-grubbing corporate stooge!”), but <a href="http://blog.vivekhaldar.com/post/29296581613/what-is-life-like-for-phds-in-computer-science-who-go">as I’ve written before</a>, the avante-garde tech companies of today offer work challenging and varied enough (and yes, well-paying enough) to keep nearly half of the graduating crop of PhDs happily employed. I expect this fraction to only grow in the future.</p>
<p>1 and 2 combined should make <a href="http://blog.vivekhaldar.com/post/25136762019/advice-to-prospective-grad-students">every prospective PhD student do a good deal of soul-searching</a> to figure out why exactly they want to go through with it. It is a big commitment, and it is not easy, not just in the intellectual and academic sense, but also psychologically. This doesn’t have to be done before you start. Remember that there is an “out” after about two years when you can leave with a master’s degree. <a href="http://blog.vivekhaldar.com/post/25136762019/advice-to-prospective-grad-students">I’ve reached the conclusion</a> that there is no material advantage to doing a PhD, and that the only good reasons to do it are philosophical and deeply personal. I will always remember it as the last still, contemplative and reflective time in my life. A font that forever gives.﻿</p></li>
<li><p>To anyone who has walked the halls of a CS department (especially at night), this statistic is far from a surprise. To most of the public, it probably is. Yes, the majority of people in CS PhD programs in the US are foreigners. And the vast majority of them get a full scholarship for the six to seven years that it takes to get a PhD. (<a href="http://blog.vivekhaldar.com/post/4986502776/side-effects-of-phd-programs">They repay part of that by keeping the academic engine churning</a>, but still.) The vast majority of that scholarship money comes from government grants (i.e. taxpayer dollars) from agencies like the National Science Foundation, Department of Homeland Security, Office of Naval Research etc. I am loathe to get into politically charged topics, but given this, it seems <a href="http://sequoiacapital.tumblr.com/post/41716630960/immigration-reform-stop-ejecting-the-brightest-minds">downright stupid to make legal residence in the US of those graduating PhDs so hard that a non-trivial fraction of them leave</a>. The logical taxpayer should <em>insist</em> that they stay here and contribute back as productive members of society.</p></li>
</ol>
]]></content:encoded>
    </item>
    
    <item>
      <title>Tackling tail latency</title>
      <link>http://vivekhaldar.com/articles/tackling-tail-latency/</link>
      <pubDate>Tue, 29 Jan 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/tackling-tail-latency/</guid>
      <description>&lt;p&gt;This will be hard to miss as it is the cover story of the next &lt;a href=&#34;http://cacm.acm.org/magazines/2013/2&#34;&gt;Communications of the ACM&lt;/a&gt;, but here&amp;rsquo;s a shout out nevertheless to the article titled &lt;a href=&#34;http://cacm.acm.org/magazines/2013/2/160173-the-tail-at-scale/fulltext&#34;&gt;&amp;ldquo;The Tail at Scale&amp;rdquo;&lt;/a&gt; by Googlers Jeffrey Dean and Luiz André Barroso.
&lt;/p&gt;&lt;p&gt;
The abstract:
&lt;/p&gt;&lt;blockquote&gt;
It is challenging for service providers to keep the tail of latency distribution short for interactive services as the size and complexity of the system scales up or as overall use increases. Temporary high-latency episodes (unimportant in moderate-size systems) may come to dominate overall service performance at large scale. Just as fault-tolerant computing aims to create a reliable whole out of less-reliable parts, large online services need to create a predictably responsive whole out of less-predictable parts; we refer to such systems as &amp;ldquo;latency tail-tolerant,&amp;rdquo; or simply &amp;ldquo;tail-tolerant.&amp;rdquo; Here, we outline some common causes for high-latency episodes in large online services and describe techniques that reduce their severity or mitigate their effect on whole-system performance.
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;http://cacm.acm.org/magazines/2013/2/160173-the-tail-at-scale/fulltext&#34;&gt;Go read the whole thing.&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>This will be hard to miss as it is the cover story of the next <a href="http://cacm.acm.org/magazines/2013/2">Communications of the ACM</a>, but here&rsquo;s a shout out nevertheless to the article titled <a href="http://cacm.acm.org/magazines/2013/2/160173-the-tail-at-scale/fulltext">&ldquo;The Tail at Scale&rdquo;</a> by Googlers Jeffrey Dean and Luiz André Barroso.
</p><p>
The abstract:
</p><blockquote>
It is challenging for service providers to keep the tail of latency distribution short for interactive services as the size and complexity of the system scales up or as overall use increases. Temporary high-latency episodes (unimportant in moderate-size systems) may come to dominate overall service performance at large scale. Just as fault-tolerant computing aims to create a reliable whole out of less-reliable parts, large online services need to create a predictably responsive whole out of less-predictable parts; we refer to such systems as &ldquo;latency tail-tolerant,&rdquo; or simply &ldquo;tail-tolerant.&rdquo; Here, we outline some common causes for high-latency episodes in large online services and describe techniques that reduce their severity or mitigate their effect on whole-system performance.
</blockquote>
<p><a href="http://cacm.acm.org/magazines/2013/2/160173-the-tail-at-scale/fulltext">Go read the whole thing.</a></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Blue collar coders</title>
      <link>http://vivekhaldar.com/articles/blue-collar-coders/</link>
      <pubDate>Mon, 28 Jan 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/blue-collar-coders/</guid>
      <description>&lt;p&gt;There have been a couple of recent calls for blue collar coders and knowledge workers. &lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://dashes.com/anil/2012/10/the-blue-collar-coder.html&#34;&gt;Anil Dash&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;High schools have long offered vocational education, preparing graduates for practical careers by making them proficient in valuable technical skill sets which they can put to use directly in the job market right after graduation. Vocational-technical schools (vo-tech) provide trained workers in important fields such as healthcare, construction trades, and core business functions like accounting. For a significant number of my high school peers, vo-tech was the best path to a professional job that would pay well over the duration of an entire career.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>There have been a couple of recent calls for blue collar coders and knowledge workers. </p>
<p><a href="http://dashes.com/anil/2012/10/the-blue-collar-coder.html">Anil Dash</a>:</p>
<blockquote>
<p>High schools have long offered vocational education, preparing graduates for practical careers by making them proficient in valuable technical skill sets which they can put to use directly in the job market right after graduation. Vocational-technical schools (vo-tech) provide trained workers in important fields such as healthcare, construction trades, and core business functions like accounting. For a significant number of my high school peers, vo-tech was the best path to a professional job that would pay well over the duration of an entire career.</p>
<p>Now it’s time that vo-tech programs broadly add internet and web technologies to the mix. We need web dev vo-tech.</p>
</blockquote>
<p><a href="http://seldo.com/weblog/2012/08/30/software_developers_can_save_the_economy">Laurie Voss</a>:</p>
<blockquote>
<p>Think about how a physical factory worked. The reason unskilled jobs in manufacturing, say, cars existed is because some very highly skilled people first got together and looked at the process of building a car and said “okay, we can automate this bit and this bit and this bit, but making machines to do this bit is way too hard”. The blue collar workers of Detroit didn’t know how to build cars: they knew how to operate one particular bit of machinery. The only people who knew how to build cars were the guys who put the machines together.</p>
<p>Now let’s try applying that model to web development…There is an entire industry built around cranking out simple websites for small businesses, in WordPress or Drupal or a thousand proprietary solutions… It’s as if Detroit were a city of craftspeople who built one car at a time from scratch in their garage at home – with love and care, but slowly and enormously expensively</p>
</blockquote>
<p>Well, it certainly isn’t for lack of trying. You have to remember that since its very inception, the field of software engineering has lamented that it was <a href="http://blog.vivekhaldar.com/post/13241026081/the-programming-assembly-line">not industrialized enough</a>. At the 1968 NATO conference, Doug McIlroy said:</p>
<blockquote>
<p>Software production today appears in the scale of industrialization somewhere below the more backward construction industries. I think its proper place is considerably higher, and would like to investigate the prospects for mass-production techniques in software. In the phrase “mass production techniques,” my emphasis is on “techniques” and not on mass production plain. Of course mass production, in the sense of limitless replication of a prototype, is trivial for software. But certain ideas from industrial technique I claim are relevant. The idea of subassemblies carries over directly and is well exploited. The idea of interchangeable parts corresponds roughly to our term `modularity,’ and is fitfully respected. The idea of machine tools has an analogue in assembly programs and compilers. </p>
</blockquote>
<p>What the two gentlemen are talking about is bringing full-scale Taylorism to software development. Industry loves Taylorism! It would bring Taylorism to every possible activity it could. And yet, there is something about the activity of constructing software that has not yet relented to Taylorism. Some parts have, though. The “knowledge factories” that churn out websites by picking and choosing from a menu might not exist, but something similar has happened on a much larger scale with enterprise software. That is the business that every large IT services and consultancy company is in.</p>
<p>The problem with this vocational tech approach is that it implicitly assumes the knowledge gained during vocational training will be relevant for a long period of time. The pace of technology change renders that unviable.</p>
<p>Also, being a blue collar coder is not a sustainable career. The kinds of jobs envisioned for them are one skip away from becoming fully automated. Why even involve a human? Why not have an <em>automated service</em> where you can select items from a menu, and presto, you have a website for your small business? Being in that position means that your only bargaining chip is controlling aggregate supply of labor, i.e. unionizing, which will likely only add to the motivation for finding automated solutions.</p>
<p>Little known is the fact that programming started out as a field that was Taylorist to its core. The very first computer “programs” were specified at a high-level by scientists, and then the actual coding into computer instructions was left to… coders, literally. And at the time, that job fell on the secretarial staff, most of whom were women. The majority of the very first programmers were ladies. (Strange how the gender ratio flipped over time.) In time, the higher-ups realized just how much talent and brain-power it took to “code”, and how much was strangely left unspecified in the gap between the white-collar specifications of the managerial layer and the nuts-and-bolts “code”.</p>
<p>They tried making coding a blue-collar job from the very start, and it didn’t work<a href="#fn:1" id="fnref:1" title="see footnote" class="footnote">[1]</a>.</p>
<div class="footnotes">
<hr><ol><li id="fn:1">
<p>For a more detailed look at the history of programming, I highly recommend <a href="http://blog.vivekhaldar.com/post/28858604561/review-the-computer-boys-take-over">“The Computer Boys Take Over”, by Nathan Ensmenger</a> <a href="#fnref:1" title="return to article" class="reversefootnote"> ↩</a></p>
</li>
</ol></div>
]]></content:encoded>
    </item>
    
    <item>
      <title>The void</title>
      <link>http://vivekhaldar.com/articles/the-void/</link>
      <pubDate>Sun, 27 Jan 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-void/</guid>
      <description>&lt;p&gt;My computing slab is in a cave. (Naturally, so am I. I wouldn&amp;rsquo;t send it in alone, would I?) No Wifi, no 3G. Then, when we come out into civilization (i.e. connectivity) after a few hours, the slab goes Bing! Bing! Bing! as it catches up to reality after being in the knowledge-less void, its notification bar lighting up like a Christmas Tree. &amp;ldquo;Look at all the things you missed!&amp;rdquo;, it screams at me, petulant from the lack of attention.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>My computing slab is in a cave. (Naturally, so am I. I wouldn&rsquo;t send it in alone, would I?) No Wifi, no 3G. Then, when we come out into civilization (i.e. connectivity) after a few hours, the slab goes Bing! Bing! Bing! as it catches up to reality after being in the knowledge-less void, its notification bar lighting up like a Christmas Tree. &ldquo;Look at all the things you missed!&rdquo;, it screams at me, petulant from the lack of attention.</p>
<p>I can&rsquo;t help but think of it as a whale coming up for air, or a bear coming out of hibernation.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Engineering, Culture and Tools</title>
      <link>http://vivekhaldar.com/articles/engineering-culture-and-tools/</link>
      <pubDate>Fri, 18 Jan 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/engineering-culture-and-tools/</guid>
      <description>&lt;p&gt;As an engineer, I&amp;rsquo;ve always been flummoxed by the word &amp;ldquo;culture&amp;rdquo;, esepecially as it pertains to corporate entities, especially those of the tech variety.&lt;/p&gt;
&lt;p&gt;When someone asks you, &amp;ldquo;What&amp;rsquo;s the culture like?&amp;rdquo;, or &amp;ldquo;Is this candidate a good culture fit?&amp;rdquo;, what do they mean, and how do you answer them? Phrases like &amp;ldquo;work hard, play harder&amp;rdquo;, &amp;ldquo;move fast&amp;rdquo;, &amp;ldquo;risk-taking is rewarded&amp;rdquo;, &amp;ldquo;dynamic and collaborative&amp;rdquo; (who isn&amp;rsquo;t?) sound catchy and look good on recruitment pages, but are meaningless. What is it then? A list of rules? Some pre-requisite mental and attidudinal posture for blending in and functioning well in the company?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>As an engineer, I&rsquo;ve always been flummoxed by the word &ldquo;culture&rdquo;, esepecially as it pertains to corporate entities, especially those of the tech variety.</p>
<p>When someone asks you, &ldquo;What&rsquo;s the culture like?&rdquo;, or &ldquo;Is this candidate a good culture fit?&rdquo;, what do they mean, and how do you answer them? Phrases like &ldquo;work hard, play harder&rdquo;, &ldquo;move fast&rdquo;, &ldquo;risk-taking is rewarded&rdquo;, &ldquo;dynamic and collaborative&rdquo; (who isn&rsquo;t?) sound catchy and look good on recruitment pages, but are meaningless. What is it then? A list of rules? Some pre-requisite mental and attidudinal posture for blending in and functioning well in the company?</p>
<p>Culture cannot be spelt out. Almost all attempts to do so result in bland lists, which, if followed, would not resemble the real culture at all. Good cultures are self-propagating and strong, in that new hires quickly ingest it by osmosis without needing someone to tell them about it. The greatest cultures even transcend their own companies, and their own era, jumping from generation to generation. The biggest example of this is how <a href="http://blog.vivekhaldar.com/post/12541821721/the-origins-of-silicon-valley">even current-day Silicon Valley culture is very close to the that of Fairchild Semiconductor, which in turn was largely the creation of a single person&ndash;Robert Noyce.</a></p>
<p>Interviewers and candidates often talk about &ldquo;culture fit&rdquo;. This is a negative filter. Interviewers aren&rsquo;t looking for people who are just like them&ndash;most reasonable people should be able to inculcate a reasonable culture just fine&ndash;they&rsquo;re looking to weed out people who are inflexible or otherwise indoctrinated enough to reject the learning-by-osmosis that takes place when one first joins an organization.</p>
<p>But here&rsquo;s the thing: amorphous as it is, <em>culture makes things happen</em>. It does have a real impact on how products are built, and which ones are built. I like to think of it as the bass player in the band. They are the most underrated member of the band. But when there&rsquo;s no bass, the whole thing sounds <em>off</em> somehow, and you can&rsquo;t put a finger on what exactly is missing. Culture is like that. Its presence in a place is taken for granted until you go somewhere else where the culture is different, or missing. It took me a while to figure this out. And then I realized why a select circle of seniors (in accomplishment, not necessarily in age) were constantly tending to it.</p>
<p>Which makes it all the more important to get a better handle on what exactly it is.</p>
<p>For engineers, there are two types of culture. The culture of the company as a whole, and the culture of the engineering organization within it. In true tech companies, the two are essentially the same. The entire company&rsquo;s culture is ultimately dictated by what makes it tick. Some companies are sales driven. Others are product driven. And some are truly tech/engg driven, where cool things are built by smart people, and <em>then</em> someone thinks about how to make money off it. Don&rsquo;t jump to the conclusion that the last one is great. The purest example of that was PARC, and while it gave the world the defining elements of the computing age, the entity itself could never stay financially solvent.</p>
<p>And then there&rsquo;s <em>engineering culture</em>. It turns out, this is much simpler to pin down, but there&rsquo;s so much fog around the world &ldquo;culture&rdquo; that it gets lost.
</p><p><em>The engineering culture is simply the set of behaviors positively reinforced by the tools and processes of the organization.</em>
</p><p>If code review is a pre-requisite for submitting patches, then you have a culture that encourages clean code, early bug-catching and knowledge-sharing. If code reviewers insist on tests for new code, and there are tools that make it easy and fast, and documents that explain clearly how to do it, then you have a culture where testing is ingrained. Note how self-reinforcing things like this are. If your code was put through the scrubber by reviewers, you too will do the same with code that you review. And that&rsquo;s a good thing. That&rsquo;s what keeps standards high. This is beautifully meta too&mdash;the culture is <a href="http://blog.vivekhaldar.com/post/450355817/software-processes-are-software-too">defined by software</a>, in a sense.</p>
<p>I was in two minds about how much of the engineering tools of Google I could describe in detail, but it turns out <a href="http://mike-bland.com/">ex-Googler Mike Bland</a> has written a <a href="http://mike-bland.com/2012/10/01/tools.html">series of five posts that goes into the coding and testing culture and tools at Google in excrutiating depth</a>. It is a splendid case study of how engineering culture is established, changed and propagated.</p>
<p>A teaser:</p>
<blockquote>
<p>
This is the fifth—and, finally, <em>final</em>—post in my “whaling” series about the high-level conceptual and cultural challenges the <a href="http://mike-bland.com/2011/09/27/testing-grouplet.html">Testing Grouplet</a> and its allies faced, and the knowledge and tools that eventually spread throughout Google engineering that removed the infamous “I don’t have time to test” excuse. This post discusses the specific tools the the Testing Grouplet, Testing Tech, Build Tools and others developed to improve development and testing efficiency and effectiveness.
</p>
<p>
The <a href="http://mike-bland.com/2012/08/10/call-me-ishmael.html">first post in this series</a> focused on high-level cultural challenges to the adoption of automated developer testing that emerged as a result of day-to-day development reality. The <a href="http://mike-bland.com/2012/08/16/oop-revisited.html">second post in this series</a> focused on the fundamental object-oriented programming issues which formed the core of most of Google’s testability challenges—and solutions. The <a href="http://mike-bland.com/2012/09/11/practice-of-testing.html">third post in this series</a> covered the basics of how automated tests should—and should not—be written. The <a href="http://mike-bland.com/2012/09/13/process.html">fourth post in this series</a> described the collection of processes employed by Google for ensuring software quality—including, but not limited to, automated testing.
</p>
</blockquote>
]]></content:encoded>
    </item>
    
    <item>
      <title>So Good They Can&#39;t Ignore You: Review</title>
      <link>http://vivekhaldar.com/articles/so-good-they-cant-ignore-you-review/</link>
      <pubDate>Sun, 13 Jan 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/so-good-they-cant-ignore-you-review/</guid>
      <description>&lt;p&gt;I’ve been following &lt;a href=&#34;http://calnewport.com/blog&#34;&gt;Cal Newport’s writing&lt;/a&gt; for a long time. He’s a sensible, practical guy. And the career advice book he just wrote, &lt;a href=&#34;http://www.amazon.com/gp/product/1455509124/&#34;&gt;So Good They Can’t Ignore You&lt;/a&gt;, is a sensible, practical book.&lt;/p&gt;
&lt;p&gt;Which means it will probably take most people by surprise.&lt;/p&gt;
&lt;p&gt;He starts by &lt;a href=&#34;http://www.nytimes.com/2012/09/30/jobs/follow-a-career-passion-let-it-follow-you.html&#34;&gt;building the case&lt;/a&gt; for &lt;a href=&#34;http://blogs.hbr.org/cs/2012/09/solving_gen_ys_passion_problem.html&#34;&gt;“follow your passion” being bad advice&lt;/a&gt;. Instead, one should focus on becoming really good at something &lt;em&gt;valuable&lt;/em&gt;. Hence the title. True job and life satisfaction, he argues, comes from having options and flexibility, which in turn comes from the career capital one builds up by continuing to improve and being valuable.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I’ve been following <a href="http://calnewport.com/blog">Cal Newport’s writing</a> for a long time. He’s a sensible, practical guy. And the career advice book he just wrote, <a href="http://www.amazon.com/gp/product/1455509124/">So Good They Can’t Ignore You</a>, is a sensible, practical book.</p>
<p>Which means it will probably take most people by surprise.</p>
<p>He starts by <a href="http://www.nytimes.com/2012/09/30/jobs/follow-a-career-passion-let-it-follow-you.html">building the case</a> for <a href="http://blogs.hbr.org/cs/2012/09/solving_gen_ys_passion_problem.html">“follow your passion” being bad advice</a>. Instead, one should focus on becoming really good at something <em>valuable</em>. Hence the title. True job and life satisfaction, he argues, comes from having options and flexibility, which in turn comes from the career capital one builds up by continuing to improve and being valuable.</p>
<p>The rest of the book is advice about how exactly to do that. But whether one follows that advice or not, the mental realignment offered by those first two theses alone is worth the price.</p>
<p>Career advice books usually massage your ego. Yes, you are unique and great. You must believe in yourself. It is just a matter of time before you strike gold!</p>
<p>This book gives it to you straight. <em>You have to get good before you get good work</em>. There are no shortcuts.</p>
<p>Highly recommended.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Scaling communication: email vs shared documents</title>
      <link>http://vivekhaldar.com/articles/scaling-communication-email-vs-shared-documents/</link>
      <pubDate>Tue, 08 Jan 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/scaling-communication-email-vs-shared-documents/</guid>
      <description>&lt;p&gt;Over the last couple of years, I have noticed a marked change in the way my colleagues and I communicate with each other at work. While still dominant, the use of email seems to have peaked, and folks are increasingly using shared &lt;a href=&#34;http://drive.google.com&#34;&gt;Google docs&lt;/a&gt; to not just document a topic, but also to discuss options and arrive at a consensus. (Disclaimer: &lt;a href=&#34;http://blog.vivekhaldar.com/about&#34;&gt;I’m biased&lt;/a&gt;, but take my opinion for what it’s worth.)&lt;/p&gt;
&lt;p&gt;Part of it is simply email overload fatigue. The promise of email has been subverted by a number of factors:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Over the last couple of years, I have noticed a marked change in the way my colleagues and I communicate with each other at work. While still dominant, the use of email seems to have peaked, and folks are increasingly using shared <a href="http://drive.google.com">Google docs</a> to not just document a topic, but also to discuss options and arrive at a consensus. (Disclaimer: <a href="http://blog.vivekhaldar.com/about">I’m biased</a>, but take my opinion for what it’s worth.)</p>
<p>Part of it is simply email overload fatigue. The promise of email has been subverted by a number of factors:</p>
<ul><li><em>it is no longer <a href="http://blog.vivekhaldar.com/post/26291176846/working-asynchronously">asynchronous</a></em>: Yes, in <em>theory</em> email’s biggest advantage is that it is asynchronous. I send you a message, it sits in your inbox and you reply to me at your leisure. In the meanwhile, both you and I go about our work merrily. This is simply not the case anymore. People expect a reply pretty much immediately, or within a few hours tops. And we–you and I–the ones who jump on every email and reply to it <em>right now</em> are to blame. Email has completely lost its asynchronous nature, and now sits just a tiny hop away from instant messaging in terms of immediacy.</li>
<li><em>email can’t be deep</em>: it is simply the wrong medium for deep, weighty discussions. Just because you spent an hour pouring out a thousand word essay into an email doesn’t mean the person at the other end with a four-digit number in a red circle showing his unread count will spend the same amount of psychic energy on it. Email is for <em>notifications</em>: “take a look at this”, “hey, this thing broke”. It is for <em>skimming</em>, not for <em>diving</em>. We all know the exponential loss of signal by the time an email thread crosses ten replies or as many people in the to/cc lines.</li>
<li><em>it is inherently attention-fracturing</em>: An inbox is like being in the center of a circle of people, each repeatedly shouting the same phrase at you. Your best bet is to either knock them out (unread archive), or make a quick radial sweek (next, next, next). It is not the place to go for shoring up your attention and focusing.</li>
</ul><p>And it is exactly for all these reasons that shared documents shine.</p>
<ul><li><em>Writing a document focuses you</em> and structures your thought in ways email cannot. It makes you think deeper, further out. The same goes for your readers. Reading well thought out prose will elicit more meaningful feedback than email ever could.</li>
<li><em><a href="http://support.google.com/drive/bin/answer.py?hl=en&amp;answer=65129">comments are inline</a></em>: in one place, right next to the main body, linked to the part that is commented upon. When you open your document, <em>all the discussion is in one place</em>.</li>
<li><em>all the privacy of email is retained</em> because docs can be shared with just the people you want, or nobody, or made public if you want.</li>
<li>And last but not least, <em>with a document you have an artifact that you can refer and link to</em> as a record of work done and thought recorded, as opposed to an email thread.</li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>The rise of fimperative programming</title>
      <link>http://vivekhaldar.com/articles/the-rise-of-fimperative-programming/</link>
      <pubDate>Mon, 07 Jan 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-rise-of-fimperative-programming/</guid>
      <description>&lt;p&gt;I love functional programming just as much as the next guy, but I’m wary when someone &lt;a href=&#34;http://pragprog.com/magazines/2013-01/functional-programming-basics&#34;&gt;unabashedly declares it the savior from our software crisis&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For the longest time, it was thought that functional programming would save us from the multicore crisis, because, well, if there is no shared state then every concurrent execution can just blaze ahead full speed, can’t it? But the devil really is in the details. Persistent data structures are not always performant. Sometimes it is cheaper to update in-place (Eeek! Assignment!).&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I love functional programming just as much as the next guy, but I’m wary when someone <a href="http://pragprog.com/magazines/2013-01/functional-programming-basics">unabashedly declares it the savior from our software crisis</a>.</p>
<p>For the longest time, it was thought that functional programming would save us from the multicore crisis, because, well, if there is no shared state then every concurrent execution can just blaze ahead full speed, can’t it? But the devil really is in the details. Persistent data structures are not always performant. Sometimes it is cheaper to update in-place (Eeek! Assignment!).</p>
<p>Also, as <a href="http://beust.com/weblog/2013/01/02/no-silver-bullet-reloaded/">Cedric Beust points out</a>, in the meanwhile the imperative camp did a great job of making concurrency work, by putting out libraries that solved the hard problems and yet exposed easy enough APIs. Paradigms win and lose not just by their theoretical beauty but by how much engineering effort goes into making them viable. As an example, <a href="http://www.azulsystems.com/blog/cliff/2007-03-26-non-blocking-hashtable">this is what it takes to get a high-performance concurrent dictionary</a>.</p>
<p>But all the same, the functional camp has much to be proud of. The trend of mainstream languages incorporating functional features has gained a lot of momentum and shows no signs of reversing. Anonymous lambda functions. First-class functions. List comprehensions. A decade ago they were FP-only, and now they are part of most programmers’ vocabularies. <a href="http://blog.vivekhaldar.com/post/36517698671/the-new-c">Even C++ has lambda functions now!</a> Maybe all languages <em>are</em> destined to asymptotically approach Lisp.</p>
<p>We’re seeing functional-inspired features creep into mainstream imperative object-oriented languages. <a href="http://richardminerich.com/2012/07/functional-programming-is-dead-long-live-expression-oriented-programming/">Richard Minerich calls it expression-oriented programming.</a> I half-jokingly call it <em>fimperative</em> programming. But what’s driving that isn’t so much the need for performance or dealing with multi-core, but just more succint and cleaner code.</p>
<p><em>Sidenote</em>: while functional programming is often presented as the antithesis of the now dominant object-oriented model, immutability and getting rid of state (i.e. no assignment!) were central to <a href="http://blog.vivekhaldar.com/post/4525315474/oop-fp">Alan Kay’s early ideas of what objects should be like</a>.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Grateful for technology?</title>
      <link>http://vivekhaldar.com/articles/grateful-for-technology/</link>
      <pubDate>Fri, 04 Jan 2013 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/grateful-for-technology/</guid>
      <description>&lt;p&gt;Everything’s amazing and nobody’s happy. — Louis CK.&lt;/p&gt;
&lt;p&gt;Does technology induce feelings of gratitude in you? Does it make you behave better? Do you ingest a life-enhancing (or life-saving) drug and then go about your daily snark? When your browser loads a webpage do you marvel at the straight line made through a stack of disparate but amazing technologies (silicon, displays, networks, Ethernet, TCP/IP, HTTP, HTML, CSS, Javascript…)?&lt;/p&gt;
&lt;p&gt;I suspect the answer is no. And at some level that always upsets engineers. We want people to feel the same sense of awe at our creations as they do when they see oceans and mountains. To feel humble and repent their petty ways.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Everything’s amazing and nobody’s happy. — Louis CK.</p>
<p>Does technology induce feelings of gratitude in you? Does it make you behave better? Do you ingest a life-enhancing (or life-saving) drug and then go about your daily snark? When your browser loads a webpage do you marvel at the straight line made through a stack of disparate but amazing technologies (silicon, displays, networks, Ethernet, TCP/IP, HTTP, HTML, CSS, Javascript…)?</p>
<p>I suspect the answer is no. And at some level that always upsets engineers. We want people to feel the same sense of awe at our creations as they do when they see oceans and mountains. To feel humble and repent their petty ways.</p>
<p>We want the world to be like Star Trek. People are clean and reasonable and polite and well-behaved. Violence and conflict are moderated by thoughtful leaders (Kirk, Picard). Human emotions are finely embroidered into the plot, not splashed randomly.</p>
<p>But the real world is a lot like another lesser known sci-fi series — <a href="#%E2%80%9Chttp://en.wikipedia.org/wiki/Babylon_5%E2%80%9D">Babylon 5</a>. It shows a world with spacefaring humans, but also with politics and class and violence and addiction. </p>
<p>Technology doesn’t change human nature.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Best of 2012</title>
      <link>http://vivekhaldar.com/articles/best-of-2012/</link>
      <pubDate>Mon, 31 Dec 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/best-of-2012/</guid>
      <description>&lt;p&gt;It has been another great year blogging, and I am deeply grateful for everyone who chose to spend some time with the words I put out, and even more so for those who started a conversation, either in the comments, or on their own online spaces.&lt;/p&gt;
&lt;p&gt;In terms of hard-nosed numbers, the key statistic I&amp;rsquo;m pleased about is that RSS subscribers grew 3.3X over the course of this year.&lt;/p&gt;
&lt;p&gt;These were the most popular posts of the year:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>It has been another great year blogging, and I am deeply grateful for everyone who chose to spend some time with the words I put out, and even more so for those who started a conversation, either in the comments, or on their own online spaces.</p>
<p>In terms of hard-nosed numbers, the key statistic I&rsquo;m pleased about is that RSS subscribers grew 3.3X over the course of this year.</p>
<p>These were the most popular posts of the year:</p>
<ul><li><a href="http://blog.vivekhaldar.com/post/28465017852/productivity-porn">Productivity Porn</a></li>
<li><a href="http://blog.vivekhaldar.com/post/29296581613/what-is-life-like-for-phds-in-computer-science-who-go">What is life like for PhDs in Computer Science who go into industry?</a></li>
<li><a href="http://blog.vivekhaldar.com/post/34386970746/why-you-would-want-to-program-at-fifty-or-any-other">Why you would want to program at fifty, or any other age</a></li>
<li><a href="http://blog.vivekhaldar.com/post/25136762019/advice-to-prospective-grad-students">Advice to prospective grad students</a></li>
<li><a href="http://blog.vivekhaldar.com/post/31462310493/english-is-heavily-left-handed">English is heavily left-handed</a></li>
<li><a href="http://blog.vivekhaldar.com/post/27259540482/teaching-data-structures-with-real-world-examples">Teaching data structures with real-world examples</a></li>
<li><a href="http://blog.vivekhaldar.com/post/23021969189/my-setup">My setup</a></li>
<li><a href="http://blog.vivekhaldar.com/post/31970017734/new-frontiers-in-text-editing">New frontiers in text editing</a></li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>New theme</title>
      <link>http://vivekhaldar.com/articles/new-theme/</link>
      <pubDate>Sat, 29 Dec 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/new-theme/</guid>
      <description>&lt;p&gt;Just in time for the new year. Source is &lt;a href=&#34;https://github.com/vivekhaldar/tumblr_theme/commit/3e860e5252814b6f5142bcfbaa376be6647854a9&#34;&gt;here&lt;/a&gt;. Body text is in &lt;a href=&#34;http://www.google.com/webfonts/specimen/Arvo&#34;&gt;Arvo&lt;/a&gt;, headings are in &lt;a href=&#34;http://www.google.com/webfonts/specimen/Kreon&#34;&gt;Kreon&lt;/a&gt;. Everything is monochrome.&lt;/p&gt;
&lt;p&gt;Please let me know if something looks bad on some platform.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Just in time for the new year. Source is <a href="https://github.com/vivekhaldar/tumblr_theme/commit/3e860e5252814b6f5142bcfbaa376be6647854a9">here</a>. Body text is in <a href="http://www.google.com/webfonts/specimen/Arvo">Arvo</a>, headings are in <a href="http://www.google.com/webfonts/specimen/Kreon">Kreon</a>. Everything is monochrome.</p>
<p>Please let me know if something looks bad on some platform.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Good reads of 2012</title>
      <link>http://vivekhaldar.com/articles/good-reads-of-2012/</link>
      <pubDate>Wed, 26 Dec 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/good-reads-of-2012/</guid>
      <description>&lt;p&gt;This was the year I got a Kindle. Not even the fancy one, just the basic Wifi model. What can I say, sometimes I am a late adopter. Later in the year, the Kindle was replaced with a Nexus 7 with the Kindle app on it, which, of course, had all my books and highlights preserved.&lt;/p&gt;
&lt;p&gt;And I chomped through more books this year than probably the last five. The physicality of books, sensuous and nostalgic as it was, was actually holding me back from reading. People who lament the death of the physical book due to the onslaught of e-readers, I&amp;rsquo;m sorry, but you have zero sympathy from me. The book might by dying, but it is the greatest time ever for reading.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>This was the year I got a Kindle. Not even the fancy one, just the basic Wifi model. What can I say, sometimes I am a late adopter. Later in the year, the Kindle was replaced with a Nexus 7 with the Kindle app on it, which, of course, had all my books and highlights preserved.</p>
<p>And I chomped through more books this year than probably the last five. The physicality of books, sensuous and nostalgic as it was, was actually holding me back from reading. People who lament the death of the physical book due to the onslaught of e-readers, I&rsquo;m sorry, but you have zero sympathy from me. The book might by dying, but it is the greatest time ever for reading.</p>
<p>So here are some of my more memorable things I read in 2012.</p>
<p><strong>Fiction:</strong> Very little of what I read was fiction. I found some short stories online which were &ldquo;sent to the Kindle&rdquo; (or the <a href="http://getpocket.com">Pocket app</a>) for clean reading. The ones which stand out:</p>
<ol><li><a href="http://io9.com/5958919/read-ken-lius-amazing-story-that-swept-the-hugo-nebula-and-world-fantasy-awards">&ldquo;The Paper Menagerie&rdquo; by Ken Liu</a>: An absolutely heartbreaking short story about a boy born in America of immigrant parents, whose culture and ways seem alien to him. I can see why it swept all three of SF&rsquo;s major awards: Hugo, Nebula and World Fantasy.</li>
<li><a href="http://www.robinsloan.com/penumbra/short-story/">&ldquo;Mr. Penumbra’s 24-Hour Bookstore&rdquo;, by Robin Sloan</a>: the short story that the author later <a href="http://www.robinsloan.com/penumbra/">expanded into a novel</a>. All I will say is that it is the story of a bibliophile&rsquo;s adventure.</li>
<li><a href="http://www.wired.com/wired/archive/2.01/microserfs_pr.html">&ldquo;Microserfs&rdquo;, by Douglas Coupland</a>: a short story that is more than a decade old, published in Wired back in the day. I re-read it again recently, and it brought back not just the story itself, but also who and where I was at the time I first read it. Nostalgia is heady. An unadorned portrait of a lonely hacker looking for solace in machines, and maybe, people. I know this will ring true to many of us.</li>
</ol><p><strong>Non-fiction:</strong> Looking back, almost all of it was about the nature of modern work in one way or another. This is a topic that has drawn me in. I think it started a few years ago when <a href="http://blog.vivekhaldar.com/post/13241026081/the-programming-assembly-line">I read Matt Crawford&rsquo;s</a> <a href="http://www.matthewbcrawford.com/">&ldquo;Shop Class as Soulcraft&rdquo;</a>.</p>
<ol><li><a href="http://blog.penelopetrunk.com/2012/07/09/how-i-got-a-big-advance-from-a-big-publisher-and-self-published-anyway/">&ldquo;The New American Dream&rdquo;, by Penelope Trunk</a>: Using interestingness as a sniff-test for where to go in life and career, and how to strive for that ever elusive work-life balance. I bought this book simply because I&rsquo;m a long-time reader of the author&rsquo;s blog, and a fan of her voice. And it turned out to be a great read.</li>
<li><a href="http://calnewport.com/blog/2012/12/13/this-holiday-give-the-gift-of-career-confidence/">&ldquo;So Good They Can&rsquo;t Ignore You&rdquo;, by Cal Newport</a>: Another book I bought right away because of the author&rsquo;s blog. (Do you see a pattern here? These days, I don&rsquo;t even consider buying a book if the author doesn&rsquo;t have a long trail of words online.) Makes the case for &ldquo;follow your passion&rdquo; being bad advice, and that you have to get good first before you get good work.</li>
<li><a href="http://www.amazon.com/Computer-Boys-History-Computing-ebook/dp/B006UHII4C/">&ldquo;The Computer Boys Take Over&rdquo;, by Nathan Ensmenger</a>: Delves into the history of programming computers as a craft and a profession. Many current issues about the profession of programming have deep historical roots, and this book gave me a lot of perspective. (<a href="http://blog.vivekhaldar.com/post/28858604561/review-the-computer-boys-take-over">My review</a>.)</li>
</ol>
]]></content:encoded>
    </item>
    
    <item>
      <title>Writing on a tablet</title>
      <link>http://vivekhaldar.com/articles/writing-on-a-tablet/</link>
      <pubDate>Fri, 21 Dec 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/writing-on-a-tablet/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been doing more and more writing on the tablet, and even on the android phone. It is a far way from replacing a laptop or desktop with a full keyboard, but the trend is surely upward. There is a &lt;a href=&#34;http://www.macworld.com/article/2018600/why-im-writing-on-the-ipad.html&#34;&gt;strange focus&lt;/a&gt; that writing on a unitasking device brings. I can also take it to more places than I would a laptop.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve also noticed the &lt;a href=&#34;http://www.youtube.com/watch?v=BkjiMpN9hvA&#34;&gt;new gesture typing feature in jellybean&lt;/a&gt; make input so much faster. It is pretty forgiving, and has a high rate of guessing the correct word even with seemingly random scrawls on the keyboard.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I&rsquo;ve been doing more and more writing on the tablet, and even on the android phone. It is a far way from replacing a laptop or desktop with a full keyboard, but the trend is surely upward. There is a <a href="http://www.macworld.com/article/2018600/why-im-writing-on-the-ipad.html">strange focus</a> that writing on a unitasking device brings. I can also take it to more places than I would a laptop.</p>
<p>I&rsquo;ve also noticed the <a href="http://www.youtube.com/watch?v=BkjiMpN9hvA">new gesture typing feature in jellybean</a> make input so much faster. It is pretty forgiving, and has a high rate of guessing the correct word even with seemingly random scrawls on the keyboard.</p>
<p>I&rsquo;ve written the <a href="http://blog.vivekhaldar.com/post/28465017852/productivity-porn">these</a> <a href="http://blog.vivekhaldar.com/post/38385618104/quantum-of-work">pieces</a> on the tablet. Reading them back, I can see a difference. There is a brevity and tautness to them. The tone might even be somewhat stern.</p>
<p>On the other hand, <a href="http://blog.vivekhaldar.com/post/29296581613/what-is-life-like-for-phds-in-computer-science-who-go">this piece</a> was dictated out, and you can certainly see that I&rsquo;m freer with words and have a more conversational tone there.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Quantum of Work</title>
      <link>http://vivekhaldar.com/articles/quantum-of-work/</link>
      <pubDate>Thu, 20 Dec 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/quantum-of-work/</guid>
      <description>&lt;p&gt;There&amp;rsquo;s something about all the recent talk about distraction and concentration and shredded attention that doesn&amp;rsquo;t quite sit right with me. Most of it focuses on the individual&amp;ndash; thinking patterns, actions, changes. But what it misses is the deeply fragmented nature of most modern work itself.&lt;/p&gt;
&lt;p&gt;If you are a writer of fiction, or a writer of non fiction who has all their research and notes at hand, then yes, in theory doing what you need to do becomes a battle of will power where you just need to sit still and concentrate and get the words out.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>There&rsquo;s something about all the recent talk about distraction and concentration and shredded attention that doesn&rsquo;t quite sit right with me. Most of it focuses on the individual&ndash; thinking patterns, actions, changes. But what it misses is the deeply fragmented nature of most modern work itself.</p>
<p>If you are a writer of fiction, or a writer of non fiction who has all their research and notes at hand, then yes, in theory doing what you need to do becomes a battle of will power where you just need to sit still and concentrate and get the words out.</p>
<p>But most knowledge work (I despise that term, buy I&rsquo;ll use it just because it&rsquo;s familiar to people) is fragmented by nature. I like to think about it in terms of what I call the quantum of work.</p>
<p>A quantum of work is the theoretical longest amount of time you can work purely on your own without needing to break out into looking up something on the web or your mail or needing input from another person. For most modern workers this quantum of work is <a href="http://www.ics.uci.edu/~gmark/CHI2005.pdf">measured in minutes</a>.</p>
<p>What&rsquo;s worse is that sometimes when you break out of a quantum you have to wait to get a response. What are you going to do in the meanwhile? You start working on another thread of work to utilise your time. You keep doing this until you get the response you were waiting for, and get back to the first thread.</p>
<p>Is there a way around this? To work in an uninterrupted manner you have to end up changing the nature of the work.</p>
<p>Is that possible? I&rsquo;m not sure.</p>
<p>The trajectory from linear long form work to fragmented quantized work had been quite steady and there are absolutely no signs of it reversing.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Testing Redux</title>
      <link>http://vivekhaldar.com/articles/testing-redux/</link>
      <pubDate>Wed, 12 Dec 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/testing-redux/</guid>
      <description>&lt;p&gt;On the &lt;a href=&#34;http://5by5.tv/buildanalyze/107&#34;&gt;latest Build and Analyze podcast&lt;/a&gt;, Marco Arment disses automated and unit-testing. Responding to a listener question, he gives voice to all the myths about testing. That it is “overhead”. That is slows down development and can hinder competitiveness. That it is only worth it when the cost of failure is high.&lt;/p&gt;
&lt;p&gt;That is &lt;em&gt;horrible&lt;/em&gt; advice.&lt;/p&gt;
&lt;p&gt;Before I lay out my disagreement, please take what I say with a huge grain of salt. Marco’s hacking credentials are impeccable. He was an early (the first?) programmer at Tumblr, which is serving up these very words to you, and has single-handedly built some of the finest mobile apps for people who appreciate pure reading (like me). He’s clearly doing something right.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>On the <a href="http://5by5.tv/buildanalyze/107">latest Build and Analyze podcast</a>, Marco Arment disses automated and unit-testing. Responding to a listener question, he gives voice to all the myths about testing. That it is “overhead”. That is slows down development and can hinder competitiveness. That it is only worth it when the cost of failure is high.</p>
<p>That is <em>horrible</em> advice.</p>
<p>Before I lay out my disagreement, please take what I say with a huge grain of salt. Marco’s hacking credentials are impeccable. He was an early (the first?) programmer at Tumblr, which is serving up these very words to you, and has single-handedly built some of the finest mobile apps for people who appreciate pure reading (like me). He’s clearly doing something right.</p>
<p>But it is those very credentials that give his advice great weight, and which, in this instance, is dangerous. If indeed he built complex apps like Instapaper without a whiff of automated testing, that means he’s superhuman. Just because Bolt can run 100 meters in under 10 seconds doesn’t mean we can all do it.</p>
<p>If there’s one process-related lesson we should have all learned from the last thirty years of programming, it is this: automated testing pays off.</p>
<p>There’s <a href="http://www.infoq.com/news/2009/03/TDD-Improves-Quality">hard data to back this up</a>. Test-driven development <a href="http://www.agile-itea.org/public/deliverables/ITEA-AGILE-D2.7_v1.0.pdf">reduces defects drastically</a>, while not hurting development time.</p>
<p>The terminology is varied: unit-testing, functional testing, integration testing etc. The important thing is that it be automated, and to a lesser extent, quick. Something you can run quickly (preferably with a key combination) every time you make even a small change, to make sure you didn’t break anything. And write new tests to cover any new code you’re writing. What else are you going to do? Run through every functionality in your app manually to make sure everything is still OK? How long do you think that will take? Why? When you could run a script?</p>
<p>Having automated tests <em>increases</em> your velocity, because you can make changes with more confidence. It can become a competitive advantage if done right. And it is worthwhile even in areas where the cost of defects is not high. My personal experience is that for anything that’s larger than a small self-itch-scratching script, that is expected to grow, the small price of writing tests is always worth it. And I’ve almost always seen my <a href="http://misko.hevery.com/code-reviewers-guide/">code get cleaner and more modular under the pressure of making them testable.</a></p>
<p>Please code like you’re in the 21st century. Write automated tests.</p>
<p>(After writing this I found that Joel Spolsky made more or less the same point <a href="http://www.joelonsoftware.com/items/2009/09/23.html">here</a>.)</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Need to remember</title>
      <link>http://vivekhaldar.com/articles/need-to-remember/</link>
      <pubDate>Sat, 01 Dec 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/need-to-remember/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.thememorynetwork.net/wp/?p=494&#34;&gt;Carr delves into the differences between computer and human memory&lt;/a&gt;. Go read that. I agree with him when he says that human memory has more associative power than computer memory&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;But given that, an interesting question is how to determine what to commit to my personal wet memory, and what to store outboard in dry memory. Given some random fact, is there a test I can apply to it to determine where it should go? How many times have you thought that you should have remembered something without having to look it up, or that you really didn&amp;rsquo;t need to clutter your head with something and could have just as well relegated it to your outboard brain?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://www.thememorynetwork.net/wp/?p=494">Carr delves into the differences between computer and human memory</a>. Go read that. I agree with him when he says that human memory has more associative power than computer memory<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>.</p>
<p>But given that, an interesting question is how to determine what to commit to my personal wet memory, and what to store outboard in dry memory. Given some random fact, is there a test I can apply to it to determine where it should go? How many times have you thought that you should have remembered something without having to look it up, or that you really didn&rsquo;t need to clutter your head with something and could have just as well relegated it to your outboard brain?</p>
<p>Imagine if it took you five seconds to remember your spouse&rsquo;s name. Or even their birthday. That would be bad. So latency of access is an important criteria. You should remember things you need to know really fast.</p>
<p>But with things like augmented vision, and further out, brain implants, the latency difference between wet and dry memory will vanish.</p>
<p>Memories are cherished. They are the fodder of nostalgia. We go to great lengths to acquire them. How many dares have you done thinking it would make a good story to tell your grandkids? What exotic locales have you traveled to to make great memories?</p>
<p>But memories are also stressful. There are unpleasant things you don’t want to remember. There are things you need to remember that are stressing you out &ndash; birthdays, appointments, todo lists. GTD caught on like wildfire because it brought a workable system to bear on externalizing all that necessary trivia that makes up a modern life.</p>
<p>For much of human history, the default answer to &ldquo;should I remember this?&rdquo; was &ldquo;yes&rdquo;, with narrow and specific exceptions. Right now, we&rsquo;re somewhere in the middle. But all the technological trends inevitably point in the direction of turning the default to &ldquo;no&rdquo;, with fewer and fewer exceptions.</p>
<p>Does this mean we will eventually turn into memoryless biomass? I don&rsquo;t think so. Because memory is what makes us who we are. It makes us individuals. Ultimately, we won&rsquo;t <em>need</em> to remember anything, so we will only remember what we <em>want</em>. It will be the purest expression of ourselves.</p>
<div class="footnotes" role="doc-endnotes">
<hr><ol><li id="fn:1" role="doc-endnote">
<p>For now. I think large systems are rapidly getting the capability of understanding concepts and making associations between them. The next step would be to personalize that. <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol></div>
]]></content:encoded>
    </item>
    
    <item>
      <title>Some advice on internships</title>
      <link>http://vivekhaldar.com/articles/some-advice-on-internships/</link>
      <pubDate>Thu, 29 Nov 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/some-advice-on-internships/</guid>
      <description>&lt;p&gt;(Reproduced from &lt;a href=&#34;http://www.quora.com/Career-Advice/Should-I-take-and-internship-with-Microsoft-or-Amazon/answer/Vivek-Haldar&#34;&gt;my answer&lt;/a&gt; to this &lt;a href=&#34;http://www.quora.com/Career-Advice/Should-I-take-and-internship-with-Microsoft-or-Amazon&#34;&gt;Quora question&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;The question was: &amp;ldquo;Should I take and internship with Microsoft or Amazon?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Disclaimer: I haven&amp;rsquo;t worked at either company. This is a more general answer.&lt;/p&gt;
&lt;p&gt;First of all, congratulations! You&amp;rsquo;re in the enviable situation of not going badly wrong either way.&lt;/p&gt;
&lt;p&gt;They&amp;rsquo;re both decent companies working on challenging problems. And I&amp;rsquo;m assuming both offers are in the Seattle/Redmond region, so geography is not a differentiator.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>(Reproduced from <a href="http://www.quora.com/Career-Advice/Should-I-take-and-internship-with-Microsoft-or-Amazon/answer/Vivek-Haldar">my answer</a> to this <a href="http://www.quora.com/Career-Advice/Should-I-take-and-internship-with-Microsoft-or-Amazon">Quora question</a>.)</p>
<p>The question was: &ldquo;Should I take and internship with Microsoft or Amazon?&rdquo;</p>
<p>Disclaimer: I haven&rsquo;t worked at either company. This is a more general answer.</p>
<p>First of all, congratulations! You&rsquo;re in the enviable situation of not going badly wrong either way.</p>
<p>They&rsquo;re both decent companies working on challenging problems. And I&rsquo;m assuming both offers are in the Seattle/Redmond region, so geography is not a differentiator.</p>
<p>You should choose based on two things:</p>
<ol><li><p>Did you get to speak to the person who will be hosting you, i.e. your boss for the summer? Do they seem like someone who would take the time and effort to guide and mentor you? Are they enthusiastic about what they&rsquo;re working on? About having you? Are they technical or more managerial? If your official host is a manager and will hand you off to one of the engineers on their team, ask to speak with that person. I&rsquo;ve hosted interns myself, and it takes special care to see to it that they are successful, and are learning and enjoying their time there. One has to pick problems of just the right size and challenge. You want to feel like you accomplished and finished a decent challenging chunk of work over the summer. An internship is basically bootcamp for industrial software engineering, and you want a great coach.</p></li>
<li><p>A distant second factor is what exactly you will be working on, and whether it is something you are interested in. I say distant second because you should not get hung up about trying something outside your specialty or interest. The main point of an internship is to just see how software is built in the real world, and get to contribute to it in a real, non-toy way.</p></li>
</ol><p>Hope that helps!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>The new C&#43;&#43;</title>
      <link>http://vivekhaldar.com/articles/the-new-c/</link>
      <pubDate>Sun, 25 Nov 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-new-c/</guid>
      <description>&lt;p&gt;C++, and its programmers, may not be in the limelight (were they ever?), but they are &lt;a href=&#34;http://medriscoll.com/post/9117396231/the-guild-of-silicon-valley&#34;&gt;the silent warriors&lt;/a&gt; that build the reliable and economical backends that make the shiny Web go. The language and libraries have been mostly the same for a while. But the new C++11 standard has brought many new features and a lot of excitement around the C++ scene.&lt;/p&gt;
&lt;p&gt;Consider a totally toy example: print out the squares of numbers from 0 to 9. In &amp;ldquo;old&amp;rdquo; C++ this would look something like:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>C++, and its programmers, may not be in the limelight (were they ever?), but they are <a href="http://medriscoll.com/post/9117396231/the-guild-of-silicon-valley">the silent warriors</a> that build the reliable and economical backends that make the shiny Web go. The language and libraries have been mostly the same for a while. But the new C++11 standard has brought many new features and a lot of excitement around the C++ scene.</p>
<p>Consider a totally toy example: print out the squares of numbers from 0 to 9. In &ldquo;old&rdquo; C++ this would look something like:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;list&gt;
#include &lt;algorithm&gt;

using namespace std;

int square(int i) {
  return i * i;
}

int main() {
  list&lt;int&gt; l;
  for (int i = 0; i &lt; 10; i++) {
    l.push_back(i);
  }

  list&lt;int&gt; t;
  t.resize(l.size());
  transform(l.begin(), l.end(), t.begin(), square);

  for (list&lt;int&gt;::iterator it = t.begin(); it != t.end(); ++it) {
    cout &lt;&lt; " " &lt;&lt; *it;
  }

return 0;
}
</code></pre>
<p>Using the <a href="http://gcc.gnu.org/projects/cxx0x.html">new C++11 features</a> (<a href="http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2009/n2930.html">Range-based for loops!</a> <a href="http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2009/n2927.pdf">Lambda expressions!</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2672.htm">List initializers!</a> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1984.pdf">Type inference!</a>), that becomes somewhat shorter and cleaner, while not sacrificing an ounce of its grip on the bare metal:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;list&gt;
#include &lt;algorithm&gt;

using namespace std;

int main() {
  list&lt;int&gt; l = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

  list&lt;int&gt; t;
  t.resize(l.size());
  transform(l.begin(), l.end(), t.begin(),
        [](int i){ return i * i;});

  for (auto e : t) {
    cout &lt;&lt; " " &lt;&lt; e;
  }

  return 0;
}
</code></pre>
<p>Of course, detractors will say that none of that comes even close to the succint Python solution:</p>
<pre><code>l = range(10)
t = [ x * x for x in l ]
for e in t:
  print e, ' ',
</code></pre>
<p>Note that a big win in terms of expressivity in the Python solution comes from list comprehensions. Perhaps the next C++?</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Treesaver-based copy of this blog</title>
      <link>http://vivekhaldar.com/articles/treesaverbased-copy-of-this-blog/</link>
      <pubDate>Fri, 23 Nov 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/treesaverbased-copy-of-this-blog/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://blog.vivekhaldar.com/post/3614639455/turn-your-blog-into-an-online-magazine-a-blogmag&#34;&gt;I&amp;rsquo;ve admired Treesaver&lt;/a&gt; since I first came across it. It is an HTML5 platform that responsively lays out content across devices. For me, the killer feature was the magazine-like touch-based experience on tablets and phones. At the time, &lt;a href=&#34;http://blog.vivekhaldar.com/post/3614639455/turn-your-blog-into-an-online-magazine-a-blogmag&#34;&gt;I used it to lay out a parallel copy of this blog&lt;/a&gt;. And then forgot to ever update it.&lt;/p&gt;
&lt;p&gt;So I came back to that during the downtime this Thanksgiving, and &lt;a href=&#34;http://www.vivekhaldar.com/blogmag/&#34;&gt;brought the copy up to date&lt;/a&gt;. I think it&amp;rsquo;s a good way to quickly thumb through the archives.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://blog.vivekhaldar.com/post/3614639455/turn-your-blog-into-an-online-magazine-a-blogmag">I&rsquo;ve admired Treesaver</a> since I first came across it. It is an HTML5 platform that responsively lays out content across devices. For me, the killer feature was the magazine-like touch-based experience on tablets and phones. At the time, <a href="http://blog.vivekhaldar.com/post/3614639455/turn-your-blog-into-an-online-magazine-a-blogmag">I used it to lay out a parallel copy of this blog</a>. And then forgot to ever update it.</p>
<p>So I came back to that during the downtime this Thanksgiving, and <a href="http://www.vivekhaldar.com/blogmag/">brought the copy up to date</a>. I think it&rsquo;s a good way to quickly thumb through the archives.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>A Programmer&#39;s Thanksgiving</title>
      <link>http://vivekhaldar.com/articles/a-programmers-thanksgiving/</link>
      <pubDate>Thu, 22 Nov 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/a-programmers-thanksgiving/</guid>
      <description>&lt;p&gt;(It&amp;rsquo;s Thanksgiving here in the US, and the peer pressure for counting your blessings finally got to me.)&lt;/p&gt;
&lt;p&gt;The tribe of those who make their living by writing code has a lot to be thankful for. Here are some things, in no particular order.&lt;/p&gt;
&lt;p&gt;(For the pedantic among you, yes, there are good days and bad days. Just prepend the phrase &amp;ldquo;by and large&amp;rdquo; to each of the following.)&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;There is a lot of work to be had. As with some other professions, we do not have to worry (yet) about a shrinking field.&lt;/li&gt;
&lt;li&gt;It pays well enough to keep us on the higher rungs of &lt;a href=&#34;http://en.wikipedia.org/wiki/Maslow&#39;s_hierarchy_of_needs&#34;&gt;Maslow&amp;rsquo;s pyramid&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;We get to work with smart, enthusiastic, reasonable and passionate people.&lt;/li&gt;
&lt;li&gt;We get to work on something that is intellectually stimulating.&lt;/li&gt;
&lt;li&gt;Our work does not feel like work at all.&lt;/li&gt;
&lt;li&gt;The tools and artifacts we make (the biggest example is the Web) fold around to become our creative and expressive outlets.&lt;/li&gt;
&lt;li&gt;We build artifacts that are used by, and improve the lives of, many people.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;If you look around today, there are very few professions for which all of the above are true (and I think the number is shrinking).&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>(It&rsquo;s Thanksgiving here in the US, and the peer pressure for counting your blessings finally got to me.)</p>
<p>The tribe of those who make their living by writing code has a lot to be thankful for. Here are some things, in no particular order.</p>
<p>(For the pedantic among you, yes, there are good days and bad days. Just prepend the phrase &ldquo;by and large&rdquo; to each of the following.)</p>
<ul><li>There is a lot of work to be had. As with some other professions, we do not have to worry (yet) about a shrinking field.</li>
<li>It pays well enough to keep us on the higher rungs of <a href="http://en.wikipedia.org/wiki/Maslow's_hierarchy_of_needs">Maslow&rsquo;s pyramid</a>.</li>
<li>We get to work with smart, enthusiastic, reasonable and passionate people.</li>
<li>We get to work on something that is intellectually stimulating.</li>
<li>Our work does not feel like work at all.</li>
<li>The tools and artifacts we make (the biggest example is the Web) fold around to become our creative and expressive outlets.</li>
<li>We build artifacts that are used by, and improve the lives of, many people.</li>
</ul><p>If you look around today, there are very few professions for which all of the above are true (and I think the number is shrinking).</p>
<p>For all this, I am deeply grateful.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Interviews (and whiteboard coding)</title>
      <link>http://vivekhaldar.com/articles/interviews-and-whiteboard-coding/</link>
      <pubDate>Wed, 21 Nov 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/interviews-and-whiteboard-coding/</guid>
      <description>&lt;p&gt;Interviewing is a touchy topic. You are being judged! You might have a couple of decades of experience, and your freckle-faced questioner might be asking you to implement some variant of sorting on the whiteboard. It would be entirely human for some part of you to think this whole exercise is beneath you.&lt;/p&gt;
&lt;p&gt;But please don&amp;rsquo;t do that. That is the one thing that will instantly poison your chances. If you think the question is trivial, prove it by banging out a clean, correct solution, quickly and without fuss. Show them how easy it was for you. Then you might get asked more challenging and open-ended questions.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Interviewing is a touchy topic. You are being judged! You might have a couple of decades of experience, and your freckle-faced questioner might be asking you to implement some variant of sorting on the whiteboard. It would be entirely human for some part of you to think this whole exercise is beneath you.</p>
<p>But please don&rsquo;t do that. That is the one thing that will instantly poison your chances. If you think the question is trivial, prove it by banging out a clean, correct solution, quickly and without fuss. Show them how easy it was for you. Then you might get asked more challenging and open-ended questions.</p>
<blockquote class="twitter-tweet" data-in-reply-to="271055160980172800"><p>@<a href="https://twitter.com/slava_pestov">slava_pestov</a> @<a href="https://twitter.com/vivekhaldar">vivekhaldar</a> What if you know how ill-conceived that interview technique is, and it makes you lose interest in working there?</p>— Richard Feldman (@rtfeldman) <a href="https://twitter.com/rtfeldman/status/271059497064214528" data-datetime="2012-11-21T01:16:34+00:00">November 21, 2012</a></blockquote>
<script src="//platform.twitter.com/widgets.js" charset="utf-8"></script><p>Think about it from the point of view of both the company and the interviewer. For the company, the cost of incorrectly hiring a moron is much, much higher than incorrectly passing on a genius. And please believe me when I tell you that that simple question you thought was beneath you stumps a good fraction of candidates.</p>
<p>These two factors combined mean that interviews have largely become negative filters, i.e. they try to filter out people below a limit, rather than trying to gauge how bright you shine. But good interviewers will almost certainly kick the gears up if you make easy work out their initial questions.</p>
<p>I realise it is far from perfect, but given the constraints, it&rsquo;s probably the best we have.</p>
<p>By far the best &ldquo;interview&rdquo; is to have the candidate on-site for a while and have them work with a team. In other words, an internship. That&rsquo;s why a lot of time and effort goes into internship programs. Killing it during your internship greatly increases your chances of getting a full time offer.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>  &#34;The best minds of my generation are thinking about how to make people click ads&#34;
  </title>
      <link>http://vivekhaldar.com/articles/the-best-minds-of-my-generation-are-thinking-about-how-to-make-people-click-ads/</link>
      <pubDate>Fri, 16 Nov 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-best-minds-of-my-generation-are-thinking-about-how-to-make-people-click-ads/</guid>
      <description>&lt;p&gt;That&amp;rsquo;s a quote by Jeff Hammerbacher, claiming that the current crop of &lt;a href=&#34;http://www.businessweek.com/magazine/content/11_17/b4225060960537.htm&#34;&gt;high-tech companies are not tackling the really hard world-changing problems&lt;/a&gt;. It has since been siezed by a number of commentators, providing great fodder for their techno-dystopian views. (Of course, very few of them have a technical understanding of what it actually takes to make people click on ads.)&lt;/p&gt;
&lt;p&gt;&lt;em&gt;It&amp;rsquo;s high time somone called bullcrap on this meme.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s akin to saying that the purpose of an aircraft carrier is to keep afloat the flag at the top of the mast.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>That&rsquo;s a quote by Jeff Hammerbacher, claiming that the current crop of <a href="http://www.businessweek.com/magazine/content/11_17/b4225060960537.htm">high-tech companies are not tackling the really hard world-changing problems</a>. It has since been siezed by a number of commentators, providing great fodder for their techno-dystopian views. (Of course, very few of them have a technical understanding of what it actually takes to make people click on ads.)</p>
<p><em>It&rsquo;s high time somone called bullcrap on this meme.</em></p>
<p>That&rsquo;s akin to saying that the purpose of an aircraft carrier is to keep afloat the flag at the top of the mast.</p>
<p>&ldquo;Clicking on ads&rdquo; happens to be <em>one single application</em> of a lego-like complex of massively complicated and cutting edge technologies that underlie a whole host of other applications. These underlying technologies span the gamut of creating and managing <a href="http://dl.acm.org/citation.cfm?id=2019527">warehouse-scale computers</a>, <a href="http://static.googleusercontent.com/external_content/untrusted_dlcp/research.google.com/en/us/archive/bigtable-osdi06.pdf">massively</a> <a href="http://research.google.com/archive/spanner.html">distributed storage systems</a>, and <a href="http://www.csee.wvu.edu/~gidoretto/courses/2011-fall-cp/reading/TheUnreasonable%20EffectivenessofData_IEEE_IS2009.pdf">manipulating large amounts of data for machine learning techniques</a>. This involves solving deep and challenging problems both at the level of science, and at the level of engineering to make it real. It it used in multitudes of applications beyond ads.</p>
<p>So please, look deeper at the general problems being tackled, and their myriad applications.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>MOOCs will eat academia</title>
      <link>http://vivekhaldar.com/articles/moocs-will-eat-academia/</link>
      <pubDate>Fri, 09 Nov 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/moocs-will-eat-academia/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://cacm.acm.org/magazines/2012/11/156587-will-moocs-destroy-academia/fulltext&#34;&gt;The latest CACM asks if MOOCs will destroy academia&lt;/a&gt;. The author concludes that &amp;ldquo;If I had my wish, I would wave a wand and make MOOCs disappear, but I am afraid that we have let the genie out of the bottle.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Like most articles that bemoan the oncoming death of the university, that article suffers from the  logical flaw that it conflates the &lt;a href=&#34;http://blog.vivekhaldar.com/post/21209976179/the-components-of-a-university&#34;&gt;two components of a university&lt;/a&gt;: teaching, and research.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://cacm.acm.org/magazines/2012/11/156587-will-moocs-destroy-academia/fulltext">The latest CACM asks if MOOCs will destroy academia</a>. The author concludes that &ldquo;If I had my wish, I would wave a wand and make MOOCs disappear, but I am afraid that we have let the genie out of the bottle.&rdquo;</p>
<p>Like most articles that bemoan the oncoming death of the university, that article suffers from the  logical flaw that it conflates the <a href="http://blog.vivekhaldar.com/post/21209976179/the-components-of-a-university">two components of a university</a>: teaching, and research.</p>
<p>MOOCs  will almost certainly hollow out the teaching component of universities as it stands today.   I don&rsquo;t see anything on the horizon that will reverse this tide. In most technical fields, the  nuts and bolts technical interview  and on-the-job learning and performance monitoring  long ago replaced  any faith in degrees as credentials.  That leaves very few fields, such as law,  where you absolutely do need the degree as a credential.</p>
<p>Add to that the fact that <a href="http://blog.vivekhaldar.com/post/25477606370/the-interested-minority">instructors of MOOCs  feel much  higher levels of job satisfaction</a>, because of the impact of teaching a few thousand students, many of whom may not be privileged enough to get to a physical classroom.  Contrast that with teaching a class with tens (or for large introductory courses, hundreds)  of students, most of whom are surfing on their laptops.</p>
<p>Unfortunately,  teaching is also the component that brings in the lion&rsquo;s share of money into  academia. But all is not lost,  because the  other thing universities do is research, and that is arguably  as important, if not more, than teaching.  If universities shed their easy-money-making  credentialing and teaching component, and contract to becoming purely  centers for research, that might not be such a bad outcome.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>A rare retrospective on a decade-long research project</title>
      <link>http://vivekhaldar.com/articles/a-rare-retrospective-on-a-decadelong-research-project/</link>
      <pubDate>Sun, 04 Nov 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/a-rare-retrospective-on-a-decadelong-research-project/</guid>
      <description>&lt;p&gt;Philip Levis looks back on the history of TinyOS&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;, one of the earliest sensor networking platforms, reflecting on its evolution, and design choices and their consequences. It is an honest look at what worked and what didn&amp;rsquo;t. Such retrospectives are rare, and I really wish more researchers did this.&lt;/p&gt;
&lt;p&gt;On the tradeoff between growing the language to support complex (but necessary) functionality, and keeping it simple:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;Early on in TinyOS development we made the decision to design a language to better support its pro- gramming and concurrency model. The nesC language allowed TinyOS to achieve near-optimal resource effi- ciency (minimization) and a surprisingly low bug rate (prevention). Having a new language also allowed us to evolve and extend features as new problems arose. Language evolution is a two-edged sword… each stage of this evolution added new features, moving TinyOS and nesC further from C and raising the barrier to entry. Furthermore, the most effective software patterns, such as static virtualization, used all of these features in complex and novel ways. By focusing on expert TinyOS users and making it possible to write larger software, TinyOS 2.x became less accessible to new users. &lt;em&gt;Making it harder to write buggy code had the unfortunate result of making it just plain harder to write code.&lt;/em&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Philip Levis looks back on the history of TinyOS<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>, one of the earliest sensor networking platforms, reflecting on its evolution, and design choices and their consequences. It is an honest look at what worked and what didn&rsquo;t. Such retrospectives are rare, and I really wish more researchers did this.</p>
<p>On the tradeoff between growing the language to support complex (but necessary) functionality, and keeping it simple:</p>
<blockquote>
  <p>Early on in TinyOS development we made the decision to design a language to better support its pro- gramming and concurrency model. The nesC language allowed TinyOS to achieve near-optimal resource effi- ciency (minimization) and a surprisingly low bug rate (prevention). Having a new language also allowed us to evolve and extend features as new problems arose. Language evolution is a two-edged sword… each stage of this evolution added new features, moving TinyOS and nesC further from C and raising the barrier to entry. Furthermore, the most effective software patterns, such as static virtualization, used all of these features in complex and novel ways. By focusing on expert TinyOS users and making it possible to write larger software, TinyOS 2.x became less accessible to new users. <em>Making it harder to write buggy code had the unfortunate result of making it just plain harder to write code.</em></p>
</blockquote>
<p>On the importance of quick rewards for beginner users:</p>
<blockquote>
  <p>In retrospect, the focus on expert users missed a great opportunity: hobbyists and the “Maker” do-it-yourself crowd…In comparison to TinyOS, Arduino is feature-poor: programs are single- threaded C programs for simple sensing and actuation. But for hobbyists, the resulting simplicity is extremely desirable. Building a gumball machine that “only dispenses treats when you knock the secret rhythm on its front panel” (an article in a recent issue of Make maga- zine) doesn’t require static virtualization, network types, and compile-time data race detection.</p>
</blockquote>
<p>And on that long-contested question in software engineering, the usefulness of reusable components, and how hard it is to actually achieve that<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup><sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup>. TinyOS has a fine-grained component model, but it turned out not to help.</p>
<blockquote>
  <p>The main goal of this approach was to ease experimentation. But taken to its conclusion, fine-grained components have significant drawbacks we did not foresee…the drawback of fine-grained components emerges when trying to understand a system for the first time. <em>There are so many tiny pieces of functionality spread across files, with numerous levels of indirection, that keeping track of it all can be a headache. The structural complexity is far beyond what the underlying code complexity requires.</em> Our conclusion is that a well designed and carefully implemented operating system is more helpful than an operating system toolkit or operating system software designed with reuse in mind. Our experience with deveoping more traditional operating systems supports this conclusion. It is easier to take the Linux boot code and modify it for your needs than to work within a component framework for its generalized boot module</p>
</blockquote>
<p>(All emphasis mine.)</p>
<div class="footnotes" role="doc-endnotes">
<hr><ol><li id="fn:1" role="doc-endnote">
<p><a href="http://sing.stanford.edu/pubs/tinyos-retrospective-osdi2012.pdf">Philip Levis, Experiences from a Decade of TinyOS Development. OSDI 2012.</a> <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:2" role="doc-endnote">
<p><a href="http://www.cs.cmu.edu/afs/cs/project/able/ftp/archmismatch-icse17/archmismatch-icse17.pdf">David Garlan, Robert Allen, and John Ockerbloom. 1995. Architectural Mismatch: Why Reuse Is So Hard. IEEE Softw. 12, 6 (November 1995), 17-26.</a> <a href="#fnref:2" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:3" role="doc-endnote">
<p><a href="http://repository.upenn.edu/cgi/viewcontent.cgi?article=1074&amp;context=library_papers">David Garlan, Robert Allen, and John Ockerbloom. 1995. Architectural Mismatch: Why Reuse Is Still So Hard. IEEE Softw. 26, 4 (July 2009), 66-69.</a> <a href="#fnref:3" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol></div>
]]></content:encoded>
    </item>
    
    <item>
      <title>Deep Shelling</title>
      <link>http://vivekhaldar.com/articles/deep-shelling/</link>
      <pubDate>Wed, 31 Oct 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/deep-shelling/</guid>
      <description>&lt;p&gt;Seeing as I spend the vast majority of my working life interacting with plaintext, and a lot of it through an interactive shell, I have found that one thing that is absolutely crucial to my productivity is having a very deep history, coupled with an unrestricted, editable shell.&lt;/p&gt;
&lt;p&gt;Let me explain what each of those means to me.&lt;/p&gt;
&lt;p&gt;By &lt;em&gt;deep history&lt;/em&gt;, I mean having very long lasting shell sessions, so that I can go back and see the entire history of my interaction (commands I entered as well as their output) going back not just days but months.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Seeing as I spend the vast majority of my working life interacting with plaintext, and a lot of it through an interactive shell, I have found that one thing that is absolutely crucial to my productivity is having a very deep history, coupled with an unrestricted, editable shell.</p>
<p>Let me explain what each of those means to me.</p>
<p>By <em>deep history</em>, I mean having very long lasting shell sessions, so that I can go back and see the entire history of my interaction (commands I entered as well as their output) going back not just days but months.</p>
<p>By &ldquo;<em>an unrestricted, editable shell</em>&rdquo;, I mean a session where everything is editable and searchable, not just the command prompt. In other words, your shell is just like a plain text file in an editor.</p>
<p>So some of you have probably already guessed that I implement this using <a href="http://blog.vivekhaldar.com/post/3996068979/the-levels-of-emacs-proficiency">shell buffers in Emacs</a>. Within that, I have tons of shell buffers, usually one per task or project I&rsquo;m dealing with, all with short but descriptive names. In addition I always have Emacs running in  daemon mode. Almost always, the <a href="https://twitter.com/vivekhaldar/status/263343368208257024">uptime for my Emacs process is the same as the uptime for my machine</a>.</p>
<p>This combination is extremely powerful. I don&rsquo;t know how many times I have to recall some complex, obscure commandline invocation, or remember some piece of interaction from the past. With this setup, all I have to do is search backwards. Also, selecting, copying and pasting text in most terminal emulators is is very fiddly, and usually involves leaving the keyboard and using the mouse.</p>
<p>The bottom line is that each shell is just another plaintext buffer, upon which the full force of Emacs&rsquo; text editing power can be applied. It now makes me cringe when I see someone fiddling with tons of little unsearchable, uneditable xterm windows,  struggling to copy and paste text in and out of them.</p>
<p>There is a downside though. On the rare occasion that my Emacs daemon crashes and I lose all my state, it is extremely disorienting. Those are the chips.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Why you would want to program at fifty (or any other age)</title>
      <link>http://vivekhaldar.com/articles/why-you-would-want-to-program-at-fifty-or-any-other-age/</link>
      <pubDate>Fri, 26 Oct 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/why-you-would-want-to-program-at-fifty-or-any-other-age/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://prog21.dadgum.com/154.html&#34;&gt;The meme is strong in this one&lt;/a&gt;. It keeps popping up again and again, and seems to have struck a chord in the hacker community.&lt;/p&gt;
&lt;p&gt;Whether you want to do something at an arbitrary time in the future is a superficial, if interesting, question. The deeper question is &lt;em&gt;what motivates you do it now&lt;/em&gt;, and how you think that motivation might shift (or maybe altogether disappear?) in the future.&lt;/p&gt;
&lt;p&gt;So, no, I honestly don’t know what activities will motivate and excite me when I am fifty, just as I didn’t know at fifteen what would make me get out of bed this morning.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://prog21.dadgum.com/154.html">The meme is strong in this one</a>. It keeps popping up again and again, and seems to have struck a chord in the hacker community.</p>
<p>Whether you want to do something at an arbitrary time in the future is a superficial, if interesting, question. The deeper question is <em>what motivates you do it now</em>, and how you think that motivation might shift (or maybe altogether disappear?) in the future.</p>
<p>So, no, I honestly don’t know what activities will motivate and excite me when I am fifty, just as I didn’t know at fifteen what would make me get out of bed this morning.</p>
<p>I have seen, and personally felt, a range of motivations for programming. Some of the more common ones are:</p>
<ul><li><em>Money</em>. It’s a well-paid job. It pays the bills, and leaves over fun money. You don’t mind it.</li>
<li><em>Purpose</em>. Your programs help a lot people do their jobs, live and enjoy their lives.</li>
<li><em>Creator’s machismo</em>. Your programs handle a gazillion queries per second and run on a trillion machines and make a jintillion dollars every minute. Take that!</li>
<li><em>Beauty</em>. You find programming artifacts to be beautiful objects in their own right. You use it as a channel for self-expression, just like sculptors and painters. You enjoy the feel and flow of your tools and environment, just like some enjoy brushes and palettes and chisels.</li>
<li><em>Intellectual exercise</em>. You find programming to be a grand intellectual adventure. Not only is it fun and challenging, but gives wings to your thoughts by making them executable. You use computation to explore the boundaries of the possible. It staves away boredom.</li>
<li><em>You fell into it</em> by accident or circumstance, and one or more of the above compelled you to stay, at least for a while.</li>
</ul><p>Of course, most programmers will cite more than one of the above as their motivations, and smear it with their own weights. What are your picks, and the weights associated with them? How do you think they will be different a few years down the line?</p>
<p>How much can one factor swing negatively while still making the overall proposition desirable? Would you still enjoy it if your programs had no intellectual heft but did an important and necessary job? What would you look for if you had saved or made a stash of money and didn’t have to worry about that?</p>
<p>This is ultimately a question which can only be answered by looking inwards. It is a test of self-knowledge. You don’t match your age to your job. You match your motivations to your job.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Coaching and review</title>
      <link>http://vivekhaldar.com/articles/coaching-and-review/</link>
      <pubDate>Sun, 21 Oct 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/coaching-and-review/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.newyorker.com/reporting/2011/10/03/111003fa_fact_gawande?printable=true&#34;&gt;Atul Gawande wrote about how he used a personal coach&lt;/a&gt; to take his performance to the next level. In his case, he reduced the errors he made while performing surgery. The key was to get what he calls a &amp;ldquo;personal coach&amp;rdquo;, someone who could objectively look at and judge his performance, and provide concrete, actionable feedback.&lt;/p&gt;
&lt;p&gt;What struck me was how specific and &lt;em&gt;nit-picky&lt;/em&gt; the feedback was. For example:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;We sat in the surgeons’ lounge afterward. He saw only small things, he said, but, if I were trying to keep a problem from happening even once in my next hundred operations, it’s the small things I had to worry about. He noticed that I’d positioned and draped the patient perfectly for me, standing on his left side, but not for anyone else. The draping hemmed in the surgical assistant across the table on the patient’s right side, restricting his left arm, and hampering his ability to pull the wound upward. At one point in the operation, we found ourselves struggling to see up high enough in the neck on that side. The draping also pushed the medical student off to the surgical assistant’s right, where he couldn’t help at all. I should have made more room to the left, which would have allowed the student to hold the retractor and freed the surgical assistant’s left hand.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://www.newyorker.com/reporting/2011/10/03/111003fa_fact_gawande?printable=true">Atul Gawande wrote about how he used a personal coach</a> to take his performance to the next level. In his case, he reduced the errors he made while performing surgery. The key was to get what he calls a &ldquo;personal coach&rdquo;, someone who could objectively look at and judge his performance, and provide concrete, actionable feedback.</p>
<p>What struck me was how specific and <em>nit-picky</em> the feedback was. For example:</p>
<blockquote>
  <p>We sat in the surgeons’ lounge afterward. He saw only small things, he said, but, if I were trying to keep a problem from happening even once in my next hundred operations, it’s the small things I had to worry about. He noticed that I’d positioned and draped the patient perfectly for me, standing on his left side, but not for anyone else. The draping hemmed in the surgical assistant across the table on the patient’s right side, restricting his left arm, and hampering his ability to pull the wound upward. At one point in the operation, we found ourselves struggling to see up high enough in the neck on that side. The draping also pushed the medical student off to the surgical assistant’s right, where he couldn’t help at all. I should have made more room to the left, which would have allowed the student to hold the retractor and freed the surgical assistant’s left hand.</p>
</blockquote>
<p><a href="http://blog.vivekhaldar.com/post/20335710829/code-review-just-do-it">Code reviews</a> also tend to be nit-picky. Style issues, formatting, naming. But what seems to be nit-picky ends up being important. When dealing with very large repositories of code, these seemingly insignificant flaws are like pebbles on the tarmac. If you let them build up, pretty soon your smooth tarmac becomes a gravel road.</p>
<p>My own &ldquo;aha&rdquo; moment for realizing the true value of code review came to me when I noticed that <em>I myself was writing the kinds of messy code that I would call out when reviwing other people&rsquo;s code</em>. But I was blind to it because I wanted to quickly get to the point where my damn code would work already. We all are.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>How did software get so reliable?</title>
      <link>http://vivekhaldar.com/articles/how-did-software-get-so-reliable/</link>
      <pubDate>Thu, 18 Oct 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/how-did-software-get-so-reliable/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://blog.regehr.org/archives/820&#34;&gt;John Regehr raises this question&lt;/a&gt;, prompted by a paper of the same title by Tony Hoare. I don&amp;rsquo;t disagree with the reasons given – management, testing, tools etc. – but I do think there are a number of factors not called out. Here is my take.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Age&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Flakiness in software is most noticeable when  it is in the foundational layers – the operating system, basic system services such as those for networking etc. And it is exactly those foundational pieces that by now have had two decades or more of continuous existence. This means they have been exercised and tested in every way imaginable in the real world. It also helps that the responsibilities of almost all foundational infrastructure software has barely changed during that same time.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://blog.regehr.org/archives/820">John Regehr raises this question</a>, prompted by a paper of the same title by Tony Hoare. I don&rsquo;t disagree with the reasons given – management, testing, tools etc. – but I do think there are a number of factors not called out. Here is my take.</p>
<p><strong>Age</strong></p>
<p>Flakiness in software is most noticeable when  it is in the foundational layers – the operating system, basic system services such as those for networking etc. And it is exactly those foundational pieces that by now have had two decades or more of continuous existence. This means they have been exercised and tested in every way imaginable in the real world. It also helps that the responsibilities of almost all foundational infrastructure software has barely changed during that same time.</p>
<p>For example, what an operating system kernel does has not changed in a very long time. The basic networking protocols – TCP/IP, DNS, HTTP and many others – have also been remarkably stable, with mostly incremental improvements. The sheer weight of everything else built on top of this layer has turned these into diamonds.</p>
<p><strong>Server-side software</strong></p>
<p>Most software that is today used by end consumers, i.e. clients, is but a thin pretty shell backed by an array of services running on a large collection of machines off in a data center somewhere. This has several implications for the overall <em>perception</em> of reliability.</p>
<ul><li>server-side software is tended by humans.  I mean that literally. When error rates go up, humans are woken up by alerts, and they deal with the problem. In most cases, the issue will be taken care of without any significant disruption, or anybody even noticing. For every major outage where a site or service is completely down, there are a thousand such problems.</li>
<li>server-side software can be updated under controlled conditions, on demand.</li>
<li><a href="http://blog.vivekhaldar.com/post/5333377223/more-machines-more-reliability">embarrassingly parallel loads spread across a large number of machines means a high level of aggregate reliability for the entire service.</a></li>
</ul><p>In the era of heavy client side software, these would all be major disruptions.</p>
<p>In essence, the move to server side software allows us to <em>cheat</em> when it comes to reliability. You can deal with problems as they arise. You don&rsquo;t have to worry about a large existing installation out in the field. This also means you don&rsquo;t need to front-load hardening and testing.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>It Might Get Loud</title>
      <link>http://vivekhaldar.com/articles/it-might-get-loud/</link>
      <pubDate>Sun, 14 Oct 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/it-might-get-loud/</guid>
      <description>&lt;p&gt;&lt;em&gt;It Might Get Loud&lt;/em&gt; is a documentary that traces the musical careers and philosophies of three guitarists&amp;mdash;&lt;a href=&#34;http://en.wikipedia.org/wiki/Jimmy_Page&#34;&gt;Jimmy Page&lt;/a&gt;,  &lt;a href=&#34;http://en.wikipedia.org/wiki/The_Edge&#34;&gt;The Edge&lt;/a&gt; and &lt;a href=&#34;http://en.wikipedia.org/wiki/Jack_White_(musician)&#34;&gt;Jack White&lt;/a&gt;.&lt;/p&gt;
&lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#34;http://www.youtube.com/embed/j0pNn2bcChA&#34; frameborder=&#34;0&#34; allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;White is what I call a primitivist.  Not really a Luddite, as in someone who dislikes and  opposes technology, but someone who is skeptical of it,  and prefers the simple &amp;ldquo;human&amp;rdquo; solution to the adorned technological one. Hence the part where he fashions an electric guitar out of a few old pieces of wood,  a few nails and a single wire. Raw is better than cooked. Less is more.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>It Might Get Loud</em> is a documentary that traces the musical careers and philosophies of three guitarists&mdash;<a href="http://en.wikipedia.org/wiki/Jimmy_Page">Jimmy Page</a>,  <a href="http://en.wikipedia.org/wiki/The_Edge">The Edge</a> and <a href="http://en.wikipedia.org/wiki/Jack_White_(musician)">Jack White</a>.</p>
<iframe width="560" height="315" src="http://www.youtube.com/embed/j0pNn2bcChA" frameborder="0" allowfullscreen></iframe>
<p>White is what I call a primitivist.  Not really a Luddite, as in someone who dislikes and  opposes technology, but someone who is skeptical of it,  and prefers the simple &ldquo;human&rdquo; solution to the adorned technological one. Hence the part where he fashions an electric guitar out of a few old pieces of wood,  a few nails and a single wire. Raw is better than cooked. Less is more.</p>
<p>Look at this performance by Son House, one of White&rsquo;s idols.  Any musician will immediately point out that the damn <em>guitar is out of tune</em>. They will also concede that,  in this case,  <em>it does not matter</em>. That one man with one impaired instrument is more than the sum of the parts. The emotion and gravitas of this piece put today&rsquo;s studio engineered sounds seem as sterile and cold and gray as a freshly scrubbed hospital hallway. Look at his weathered face, his calloused and stiff fingers. Only a man like that can pour out a song like that.</p>
<iframe width="420" height="315" src="http://www.youtube.com/embed/NCWRPrU7e_E" frameborder="0" allowfullscreen></iframe>
<p>Page and The Edge are closer to the other end of the spectrum. Their musical explorations were also very much an exploration of the boundaries of technology and how much they could push it. Amps, pedals, effects, fancy guitars, sound engineering. They were not shy about using any of those tools to express what they wanted to express acoustically.</p>
<p>Look at this clip where he plays the intro to <em>Elevation</em>, with and without the effects pedal.</p>
<iframe width="560" height="315" src="http://www.youtube.com/embed/tHlU2ukrCoU" frameborder="0" allowfullscreen></iframe>
<p>Like he says in the documentary, he is just trying to get the machinery to make the sound he can already hear in his head. So obviously, the technophiles can also emote and express. They just have a very different way of going about it.</p>
<p>Overall, fascinating documentary, and a must-see if you are even a little bit into rock. The money shot is the three of them jamming in the end. You can watch the whole thing on Youtube.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Poor man&#39;s DIY little printer</title>
      <link>http://vivekhaldar.com/articles/poor-mans-diy-little-printer/</link>
      <pubDate>Mon, 08 Oct 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/poor-mans-diy-little-printer/</guid>
      <description>&lt;p&gt;I wanted the &lt;a href=&#34;http://bergcloud.com/littleprinter/&#34;&gt;Berg Little Printer&lt;/a&gt;  ever since they announced it, which I think was about a year ago. I loved the idea of having something tangible, and yet ephemeral, like little pieces of paper, printed on demand. I loved that it brought some &lt;a href=&#34;http://blog.vivekhaldar.com/post/485220674/collecting-needles&#34;&gt;finiteness to a digital realm that otherwise seemed infinite&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;And then reality hit. They announced a price of £199, which at today&amp;rsquo;s conversion rate works out to approximately $320.  Love it as I may, that was too much for a printer.  For comparison,  the cool new &lt;a href=&#34;http://www.google.com/nexus/#/7&#34;&gt;Nexus 7  was only $199&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I wanted the <a href="http://bergcloud.com/littleprinter/">Berg Little Printer</a>  ever since they announced it, which I think was about a year ago. I loved the idea of having something tangible, and yet ephemeral, like little pieces of paper, printed on demand. I loved that it brought some <a href="http://blog.vivekhaldar.com/post/485220674/collecting-needles">finiteness to a digital realm that otherwise seemed infinite</a>.</p>
<p>And then reality hit. They announced a price of £199, which at today&rsquo;s conversion rate works out to approximately $320.  Love it as I may, that was too much for a printer.  For comparison,  the cool new <a href="http://www.google.com/nexus/#/7">Nexus 7  was only $199</a>.</p>
<p>And thus was born my weekend DIY project to build me my own little printer.</p>
<p>These were the ingredients:</p>
<ul><li><a href="http://www.amazon.com/gp/product/B005IKHL4U/ref=oh_details_o02_s00_i00">some cheap thermal point-of-sale (POS) printer I found on Amazon</a>. $51</li>
<li><a href="http://www.amazon.com/gp/product/B000UY10Z0/ref=oh_details_o01_s00_i00">pack of 24 rolls of 2.25 inch, 85 ft thermal paper</a>. $9</li>
<li><a href="http://code.google.com/p/python-escpos/">Python code for outputting to POS printers</a>.</li>
<li>My own little scripts for <a href="https://github.com/vivekhaldar/fetch_rss">fetching RSS feeds and outputting them in various formats</a>, now updated to output <a href="http://nicholas.piasecki.name/blog/wp-content/uploads/2009/12/ESC-POS-Command-Guide.pdf">ESC-POS format</a>.</li>
</ul><p>Total money spent: $60.</p>
<p><img src="../../media/449104958.png" alt=""/><img src="../../media/449104958.png" alt=""/></p>
<p>Because I was doing this on my MacBook and I had trouble finding the Python USB libs, I had to fork and hack the Python escpos code to output to files instead of sending directly to USB. This also let me decouple the fetch/format stage from the actual printing.</p>
<p>On MacOS X, install it as a generic printer, and then print to it using lpr. The scripts will output files in the ESC-POS format, which you can send directly to the printer:</p>
<blockquote>
  <p>lpr -P posprinter -l nytpic.prn</p>
</blockquote>
<p>Now this is certainly not as polished and convenient as what Berg is offering, but at less than one-fifth of the price, I humbly contend that it gets you much more than one-fifth of the way there.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Money in the Valley</title>
      <link>http://vivekhaldar.com/articles/money-in-the-valley/</link>
      <pubDate>Sun, 07 Oct 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/money-in-the-valley/</guid>
      <description>&lt;p&gt;I think the technology press is doing us all a disservice by focusing so much on the money. If you read the tech press, 90% of the coverage is about valuations and exits and how much the primaries made.  To someone  not familiar with the real culture of  Silicon Valley, this all looks very similar to Wall Street, which is the furthest thing from reality.&lt;/p&gt;
&lt;p&gt;Now I&amp;rsquo;m certainly not trying to  say that money is not important, and that it should not be discussed.  Everybody needs to make a living. Everybody needs to feel secure. But what the tech press  is missing is  the entirely different  &lt;em&gt;attitude&lt;/em&gt; that true  Valley entrepreneurs have towards money.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I think the technology press is doing us all a disservice by focusing so much on the money. If you read the tech press, 90% of the coverage is about valuations and exits and how much the primaries made.  To someone  not familiar with the real culture of  Silicon Valley, this all looks very similar to Wall Street, which is the furthest thing from reality.</p>
<p>Now I&rsquo;m certainly not trying to  say that money is not important, and that it should not be discussed.  Everybody needs to make a living. Everybody needs to feel secure. But what the tech press  is missing is  the entirely different  <em>attitude</em> that true  Valley entrepreneurs have towards money.</p>
<p>The Wall Street attitude towards money  is to use it for two primary things: status, and insurance.  As you get more money, you get to buy more expensive toys.  You also have the secure feeling that no matter what problem you face, you can throw money at it to solve it.</p>
<p>But Silicon Valley is very different.  First of all,  there is  almost no status hierarchy. Billionaires dress the same way  that  Ramen-eating fresh graduates do – in well-worn jeans and t-shirts.  Fresh graduates  address them by their first names, and have  irreverent, spirited debates with them.  Pulling rank is considered to be extremely poor form.</p>
<p>Money is treated differently. Its primary purpose is  to be used as <em>fuel</em>.  Fuel to get somewhere. Fuel to do new things. Fuel for an <a href="http://en.wikipedia.org/wiki/Finite_and_Infinite_Games">infinite game</a>.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Science = Prediction</title>
      <link>http://vivekhaldar.com/articles/science--prediction/</link>
      <pubDate>Sun, 30 Sep 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/science--prediction/</guid>
      <description>&lt;p&gt;Computer Science has had an identity crisis since its very inception. What exactly constitutes it? Is it a science?&lt;/p&gt;
&lt;p&gt;Here is Denning&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;Science, engineering, and mathematics combine into a unique and
  potent blend in our field. Some of our activities are primarily science—for example, experimental algorithms, experimental computer science, and computational science. Some are primarily engineering—for example, design, development, software engineering, and computer engineering. Some are primarily mathematics—for example, computational complexity, mathematical software, and numerical analysis. But most are combinations.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Computer Science has had an identity crisis since its very inception. What exactly constitutes it? Is it a science?</p>
<p>Here is Denning<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">1</a></sup>:</p>
<blockquote>
  <p>Science, engineering, and mathematics combine into a unique and
  potent blend in our field. Some of our activities are primarily science—for example, experimental algorithms, experimental computer science, and computational science. Some are primarily engineering—for example, design, development, software engineering, and computer engineering. Some are primarily mathematics—for example, computational complexity, mathematical software, and numerical analysis. But most are combinations.</p>
</blockquote>
<p>But Vint Cerf, the recently appointed president of the Association for Computing Machinery, gets the last punch<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">2</a></sup>:</p>
<blockquote>
  <p>In the physical world, science is largely about models, measurement, predictions, and validation. Our ability to predict likely outcomes based on models is fundamental to the most central notions of the scientific method. The term &ldquo;computer science&rdquo; raises expectations, at least to my mind, of an ability to define models and to make predictions about the behavior of computers and computing systems&hellip; When we write a piece of software, do we have the ability to predict how many mistakes we have made (that is, bugs)? Do we know how long it will take to find and fix them? Do we know how many new bugs our fixes will create? Can we say anything concrete about vulnerability? What about the probability of exploitation?</p>
</blockquote>
<p>In other words, you can&rsquo;t call your field a science until it gives you <em>predictive power</em> over your world.</p>
<p>At the beginning of a complex software project, the margin of error in predicting completion time and resources required is so large as to be practically useless. This <a href="http://www.construx.com/Page.aspx?cid=1648">cone of uncertainty</a> decreases as the project progresses. The only way out is through.</p>
<p>Estimating (i.e. prediction) is the dirty secret of the computing industry. Everyone wants them. Everyone provides them. Nobody attaches <em>probabilities</em> to them. And absolutely nobody believes them. Reported estimates are often padded by a factor of two (or more) for planning downstream activities, and even that isn&rsquo;t enough.</p>
<p>I am pessimistic about the endeavor of bringing scientific estimation to software development, at least, in an a priori manner. It <em>might</em> be possible to build post-hoc models based on history. For example, by the tenth time you build the same thing, you can provide a good estimate for the time and resources required.</p>
<p>I am pessimistic because the bulk of uncertainty in software development comes from human complexity. If the world and behavior of humans was governed by principled laws, and if they all used the same language, then software in such a world would be simple and predictable. But the world of humans is complex and messy and ureasonable, and software that deals with them also must be.</p>
<div class="footnotes" role="doc-endnotes">
<hr><ol><li id="fn:2" role="doc-endnote">
<p><a href="http://www.ifba.edu.br/professores/antoniocarlos/cacmApr05.pdf">Is Computer Science Science? Peter J. Denning. Communications Of The ACM April  2005/Vol. 48, No. 4 27</a> <a href="#fnref:2" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:1" role="doc-endnote">
<p><a href="http://cacm.acm.org/magazines/2012/10/155530-where-is-the-science-in-computer-science/fulltext">Where is the Science in Computer Science?By Vinton G. Cerf, Communications of the ACM, Vol. 55 No. 10, Page 5</a> <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol></div>
]]></content:encoded>
    </item>
    
    <item>
      <title>Datacenter power</title>
      <link>http://vivekhaldar.com/articles/datacenter-power/</link>
      <pubDate>Sun, 23 Sep 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/datacenter-power/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.nytimes.com/2012/09/23/technology/data-centers-waste-vast-amounts-of-energy-belying-industry-image.html?pagewanted=all&#34;&gt;The New York Times takes datacenters to task for wasting electricity&lt;/a&gt;, but I do think they&amp;rsquo;ve missed two crucial points on the other side of the debate:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;there are strong incentives to reduce power consumption, as that is a huge capital drain, and, well, companies want to reduce their costs. (I found it strange that one of their sources was quoted as saying that they don&amp;rsquo;t get bonuses for reducing power consumption.)&lt;/li&gt;
&lt;li&gt;each machine in a datacenter serves many people. That desktop serves just you, and that too for a small fraction of the day. A world in which everyone uses tiny devices (phones, tablets, laptops) backed by giant datacenters will use drastically lesser power per person than one in which most have desktop machines.&lt;/li&gt;
&lt;/ul&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://www.nytimes.com/2012/09/23/technology/data-centers-waste-vast-amounts-of-energy-belying-industry-image.html?pagewanted=all">The New York Times takes datacenters to task for wasting electricity</a>, but I do think they&rsquo;ve missed two crucial points on the other side of the debate:</p>
<ul><li>there are strong incentives to reduce power consumption, as that is a huge capital drain, and, well, companies want to reduce their costs. (I found it strange that one of their sources was quoted as saying that they don&rsquo;t get bonuses for reducing power consumption.)</li>
<li>each machine in a datacenter serves many people. That desktop serves just you, and that too for a small fraction of the day. A world in which everyone uses tiny devices (phones, tablets, laptops) backed by giant datacenters will use drastically lesser power per person than one in which most have desktop machines.</li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Citation Reliability</title>
      <link>http://vivekhaldar.com/articles/citation-reliability/</link>
      <pubDate>Fri, 21 Sep 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/citation-reliability/</guid>
      <description>&lt;p&gt;If you spend enough time reading personal finance literature, you are bound to run into the claim that &amp;ldquo;asset allocation determines 95% of the return of a portfolio.&amp;rdquo; I did too. Then I began digging into it. Turns out that it is a widely held misconception.&lt;/p&gt;
&lt;p&gt;The original study on which the claim is based claims a relation between assset allocation and &lt;em&gt;volatility&lt;/em&gt;, not returns.&lt;/p&gt;
&lt;p&gt;This paper&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; clarifies:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;The specific claims vary, but financial professionals generally assert that asset allocation is the most important determinant of returns, accounting for more than 90 percent of performance. This assertion stems from studies by Brinson et al. (1986, 1991), that state, “&amp;hellip;investment policy dominates investment strategy (market timing and security selection), explaining on average 93.6 percent of the variation in total plan return.” This conclusion has caused a great deal of confusion in both the academic and financial communities. In fact, a survey by Nuttall &amp;amp; Nuttall (1998) demonstrates that &lt;strong&gt;out of 50 writers who quoted Brinson, only one quoted him correctly. Approximately 37 writers misinterpreted Brinson’s work as an answer to the question, “What percent of total return is explained by asset allocation policy?” and five writers misconstrued the Brinson conclusion as an answer to the question, “What is the impact of choosing one asset allocation over another?”&lt;/strong&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>If you spend enough time reading personal finance literature, you are bound to run into the claim that &ldquo;asset allocation determines 95% of the return of a portfolio.&rdquo; I did too. Then I began digging into it. Turns out that it is a widely held misconception.</p>
<p>The original study on which the claim is based claims a relation between assset allocation and <em>volatility</em>, not returns.</p>
<p>This paper<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> clarifies:</p>
<blockquote>
  <p>The specific claims vary, but financial professionals generally assert that asset allocation is the most important determinant of returns, accounting for more than 90 percent of performance. This assertion stems from studies by Brinson et al. (1986, 1991), that state, “&hellip;investment policy dominates investment strategy (market timing and security selection), explaining on average 93.6 percent of the variation in total plan return.” This conclusion has caused a great deal of confusion in both the academic and financial communities. In fact, a survey by Nuttall &amp; Nuttall (1998) demonstrates that <strong>out of 50 writers who quoted Brinson, only one quoted him correctly. Approximately 37 writers misinterpreted Brinson’s work as an answer to the question, “What percent of total return is explained by asset allocation policy?” and five writers misconstrued the Brinson conclusion as an answer to the question, “What is the impact of choosing one asset allocation over another?”</strong></p>
</blockquote>
<p>(emphasis mine)</p>
<p>The depressing lesson to be learned from this (and countless other times I&rsquo;ve dug into the primary source behind a citation) is that citations of technical material in popular literature simply cannot be trusted. If you really want to know, go find the paper and read it. Citations of technical material in technical literature fare better, but even there results are often mis-interpreted or cherry-picked to suit one&rsquo;s position.</p>
<p>As they say, <em>use the force, read the source.</em></p>
<p>(So how much of returns are due to asset allocation? This paper<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> might answer that question.)</p>
<div class="footnotes" role="doc-endnotes">
<hr><ol><li id="fn:1" role="doc-endnote">
<p><a href="http://www.ifa.com/Media/Images/PDF%20files/Does_Asset_Allocation_Explain_Performance.pdf">The True Impact of Asset Allocation on Returns. Roger G. Ibbotson</a> <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:2" role="doc-endnote">
<p><a href="http://www.mangustarisk.com/doc/pdf/Does_Asset_Allocation_Explain_40_90_100_Performance.pdf">Does Asset Allocation Policy Explain 40, 90 or 100 Percent of Performance? Roger G. Ibbotson and Paul D. Kaplan</a> <a href="#fnref:2" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol></div>
]]></content:encoded>
    </item>
    
    <item>
      <title>New frontiers in text editing</title>
      <link>http://vivekhaldar.com/articles/new-frontiers-in-text-editing/</link>
      <pubDate>Thu, 20 Sep 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/new-frontiers-in-text-editing/</guid>
      <description>&lt;p&gt;Over the last couple of months I&amp;rsquo;ve watched the unfolding drama of TextMate lovers scrambling to find a replacement after it was open-sourced, and presumed abandoned. The ensuing searching of editors and souls shed some light into what geeks seem to want in an editor these days. And that seems to be (1) good looks (at least on the Mac, because &amp;ldquo;things are pretty here&amp;rdquo;) and (2)&amp;hellip; some feature and performance soup that nobody can agree upon.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Over the last couple of months I&rsquo;ve watched the unfolding drama of TextMate lovers scrambling to find a replacement after it was open-sourced, and presumed abandoned. The ensuing searching of editors and souls shed some light into what geeks seem to want in an editor these days. And that seems to be (1) good looks (at least on the Mac, because &ldquo;things are pretty here&rdquo;) and (2)&hellip; some feature and performance soup that nobody can agree upon.</p>
<p>What I don&rsquo;t understand is: why should you ever care how your editor looks, unless you&rsquo;re trying to win a screenshot competition? The primary factor in looking good should be the choice of a good font at a comfortable size, and a syntax coloring theme that you like. And that is not something specific to an editor. Editors like Emacs and vi have almost no UI! If Emacs is configured right, the only UI it has is the modeline and the minibuffer.</p>
<p>People talk about getting used to a new editor, but over time, it is precisely the opposite that should happen–the editor should get used to us.</p>
<p>I watched this drama from my perch upon <a href="http://blog.vivekhaldar.com/post/3996068979/the-levels-of-emacs-proficiency">Mt. Emacs</a>. If this makes me sound like an Emacs elitist snob, so be it! Now, I&rsquo;m typing these words into Byword on a Mac. For me, it serves as the small home kitchen knife compared to the full chef&rsquo;s knife set that is Emacs.</p>
<p>There are times when I just need to serially dump a large number of words from my head into the digital ether, and that does not require much editor sophistication. There are other times (the majority of my day job) when I need juggling between dozens of files and shells and compiles and regexes and searches and syntax comprehension. That&rsquo;s when I use Emacs.</p>
<p>Overall, I think text editing is a solved problem. Text editors are like wine. The older the better. You do not want a shiny new text editor. You want the text editor that has been around long enough and used by enough geeks that every conceivable pattern of manipulating symbols on the screen has been thought of, and crystallized into a re-usable pack.</p>
<p><em>The big unsolved problem in text editing is to do it without a keyboard</em>, whose use I think peaked sometime in 2011. On tablets and phones. On devices where the entry and manipulation of text remains a royal pain, because we haven&rsquo;t yet figured out a way to do it. The challenge is to never make someone think &ldquo;damn, I really wish I had a keyboard right now!&rdquo;</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>English is heavily left-handed</title>
      <link>http://vivekhaldar.com/articles/english-is-heavily-lefthanded/</link>
      <pubDate>Thu, 13 Sep 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/english-is-heavily-lefthanded/</guid>
      <description>&lt;p&gt;It turns out that when using a QWERTY layout keyboard, English is heavily left-handed. By that, I mean that characters on the left side of the keyboard occur much more frequently than those on the right hand side.&lt;/p&gt;
&lt;p&gt;If you go by the &lt;a href=&#34;http://en.wikipedia.org/wiki/Letter_frequency&#34;&gt;relative frequencies of the letters in the English language&lt;/a&gt;, and assume a &lt;a href=&#34;http://www.goldtouch.com/p-2-goldtouch-v2-adjustable-comfort-keyboard-pc-mac-compatible-usb.aspx&#34;&gt;keyboard split like the Goldtouch keyboard&lt;/a&gt;, it turns out that characters on the &lt;strong&gt;left occur 58.73%&lt;/strong&gt; of the time, and those on the &lt;strong&gt;right 41.3%&lt;/strong&gt; of the time. This is certainly not helped by the fact that the right side has 11 letters to the left&amp;rsquo;s 15.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>It turns out that when using a QWERTY layout keyboard, English is heavily left-handed. By that, I mean that characters on the left side of the keyboard occur much more frequently than those on the right hand side.</p>
<p>If you go by the <a href="http://en.wikipedia.org/wiki/Letter_frequency">relative frequencies of the letters in the English language</a>, and assume a <a href="http://www.goldtouch.com/p-2-goldtouch-v2-adjustable-comfort-keyboard-pc-mac-compatible-usb.aspx">keyboard split like the Goldtouch keyboard</a>, it turns out that characters on the <strong>left occur 58.73%</strong> of the time, and those on the <strong>right 41.3%</strong> of the time. This is certainly not helped by the fact that the right side has 11 letters to the left&rsquo;s 15.</p>
<p>Add to that the fact that if you&rsquo;re an Emacs user (like me), then some of the most common commands and command prefixes (Ctrl-A, Ctrl-E, Ctrl-X, Meta-X, Ctrl-C, Ctrl-R, Ctrl-W) <em>all</em> use left-side keystrokes, and you end up with an even heavier leftwards tilt.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Writing and happiness</title>
      <link>http://vivekhaldar.com/articles/writing-and-happiness/</link>
      <pubDate>Tue, 11 Sep 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/writing-and-happiness/</guid>
      <description>&lt;p&gt;I recently read a couple of papers that go further along the lines of &lt;a href=&#34;http://blog.vivekhaldar.com/post/12023299097/the-empirical-science-of-happiness&#34;&gt;happiness becoming an emperical science&lt;/a&gt;. Specifically, how writing affects well-being.&lt;/p&gt;
&lt;p&gt;Those who write know that it makes them happy. They know they will get cranky if they don&amp;rsquo;t. Just like athletes missing a training session. Now here is some emperical evidence along those lines.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;those who regularly wrote expressively before an exam had higher scores and lesser pre-exam depression. &lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;writing about your worst experiences improves your mental and physical health. The flip side was that writing and analyzing positive experiences descreased overall life satisfaction. In other words, face and work through the bad stuff, accept and don&amp;rsquo;t overthink the good stuff. &lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;&lt;ol&gt;&lt;li id=&#34;fn:1&#34; role=&#34;doc-endnote&#34;&gt;
&lt;p&gt;&lt;a href=&#34;http://www.ncbi.nlm.nih.gov/pubmed/21517162&#34;&gt;Opening up in the classroom: effects of expressive writing on graduate school entrance exam performance. Frattaroli J, Thomas M, Lyubomirsky S. Emotion. 2011 Jun;11(3):691-6.&lt;/a&gt; &lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;↩︎&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I recently read a couple of papers that go further along the lines of <a href="http://blog.vivekhaldar.com/post/12023299097/the-empirical-science-of-happiness">happiness becoming an emperical science</a>. Specifically, how writing affects well-being.</p>
<p>Those who write know that it makes them happy. They know they will get cranky if they don&rsquo;t. Just like athletes missing a training session. Now here is some emperical evidence along those lines.</p>
<ul><li>those who regularly wrote expressively before an exam had higher scores and lesser pre-exam depression. <sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></li>
<li>writing about your worst experiences improves your mental and physical health. The flip side was that writing and analyzing positive experiences descreased overall life satisfaction. In other words, face and work through the bad stuff, accept and don&rsquo;t overthink the good stuff. <sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup></li>
</ul><div class="footnotes" role="doc-endnotes">
<hr><ol><li id="fn:1" role="doc-endnote">
<p><a href="http://www.ncbi.nlm.nih.gov/pubmed/21517162">Opening up in the classroom: effects of expressive writing on graduate school entrance exam performance. Frattaroli J, Thomas M, Lyubomirsky S. Emotion. 2011 Jun;11(3):691-6.</a> <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:2" role="doc-endnote">
<p><a href="http://www.faculty.ucr.edu/~sonja/papers/LSD2006.pdf">Lyubomirsky, S., Sousa, L., Dickerhoof, R. (2006). The costs and benefits of writing, talking, and thinking about life&rsquo;s triumphs and defeats. Journal of Personality and Social Psychology, 90, 692-708.</a> <a href="#fnref:2" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol></div>
]]></content:encoded>
    </item>
    
    <item>
      <title>Shitty legacy maintenance</title>
      <link>http://vivekhaldar.com/articles/shitty-legacy-maintenance/</link>
      <pubDate>Tue, 04 Sep 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/shitty-legacy-maintenance/</guid>
      <description>&lt;p&gt;Software engineers &lt;a href=&#34;http://arstechnica.com/business/2012/07/im-doing-90-percent-maintenance-10-percent-development-is-this-normal/&#34;&gt;often complain&lt;/a&gt; that they are stuck doing &lt;a href=&#34;http://news.ycombinator.com/item?id=4459412&#34;&gt;shitty legacy maintenance work&lt;/a&gt;. This is one of the major naive beliefs of new engineers. It is interesting to look at what exactly “legacy maintenance” consists of, why it is considered “shitty”, and by whom, and then, what kind of work is &lt;em&gt;not&lt;/em&gt; legacy maintenance.&lt;/p&gt;
&lt;h4&gt;The work of engineers&lt;/h4&gt;
&lt;p&gt;Start by asking yourself what you signed up for when you said you wanted to become an engineer, of software or any other kind.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Software engineers <a href="http://arstechnica.com/business/2012/07/im-doing-90-percent-maintenance-10-percent-development-is-this-normal/">often complain</a> that they are stuck doing <a href="http://news.ycombinator.com/item?id=4459412">shitty legacy maintenance work</a>. This is one of the major naive beliefs of new engineers. It is interesting to look at what exactly “legacy maintenance” consists of, why it is considered “shitty”, and by whom, and then, what kind of work is <em>not</em> legacy maintenance.</p>
<h4>The work of engineers</h4>
<p>Start by asking yourself what you signed up for when you said you wanted to become an engineer, of software or any other kind.</p>
<p>Engineers are supposed to build real-world solutions to real-world problems within <em>externally specified</em> time and financial constraints.</p>
<p>This often means using stable, established technologies. Mature engineers understand that they have a limited <em>risk budget</em>. Almost always, that risk budget gets used up by uncertainties in time and money, which leaves little or no risk to be spent trying out cool and new, but unproved, technologies.</p>
<p>Out of time, money and experimenting with cool new stuff, they get to choose any two. This is why when a project that wants to push the envelope of the underlying technologies themselves, that is made (or at least, should be) explicit at the outset, and they are given a lot of slack with either money or time.</p>
<h4>Maintenance</h4>
<p>The narrative of technology is told in terms of invention and innovation. But if you <a href="http://www.amazon.com/gp/product/1449389627">look closer</a>, innovation is made up of a thousand small, incremental steps on existing technologies.</p>
<p>Others have argued that <a href="http://www.amazon.com/Shock-Old-David-Edgerton/dp/1861972962/">looking at the history of technology through a use-based rather than innovation-based narrative</a> paints a more accurate portrait of how prevalent and significant old technologies are, and what a central role maintenance plays. Things would simply fall apart if they were not maintained.</p>
<h4>New Stuff, Interesting Stuff</h4>
<p>Unfortunately, the dominant narrative of the progress of technology is the <a href="http://en.wikipedia.org/wiki/Chronocentrism">chronocentric</a> one centered on innovation. That&rsquo;s not a big surprise, because news needs to be, well, new. Everything reported in the tech news is significant and useful to a vanishingly small fraction of the population. The overwhelming majority uses boring, old, mature, <em>dependable</em> technologies.</p>
<p>The side-effect of this is that engineering graduates come into the job market with an expectation of always working on shiny, new, cutting-edge, greenfield projects. And then they&rsquo;re dejected when that expectation is not met by the real world. <em>There is simply not that much new stuff to go around</em>.</p>
<p>But it is a mistake to think that working on an existing system, or maintaining it, is a crappy job. For a fresh grad, it might actually be a good thing. It is a gentle ramp up. It gives them a chance to observe the operation of a real system. If they take it upon themselves to dig deeper and learn about it and see why it was built the way it was built (as opposed to complaining about it), they can learn some valuable lessons. And if what they learn truly does not make sense, they&rsquo;ve just found an opportunity for improving things!</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Personal Trainers for Software</title>
      <link>http://vivekhaldar.com/articles/personal-trainers-for-software/</link>
      <pubDate>Thu, 30 Aug 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/personal-trainers-for-software/</guid>
      <description>&lt;p&gt;It is routine for individuals to hire professional help for a range of narrow, well-defined activities.&lt;/p&gt;
&lt;p&gt;We hire contractors and interior decorators to build our homes.&lt;/p&gt;
&lt;p&gt;We hire accountants to take care of our taxes and investments.&lt;/p&gt;
&lt;p&gt;We hire personal trainers to help with our physical fitness.&lt;/p&gt;
&lt;p&gt;Why do we not hire &lt;em&gt;software contractors&lt;/em&gt; (or whatever you want to call them) for specialized software work that is personalized to one&amp;rsquo;s specific workflows?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>It is routine for individuals to hire professional help for a range of narrow, well-defined activities.</p>
<p>We hire contractors and interior decorators to build our homes.</p>
<p>We hire accountants to take care of our taxes and investments.</p>
<p>We hire personal trainers to help with our physical fitness.</p>
<p>Why do we not hire <em>software contractors</em> (or whatever you want to call them) for specialized software work that is personalized to one&rsquo;s specific workflows?</p>
<p>Programmers constantly build their own little tools and scripts to grease their daily workflows. Regular people are stuck with whatever applications happen to allow. If an application to do something does not exist, it usually precludes that activity entirely. Programmers don&rsquo;t realize what a problem this is. Just listen to the convoluted flows on a show like <a href="http://5by5.tv/mpu">Mac Power Users</a>. A huge amount of time, money and effort is spent on cobbling together blunt tools.</p>
<p>How would one go about establishing such a profession?</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>The levels of agility</title>
      <link>http://vivekhaldar.com/articles/the-levels-of-agility/</link>
      <pubDate>Mon, 27 Aug 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-levels-of-agility/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://blog.assembla.com/assemblablog/tabid/12618/bid/87899/Seven-Things-I-Hate-About-Agile.aspx&#34;&gt;Andy Singleton wrote about what irks him about agile.&lt;/a&gt; He has a few good points about how the marketing of agile has distorted the true essence and value of it.&lt;/p&gt;
&lt;p&gt;But, first of all, come on, Andy, let&amp;rsquo;s not be ageist. One of the things he hates is:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;Old people: Agile has the smell of death on it.   If you go to an “agile” event you will see few people under the age of 40 and many over 50. These attendees are on average much older than the average age of programmers&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://blog.assembla.com/assemblablog/tabid/12618/bid/87899/Seven-Things-I-Hate-About-Agile.aspx">Andy Singleton wrote about what irks him about agile.</a> He has a few good points about how the marketing of agile has distorted the true essence and value of it.</p>
<p>But, first of all, come on, Andy, let&rsquo;s not be ageist. One of the things he hates is:</p>
<blockquote>
  <p>Old people: Agile has the smell of death on it.   If you go to an “agile” event you will see few people under the age of 40 and many over 50. These attendees are on average much older than the average age of programmers</p>
</blockquote>
<p>It is not logical to dump on a state you will inevitably be in, i.e <em>old</em>.  You might very well learn a thing or two from those that smell of death.</p>
<p>That said, I want to talk about what I like about agile.</p>
<p>Agile means so many things to so many people that is hard to even define what it means. I&rsquo;m not going to attempt a universal definition. I&rsquo;m going to talk about what &ldquo;agile&rdquo; means to <em>me</em>.</p>
<!-- more -->
<p>Here&rsquo;s my definition:</p>
<p><strong>To be agile means to have such a degree of control and understanding of the process by which you produce that you can make your output predictable (in terms of resources like time, people, material etc.) and can rapidly adjust the process to deal with changes in the environment (such as new requirements or contstraints).</strong></p>
<p>For those who have a deep understanding of what it is, and how to <em>implement</em> it in a team setting, it works amazingly well. Like anything that works amazingly well, people want a piece of it. Like anything that works amazingly well, other people want to sell it. Hence the never-ending stream of books and hoopla and conferences and terminology.</p>
<p>Unfortunately, agile is often sold as a canned collection of processes and practices, and many think that blindly applying it to their context will make all their problems go away. No, it will not. If you just apply them like a script kiddie runs downloaded warez, without really understanding them or knowing how to tweak them, agile will not solve anything for you.</p>
<p>The same goes for agile &ldquo;tools&rdquo;, of which there are tons in the market. It is all too easy to fiddle with tools without getting any real results. It is not about the tools at all. I have seen experienced practitioners work wonders with nothing more than a simple shared spreadsheet.</p>
<p>Let&rsquo;s look at the levels on the agile ladder.</p>
<ol><li><strong>The pain and the need.</strong> The team is somehow making stuff, but it is chaotic and stressful, dates and deliverables mean nothing. If deadlines are met it is by sheer luck. I need <em>something</em>, some <em>process</em>, to bring some control and predictability to this.</li>
<li><p><strong>Lightweight process. Iteration.</strong> The next step is usually to wonder if a process can help you. Most people, especially technical folks, have a disdain for process, and rightly so, because a process can quickly become an end in itself if not overseen by someone mature enough to realize that it is just a tool.</p>
<p>Fortunately, a lightweight process is all you need. This involves simple things like breaking work down into concrete chunks that can be estimated, fitting those chunks into timeboxed iterations (usually a few weeks), and people signing up for chunks in a given iteration. Just doing this much brings a lot of clarity to end-goals and the rough size of the problem being tackled.</p>
<p>When you start out with this, you will realize that you aren&rsquo;t very good at it. Your estimates will be way off, often by as much an order of magnitude. Your chunks of work may not be well defined. You will probably end up missing things you signed up for in the iteration, and doing things you didn&rsquo;t sign up for. This is expected. Each iteration, keep an eye on what you could have done better. Stick with it. You&rsquo;ll get better.</p>
<p>The crucial idea here is that of <em>iteration</em>. You should try to get to a &ldquo;walking skeleton&rdquo; as soon as possible, and then add flesh to it every iteration. <a href="http://blog.vivekhaldar.com/post/27415471917/on-vagueness">Failure should get exposed early rather than late.</a> Which brings us to&hellip;</p></li>
<li><p><strong>Visibility and automation.</strong> Next you get to what most people know of as the standard tools and practices of &ldquo;agile.&rdquo; Lots and lots of tests. Continuous builds and tests. Dashboards. Code metrics. There is a common theme underlying all these tools and practices&ndash;visibility and automation. Automation, because the more you automate, the more you remove friction and leave time to concentrate on the hard problems. Visibility, because the only way to even try to control a large, complex system is to gain visibility into it.</p>
<p>You can get a big fraction of the benefits of agile by getting this far. I call this the &ldquo;<em>fake it until you make it</em>&rdquo; phase. Plan iterations (even if the plans turn out to be lousy), set up a continuous build, get used to being green and keeping it that way. You will notice the chaos and anxiety slowly but surely replaced by a calm, confident velocity. There should be far fewer fire drills.</p></li>
<li><p><strong>Control and adaptibility.</strong> The thing that separates the 99th percentile of guru agile practitioners from the others is an <em>understanding of your process and how to tweak it</em>. What if your requirements suddenly change? What if you realize that you fundamentally need to rework some significant part of your product? What if your team size is halved? Or doubled? How will your process absorb these environmental changes and allow you to continue building and delivering stuff?</p>
<p>There are no tools and practices for this. This just takes time and attention and gentle nudges in the right place.</p>
<p>One principle is key here, and it is one almost never mentioned by agile tool vendors. That is the <a href="http://en.wikipedia.org/wiki/Theory_of_constraints">theory of constraints</a>. That&rsquo;s a fancy of way of saying that your process always has a bottleneck, and that you should find it and focus on removing that one bottleneck. Repeat with the next bottleneck.</p>
<p>The two most common ways are to either put more resources to remove the bottleneck, or structure your work to avoid &ldquo;backing up&rdquo; at the bottleneck. For example, say you have ten devs and one tester. The rate of which your entire team can deliver reliable, tested code is limited by that one tester. You could either hire more testers, or start nudging your devs to test more.</p></li>
</ol><p>That&rsquo;s what agile means to me. Every team that gets value out of it uses their own unique variation of it, and that&rsquo;s great. Take it on. Use what you like, throw away what you don&rsquo;t. Pay attention to <em>your</em> team and <em>your</em> process. Don&rsquo;t start by choosing tools. Take the word of agile &ldquo;experts&rdquo; with a grain of salt.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>A Twitter-based Anagram Game</title>
      <link>http://vivekhaldar.com/articles/a-twitterbased-anagram-game/</link>
      <pubDate>Sun, 26 Aug 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/a-twitterbased-anagram-game/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been fascinated with the idea of using Twitter for slow, asynchronous, text-based games. The kind where a challenge is tweeted out, and you can take your sweet time to respond to it, again with a tweet, sprinkled with some simple game elements like leaderboards.&lt;/p&gt;
&lt;p&gt;My initial exploration of the idea led me to develop what was &lt;a href=&#34;http://blog.vivekhaldar.com/post/2830035130/how-to-write-a-twitter-bot-in-python&#34;&gt;a pretty simple and useless twitter chat bot (in the style of Eliza)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The next step in my exploration is &lt;strong&gt;Anagramr&lt;/strong&gt;, a game of anagrams over Twitter. Here are the rules:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I&rsquo;ve been fascinated with the idea of using Twitter for slow, asynchronous, text-based games. The kind where a challenge is tweeted out, and you can take your sweet time to respond to it, again with a tweet, sprinkled with some simple game elements like leaderboards.</p>
<p>My initial exploration of the idea led me to develop what was <a href="http://blog.vivekhaldar.com/post/2830035130/how-to-write-a-twitter-bot-in-python">a pretty simple and useless twitter chat bot (in the style of Eliza)</a>.</p>
<p>The next step in my exploration is <strong>Anagramr</strong>, a game of anagrams over Twitter. Here are the rules:</p>
<ol><li>Follow <a href="https://twitter.com/anagramr">@anagramr</a> on Twitter. Every couple of minutes, it will tweet out a challenge like: &ldquo;Give me anagrams for FOO.&rdquo; (<strong>Update</strong>: I got feedback this was way too frequent. I&rsquo;ve turned this down to one challenge tweeted out every half hour.)</li>
<li>Reply to one of those challenges with <a href="http://en.wikipedia.org/wiki/Anagram">anagrams</a> of the the word in the challenge. <em>It must be a reply to that tweet</em>, or Anagramr will not know which word you are replying to.</li>
<li>Anagramr will tweet you back with whether your reply was a valid anagram or not.</li>
<li>A couple of times a day, Anagramr will tweet out leaderboards.</li>
</ol><p>A typical run looks like this:</p>
<p><img src="../../media/449104958.png" alt=""/></p>
<p><a href="https://github.com/vivekhaldar/the_shrinkbot/blob/master/anagramr.py">Code is over on github.</a></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>The Cubicle Dilemma</title>
      <link>http://vivekhaldar.com/articles/the-cubicle-dilemma/</link>
      <pubDate>Wed, 15 Aug 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-cubicle-dilemma/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve only ever worked in cubicles, and often wondered what it would be like to work in a closed individual office.&lt;/p&gt;
&lt;p&gt;The two layouts encourage very different styles of work, and even different styles of thought. In a recent study of a war room environment&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;, extremely easy and frequent communication among team members was a huge advantage. The team in question delivered projects on time and on budget consistently.&lt;/p&gt;
&lt;p&gt;But there were caveats.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I&rsquo;ve only ever worked in cubicles, and often wondered what it would be like to work in a closed individual office.</p>
<p>The two layouts encourage very different styles of work, and even different styles of thought. In a recent study of a war room environment<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>, extremely easy and frequent communication among team members was a huge advantage. The team in question delivered projects on time and on budget consistently.</p>
<p>But there were caveats.</p>
<!-- more -->
<p>You have to be a certain type of engineer to thrive in this kind of environment: &ldquo;&hellip; [this] environment is not for every engineer nor for every design team. Certain types of personality, such as being flexible and adaptable, are needed to be able to work in such a public environment. Most work is visible to all (except intermediate calculations), especially mistakes. Team members unable to adapt to an unstructured environment do not last long on the team. <strong>Moreover, they have to be able to withstand the stress generated by noise and time pressure; despite these distractions, one must be able to continually monitor the conversations, exchanges, design status, and changing mission parameters</strong>, as well as the team leader’s remarks&hellip;. Almost all current Team X members report being mentally tired at the end of a session. <strong>Yet results from a questionnaire I administered to each team member showed the mean satisfaction level working in this environment to be quite high</strong>: 9.4 (sd=0.9) on a scale of 1 to 10 (high). One engineer described the experience as exhausting but thrilling, like riding a roller coaster. The key is to enjoy problem-solving in a highly social atmosphere.&rdquo; (emphasis mine)</p>
<p>On the other hand, the frequent disruptions that tightly packed arrangements encourage are extremely detrimental to the flow of work. In another study, the same author measured the cost of interruptions<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> on daily office work. One might think that interruptions related to the task at hand are different from interruptions related to a completely different context. This turned out not to be the case: <strong>there is no such thing as a good interruption.</strong> &ldquo;Our results showed that any interruption introduces a change in work pattern and is not related to context per se.&rdquo;</p>
<p>Surprisingly, people took longer to complete tasks in the absence of any interruptions. But there was a caveat: &ldquo;<strong>When people are constantly interrupted, they develop a mode of working
faster (and writing less) to compensate for the time they know they will lose by being interrupted.</strong> Yet working faster with interruptions has its cost: people in the interrupted conditions experienced a higher workload, more stress, higher frustration, more time pressure, and effort. So interrupted work may be done faster, but at a price.&rdquo;</p>
<p>How do we reconcile this? Being tightly packed with your coworkers does seem to offer significant advantages, but not without a price.</p>
<div class="footnotes" role="doc-endnotes">
<hr><ol><li id="fn:1" role="doc-endnote">
<p><a href="http://www.ics.uci.edu/~gmark/extreme%20collaboration.pdf">Gloria Mark. Extreme Collaboration. Communications of the ACM, June 2002.</a> <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:2" role="doc-endnote">
<p><a href="http://www.ics.uci.edu/~gmark/chi08-mark.pdf">Gloria Mark, Daniela Gudith and Ulrich Klocke. The Cost of Interrupted Work: More Speed and Stress. Proceedings of the twenty-sixth annual SIGCHI conference on Human factors in computing systems, 2008.</a> <a href="#fnref:2" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol></div>
]]></content:encoded>
    </item>
    
    <item>
      <title>What is life like for PhDs in computer science who go into industry?</title>
      <link>http://vivekhaldar.com/articles/what-is-life-like-for-phds-in-computer-science-who-go-into-industry/</link>
      <pubDate>Sun, 12 Aug 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/what-is-life-like-for-phds-in-computer-science-who-go-into-industry/</guid>
      <description>&lt;p&gt;(I just posted a long answer to &lt;a href=&#34;http://www.quora.com/Computer-Science/What-is-life-like-for-PhDs-in-computer-science-who-go-into-industry&#34;&gt;this Quora question&lt;/a&gt;. Reproducing here.)&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;What is life like for PhDs in computer science who go into industry?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is one of the most common questions I get during recruiting events.  I have a PhD, and have worked in industry for last few years, so I am going to take a stab at answering.&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;First of all, I want to administer a dose of reality to the OP. Please don&amp;rsquo;t take offense at this, because I used to think exactly like the OP when I was a green newb. The entire set of questions has an undertone of “how will I be treated special in the workplace if I have a PhD?” You will not be treated special at all. When you go about your day-to-day job, you do not have a halo hanging over your head declaring that you did a PhD. You will &lt;em&gt;earn&lt;/em&gt; the respect of your peers and bosses by delivering value to your team, not by possessing a degree. (Also see answer to job security question below.)&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>(I just posted a long answer to <a href="http://www.quora.com/Computer-Science/What-is-life-like-for-PhDs-in-computer-science-who-go-into-industry">this Quora question</a>. Reproducing here.)</p>
<blockquote>
  <p>What is life like for PhDs in computer science who go into industry?</p>
</blockquote>
<p>This is one of the most common questions I get during recruiting events.  I have a PhD, and have worked in industry for last few years, so I am going to take a stab at answering.</p>
<!-- more -->
<p>First of all, I want to administer a dose of reality to the OP. Please don&rsquo;t take offense at this, because I used to think exactly like the OP when I was a green newb. The entire set of questions has an undertone of “how will I be treated special in the workplace if I have a PhD?” You will not be treated special at all. When you go about your day-to-day job, you do not have a halo hanging over your head declaring that you did a PhD. You will <em>earn</em> the respect of your peers and bosses by delivering value to your team, not by possessing a degree. (Also see answer to job security question below.)</p>
<p>It is natural to feel special after a PhD. Academia implicitly drills it into you, because a PhD is academia&rsquo;s entry ticket. You <em>must</em> be among the chosen ones if you have one. This privilege does not transfer to industry.</p>
<p>About the only concrete benefit of starting out with a PhD is that you will likely have a slightly higher starting salary, compared to those with a Masters.</p>
<p>There do exist venues in industry where research by itself is a specially delineated activity, and researchers are treated differently than regular engineers. They are the well known industry CS &ldquo;labs&rdquo;. A few years ago, the big four were: Microsoft Labs, IBM Labs, Sun Labs and HP Labs. They were shining examples of how research could be embedded in a industrial setting, advancing the state of the art while also having a positive impact on the company&rsquo;s bottomline. But, they were clearly delineated from the rest of the company, and essentially served as an in-house CS department. One of the core activities of such labs was “technology transfer”, so that the cool things they came up with could be disseminated to the rest of the company. Today, the only two still going strong are IBM and Microsoft Labs, while the others have diminished.</p>
<p>What happened in the meanwhile was that <a href="http://static.googleusercontent.com/external_content/untrusted_dlcp/research.google.com/en/us/pubs/archive/38149.pdf">Google started operating with a hybrid model of industrial research</a>, where research was not a cleanly separated division or activity, with blended seamlessly into the regular operation of the company. There are people with the title of “researcher” and those with the title of “software engineer”, and a continuous gradation in between, with researchers expected to focus on more ambiguous and blue sky problems, and engineers expected to focus on more immediate implementation and design issues. This is a marked departure from the “labs” model. What it is essentially saying is that every problem that the company tackles is in some sense research worthy.</p>
<p>It was also around this time (early 2000&rsquo;s) that the expectations of what PhDs should work on began to change. If you graduated with a PhD, the highest status job you could get was a tenure track university professorship. Indeed, most PhD programs implicitly gear graduates for that end. If you could not attain that, the next best thing to strive for was a researcher position in one of the aforementioned industrial labs. And, if you could not even land that, you would go looking for regular industry jobs with the unwashed masses.</p>
<p>The problem with this picture is that there are <a href="http://blog.vivekhaldar.com/post/25136762019/advice-to-prospective-grad-students">10 PhD graduates for every tenure-track position</a>. And, while I don&rsquo;t have  figures, the industrial labs don&rsquo;t hire at a much faster rate either. And that left regular industry jobs as the only viable option for the vast majority of PhDs. My guess is that the recruitment engines of most major tech companies also wised up to this fact, and started actively pitching to not just bachelors and Masters graduates, but PhDs as well. The new crop of web companies, with Google at the forefront, also started projecting the image that the work being done there was new and cool and challenging and important enough to keep PhDs engaged. Also, the pay was pretty good. When you saw that year after year a significant fraction of the outgoing PhD graduates from your CS department were happily ensconced in regular industrial jobs, option number 3 began rapidly catching up with the other options.</p>
<blockquote>
  <ul><li>What is the day to day life like?</li>
  </ul></blockquote>
<p>At the broadest level, you will spend about half of your time designing systems and features, and getting those designs discussed and reviewed, and the other half actually implementing those. (Also see the next answer.) As you become more senior, leadership/coordination activities also start becoming a significant part of the job.</p>
<p><em>You must be a great coder.</em> That is a minimum prerequisite. During one interview, I asked a candidate (a recent PhD graduate) to give me some pseudo-code for the solution he had just described, and he went “oh well, if you must make me code…” That pretty much made me go “no hire.” What did you think the job involved?</p>
<blockquote>
  <ul><li>Do people usually work alone, or with others?</li>
  </ul></blockquote>
<p>Again, the answer to this question does not depend on what degree you have. The simple truth is <em>there is no job in the modern tech industry that involves working alone.</em></p>
<p>You will probably evenly split your time between collaborative activities such as design discussions and code review (both for your code, as well as others&rsquo; code), and  solitary activities such as heads-down coding. The fraction of solitary time goes down as you become more senior.</p>
<blockquote>
  <ul><li>How much mentoring is there?  Who can you ask for help if you need it?</li>
  </ul></blockquote>
<p>Almost never an issue. Most places will actually pair you up with a mentor <em>who is not your boss</em>. This means you should feel comfortable discussing things with them that you wouldn&rsquo;t with your boss. Also, everyone around you will also help you out, mentor or not.</p>
<p>Remember the crucial thing about asking for help in a way that will make people want to help you–show that you have put in some work and are stuck at some point. Don&rsquo;t just go around asking questions because you are too lazy to dig.</p>
<blockquote>
  <ul><li>Are good jobs available in all locations?  Are you usually required to move after grad school if you want to get a good job?</li>
  </ul></blockquote>
<p>You are much more likely to land an interesting job at the coasts. West more than East.</p>
<blockquote>
  <ul><li>How many jobs are available and how many publications do you need to get them?  How cutthroat is the competition for good jobs?</li>
  </ul></blockquote>
<p>Most industrial positions will not care about your publications, unless you have none or very few, in which case the question will naturally arise of why you produced so little over your PhD.</p>
<p>Competition is high. You have to be prepared. You have to be specifically prepared for a tech/coding interview. Use your favorite search engine to get inundated with tips for how to prepare. <a href="http://steve-yegge.blogspot.com/2008/03/get-that-job-at-google.html">This is a great starting point</a>.</p>
<blockquote>
  <ul><li>Are you only qualified to work in the exact subfield you studied in grad school?</li>
  </ul></blockquote>
<p>This is another big area of adjustment. Employees will usually try to match you to a position that relates to your research. But do not expect to spend your entire career are in the same field that you got your PhD in. (Why would you even want to do that? It would get boring pretty quickly.)  Getting a PhD <a href="http://blog.vivekhaldar.com/post/25136762019/advice-to-prospective-grad-students">should have equipped you to tackle problems outside your area.</a></p>
<blockquote>
  <ul><li>How is job security?</li>
  </ul></blockquote>
<p><em>There is no such thing as job security, no matter what degree you have.</em> The only way to be somewhat secure is to have demonstrable competence. Note  that I said not just competence, but <em>demonstrable</em> competence. If you are doing great things, but nobody knows about them, it doesn&rsquo;t count.</p>
<p>All those skills you developed during your research career to promote your work and your papers, to get your point across, to put it in context, to explain why it is important–both in terms of written and spoken communication–will be crucial in developing your career. If you feel like you are not developing these skills during the course of your PhD, then you should really focus on them.</p>
<p>In some places, another way to get security is to be really good at internal political games. You do not want to be at a place like that. If you live by politics, you die by politics.</p>
<blockquote>
  <ul><li>Do you work 9 to 5, or do you take your work home with you?</li>
  </ul></blockquote>
<p>This, again, is completely independent of what degree you have. How you structure your priorities and your work to get it done within sane hours, and while maintaining some sort of “work/life balance” (I hate that term, but that is a whole other story) is entirely up to you.</p>
<blockquote>
  <ul><li>Are you expected to publish papers?</li>
  </ul></blockquote>
<p>If your title is “researcher”, then yes.</p>
<blockquote>
  <ul><li>How hungry are people for career advancement?</li>
  </ul></blockquote>
<p>How hungry are you? It is an entirely personal choice.</p>
<blockquote>
  <ul><li>If a PhD goes into industry, does he usually do the same type of job that you could get with a Master&rsquo;s?  If not, how do they differ, and why are they better/worse?</li>
  </ul></blockquote>
<p>Yes, you will usually do the same type of work.</p>
<p>At this point, you might be wondering “so are there any advantages to a PhD at all?” Yes, there are. <a href="http://blog.vivekhaldar.com/post/25136762019/advice-to-prospective-grad-students">You have to use the skills that you developed while doing a PhD</a> to advance your career. &ldquo;What might such skills be?&rdquo;, you ask. The two most important are the ability to work with ambiguous and ill-specified problems, and communication skills. This is where PhDs should edge out others.</p>
<p>But, I&rsquo;ve seen plenty of PhDs without these two crucial skills, and plenty of non-PhDs with. If all the problems, as well as the sketches of the solutions, that you worked on during your PhD were handed to you by your advisor, and you did not wrestle with any demons on your own, you will probably fall short here.</p>
<blockquote>
  <ul><li>Do most people stay in industry, or do they use their jobs as a jumping-off point to get back into academia?</li>
  </ul></blockquote>
<p>Except in extremely rare circumstances, I&rsquo;ve not seen people going back to academia from industry. There has, however, been a <a href="http://matt-welsh.blogspot.com/2010/11/why-im-leaving-harvard.html">recent</a> <a href="http://cs.unm.edu/~terran/academic_blog/?p=113">spate</a> of people moving from academia to industry, even giving up tenure in the process!</p>
<blockquote>
  <ul><li>Do you ever regret getting a PhD?</li>
  </ul></blockquote>
<p>No. <a href="http://blog.vivekhaldar.com/post/25136762019/advice-to-prospective-grad-students">Here&rsquo;s why</a>.</p>
<blockquote>
  <ul><li>Do most people have time to get married?</li>
  </ul></blockquote>
<p>(See answer to 9-5 question above.)</p>
<blockquote>
  <ul><li>How are these impacted by the prestige of your graduate school?</li>
  </ul></blockquote>
<p>Does not matter. The only thing that matters is how you perform on the interview.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>The lure of work</title>
      <link>http://vivekhaldar.com/articles/the-lure-of-work/</link>
      <pubDate>Fri, 10 Aug 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-lure-of-work/</guid>
      <description>&lt;p&gt;It is common to see and hear of people compromising their health and relationships for work. It has become a staple of the modern world.&lt;/p&gt;
&lt;p&gt;To me, the crucial question is: &lt;em&gt;what is the lure of work&lt;/em&gt;, specifically for engineers? I find it hard to believe that somebody pushed themselves to this level of personal sacrifice because their manager pushed them, or because they were coerced in some way. There has to be a deeper reason: they did it because they wanted to. Haven&amp;rsquo;t we all sometimes treated work as a refuge from home, rather than the other way round. Question is: why, in spite of the obvious costs? What is the lure of work?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>It is common to see and hear of people compromising their health and relationships for work. It has become a staple of the modern world.</p>
<p>To me, the crucial question is: <em>what is the lure of work</em>, specifically for engineers? I find it hard to believe that somebody pushed themselves to this level of personal sacrifice because their manager pushed them, or because they were coerced in some way. There has to be a deeper reason: they did it because they wanted to. Haven&rsquo;t we all sometimes treated work as a refuge from home, rather than the other way round. Question is: why, in spite of the obvious costs? What is the lure of work?</p>
<p>I remember when I got my first computer, a PC AT, back in high school. I couldn&rsquo;t get my hands off it for the next thirty six hours, at which point my body refused to co-operate. Afterwards, I spent hours every day on it, tinkering, learning, exploring&hellip; having fun, losing myself.</p>
<p>This is pretty much the story of every computer geek, right?</p>
<p>You grow up, you build deeper relationships, you get responsibilities, you have the entire world inundating you. It&rsquo;s all very enriching and exciting. Yet, you find yourself always coming back to this inanimate object that is almost a shelter. Tinkering, exploring, learning&hellip; having fun, losing yourself.</p>
<p>The world of humans is messy, unpredictable, and&ndash;this is the part that infuriates you the most, the part you simply don&rsquo;t get, the part that will forever make you an outsider&ndash;<em>unreasonable</em>. Humans are unreasonable. Your whole life, you&rsquo;ve trusted one thing to save you. And saved you it has, again and again, without fail. That one thing is reason. Computers are a tool of reason, to be handled by people who obey the code of reason. People who are involved with computers, they&rsquo;re reasonable, just like you. You all share a deep, unspoken bond. You&rsquo;re all worshipers in the church of reason.</p>
<p>Welcome home.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Review: The Computer Boys Take Over</title>
      <link>http://vivekhaldar.com/articles/review-the-computer-boys-take-over/</link>
      <pubDate>Mon, 06 Aug 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/review-the-computer-boys-take-over/</guid>
      <description>&lt;p&gt;I just finished &lt;a href=&#34;http://www.amazon.com/Computer-Boys-History-Computing-ebook/dp/B006UHII4C/&#34;&gt;&amp;ldquo;The Computer Boys Take Over&amp;rdquo;, by Nathan Ensmenger&lt;/a&gt;. I thoroughly enjoyed the book, and learned a lot from it. I would strongly recommend it. (&lt;a href=&#34;http://thecomputerboys.com/&#34;&gt;Book blog&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../media/449104958.png&#34; alt=&#34;&#34;/&gt;&lt;/p&gt;
&lt;p&gt;The author delves into the history of programming as a profession, and also the question of whether it is a profession at all.&lt;/p&gt;
&lt;p&gt;To me, one of the most fascinating bits was about how programming started out as a low status, mechanical and clerical job. The designers and creators of hardware were at the top of the hierarchy, followed by those who “designed” high-level solutions to problems, and then at the very bottom where the “coders” who would, literally, take these high-level plans and encode them into machine language. Only time and experience revealed that this was far from the lowly, clerical job that it was initially thought to be.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I just finished <a href="http://www.amazon.com/Computer-Boys-History-Computing-ebook/dp/B006UHII4C/">&ldquo;The Computer Boys Take Over&rdquo;, by Nathan Ensmenger</a>. I thoroughly enjoyed the book, and learned a lot from it. I would strongly recommend it. (<a href="http://thecomputerboys.com/">Book blog</a>)</p>
<p><img src="../../media/449104958.png" alt=""/></p>
<p>The author delves into the history of programming as a profession, and also the question of whether it is a profession at all.</p>
<p>To me, one of the most fascinating bits was about how programming started out as a low status, mechanical and clerical job. The designers and creators of hardware were at the top of the hierarchy, followed by those who “designed” high-level solutions to problems, and then at the very bottom where the “coders” who would, literally, take these high-level plans and encode them into machine language. Only time and experience revealed that this was far from the lowly, clerical job that it was initially thought to be.</p>
<p>Another interesting thread was the continuous presence of <a href="http://blog.vivekhaldar.com/post/13241026081/the-programming-assembly-line">Taylorism as a strong motivation for software engineering</a>. From the very birth of the term at the 1968 NATO conference, the goal of software engineering was to make the construction of software just like the construction of physical goods, with a “software factory” being the ultimate goal. The strong intuitive and artisanal tendencies of the programming community were always at odds with this.</p>
<p>My only criticism is that it reads exactly like what it is&ndash;an academic dissertation turned into a book, and as such it can be a bit dry. This minor problem should not detract from an otherwise engaging journey.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Productivity porn</title>
      <link>http://vivekhaldar.com/articles/productivity-porn/</link>
      <pubDate>Tue, 31 Jul 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/productivity-porn/</guid>
      <description>&lt;p&gt;&lt;em&gt;It&amp;rsquo;s like a finger pointing at the moon. Do not concentrate on the finger or you will miss all of the heavenly glory!&lt;/em&gt;
&lt;em&gt;&amp;ndash; Bruce Lee.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The internet is full of productivity tips and techniques, more accurately known as productivity porn. It&amp;rsquo;s like McDonalds trying to sell you healthy food. You know that is what you should eat, but when you actually get there you end up eating the nutrition-free fast food.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>It&rsquo;s like a finger pointing at the moon. Do not concentrate on the finger or you will miss all of the heavenly glory!</em>
<em>&ndash; Bruce Lee.</em></p>
<p>The internet is full of productivity tips and techniques, more accurately known as productivity porn. It&rsquo;s like McDonalds trying to sell you healthy food. You know that is what you should eat, but when you actually get there you end up eating the nutrition-free fast food.</p>
<p>And I plead guilty. I&rsquo;ve tried them all. Every now and then I stare into the chaotic abyss of the stuff I need to keep on top of, and decide what will save me is a new system. Of course, it doesn&rsquo;t.</p>
<p>I&rsquo;ve learned a few things the hard way that are not often mentioned.</p>
<p><em>If you really deeply care about something, you will do it.</em> You will do it without needing a list or a system or a reminder. No, your brain will not feel cluttered by the burden of having to remember it. If it happens to be a complex task with many steps, you&rsquo;ll make a list, without thinking &ldquo;oh look I&rsquo;m doing GTD.&rdquo;</p>
<p><img src="../../media/449104958.png" alt=""/></p>
<p>So what do you need a system for? You need it for <em>chores</em>. The stuff you don&rsquo;t want to do, but you need to. The stuff which is easy put off but will hurt in due time. Stuff like paying bills and calling customer service.</p>
<p><img src="../../media/449104958.png" alt=""/></p>
<p><em>Do not confuse activity for progress.</em> Sometimes blind activity can be a palliative, a false reassurance that we are moving forward. It takes courage to stop and ask if what is being done is actually having any impact&ndash;on our lives and our work and our happiness. We know the answer will often make us wince.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>What mobile development taught me</title>
      <link>http://vivekhaldar.com/articles/what-mobile-development-taught-me/</link>
      <pubDate>Fri, 27 Jul 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/what-mobile-development-taught-me/</guid>
      <description>&lt;p&gt;After recently doing some Android app programming, I&amp;rsquo;ve learned a few things about mobile development. These are probably obvious to folks who already have been doing this a while, but I was late to the party.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../media/449104958.png&#34; alt=&#34;&#34;/&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Gotta have custom controls&lt;/strong&gt;: If you use the standard UI controls, your app will look bland and boring and barely any different from the demo apps that come with the SDK. To get your app even a little bit past the threshold of noticeability, you really need to build your own custom control with its own unique look and feel. Every popular app does this. I can&amp;rsquo;t think of a &lt;em&gt;single&lt;/em&gt; decent app that doesn&amp;rsquo;t.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Design is everything&lt;/strong&gt;: you have a tiny canvas (maybe not so tiny if you&amp;rsquo;re developing for a tablet, but still), but unlike the desktop, you have &lt;em&gt;all&lt;/em&gt; of it. Also, unlike the desktop, there are very few rules to adhere to. Great design and user experience completely dominates the impact of the app.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Your app has richer inputs&lt;/strong&gt;: my desktop-bred keyboard-clacking geek brain immediately dismissed mobile devices as inferior because they didn&amp;rsquo;t have a keyboard. I can be stupid like that. The fact is, modern phones and tablets have &lt;em&gt;richer&lt;/em&gt; inputs than desktops. Location. Gyro. Touch. Laptops and desktops are &lt;em&gt;archaic&lt;/em&gt; and crippled by comparison.&lt;/li&gt;
&lt;/ul&gt;</description>
      <content:encoded><![CDATA[<p>After recently doing some Android app programming, I&rsquo;ve learned a few things about mobile development. These are probably obvious to folks who already have been doing this a while, but I was late to the party.</p>
<p><img src="../../media/449104958.png" alt=""/></p>
<ul><li><strong>Gotta have custom controls</strong>: If you use the standard UI controls, your app will look bland and boring and barely any different from the demo apps that come with the SDK. To get your app even a little bit past the threshold of noticeability, you really need to build your own custom control with its own unique look and feel. Every popular app does this. I can&rsquo;t think of a <em>single</em> decent app that doesn&rsquo;t.</li>
<li><strong>Design is everything</strong>: you have a tiny canvas (maybe not so tiny if you&rsquo;re developing for a tablet, but still), but unlike the desktop, you have <em>all</em> of it. Also, unlike the desktop, there are very few rules to adhere to. Great design and user experience completely dominates the impact of the app.</li>
<li><strong>Your app has richer inputs</strong>: my desktop-bred keyboard-clacking geek brain immediately dismissed mobile devices as inferior because they didn&rsquo;t have a keyboard. I can be stupid like that. The fact is, modern phones and tablets have <em>richer</em> inputs than desktops. Location. Gyro. Touch. Laptops and desktops are <em>archaic</em> and crippled by comparison.</li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Is C/C&#43;&#43; worth it?</title>
      <link>http://vivekhaldar.com/articles/is-cc-worth-it/</link>
      <pubDate>Tue, 24 Jul 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/is-cc-worth-it/</guid>
      <description>&lt;p&gt;(&lt;a href=&#34;http://lemire.me/blog/archives/2012/07/23/is-cc-worth-it/&#34;&gt;Daniel Lemire asked the original question&lt;/a&gt;. Rather than leave a long comment, I decided to break this out into a post.)&lt;/p&gt;
&lt;p&gt;When you ask if language or technology is worth it, the first thing you have to do is define what “worth” means to you. For the purposes of this post, I take that to be money, i.e. economic worth. In general, &lt;a href=&#34;http://blog.vivekhaldar.com/post/15628047570/the-cs-assignment-i-wish-i-had&#34;&gt;CS education does very little to teach us how economic factors play into technical decisions&lt;/a&gt;. The &lt;a href=&#34;http://blog.vivekhaldar.com/post/19571998004/themes-the-economics-of-programming&#34;&gt;economics of programming has been a strong theme of this blog&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>(<a href="http://lemire.me/blog/archives/2012/07/23/is-cc-worth-it/">Daniel Lemire asked the original question</a>. Rather than leave a long comment, I decided to break this out into a post.)</p>
<p>When you ask if language or technology is worth it, the first thing you have to do is define what “worth” means to you. For the purposes of this post, I take that to be money, i.e. economic worth. In general, <a href="http://blog.vivekhaldar.com/post/15628047570/the-cs-assignment-i-wish-i-had">CS education does very little to teach us how economic factors play into technical decisions</a>. The <a href="http://blog.vivekhaldar.com/post/19571998004/themes-the-economics-of-programming">economics of programming has been a strong theme of this blog</a>.</p>
<p>Let us start by asking the economic variables and commodities that should be considered when trying to answer this question. At the highest level, the economic variables that matter the most are:</p>
<ul><li><strong>Material</strong>: this is the cost of hardware, real estate, electricity, bandwidth, and everything else that you explicitly need to buy in order to run your service or product. This is the easiest variable to account for, because you write checks and get stuff, and all the quantities and numbers involved are clear.</li>
<li><strong>People</strong>: this is the cost of hiring and maintaining the people necessary to build and maintain your service or product. This variable is  more fuzzy than material, because there are many costs associated with hiring a person besides just their compensation, and these costs become known only in the aggregate. For example, a general rule of thumb is that the total cost to a company hiring a person is approximately double their salary.</li>
<li><strong>Time</strong>: the cost of time has two components–the monetary value of time spent by the people you have hired, and the monetary value of losing out in the market due to arriving too late or building the wrong product, i.e. opportunity cost. Due to the 2nd component, this is by far the most fuzzy and hard to account for variable.</li>
</ul><p>The total cost of building and maintaining a product of service is the sum of these 3 costs. I&rsquo;m going to assume that the intent of the original question was to decrease cost, while ignoring revenue and profit from the product.</p>
<p>I am by no means suggesting that these 3 are the only economic variables that should be considered, just that they form a crude model sufficient for the argument at hand. One could go on to list dozens of other variables, but most of them would fall into one of these 3 categories.</p>
<p>Now that we have set the stage, we can reframe the original question to “suppose we built a product using C or C++, and we know its cost to be X, if, in an alternate universe we built the exact same product using language L, would the cost be less than X?”</p>
<p>Note that this alternate universe does not have to be a parallel one, it could just be the universe starting at time=now, i.e. building the product over again with the new language.</p>
<p>An alternate way of framing the question would be: given the space of cost defined by these variables, in which regions of that space is language/technology X more economical than others?</p>
<p>Let me make this concrete by considering two common scenarios:</p>
<p><strong>You are a startup</strong>: in this case, <em>the cost of time dominates</em> the other 2 variables. You are in a race to build something fast, release it, discover whether it works, and iterate. If you can use a technology or language that chews through material that lets you build and modify your product very quickly, you should choose that. This is a familiar story–and the reason why supple and expressive languages like Ruby and Python are so popular among startups.</p>
<p><strong>You are a warehouse scale computing company</strong>: you run multiple large data centers, with gazillions of machines. You have a few products and services that are used by billions of users. At this scale, <em>the cost of material starts becoming a significant component of your overall cost</em>, and may even dominate the other two variables.</p>
<p>The difference between these two scenarios boils down to this: <strong>are you spending hardware on people, or people on hardware?</strong></p>
<p>The major problem is that the crossover between the two is extremely fuzzy. It&rsquo;s like navigating a ship across the Pacific with your instruments only telling you when you have crossed either Tropic. Chances are, one fine day the person who actually writes the checks will notice that, for example, they are spending nearly as much on material as on people, and will instruct the next line of engineering managers to crank the dial towards optimization.</p>
<p>The astute reader will notice that I still haven&rsquo;t answered the question. The answer is… it depends.</p>
<p>The particular example that Lemire used is a  batch job, where we would like to maximize throughput–process as many integers possible. Another important class of applications does not care so much about throughput,  but about the latency of each individual request. VM randomness like GC pauses are a disadvantage for those.</p>
<p>VMs have their own memory overhead, which might not be significant when running on a few machines, but when multiplied by thousands of machines quickly becomes significant.</p>
<p>Is C/C++ worth it? Yes. For backend infrastructure that runs across entire datacenters, the truth is the economics simply do not work out with anything else. Of course, not everyone operates on that scale, and for them the answer will be different. How exactly C and C++ landed up in that position is an entirely different story. And the situation looks like it won&rsquo;t change anytime soon, because while there has been an <em>explosion</em> of higher level languages in the last couple of decades, nothing has come close to dislodging C/C++ from the perch of systems/infrastructure supremacy.</p>
<p>One more thing: implicit in Lemire&rsquo;s post is that the &ldquo;low-levelness&rdquo; of C/C++ is a substantial burden, and it would be a worthwhile tradeoff to use a higher-level level, more expressive language. In my anecdotal experience, the low-level nature of C/C++ has not been an issue with the right programmers. I&rsquo;ve seen programmers around me who are productive in spades with C++, notwithstanding all the blogosphere&rsquo;s chatter about how much it sucks to work with C++. I think the reason is that the <em>bottleneck in system construction is often elsewhere</em>. Again, that&rsquo;s a whole other story.</p>
<p>So the answer is, yes, C/C++ worth it when it is.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>On Vagueness</title>
      <link>http://vivekhaldar.com/articles/on-vagueness/</link>
      <pubDate>Tue, 17 Jul 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/on-vagueness/</guid>
      <description>&lt;p&gt;Here is something I struggle with: &lt;strong&gt;given a vague goal, how do you move towards reaching it, towards shaping something concrete out of it?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is important, because all projects start with a big blob of vagueness. Folks who create the most concreteness out of that are the ones who have the biggest impact. I&amp;rsquo;m learning how to approach this, but I still feel like a non-swimmer in the shallow end with lifesavers. I&amp;rsquo;ve learned a little, by personal experience, and by observation.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Here is something I struggle with: <strong>given a vague goal, how do you move towards reaching it, towards shaping something concrete out of it?</strong></p>
<p>This is important, because all projects start with a big blob of vagueness. Folks who create the most concreteness out of that are the ones who have the biggest impact. I&rsquo;m learning how to approach this, but I still feel like a non-swimmer in the shallow end with lifesavers. I&rsquo;ve learned a little, by personal experience, and by observation.</p>
<p>The design space is huge and completely unconstrained at this point. There are too many <a href="http://en.wikipedia.org/wiki/Known_unknown">unknown unknowns</a>. How does one proceed?</p>
<!-- more -->
<p>First of all, <em>formulate principles that will guide the solution</em>. This is not design yet. These are high-level ideas that put constraints on the design space. For example, GMail chose the principle that search should be the primary email navigation mechanism. Think long and hard about these, because these principles will be baked into your code and your system in a way that can&rsquo;t be &ldquo;refactored&rdquo; away later. This is where wizards (i.e. very senior battle-hardened engineers) can help. Often, choosing these is a matter of taste and design and conceptual integrity. It might sound wishy-washy but it&rsquo;s hard. Document these well. This is your manifesto.</p>
<p>Once you&rsquo;ve got a spine, you&rsquo;ve got to add a few more bones.</p>
<p>The next step is to find one concrete idea, and build on it. This usually takes the form of a prototype, or a walking skeleton. It might have huge swaths of functionality missing. It might have serious shortcomings. It might be ugly. It might be slow. But that&rsquo;s OK. Think of this as the spec of sand around which a pearl is formed. What is important is that it be concrete, and growable.</p>
<p>It needs to be concrete and tangible. Something you can show and demo and people can play with and talk about and criticize get excited about. People rarely get excited about design documents. They frequently get excited about <em>working prototypes</em>, even when they come with massive this-will-break-on-you disclaimers.</p>
<p>The other crucial thing is that it should be <em>growable</em>. Your prototype should not be a dead end. You should be able to put work into it and make it incrementally better. Adding something new or changing it should not require you to build a new one from scratch. In other words, it should support iteration. There may come a point when you have to throw one (or more away), but ideally that happens only when the prototype has brought you to a major insight that invalidates some of your basic assumptions. Even then, it would have served its purpose. And even then, you need something that will get you to that point quickly.</p>
<p>Which brings me to my most important point: <em>iteration</em>. <a href="http://msdn.microsoft.com/en-us/library/aa479371.aspx#sessionsfinal100_topic9">Speed of iteration almost always beats quality of iteration</a>. In other words, focus on learning and fixing, continuously and quickly. Don&rsquo;t sweat too much about getting it right. Chances are, your idea of right won&rsquo;t be the right one. Chances are that most other peoples&rsquo; idea of right won&rsquo;t be either. Only by having something real to criticize and learn from will everyone figure out what right is.</p>
<p>Build, fail, fix&ndash;and repeat.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Teaching data structures with real-world examples</title>
      <link>http://vivekhaldar.com/articles/teaching-data-structures-with-realworld-examples/</link>
      <pubDate>Sun, 15 Jul 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/teaching-data-structures-with-realworld-examples/</guid>
      <description>&lt;p&gt;I loved the data structures courses. They were just so &lt;em&gt;cute&lt;/em&gt;. We would all write our own snowflake implementations of AVL trees and have fun inserting and deleting integers from them.&lt;/p&gt;
&lt;p&gt;What was missing was an appreciation of how, and &lt;em&gt;why&lt;/em&gt;, particular data structures are used in the real world, embedded in real systems.&lt;/p&gt;
&lt;p&gt;So I&amp;rsquo;ve been wondering, while teaching a DS course, what would be a good way to show the students non-toy examples of how they&amp;rsquo;re used?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I loved the data structures courses. They were just so <em>cute</em>. We would all write our own snowflake implementations of AVL trees and have fun inserting and deleting integers from them.</p>
<p>What was missing was an appreciation of how, and <em>why</em>, particular data structures are used in the real world, embedded in real systems.</p>
<p>So I&rsquo;ve been wondering, while teaching a DS course, what would be a good way to show the students non-toy examples of how they&rsquo;re used?</p>
<!-- more -->
<p>I think the Linux kernel is an excellent example.</p>
<p>Let&rsquo;s look at how the kernel puts some data structures through the paces.</p>
<p><strong>Red-black trees</strong></p>
<p><a href="http://lxr.linux.no/linux+v3.4.4/Documentation/rbtree.txt">From the kernel docs</a>:</p>
<blockquote>
  <p>There are a number of red-black trees in use in the kernel. The deadline and CFQ IO schedulers employ rbtrees to track requests; the packet CD/DVD driver does the same. The high-resolution timer code uses an rbtree to organize outstanding timer requests.  The ext3 filesystem tracks directory entries in a red-black tree.  Virtual memory areas (VMAs) are tracked with red-black trees, as are epoll file descriptors, cryptographic keys, and network packets in the &ldquo;hierarchical token bucket&rdquo; scheduler.</p>
</blockquote>
<p>The kernel implementation is different from most naive implementations, and that teaches you something about performance and cache locality:</p>
<blockquote>
  <p>The Linux rbtree implementation is optimized for speed, and thus has one less layer of indirection (and better cache locality) than more traditional tree implementations.  Instead of using pointers to separate rb_node and data structures, each instance of struct rb_node is embedded in the data structure it organizes.</p>
</blockquote>
<p><strong>Radix trees</strong></p>
<p>Again, the <a href="http://lwn.net/Articles/175432/">kernel imlementation</a> is different from the <a href="http://en.wikipedia.org/wiki/Radix_tree">standard one</a>:</p>
<blockquote>
  <p>A Linux radix tree is a mechanism by which a (pointer) value can be associated with a (long) integer key. It is reasonably efficient in terms of storage, and is quite quick on lookups. Additionally, radix trees in the Linux kernel have some features driven by kernel-specific needs, including the ability to associate tags with specific entries.</p>
  <p>The most widespread use of radix trees, however, is in the memory management code. The address_space structure used to keep track of backing store contains a radix tree which tracks in-core pages tied to that mapping. Among other things, this tree allows the memory management code to quickly find pages which are dirty or under writeback.</p>
</blockquote>
<p><strong>Possible Assignments and Questions</strong></p>
<ul><li>The kernel doesn&rsquo;t have any &ldquo;fancy&rdquo; data structures. For example, there are no skip lists? Why do you think that is? (E.g. see <a href="https://lkml.org/lkml/2011/9/23/371">these</a> <a href="http://lkml.indiana.edu/hypermail/linux/kernel/0109.2/1067.html">attempts</a>)</li>
<li>Swap out a data structure with another one (AVL trees instead of red-black?) and see if can improve performance, or simplify the code.</li>
</ul><p>Such exercises place the data structure in the larger context of a whole application and real workloads, which is much more interesting than just implementing a standalone data structure and exercising it.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>How I read now</title>
      <link>http://vivekhaldar.com/articles/how-i-read-now/</link>
      <pubDate>Sat, 14 Jul 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/how-i-read-now/</guid>
      <description>&lt;p&gt;The Kindle (along with the Kindle app on my Android phone) has now become my default device for reading. If I &lt;em&gt;really&lt;/em&gt; want to read something, it&amp;rsquo;s &amp;ldquo;Send to Kindle.&amp;rdquo; No more webpage clutter. So much better.&lt;/p&gt;
&lt;p&gt;I use &lt;a href=&#34;http://www.readability.com/addons/&#34;&gt;Readability&amp;rsquo;s &amp;ldquo;Send to Kindle&amp;rdquo;&lt;/a&gt; bookmarklet.&lt;/p&gt;
&lt;p&gt;And for my RSS feeds, I use &lt;a href=&#34;http://calibre-ebook.com/&#34;&gt;Calibre&lt;/a&gt;, which can take a list of your subscriptions, download them, package them up nicely as an ebook, and send them to your Kindle.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The Kindle (along with the Kindle app on my Android phone) has now become my default device for reading. If I <em>really</em> want to read something, it&rsquo;s &ldquo;Send to Kindle.&rdquo; No more webpage clutter. So much better.</p>
<p>I use <a href="http://www.readability.com/addons/">Readability&rsquo;s &ldquo;Send to Kindle&rdquo;</a> bookmarklet.</p>
<p>And for my RSS feeds, I use <a href="http://calibre-ebook.com/">Calibre</a>, which can take a list of your subscriptions, download them, package them up nicely as an ebook, and send them to your Kindle.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Management models</title>
      <link>http://vivekhaldar.com/articles/management-models/</link>
      <pubDate>Mon, 09 Jul 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/management-models/</guid>
      <description>&lt;p&gt;Imagine that you are a manager. What would your ideal world look like? One where you can show off all your management chops. And since the world obviously is not ideal, how would you adjust your behavior accordingly?&lt;/p&gt;
&lt;p&gt;I think most managers would ideally prefer their world to be like a turn-based game. One where the other side makes a move, and then nothing else happens while you observe the state of the world, use all your faculties, then make your “move”. Repeat ad infinitum.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Imagine that you are a manager. What would your ideal world look like? One where you can show off all your management chops. And since the world obviously is not ideal, how would you adjust your behavior accordingly?</p>
<p>I think most managers would ideally prefer their world to be like a turn-based game. One where the other side makes a move, and then nothing else happens while you observe the state of the world, use all your faculties, then make your “move”. Repeat ad infinitum.</p>
<p>The worst managers follow this mental model, possibly not even realizing that it has no reflection in reality. Mediocre managers realize that reality is different from this model, but try to act as if they can play out a coarse approximation. And great managers (or at least, those that strive to be great) completely reject it.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>The Nostalgia Trap</title>
      <link>http://vivekhaldar.com/articles/the-nostalgia-trap/</link>
      <pubDate>Thu, 05 Jul 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-nostalgia-trap/</guid>
      <description>&lt;p&gt;I am part of the generation that spent most of their childhood in the analog world, and then gradually turned digital as they came into young adulthood. We are often referred to as “digital immigrants”, contrasting us with the “digital natives” born somewhere between a decade and two later. But a more appropriate term would be the “abyss generation”, because somewhere deep down we are stuck in limbo, in the abyss between fully analog and fully digital, of two worlds, yet fully belonging to neither.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I am part of the generation that spent most of their childhood in the analog world, and then gradually turned digital as they came into young adulthood. We are often referred to as “digital immigrants”, contrasting us with the “digital natives” born somewhere between a decade and two later. But a more appropriate term would be the “abyss generation”, because somewhere deep down we are stuck in limbo, in the abyss between fully analog and fully digital, of two worlds, yet fully belonging to neither.</p>
<!-- more -->
<p>Growing up, we used a lot of paper. A lot of color pencils and crayons. Our teachers put us through endless drills in cursive handwriting. A neat, legible, and beautiful hand was something to be strived for, something that was prized, and rewarded and shown off.</p>
<p>We had long afternoons to ourselves. We had a loyal band of neighborhood friends. We would have four hour long play sessions. Sometimes, we would listen to entire albums from beginning to end–while doing nothing else. Do you even remember the last time you just listened to music, without it being a soundtrack to some other activity you were doing?</p>
<p>Sometimes, we ache to go back to that time. That time seemed simpler and purer. So much so that we are willing to mutilate memories from our immediate past with sepia and Polaroid filters. <a href="http://www.youtube.com/watch?v=yWyLaXCV2_s">Nostalgia is painful, but it is also sweet and powerful</a>.</p>
<p>But here is the thing: nostalgia is a trap. It is not that those times were simpler and purer. <em>We</em> were simpler and purer.</p>
<p>Nostalgia is easy to fall into. And the older you get, the easier it gets. The universe of things you can look back on only increases with time. And it seems so much more pleasant  than looking forward, where you only see hopes and dreams and fears and probabilities. It takes conscious effort to not go down that slope, to instead look to the future, and actually create it. And it takes even more effort, and more courage, to <a href="http://www.rationaloptimist.com/">objectively compare the past to the present</a>, and face the fact that, yes, indeed, most things are better, and are more likely than not to continue getting better.</p>
<p>Over the last year, I have found myself writing by hand again. Sometimes, it is page after page of straight prose. Sometimes it is phrases and bullet points and underlines and bubbles. Sometimes it is just random senseless doodling. And the reason I have come back to that archaic activity is my <a href="http://www.livescribe.com/en-us/smartpen/echo/">LiveScribe pen</a>. I no longer have to worry about losing all that. Something that is naturally analog and free-form is seamlessly brought into the digital world.</p>
<p>We seem to be enveloped by the literature of despair and frustration. Complaints and pessimism always seem to be more profound and erudite when placed next to cheerful optimism. Reject that.</p>
<p>Look forward. Make the future.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Working asynchronously</title>
      <link>http://vivekhaldar.com/articles/working-asynchronously/</link>
      <pubDate>Sun, 01 Jul 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/working-asynchronously/</guid>
      <description>&lt;p&gt;There is a lot of debate about distributed and co-located teams, but I think that the crucial distinction is not one of geography but the style of working: whether it is synchronous or asynchronous.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../media/449104958.png&#34; alt=&#34;&#34;/&gt;&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;A &lt;strong&gt;synchronous&lt;/strong&gt; working style is one where some of all of the team has to regularly stop what they&amp;rsquo;re doing, meet and discuss and agree on the next steps together, and then get back to work implementing those steps. These synchronous “join points” are frequent, unavoidable, and built into the structure of the work.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>There is a lot of debate about distributed and co-located teams, but I think that the crucial distinction is not one of geography but the style of working: whether it is synchronous or asynchronous.</p>
<p><img src="../../media/449104958.png" alt=""/></p>
<!-- more -->
<p>A <strong>synchronous</strong> working style is one where some of all of the team has to regularly stop what they&rsquo;re doing, meet and discuss and agree on the next steps together, and then get back to work implementing those steps. These synchronous “join points” are frequent, unavoidable, and built into the structure of the work.</p>
<p>An <strong>asynchronous</strong> working style is one where the entire team rarely, if ever, gets together for big agreements and discussions, each individual team member more or less works on their own and at their own pace, with collaboration and agreement being handled by asynchronous mechanisms such as e-mail and shared online documents.</p>
<p>With these definitions, geographic location and working style are largely independent. It is possible, and even common, to have a team that sits together in an open cubicle arrangement and yet works mostly asynchronously. Conversely, it is also possible to have team members geographically strewn, and yet having to synchronize frequently.</p>
<p>Working asynchronously certainly enables the team to be geographically distributed, or telecommute, or maintain flexible hours.</p>
<p>The asynchronous style centers around <em>shared artifacts</em>, with each team member gradually accreting layers and complexity onto those artifacts. The most common example is commits to a source code repository. Other examples: code reviews (which just collapse down to e-mail), shared online documents with multiple editors and commenters. Team members usually have multiple related threads of work going on simultaneously, so that if one is blocked on input from someone else (for example, if you are waiting for someone to review a document, or comment on your code), another thread can be picked up to make forward progress.</p>
<p>Of course, most of us will recognize our team&rsquo;s style as a hybrid of synchronous and asynchronous. But the trend towards the asynchronous style is clear and strong.</p>
<p>Most software companies work asynchronously, even if team members sit next to each other. The common picture is one of an open cubicle farm, with everyone wearing large headphones. It is pretty common to use instant messaging with the person two desks down, rather than actually talking to them, especially if they have the big fat “do not disturb” sign that is the headphone.</p>
<p>One sign of things being asynchronous by default is that I find it archaic, even rude, when someone insists on calling me on the phone. It is an unnecessary imposition on my time, and breaks my flow. Why can&rsquo;t you just e-mail me?</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Recent updates to old posts</title>
      <link>http://vivekhaldar.com/articles/recent-updates-to-old-posts/</link>
      <pubDate>Wed, 27 Jun 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/recent-updates-to-old-posts/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://blog.vivekhaldar.com/post/12023299097/the-empirical-science-of-happiness&#34;&gt;The empirical science of happiness&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update, June 26, 2012:&lt;/strong&gt; I recently came across another interesting paper in this vein: If Money Doesn&amp;rsquo;t Make You Happy, Consider Time. It talks about how we should spend our &lt;em&gt;time&lt;/em&gt; to increase our happiness.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://blog.vivekhaldar.com/post/12023299097/the-empirical-science-of-happiness">The empirical science of happiness</a>:</p>
<p><strong>Update, June 26, 2012:</strong> I recently came across another interesting paper in this vein: If Money Doesn&rsquo;t Make You Happy, Consider Time. It talks about how we should spend our <em>time</em> to increase our happiness.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Social Engineering for Programming Languages</title>
      <link>http://vivekhaldar.com/articles/social-engineering-for-programming-languages/</link>
      <pubDate>Tue, 26 Jun 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/social-engineering-for-programming-languages/</guid>
      <description>&lt;p&gt;As technologies mature they start hitting barriers that are not technical. The roadblocks start becoming social and policy factors.&lt;/p&gt;
&lt;p&gt;And so it was a pleasant surprise to read &lt;a href=&#34;http://lmeyerov.blogspot.com/2012/04/socio-plt-principles-for-programming.html&#34;&gt;this paper&lt;/a&gt; that makes the case for studying and understanding the &lt;em&gt;social&lt;/em&gt; factors that affect the adoption of programming languages and programming features.&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;(Funny story: I found this paper at the printer in the office, glanced at the title and ran back to my desk to Google it.)&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>As technologies mature they start hitting barriers that are not technical. The roadblocks start becoming social and policy factors.</p>
<p>And so it was a pleasant surprise to read <a href="http://lmeyerov.blogspot.com/2012/04/socio-plt-principles-for-programming.html">this paper</a> that makes the case for studying and understanding the <em>social</em> factors that affect the adoption of programming languages and programming features.</p>
<!-- more -->
<p>(Funny story: I found this paper at the printer in the office, glanced at the title and ran back to my desk to Google it.)</p>
<p>Don&rsquo;t expect any grand answers. The paper raises many more questions than it answers. It&rsquo;s special because it makes the case that social factors <em>are</em> critical when considering adoption of languages and their features, and proposes a research agenda for investigating them. It is also a thorough survey of the scattered remarks and papers by language designers where they reflect on the adoption (or lack thereof) of their creations.</p>
<p>I would&rsquo;ve also loved to see some discussion of the <a href="http://blog.vivekhaldar.com/post/19571998004/themes-the-economics-of-programming"><em>economical</em></a> and <em>organizational</em> factors that affect PL adoption. For example, the criteria that <em>companies</em> use when choosing languages are very different than those used by individual programmers. Using Lisp (or your favorite why-the-hell-won&rsquo;t-they-let-me-use-that language) might make <em>you</em> super-productive (or so you think) but will it scale to making the entire team productive as well? Early hires probably have much more room to choose. The large majority of working programmers enter a situation where the language is already chosen and they have to work with it.</p>
<p>Another factor they miss is the <em>context around a language</em>. Languages are seldom chosen in isolation. Usually, much more thought goes into choosing a <a href="http://blog.vivekhaldar.com/post/14809797775/how-to-make-your-new-programming-language-successful"><em>platform</em></a>, and the language comes with it. Think about the Web and Javascript, Unix and C, and so on.</p>
<p>But overall, a great read and an agenda that was a long time coming.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>The Interested Minority</title>
      <link>http://vivekhaldar.com/articles/the-interested-minority/</link>
      <pubDate>Tue, 19 Jun 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-interested-minority/</guid>
      <description>&lt;p&gt;Apart from the scale and the economics, another reason that online teaching (like Udacity, OCW, Coursera etc) will take over is beginning to dawn on me.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The instructors are going to enjoy it more.&lt;/strong&gt;&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;Why? Don&amp;rsquo;t they prefer the live interaction of a classroom, the feel of chalk on board?&lt;/p&gt;
&lt;p&gt;No. If you think about it, classroom teaching, especially at the university level, has been steadily declining in quality. The professor comes in and rattles off a stock deck of slides off their laptop. The students all have their laptops open, web surfing.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Apart from the scale and the economics, another reason that online teaching (like Udacity, OCW, Coursera etc) will take over is beginning to dawn on me.</p>
<p><strong>The instructors are going to enjoy it more.</strong></p>
<!-- more -->
<p>Why? Don&rsquo;t they prefer the live interaction of a classroom, the feel of chalk on board?</p>
<p>No. If you think about it, classroom teaching, especially at the university level, has been steadily declining in quality. The professor comes in and rattles off a stock deck of slides off their laptop. The students all have their laptops open, web surfing.</p>
<p>It&rsquo;s unenjoyable for the students, because they&rsquo;re just sitting there, postponing the learning (or cramming) until finals week or the the day before the assignment is due. It&rsquo;s painful for the professor, because they have to look out into a sea of disinterested people. Once in a blue moon, a sharp, interested student will really engage with the teacher and the material and make it worthwhile.</p>
<p><em>The interested minority is drowned by the passive majority.</em></p>
<p>But look what happens when the material is online. The teacher <em>only</em> hears and engages with the interested students, and there are a <em>lot more</em> of them. That is so much more motivating. The forums, the email, the blogs, the tweets, the questions, the corrections&mdash;they&rsquo;re all from the interested minority. But it feels like they&rsquo;re the only ones there.</p>
<p>Suddenly, the interested minority is is in control.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Advice to (prospective) grad students</title>
      <link>http://vivekhaldar.com/articles/advice-to-prospective-grad-students/</link>
      <pubDate>Thu, 14 Jun 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/advice-to-prospective-grad-students/</guid>
      <description>&lt;p&gt;In my final year of college, when I was applying to graduate schools, I spent a lot of time reading “advice to graduate students” pages. Some of them helped shape my thinking about the decision of whether to do a PhD, and I feel indebted to them. (And by &amp;ldquo;grad students&amp;rdquo;, I really mean &amp;ldquo;PhD students.&amp;rdquo;) Now that I&amp;rsquo;ve been through that experience, here is my humble contribution to the genre.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>In my final year of college, when I was applying to graduate schools, I spent a lot of time reading “advice to graduate students” pages. Some of them helped shape my thinking about the decision of whether to do a PhD, and I feel indebted to them. (And by &ldquo;grad students&rdquo;, I really mean &ldquo;PhD students.&rdquo;) Now that I&rsquo;ve been through that experience, here is my humble contribution to the genre.</p>
<!-- more -->
<p>The category representative of the genre is Ronald Azuma&rsquo;s timeless classic “<a href="http://www.cs.unc.edu/~azuma/hitch4.html">So Long, and Thanks for the PhD.</a>” Much of what I wanted to say has already been said there, and although the piece is more than a decade old, it holds up remarkably well. What I want to do here is provide some personal perspective.</p>
<p>My credentials are that <a href="http://www.vivekhaldar.com/blog/?p=112">I&rsquo;ve actually done a PhD in computer science</a>, and since then spent as much time out in the real world as in grad school, so I&rsquo;ve seen both sides of the fence.</p>
<p><strong>Do you really want to get a PhD?</strong></p>
<p>Before climbing the ladder, make sure it&rsquo;s up against the right wall. Should you get a PhD?</p>
<p>The answer to that depends on two questions? Do you need one? Do you want one?</p>
<p>You <em>need</em> a PhD if you want to go into academia. If you find the process of getting a PhD unenjoyable, that is a strong sign that you are not cut out to be in academia. If a PhD makes you hunger for more, then you are.</p>
<p>The numbers are stacked against you though. <a href="http://cra.org/uploads/documents/resources/taulbee/CS_Degree_and_Enrollment_Trends_2009-10.pdf">PhD graduates in computer science outnumbered tenure-track professor positions in CS by a factor of 10.</a> The next best option for those who want to be in academia is to become a postdoc,<a href="http://www.cccblog.org/2012/05/07/surge-in-postdocs-continues-according-to-latest-survey-data/">which is why postdoc numbers surged</a>, but let&rsquo;s face it, that is a crappy second option.</p>
<p>And let&rsquo;s not even talk about the financial oppurtunity cost. It is nearly 100% certain that someone who started in industry on the day you joined grad school will overtake you in salary by the time you graduate and join the &ldquo;real world.&rdquo;</p>
<p>There used to be certain positions in industry, especially in R&amp;D, that absolutely needed people with PhDs. That has been steadily eroding over the years, and while a PhD is certainly a plus, its necessity has been watered down significantly. Even if you do not formally have a PhD but can make an impact and prove yourself in an industrial research setting, you can perform the exact same job as someone with a PhD.</p>
<p>Why am I being so discouraging here? Because I have seen my share of people get into grad school for the wrong reasons and go on to waste their time at best or get stuck in an unhappy path for life at worst. If you realize this is not for you, cut out after your Masters.</p>
<p>What it boils down to is that this is one of the most intense questions of <em>self-knowledge</em> you will ever face. The answer is simple: you should do a PhD if you really want to. Look into yourself to figure out if you really want to. Everything I said above was to list out things that <em>should not</em> factor into your decision.</p>
<p>This is what I like to call a <em>clamped</em> decision. If you are not fully convinced that the answer is &ldquo;yes&rdquo;, then the answer is &ldquo;no.&rdquo;</p>
<p>So why should you do one? I&rsquo;ll get back to that after considering the more practical question of choosing where to go.</p>
<p><strong>Choosing where to go</strong></p>
<p>Assuming you are brilliant enough to have scored multiple admission offers, choosing where to go is a big decision.</p>
<p>What should your criteria be? If you are like most fourth-year college students, you will only look at one thing–the rankings of the schools. This is a big mistake. (With one important exception. See below.) The choice is much more nuanced than that. There are actually three big factors at play here, and you have to decide which ones you value more, and what balance to strike among them. They are:</p>
<ul><li>Your <strong>happiness and quality of life</strong> during the 5 to 6 years you will be in graduate school</li>
<li>The <strong>quality of the learning and research</strong> at the school</li>
<li>Your <strong>future prospects</strong> after graduation</li>
</ul><p>Your prospects after graduation have have nothing to do with your school if you are going into industry. Industry (at least, the tech/software industry) <em>does not care about your alma mater. They care about whether you can program.</em> They do not care about your credentials. <a href="http://blog.vivekhaldar.com/post/21209976179/the-components-of-a-university">They care about whether you do well at their interview.</a></p>
<p>There is an important exception. If you want to go into academia after your PhD, then school ranking matters, because whether they admit it or not, in practice a school will only hire new professors who have graduated from schools close to their own rank. This works the other way round too. Candidates will only want to join schools with ranks close to the one where they graduated from.</p>
<p>Which leaves us with the first two criteria.</p>
<p><strong>The one choice that affects both of these is who your PhD advisor is.</strong> That should make up 80% of how you choose where to go. Repeat after me: PhD advisor. PhD advisor.</p>
<p>Are they someone that will nurture you, and give you room to grow and explore, while not breathing down your neck, and having the wisdom to gently nudge you back on track when you will inevitably be lost in the dark jungle of the trough of your PhD? Are they someone with a track record of successfully funding their research, so that you and your project are not suddenly left high and dry without money in the middle of your PhD?</p>
<p>How is one to find out these things? You can look at their webpage, but take everything there with a grain of salt, just as you would someone&rsquo;s resume. A better way is to email their current grad students. You would be amazed at how helpful they might be. A large group of grad students is also a good sign of being funded.</p>
<p>I have seen first-hand what a stressed out and crappy life some of my fellow grad students had due to their advisors insisting that they put in a certain number of hours at the lab everyday, or not letting them graduate even though they had done more than enough work and published more than enough papers to justify getting a PhD already.</p>
<p>Graduate school is a long haul, and almost your entire happiness and quality of life depends on your PhD advisor. I cannot stress this enough. <em>This is the only choice you should be stressing out about.</em> All other variables are in the noise.</p>
<p>Coming to secondary factors, the next most important one is <strong>location</strong>. I wish someone had impressed this on me. I chose California, but that was luck, not wisdom.</p>
<p>You will have a much richer and more stimulating life if you are in a densely populated area as opposed to a small town with a ninety minute drive to the nearest big city. If you are in CS and want to go into industry, try to be on the coasts, preferably the West one. If you come from a place that does not have long snowy winters, beware of places that do. The &ldquo;oh look the snow is so beautiful!&rdquo; feeling goes away very quickly after a few months of shoveling snow.</p>
<p><strong>Why do a PhD?</strong></p>
<p>Let&rsquo;s come back to the question of why you would want to do a PhD.</p>
<p>Like I said above, this is a question of <em>self knowledge</em>.  The circular answer is that you should do it if you are the type of person who would enjoy it.</p>
<p>Let&rsquo;s take another excursion and ask: <em>what is the value of a PhD?</em> Which begs the question: value to <em>whom</em>?</p>
<p>The value to employers is that it indicates deep specialty in a narrow field. Or so one might think. Does that mean that when you dissertation topic is no longer fashionable and becomes obsolete you have no value? No. So it must be more than that.</p>
<p>Another value to employers is the <em>indirect signal</em> a PhD sends. It means you took an a substantial intellectual task and stuck with it for a long time to achieve some sort of closure. That is valuable. But even more valuable than that is the fact that you faced an ambiguous ill-specified problem and charted it through an uncertain path. That is the central value of a PhD: to be able to <em>comfortably work with ambiguity and uncertainty.</em> Note that this implies the serial-learner &ldquo;learning how to learn&rdquo;  capability usually ascribed to PhDs.</p>
<p>I&rsquo;m certainly not claiming that doing a PhD is the <em>only</em> way to get the capability of comfortably working with ambiguity and uncertainty. There are certainly other activities and experiences in life that can equip you for that. But a PhD is <em>structured</em> to do that.</p>
<p>But I&rsquo;ve only spoken of value to someone else. What about the value to <em>you</em>, as an individual? That would include all I&rsquo;ve said above, but what else?</p>
<p>Before I come to that, I want to take a slight detour to talk about boredom, solitude and entertainment.</p>
<p>William Deresiewicz on <a href="http://chronicle.com/article/The-End-of-Solitude/3708">solitude and boredom</a>:</p>
<blockquote>
  <p>Boredom is not a necessary consequence of having nothing to do, it is only the negative experience of that state. Television, by obviating the need to learn how to make use of one&rsquo;s lack of occupation, precludes one from ever discovering how to enjoy it. In fact, it renders that condition fearsome, its prospect intolerable. You are terrified of being bored — so you turn on the television.</p>
  <p>I speak from experience. I grew up in the 60s and 70s, the age of television. I was trained to be bored; boredom was cultivated within me like a precious crop. (It has been said that consumer society wants to condition us to feel bored, since boredom creates a market for stimulation.) It took me years to discover — and my nervous system will never fully adjust to this idea; I still have to fight against boredom, am permanently damaged in this respect — that having nothing to do doesn&rsquo;t have to be a bad thing. The alternative to boredom is what Whitman called idleness: a passive receptivity to the world.</p>
  <p>So it is with the current generation&rsquo;s experience of being alone. That is precisely the recognition implicit in the idea of solitude, which is to loneliness what idleness is to boredom. Loneliness is not the absence of company, it is grief over that absence. The lost sheep is lonely; the shepherd is not lonely. But the Internet is as powerful a machine for the production of loneliness as television is for the manufacture of boredom. If six hours of television a day creates the aptitude for boredom, the inability to sit still, a hundred text messages a day creates the aptitude for loneliness, the inability to be by yourself.</p>
</blockquote>
<p><a href="http://groups.csail.mit.edu/mac/users/hal/hal.html">Hal Abelson</a>, co-author of <a href="http://mitpress.mit.edu/sicp/full-text/book/book.html">SICP</a>, said of entertainment and education (and this is entirely from my memory of a talk by him I attended <em>six years</em> ago, and is paraphrased, so is almost certainly warped, which is why I&rsquo;m not even going to put it in quotes): We see all around us that the marginal cost of goods and services eventually approaches zero, but one thing we all want and pay for is entertainment. And that&rsquo;s the value of education. Ultimately, the more educated and creative you are, the easier it will be for you to <em>entertain yourself</em> and never be bored.</p>
<p>And that finally brings me full circle. The value of a PhD to <em>you</em> is that you will never be bored, and that you will be comfortable with solitude and cherish it. This is partly why I keep referring to <a href="http://blog.vivekhaldar.com/post/21209976179/the-components-of-a-university">universities</a> (especially grad school) as the closest things to <a href="http://blog.vivekhaldar.com/post/13776333966/the-monk-tax">modern-day secular monasteries</a>.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Operations should be in the computer science curriculum</title>
      <link>http://vivekhaldar.com/articles/operations-should-be-in-the-computer-science-curriculum/</link>
      <pubDate>Tue, 29 May 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/operations-should-be-in-the-computer-science-curriculum/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://ai.stanford.edu/users/sahami/CS2013/&#34;&gt;CS 2013&lt;/a&gt; is a proposal to update the computer science curriculum. Anyone interested in learning or teaching computer science should read the whole thing. I think it does an admirable job not just of providing coverage, but also outlining the principles for selecting topics, and impressing upon the reader the complexity and nuance of this task.&lt;/p&gt;
&lt;p&gt;That said, I want to point out one glaring omission. I realized its importance only after working in the real world for a few years, and being schooled in how inadequately prepared my CS education had left me in this arena.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://ai.stanford.edu/users/sahami/CS2013/">CS 2013</a> is a proposal to update the computer science curriculum. Anyone interested in learning or teaching computer science should read the whole thing. I think it does an admirable job not just of providing coverage, but also outlining the principles for selecting topics, and impressing upon the reader the complexity and nuance of this task.</p>
<p>That said, I want to point out one glaring omission. I realized its importance only after working in the real world for a few years, and being schooled in how inadequately prepared my CS education had left me in this arena.</p>
<!-- more -->
<p>That topic is <strong>operations</strong>. It encompasses all the activities required to keep a computing service deployed, performant and available. Chances are, if you work in the industry today, even if your title is something like “programmer” or “software engineer”, operations will be some component of your job. The fraction of time you spend on operations might fluctuate between 0% and 100%, but it will certainly exist.</p>
<p>In broad strokes, operations includes the following:</p>
<ul><li><strong>Production design</strong>: okay, your shiny new system is code complete. How exactly will it be deployed? How many machines? What kinds of machines? What resources does it need? What are the failure modes of your system? What happens if x% of your machines go down? What happens if all your machines go down? Under what failure circumstances can the service continue to limp along, as opposed to being completely unavailable? The answers to all these questions makes up the production design of your system.</li>
<li><strong>Deployment</strong>: how would you automate the process of pushing new code? Of taking the entire system up and down? Taking subcomponents of the system up and down? How will you do a rolling restart of all your machines?</li>
<li><strong>Monitoring</strong>: how will you get visibility into the performance and health of your system? This includes inserting hooks to measure key characteristics (qps, latency etc.) as well as collecting and visualizing them automatically, in a way that will make sense to a bleary-eyed person who has been woken up by a page at 3 AM.</li>
<li><strong>Alerting</strong>: okay, you&rsquo;ve done a great job of monitoring the health and performance of key system metrics. Now how will you notify yourself when something goes wrong? This includes figuring out the exact thresholds of the metrics after which the system is deemed unhealthy. This really needs to be foolproof. You don&rsquo;t want your system to be down, and not even get paged about it.</li>
</ul><p>In short, being responsible for the uptime of your own code gives you a whole new perspective when you write it. You start thinking about what could happen in there that might page you at 3 AM. You also realize how writing code is but one step in the never-ending cycle of deploying, tweaking, and writing again.</p>
<p>Where might this fit into a computer science curriculum? One option would be to make it an additional component of existing programming exercises, by having students deploy their programs on test systems and simulating failures, and then seeing how well their monitoring and alerting holds up. An interesting twist might be to have students be responsible for the upkeep of not their own but other students&rsquo; programs.</p>
<p>Also see: <a href="http://blog.vivekhaldar.com/post/15628047570/the-cs-assignment-i-wish-i-had">the CS assignment I wish I&rsquo;d had</a>.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Executable Thought</title>
      <link>http://vivekhaldar.com/articles/executable-thought/</link>
      <pubDate>Sun, 20 May 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/executable-thought/</guid>
      <description>&lt;p&gt;Imagine that you were a teacher in ancient Greece. Your expository traditions were firmly rooted in the practice of oral argument and knowledge transfer. And then along came this newfangled thing called “writing”. It pulled thoughts from your brain and committed them to something more permanent, and even more terrifyingly, allowed others who understood these symbols to receive those thoughts without your presence. To top it all off, it encouraged your brain to become feeble, now that it did not have to hold the entirety of human knowledge. You were resistant to this new medium. Your current ways of creating and conveying thoughts were doing just fine.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Imagine that you were a teacher in ancient Greece. Your expository traditions were firmly rooted in the practice of oral argument and knowledge transfer. And then along came this newfangled thing called “writing”. It pulled thoughts from your brain and committed them to something more permanent, and even more terrifyingly, allowed others who understood these symbols to receive those thoughts without your presence. To top it all off, it encouraged your brain to become feeble, now that it did not have to hold the entirety of human knowledge. You were resistant to this new medium. Your current ways of creating and conveying thoughts were doing just fine.</p>
<p>If, in the above paragraph, you substitute “writing” for “oral argument”, and “coding” for “writing”, it will sum up the current debate on whether you should learn how to code.</p>
<!-- more -->
<p>But the whole debate on learning to code is missing the larger point of the thought  processes and mentality it takes to code. Like Dijkstra said, computer science is as much about computers as astronomy is about telescopes.</p>
<p>After all, why should the mayor learn how to code? Is he now going to start writing apps?</p>
<p>The current debate also entirely misses the question of gradation. Take mathematics for example. It is pretty important for the population at large to understand arithmetic, and possibly also some algebra. That&rsquo;s why everyone learns those topics in school. But is it equally important for the entire populace to be well-versed in the intricacies of group theory and vector spaces? Probably not.</p>
<p>Instead of talking about coding, we should be talking about computational literacy. Being fluent in a programming language is just one aspect of that, and a pretty advanced one. There are other topics and ways of thinking that need to come first in the curriculum of computational literacy. And perhaps, some of those ideas and ways of thinking that come before coding in this ladder are sufficient for the general population.</p>
<p>Note that computational literacy has absolutely nothing to do with being able to fluently use computers. Just like being a good driver doesn&rsquo;t mean you have a good grasp of mechanical engineering.</p>
<p>Jeanette Wing refers to this as <em>computational thinking</em>, and makes the case for it being a useful interdisciplinary mode of thought<sup id="fnref:compthink"><a href="#fn:compthink" class="footnote-ref" role="doc-noteref">1</a></sup>.</p>
<p>To build the case for broadly teaching computational thinking, we need to look at the major transitions in modes of human thought through the history of civilization.</p>
<p>The earliest known mode was perhaps what we now know of as the Greek school, when knowledge was held in brains and created and transferred through an intricate and time-consuming culture rooted in oral debate and discussion. This was <em>spoken thought</em>.</p>
<p>The next big transition was to <em>written thought</em>. This was the first major leap in the scalability of thoughts. Their total number was not limited to the capacity of human brains. They could be transferred without the presence of the original thinker.</p>
<p>The next leap along the same lines was printing–which made thoughts orders of magnitude easier to reproduce and spread. This is what truly cemented the supremacy of written thought.</p>
<p>And now we&rsquo;re seeing the beginnings of the next major mode of thought–<em>executable thought</em>.</p>
<p><strong>Executable thought</strong> arises when written things can be automatically consumed and manipulated. This breathes life into what previously was just an inert string of symbols. The most obvious example of this is a computer compiling and executing something written in a traditional programming language. This is also the thing that most often hooks people into becoming programmers–the idea of converting pure thought into action.</p>
<p>But it does not have to stop there. The form of the idea does not have to be “code” in the traditional sense. Take, for example, something as innocuous as a hyperlink. If you were to think about it with the old written thought frame of mind, it would be just a citation. But if you were to think about it computationally, and with a rudimentary understanding of page rank, that one link would become the trigger for a sequence of  computational actions that have implications for the authority, trustworthiness and findability of both sides.</p>
<p>Another example: biologists have been better able to understand a number of processes when wearing their computational, rather than the life sciences, hats<sup id="fnref:bioalgo"><a href="#fn:bioalgo" class="footnote-ref" role="doc-noteref">2</a></sup>.</p>
<p>This idea of thought being executable already permeates most of the commercial and physical infrastructure of the world around us, and very soon, someone who cannot think this way will feel like an alien in it. To put it another way, computational thought will become a necessary prerequisite to function in a computational  world.</p>
<div class="footnotes" role="doc-endnotes">
<hr><ol><li id="fn:compthink" role="doc-endnote">
<p>Jeannette M. Wing, <a href="http://www.cs.cmu.edu/~wing/publications/Wing06.pdf">Computational Thinking</a>; Communications Of The ACM March 2006/Vol. 49, No. 3. <a href="#fnref:compthink" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:bioalgo" role="doc-endnote">
<p>Saket Navlakha and Ziv Bar-Joseph, <a href="http://www.algorithmsinnature.org/">Algorithms in nature: the convergence of systems biology and computational thinking</a>; Molecular Systems Biology 7: 546￼￼￼￼￼￼￼￼￼￼ <a href="#fnref:bioalgo" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol></div>
]]></content:encoded>
    </item>
    
    <item>
      <title>The need for Easter eggs</title>
      <link>http://vivekhaldar.com/articles/the-need-for-easter-eggs/</link>
      <pubDate>Thu, 17 May 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-need-for-easter-eggs/</guid>
      <description>&lt;p&gt;I have often wondered what drives programmers to insert Easter eggs into their creations. If you really dig deep, the need to insert Easter eggs offers an incisive look into the psychology of programmers.&lt;/p&gt;
&lt;p&gt;At its core, an Easter egg is a programmer&amp;rsquo;s way to show off his artistry in an overt and obvious way.&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;The artifact that the programmer creates–a word processor, a spreadsheet, a search engine–is meant to be utilitarian. The code he crafts towards that end might possess a beauty seen only by his eyes, but to the rest of the world it is only a means towards an end, and that end is to serve a specific, well-defined function. The world judges his beautifully crafted code purely by its utility. To them, he is an anonymous constructor.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I have often wondered what drives programmers to insert Easter eggs into their creations. If you really dig deep, the need to insert Easter eggs offers an incisive look into the psychology of programmers.</p>
<p>At its core, an Easter egg is a programmer&rsquo;s way to show off his artistry in an overt and obvious way.</p>
<!-- more -->
<p>The artifact that the programmer creates–a word processor, a spreadsheet, a search engine–is meant to be utilitarian. The code he crafts towards that end might possess a beauty seen only by his eyes, but to the rest of the world it is only a means towards an end, and that end is to serve a specific, well-defined function. The world judges his beautifully crafted code purely by its utility. To them, he is an anonymous constructor.</p>
<p>This is where the Easter egg comes in.</p>
<p>It breaks through the calculus of utility and presents something purely frivolous. It serves no purpose, other than to declare “I make cool things! I made this!”</p>
<p>It is a secret, revealed only to a select few. Out of the hordes of users a program might have, it calls out to the select few who have the curiosity and inclination to peel back the covers. “You want to see something cool? Here it is!”, it says to them.</p>
<p>But the fundamental urge an Easter egg satisfies is to declare to the world–there is art over here! You might not see it everyday, but if you pull this lever just so you will be treated to something awesome, and it will change the way you see this functional piece of software. You will get a glimpse into the artistry and the humanity of those who made it. This is their signature.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>The 7 stages of debugging</title>
      <link>http://vivekhaldar.com/articles/the-7-stages-of-debugging/</link>
      <pubDate>Wed, 16 May 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-7-stages-of-debugging/</guid>
      <description>&lt;p&gt;(with my deepest apologies to the &lt;a href=&#34;http://www.recover-from-grief.com/7-stages-of-grief.html&#34;&gt;7 stages of grief&lt;/a&gt;.)&lt;/p&gt;
&lt;!-- more --&gt;
&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Shock &amp;amp; Denial&lt;/strong&gt;:
But&amp;hellip; but&amp;hellip; how can this happen? I have unit-tests! And they even pass!! Besides, look at the code, it&amp;rsquo;s obvously correct. Really, this shouldn&amp;rsquo;t be happening. Can you even reproduce this?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pain &amp;amp; Guilt&lt;/strong&gt;:
OMG. The other guy just gave me a reliable reproduction. My code sucks! I&amp;rsquo;m a worthless moron! How many other bugs are lurking in the code I shipped? I should just quit programming and go into sales.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>(with my deepest apologies to the <a href="http://www.recover-from-grief.com/7-stages-of-grief.html">7 stages of grief</a>.)</p>
<!-- more -->
<ol><li><p><strong>Shock &amp; Denial</strong>:
But&hellip; but&hellip; how can this happen? I have unit-tests! And they even pass!! Besides, look at the code, it&rsquo;s obvously correct. Really, this shouldn&rsquo;t be happening. Can you even reproduce this?</p></li>
<li><p><strong>Pain &amp; Guilt</strong>:
OMG. The other guy just gave me a reliable reproduction. My code sucks! I&rsquo;m a worthless moron! How many other bugs are lurking in the code I shipped? I should just quit programming and go into sales.</p></li>
<li><p><strong>Anger &amp; Bargaining</strong>:
To the bug reporters: are you sure you&rsquo;re calling my code with the right parameters? Maybe there&rsquo;s a bug in your code. I think my module works as per spec. Maybe you should change the way you call it. Frickin&rsquo; morons!</p></li>
<li><p><strong>&ldquo;Depression&rdquo;, Reflection, Loneliness</strong>-
Life sucks. I feel like puking everytime I see a chirpy colleague checking in code by the shovel-full. I don&rsquo;t even feel like going into the office anymore.</p></li>
<li><p><strong>The Upward Turn</strong>:
Ohhhh&hellip; I see what might be wrong. Hack, hack. Oh! I see where the bug is!</p></li>
<li><p><strong>Reconstruction &amp; Working Through</strong>:
Hack, hack. It&rsquo;s fixed! It&rsquo;s fixed! I&rsquo;m a rockstar coder again! I&rsquo;m getting back to shipping regular code again.</p></li>
<li><p><strong>Acceptance &amp; Hope</strong>:
I know code will always have bugs, no matter what. Do your best. Test, test, test. And never feel invincible.</p></li>
</ol>
]]></content:encoded>
    </item>
    
    <item>
      <title>My setup</title>
      <link>http://vivekhaldar.com/articles/my-setup/</link>
      <pubDate>Sun, 13 May 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/my-setup/</guid>
      <description>&lt;p&gt;I want to describe my computing set up, both hardware and software. But I want to take a slightly different tack than most set up posts out there. Rather than go through the list of all the items I use, and gush about why they are the coolest in the world (there might still be some gushing), I want to go into why exactly I chose those items, and what trade-offs were involved. Hopefully, this approach will make this post useful even to those who disagree with my specific choices.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I want to describe my computing set up, both hardware and software. But I want to take a slightly different tack than most set up posts out there. Rather than go through the list of all the items I use, and gush about why they are the coolest in the world (there might still be some gushing), I want to go into why exactly I chose those items, and what trade-offs were involved. Hopefully, this approach will make this post useful even to those who disagree with my specific choices.</p>
<!-- more -->
<p><strong>Goals</strong></p>
<p>Before I even get into the details, I must describe the overall goals that I want and need my computing set up to achieve.</p>
<p><em>Simplicity</em></p>
<p>As time goes on, time becomes precious. I spent years in college and grad school maintaining my own Linux boxes and servers, tweaking their every detail, compiling my own custom kernel, installing all the latest packages, and happily staying up all night to do so. Believe me, it gets old. I guess it was a good learning experience, but that is certainly not something I want to include in my regular set up. I want it to be as hands-off as possible. If there are services that meet my needs and handle things for me, I want to use them. I want to minimize the number of moving parts, both in hardware and software. I want things to work out-of-the-box. I want to spend the minimum amount of time possible tweaking and maintaining my setup.</p>
<p><em>Functionality</em></p>
<p>As functionality goes, my needs are quite pedestrian. Of course, I need my set up to be programmer-friendly, seeing as that is my day job. I don&rsquo;t do anything that might be considered heavy duty, like editing large videos. I do deal with the constant stream of images and videos that my setup ingests from digital cameras and phones, but that is a mainstream requirement. By and large, the vast majority of my digital activity centers around consuming, creating and massaging text, be it structured in the form of programs, or unstructured in the form of prose.</p>
<p><em>Preservation</em></p>
<p>After you go through a few machines, you realize that they are nothing but shells, and in the grander scheme of things, completely inconsequential. What does matter above everything else is your data. In your digital life, you don&rsquo;t just do things, you make them, and save them. Everything else is moot if all this data cannot be safely and verifiably be backed up for the long term. Think about what your life expectancy is. Now think about something recent from your digital trail that really matters to you. It might be vacation pictures, a journal entry, a blog post, anything. Would you like to have that digital item available for your perusal when you are 80 years old? Now try to remember the oldest digital artifact that you can still retrieve, and more importantly, decode and view. Can you? How old is it? That should give you some idea of how hard and full of unknowns the problem of long-term preservation is.</p>
<p><strong>Your body</strong></p>
<p>I&rsquo;ve talked about taking measures to <a href="http://blog.vivekhaldar.com/post/8339897599/do-you-have-an-rsi-prevention-plan">proactively avoid RSI</a> previously on this blog. Long story short, if a significant fraction of your working life is spent working with computers, and you do not yet have even the mildest RSI, you should consider yourself extremely lucky, but not immune. Act like you do have RSI, and change your set up right now to avoid it. It will happen sooner or later, and you might as well tackle it before it actually happens, so that you have a good chance of completely avoiding it.</p>
<p>After years of experimentation, I have found that the following works for me:</p>
<ul><li><em>Absolutely no mice.</em> As early as college, my right wrist was completely ruined by excessive mouse use. I moved to using the mouse only with my left hand, and also doing as much as possible with the keyboard, but I could feel the pain creeping into my left hand as well. I tried trackballs, vertical mice, ergonomic mice, everything you can think of. Eventually, I was saved by the <a href="http://www.apple.com/magictrackpad/">magic trackpad</a>.</li>
<li><em>Use a split keyboard.</em> Using a split keyboard, the kind that has an inverted V shaped space down the middle, lets me type without bending my wrists at an unnatural angle. I use the <a href="http://www.amazon.com/GOLDTOUCH-Adjustable-Keyboard-White-Ergonomic/dp/B0002OSNQC/">GoldTouch keyboard</a>.</li>
<li><em>Use dictation software.</em> Of course, this does not work for programming and fine text surgery, but for tasks where I just need to transfer a large number of words from my brain into a computer, this works wonderfully and keeps my hands completely out of the loop. It still feels strange sometimes, because my entire life up to now the circuit that moves words from my head to the screen has been silent, and it takes some adjusting to speaking them out loud. But maybe that is just a  ghost in my head. I use DragonDictate, the Mac version, and have been a happy user for almost 2 years.</li>
</ul><p><a href="http://blog.vivekhaldar.com/post/8171137332/an-ergonomic-keyboard-and-mouse-configuration">This is what my keyboard/trackpad setup looks like</a>:</p>
<p><img src="../../media/449104958.png" alt="Split keyboard and magic trackpad"/></p>
<p><strong>Hardware</strong></p>
<p>The piece of hardware that I physically interact with the vast majority of the time is the 13 inch MacBook air, the model from mid 2011. It has 4 GB of RAM, and a snappy 128 GB flash drive. Once you taste the sweet speed of a flash drive,  you will never go back, and the smaller capacity compared to spinning rust drives will feel like an inconsequential sacrifice. It is by far the sweetest, most lickable piece of hardware I have ever had.</p>
<p>Before my current Mac phase, I had used Windows for several years. I honestly don&rsquo;t see what the fuss is about–I&rsquo;ve moved back and forth between the 2 worlds relatively easily. Maybe that&rsquo;s because all the software that I regularly use runs equally well on both sides. The major advantage of the Mac side of things is that they tend not to suffer from the bit rot that makes a Windows machine completely unusable after about 2 years.</p>
<p>I&rsquo;m 90% ready to make the jump to pure netbooks, with nothing but a browser and a net connection. About the only thing holding me back at this point is good dictation software.</p>
<p>For serious, heads down work, the MacBook is connected to a large 30 inch monitor, and an external keyboard and trackpad. I use the Apple Magic trackpad, and the Goldtouch split keyboard.</p>
<p>Most of the real work on the job happens on a humongous, powerful machine, that sits under my desk, fed only by a power cable and ethernet.  This, of course, runs Linux. I just ssh and X11 into it from the laptop wherever I am and go about my work.</p>
<p>So those are the 2 major pieces of hardware I regularly use–the large machine that stays put, and the feathery laptop that goes around with me. It&rsquo;s pretty simple. The laptop is the pretty front-end, and the desktop serves as the heavy backend.</p>
<p>I like this setup because I get the UI sweetness of MacOS X, while being able to use the dev setup on the Linux box.</p>
<p>Other miscellaneous pieces:</p>
<ul><li>the <a href="http://www.amazon.com/Logitech-Headset-Portable-Notebooks-981-000261/dp/B003NREDHS">Logitech H555 headset</a> for dictation, and  video conferencing, and occasionally listening to music.</li>
<li><a href="http://www.amazon.com/Bose%C2%AE-QuietComfort%C2%AE-Acoustic-Cancelling%C2%AE-Headphones/dp/B0054JJ0QW/">Bose QC15 noise canceling headphones</a> for the times when I really need to block out the outside world. They definitely go on flights with me. They are kind of expensive for headphones, but they really do make a huge difference. In a regular office environment, it&rsquo;s as if–whooosh–the whole world just fell away. And on planes, the loud drone becomes a whimpering hiss. This is the one gadget that still amazes me every time I use it.</li>
<li>An external USB drive, for backups. I use the <a href="http://www.amazon.com/Western-Digital-Passport-Essential-Portable/dp/B0041OSQ9I/">Western Digital Passport 1 TB</a>.</li>
</ul><p><strong>Software</strong></p>
<p><em>Editors</em></p>
<p>This is where the religious wars usually start. And rightfully so. If, like me, your digital life mostly revolves around text, then you need to have a religious fervor for your text editor. When I meet a geek who does not feel strongly about their choice of text editor (or worse, uses notepad or gedit), all my “fake geek” alarms go off. As far as software goes, this is the centerpiece of the entire set up.</p>
<p>You know what&rsquo;s coming–Emacs and vi–those are the only serious contenders. I have some measure of objectivity here, because I have used both for a number of years, and feel comfortable with either. In the end, <a href="http://blog.vivekhaldar.com/post/3996068979/the-levels-of-emacs-proficiency">I fell towards the Emacs camp</a>. What finally tipped me over was the customizability. People keep talking about the look and the key bindings and how many keystrokes it takes to do something. But all that is not important. What is important is whether you can make this editor your own. In the final analysis, Emacs is not really a text editor, but a <em>platform</em> on which to build your workflows. It just happens to be really good at text.</p>
<p>But–<em>I&rsquo;m not advocating a particular editor here</em>. It really doesn&rsquo;t matter which one you end up with. What does matter though is that you are a power user of it. It should feel like second nature to you. You should have no trouble making it do your bidding. It should make you feel powerful and light and frictionless. When people look over your shoulder at you going about your work with it, it should look like an incomprehensible buzz to them.</p>
<p>Also, don&rsquo;t be a text editor mono maniac. I love Emacs, sure, but I confess to dropping down to other tools when they are better suited to the task. For example, for dictation I usually use TextEdit, because MacSpeech Dictate can&rsquo;t really work with Emacs&rsquo; text control.  When I&rsquo;m writing Markdown, I often use <a href="http://bywordapp.com/">Byword</a>. Also, for tracking my tasks, I use <a href="http://www.omnigroup.com/products/omnifocus/">Omnifocus</a>. I know, that can be subsumed by Org-mode in Emacs. Org-mode can subsume everything. Doesn&rsquo;t mean it should.</p>
<p><em>Web browsing</em></p>
<p>Actually, I  lied about the text editor being the centerpiece of my setup. I ran a time tracking utility, and found that even on days and weeks when I&rsquo;m mostly heads down programming, the application I spend the most time in is my browser. So it&rsquo;s pretty important to get this one right, and to tweak it exactly the way you want it.</p>
<p>I have settled on using <a href="https://www.google.com/chrome">Chrome</a>. The one indispensable plug-in I use is <a href="http://thegleebox.com/">Gleebox</a>, because it gives me keyboard control over common actions such as selecting and clicking links, and switching tabs.</p>
<p><em>Terminal/Shell</em></p>
<p>I use bash. I don&rsquo;t use a terminal application. I just run all my <a href="http://blog.vivekhaldar.com/post/3996068979/the-levels-of-emacs-proficiency">shells in Emacs</a>. That way, they are simply text buffers, like everything else. Once you do this, you will never understand why people use terminal programs where the only editable line is for the command you are entering.</p>
<p><em>Digital photographs</em></p>
<p>I like to meticulously name the directories in which I save digital photographs. Usually, I also give each individual picture a short, descriptive filename.</p>
<p>For browsing them, as well as making small edits, I use <a href="http://picasa.google.com/">Picasa</a>. It is overall a great application. But what really attracts me to it is that, unlike most other photo managing apps, Picasa works with your directory hierarchy, and never messes with it. It is a read only application, unless you explicitly modify something yourself.</p>
<p>This is a useful litmus test for almost every application I use. It should work with my directory layout, and provide a view over that. It should absolutely never create its own directory layout with jumbled names that are opaque to me, and have me depend on that one specific app to view my data.</p>
<p><em>Backups and preservation</em></p>
<p>I keep all my digital artifacts in a version controlled repository. There is a “master copy” that I commit new items to, and check out from. This holds everything, including binary blobs such as digital photographs. The repository is the Golden copy. It is backed up many different ways. Rsync helps a lot with that.</p>
<p>This means that what is on my laptop is just a cache, a checked out (small) subset of the entire repository.</p>
<p>I know what you&rsquo;re thinking–what version control system do I use for this? I use CVS. There, I said it. Back when I started my repository in 1999, CVS was cool and the state of the art. And now, I have so much precious data in my repository that I&rsquo;d rather not migrate it to something else. CVS also has the nice property that it&rsquo;s repository (the &ldquo;,v&rdquo; files) are human readable.</p>
<p><strong>Common flows</strong></p>
<p><em>Reading</em></p>
<p>Most of my reading comes through my RSS subscriptions, and then there are the occasional longform pieces I stumble across. But here is my twist: <a href="http://blog.vivekhaldar.com/post/930235677/listening-to-your-reading">I listen to almost all of my reading</a>. I <a href="https://github.com/vivekhaldar/fetch_rss">dump it out to text</a>, and then use Mac OS X&rsquo;s speech synthesizer to “speak” them out into sound files, which I then listen to on my iPod. Why? It started because I wanted something interesting to listen to during my commute. But then I realized what a better experience listening to something is when compared to reading it on the screen. It&rsquo;s easier on the eyes, of course, but also free of all the distractions that a screen brings. It also leaves you free to do other tasks, like driving, that don&rsquo;t divert from the cognition required to comprehend the piece.</p>
<p><strong>Wish list</strong></p>
<p>The number one thing on my wish list is a high-resolution large (13 inches or more) display. I want something that comes close to the retina resolution levels of the iPad. This point was driven home to me when a full resolution screenshot of the new iPad did not fit on my 30 inch monitor.</p>
<p>Next wish: more storage. You can never have enough storage. Right now, I&rsquo;m compelled to only carry a small fraction of my repository on my laptop. It would be great to have the whole thing, preferably at flash-like speeds. But I would even settle for a hybrid approach where the OS and apps live on a fast flash disk, and my deep archives are on slower spinning rust disks.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Big science funding</title>
      <link>http://vivekhaldar.com/articles/big-science-funding/</link>
      <pubDate>Mon, 07 May 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/big-science-funding/</guid>
      <description>&lt;p&gt;In &lt;a href=&#34;http://www.nybooks.com/articles/archives/2012/may/10/crisis-big-science/?pagination=false&#34;&gt;The Crisis of Big Science&lt;/a&gt;, Steven Weinberg describes how basic science is getting bigger and bigger, and now requires vast amounts of funding, often from public entities such as Congress that understand neither the technology nor the value of it.&lt;/p&gt;
&lt;p&gt;It looks like the bottleneck for advancing science is now not so much the presence of brilliant brains, but the presence of an advocate with charm and clout and connections, who can coax funding out of reluctant public bodies, and then charm them over many years while the project continues.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>In <a href="http://www.nybooks.com/articles/archives/2012/may/10/crisis-big-science/?pagination=false">The Crisis of Big Science</a>, Steven Weinberg describes how basic science is getting bigger and bigger, and now requires vast amounts of funding, often from public entities such as Congress that understand neither the technology nor the value of it.</p>
<p>It looks like the bottleneck for advancing science is now not so much the presence of brilliant brains, but the presence of an advocate with charm and clout and connections, who can coax funding out of reluctant public bodies, and then charm them over many years while the project continues.</p>
<!-- more -->
<p>But even when such a person is at the helm, funding is always a struggle. Weinberg is pessimistic about public funding of big science in general:</p>
<blockquote>
  <p>What really motivates elementary particle physicists is a sense of how the world is ordered—it is, they believe, a world governed by simple universal principles that we are capable of discovering. But not everyone feels the importance of this. During the debate over the SSC, I was on the Larry King radio show with a congressman who opposed it. He said that he wasn’t against spending on science, but that we had to set priorities. I explained that the SSC was going to help us learn the laws of nature, and I asked if that didn’t deserve a high priority. I remember every word of his answer. It was “No.”</p>
  <p>What does motivate legislators is the immediate economic interests of their constituents. Big laboratories bring jobs and money into their neighborhood, so they attract the active support of legislators from that state, and apathy or hostility from many other members of Congress. Before the Texas site was chosen, a senator told me that at that time there were a hundred senators in favor of the SSC, but that once the site was chosen the number would drop to two. He wasn’t far wrong. We saw several members of Congress change their stand on the SSC after their states were eliminated as possible sites.</p>
</blockquote>
<p>I was hoping he would also delve into some alternative models for funding big science. He proposes raising taxes, but that itself is another political battle. Perhaps the X Foundation and its quest to move space exploration forward with private funds is one model.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Bug finding and static analysis in the real world</title>
      <link>http://vivekhaldar.com/articles/bug-finding-and-static-analysis-in-the-real-world/</link>
      <pubDate>Wed, 02 May 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/bug-finding-and-static-analysis-in-the-real-world/</guid>
      <description>&lt;p&gt;If you want to get a good idea of how industry currently uses static analysis and bug-finding tools, you should read these 2 papers:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href=&#34;http://dl.acm.org/citation.cfm?id=1831738&#34;&gt;Nathaniel Ayewah and William Pugh. 2010. &lt;strong&gt;The Google FindBugs fixit.&lt;/strong&gt; In Proceedings of the 19th international symposium on Software testing and analysis (ISSTA &amp;lsquo;10).&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&#34;http://www.stanford.edu/~engler/BLOC-coverity.pdf&#34;&gt;Al Bessey, Ken Block, Ben Chelf, Andy Chou, Bryan Fulton, Seth Hallem, Charles Henri-Gros, Asya Kamsky, Scott McPeak, Dawson Engler.   &lt;strong&gt;A few billion lines of code later: using static analysis to find bugs in the real world.&lt;/strong&gt;  Communications of the ACM archive Volume 53 , Issue 2 (February 2010) Pages: 66-75.&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>If you want to get a good idea of how industry currently uses static analysis and bug-finding tools, you should read these 2 papers:</p>
<ul><li><a href="http://dl.acm.org/citation.cfm?id=1831738">Nathaniel Ayewah and William Pugh. 2010. <strong>The Google FindBugs fixit.</strong> In Proceedings of the 19th international symposium on Software testing and analysis (ISSTA &lsquo;10).</a></li>
<li><p><a href="http://www.stanford.edu/~engler/BLOC-coverity.pdf">Al Bessey, Ken Block, Ben Chelf, Andy Chou, Bryan Fulton, Seth Hallem, Charles Henri-Gros, Asya Kamsky, Scott McPeak, Dawson Engler.   <strong>A few billion lines of code later: using static analysis to find bugs in the real world.</strong>  Communications of the ACM archive Volume 53 , Issue 2 (February 2010) Pages: 66-75.</a></p>
<!-- more --></li>
</ul><p>What both these papers have in common is that they document the experience of computer science academics applying their tools to real, and large, code bases. The first one talks about <a href="http://www.cs.umd.edu/~pugh/">Bill Pugh&rsquo;s</a> sabbatical at Google, which he spent applying his <a href="http://findbugs.sourceforge.net/">FindBugs</a> tool to the massive mountain of Java code there. The second describes <a href="http://www.stanford.edu/~engler/">Dawson Engler&rsquo;s</a> experience <a href="http://coverity.com">commercializing</a> his group&rsquo;s research in extensible static analysis for bug-finding.</p>
<p>If you are curious about the details, you should just read the whole papers, but these are some of the things that stood out to me:</p>
<ul><li>FindBugs did find a large number of bugs, but only very few of them were serious or caused production problems. The authors attribute this to the numerous other “filters” that code has to go through at Google: code review, unit tests, integration tasks, canary deployments etc. The major value of regularly using such a tool would be to filter out some of these bugs earlier, as opposed to the usual selling pitch for static analysis tools, which is to avoid catastrophic bugs.</li>
<li>Both tools are unsound: they make their best effort to find genuine problems, but might also report false positives. This is a major departure from most academic research, which looks down on unsoundness.</li>
<li>In the case of Coverity, I found it very amusing to read how and why their tool had to be essentially dumbed down, because complex bug reports that were genuine but not understood by developers were simply dismissed as false positives. They also have a number of juicy quotes from clueless programmers.</li>
<li>There are two broad kinds of properties of code that tools can try to infer. <em>Liveness</em> properties say that the code is good: does what its supposed to, makes progress etc. <em>Safety</em> properties speak about the absence of bad things: no null pointer references, out-of-bound reads etc.  Both these tools, as well as every other one I know of, completely give up on liveness and focus on safety. This makes sense, because, in general, liveness properties are much harder to prove, and also require programmers to provide a rigorous description of what the code is supposed to do.</li>
<li>These tools are <em>context-insensitive</em>: they examine a piece of code locally, without taking into consideration all the paths that could lead there. <em>Context-sensitive</em> analysis is too hard and explodes combinatorially for large codebases.</li>
</ul><p><strong>The cost of a bug</strong></p>
<p>In this context, it is useful to ask: what is the cost of a bug? Sure, we would like to eliminate every bug if possible, but what are the tradeoffs?</p>
<p>Let&rsquo;s take a serious class of bugs: those that crash your application. Not quite as serious as something that destroys data, but something in the middle, and that happens frequently.</p>
<p>The question then becomes: what is the cost of a crash? This is where the economics become interesting.</p>
<p>For client applications, the cost of a crash is pretty high. A crash makes your users unhappy and complain and leave, and justifiably so, because the application they were using just crashed on them! On top of that, you do not control the environment in which your application runs, and have to bend over backwards to get crash information to help you debug.</p>
<p>Things are very different for server-side applications served over the web. They are typically request-oriented, served by lots of instances. If one of them crashes, and the application stack is smart enough with retries, there is no user impact at all. What&rsquo;s more, you control the environment the crash ocurred in, and have all the debugging and trace information you need. And you can push a fixed binary at your pleasure without anybody even noticing.</p>
<p>This means that the cost of a crash is much, much higher for client software than for server software.</p>
<p><strong>The future of bug-finding</strong></p>
<p>The major roadblock for no-holds-barred context-sensitive analysis of code is the exponential blowup in the space being analyzed. But this is only a hurdle if you are holding on to the <em>single-machine</em> model of building and analyzing code, i.e., that you have one machine (albeit a monster) that builds your code and tests it and analyzes it.</p>
<p>But what if you could throw a cluster of a few hundred machines at the problem, and have them running continuously? How much deeper and fine-grained could your analysis be?</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Church numerals in Python</title>
      <link>http://vivekhaldar.com/articles/church-numerals-in-python/</link>
      <pubDate>Sat, 21 Apr 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/church-numerals-in-python/</guid>
      <description>&lt;p&gt;Just coz I feel like canoodling around with abstract representations of the natural numbers on a Saturday morning.&lt;/p&gt;
&lt;p&gt;I love that lambda support in Python is great enough to be able to do this.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://en.wikipedia.org/wiki/Church_encoding&#34;&gt;Church numerals&lt;/a&gt; are an encoding of the natural numbers in pure lambda calculus. It&amp;rsquo;s fascinating to see how you can build up everything from this bare simplicity.&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;&lt;a href=&#34;https://gist.github.com/2438498&#34;&gt;The code is here&lt;/a&gt;, and reproduced below.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Just coz I feel like canoodling around with abstract representations of the natural numbers on a Saturday morning.</p>
<p>I love that lambda support in Python is great enough to be able to do this.</p>
<p><a href="http://en.wikipedia.org/wiki/Church_encoding">Church numerals</a> are an encoding of the natural numbers in pure lambda calculus. It&rsquo;s fascinating to see how you can build up everything from this bare simplicity.</p>
<!-- more -->
<p><a href="https://gist.github.com/2438498">The code is here</a>, and reproduced below.</p>
<pre><code>#! /usr/bin/python
#
# Church numerals in Python.
# See <a href="http://en.wikipedia.org/wiki/Church_encoding">http://en.wikipedia.org/wiki/Church_encoding</a>
#
# Vivek Haldar &lt;vh@vivekhaldar.com&gt;
#
# <a href="https://gist.github.com/2438498">https://gist.github.com/2438498</a>

zero = lambda f: lambda x: x

# Compute the successor of a Church numeral, n.
# Apply function one more time.
succ = (lambda n: lambda f: lambda x:
        f(n(f)(x)))

one = succ(zero)

# Add two Church numerals, n, m.
add = (lambda m: lambda n: lambda f: lambda x:
       n(f)(m(f)(x)))

# Multiply two Church numerals, n, m.
mult = (lambda m: lambda n:
        lambda f: lambda x: n(m(f))(x))

# Exponentiation: n^m
exp = lambda m: lambda n: n(m)

# Convert a Church numeral into a concrete integer.
# n = 0, f = (add 1 to a number)
plus1 = lambda x: x + 1
church2int = lambda n: n(plus1)(0)

# Convert a concrete integer into a church numeral.
def int2church(i):
    if i == 0:
        return zero
    else:
        return succ(int2church(i - 1))

# Eval and print a string
def peval(s):
    print s, ' = ', eval(s)

peval('church2int(zero)')
peval('church2int(succ(zero))')
peval('church2int(one)')
peval('church2int(succ(one))')
peval('church2int(succ(succ(one)))')
peval('church2int(succ(succ(succ(one))))')
peval('church2int(add(one)(succ(one)))')
peval('church2int(add(succ(one))(succ(one)))')
peval('church2int(mult(succ(one))(succ(one)))')
peval('church2int(exp(succ(one))(succ(one)))')
peval('church2int(int2church(0))')
peval('church2int(int2church(1))')
peval('church2int(int2church(111))')

c232 = int2church(232)
c421 = int2church(421)
peval('church2int(mult(c232)(c421))')
print '232 * 421 = ', 232 * 421


c2 = int2church(2)
c10 = int2church(10)
peval('church2int(exp(c2)(c10))')
print '2 ** 10 = ', 2 ** 10
</code></pre>
]]></content:encoded>
    </item>
    
    <item>
      <title>The carrier-messenger wars</title>
      <link>http://vivekhaldar.com/articles/the-carriermessenger-wars/</link>
      <pubDate>Tue, 17 Apr 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-carriermessenger-wars/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.amazon.com/The-Information-History-Theory-Flood/dp/0375423729&#34;&gt;James Gleick&amp;rsquo;s &lt;em&gt;The Information&lt;/em&gt;&lt;/a&gt; has an interesting anecdote from the early history of telegraphy. Telegraphs were charged by the number of characters. So messengers had an incentive to shorten their messages as much as possible while still being able to communicate. Carriers had the opposite incentive&amp;ndash;to make messages as long as possible, to maximize their revenue.&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;Heavy-duty messengers, such as railways, &lt;a href=&#34;http://www.railpage.org.au/telecode/&#34;&gt;devised their own intricate codes&lt;/a&gt; with short forms for messages they commonly needed to communicate. These codes were then spread throughout the organization, to be used by both telegraph senders and receivers. And telegraph operators tried their best to outlaw the use of such codes.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://www.amazon.com/The-Information-History-Theory-Flood/dp/0375423729">James Gleick&rsquo;s <em>The Information</em></a> has an interesting anecdote from the early history of telegraphy. Telegraphs were charged by the number of characters. So messengers had an incentive to shorten their messages as much as possible while still being able to communicate. Carriers had the opposite incentive&ndash;to make messages as long as possible, to maximize their revenue.</p>
<!-- more -->
<p>Heavy-duty messengers, such as railways, <a href="http://www.railpage.org.au/telecode/">devised their own intricate codes</a> with short forms for messages they commonly needed to communicate. These codes were then spread throughout the organization, to be used by both telegraph senders and receivers. And telegraph operators tried their best to outlaw the use of such codes.</p>
<p>That was an early form of the same <em>carrier-messenger war</em> we are currently seeing with issues such as net-neutrality. Carriers want to shape the content on their pipes to suit their business needs. And messengers want the carriers to not care about their messages and never look at what is running through the pipes.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>The components of a university</title>
      <link>http://vivekhaldar.com/articles/the-components-of-a-university/</link>
      <pubDate>Mon, 16 Apr 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-components-of-a-university/</guid>
      <description>&lt;p&gt;In about five years, if not sooner, the entire education complex is going to face the same existential crisis that journalism and newspapers are going through right now. Their product will be unbundled from the unified package in which it is conventionally sold, and will be served a-la-carte and free over the net.&lt;/p&gt;
&lt;p&gt;For journalism the package was the newspaper, a collection of articles. For colleges, the package is the degree, a collection of courses.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>In about five years, if not sooner, the entire education complex is going to face the same existential crisis that journalism and newspapers are going through right now. Their product will be unbundled from the unified package in which it is conventionally sold, and will be served a-la-carte and free over the net.</p>
<p>For journalism the package was the newspaper, a collection of articles. For colleges, the package is the degree, a collection of courses.</p>
<!-- more -->
<p>Of course, with Khan Academy and Udacity and OCW and many others, the courses are free. This, among others, is a major part of the argument of growing anti-college brigade who say that you&rsquo;re better off not going to college, saving your money and not getting saddled with debt, and instead getting work experience for those four years, perhaps moonlighting with online courses.</p>
<p><strong>Degrees</strong></p>
<p>Colleges retort with: &ldquo;we certify you! A degree is a stamp of some sort of minimum competence.&rdquo;</p>
<p>But on the demand side, employers (at least in software) have almost completely soured on degrees. Their hiring decisions are based <em>completely</em> on how well you do on the interview, not on what degree you got from which college. And the interview focuses completely on the thing you&rsquo;re being hired to do (e.g. programming). You would be amazed how many people with CS degrees simply <em>cannot write programs.</em></p>
<p><strong>Cost structure</strong></p>
<p>The thing is: colleges are stuck in a death spiral of costs increasing, and increasing costs turning off applicants.</p>
<p>Why are costs high? Because it takes a lot of people, and they have salaries and health benefits, and retirement plans. But also because of the <em>resortification</em> of colleges. Larger fractions of funds are going towards building lavish facilities and buildings and recreation centers and dorms that are not dorms but fully furnished apartments. Those are now the baseline for attracting applicants.</p>
<p><strong>Return to basics</strong></p>
<p>So what will become of colleges?</p>
<p>I like to expand the question to encompass the thing that contains the college: the university. <em>University</em> and <em>college</em> have been synonymous for a long time, but a college is only one component of a university, which is a much broader institution.</p>
<p>It not only disseminates knowledge, but also creates and curates it. It&rsquo;s the dissemination part that is being unbundled and dis-intermediated. That is the part that can be put online, for free.</p>
<p>The fact still remains though, that colleges survive on the money from undergraduate tuitions. And that is exactly the part that is beginning to go away.</p>
<p>Just like newspapers, the money from new sources of revenue will never come up to the level from the sources that are going away.</p>
<p>So what gives?</p>
<p>Remember that universities started out as essentially <a href="http://blog.vivekhaldar.com/post/13776333966/the-monk-tax">learning monasteries</a>.  You went there if you had a thirst for knowledge, but there wasn&rsquo;t a pre-packaged &ldquo;degree&rdquo; to be had.</p>
<p>Likely, universities will go back to their smaller, simpler roots,  concentrating more on unstructured knowledge creation.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Mediated Concert</title>
      <link>http://vivekhaldar.com/articles/mediated-concert/</link>
      <pubDate>Sun, 15 Apr 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/mediated-concert/</guid>
      <description>&lt;p&gt;I was reading this &lt;a href=&#34;http://www.theatlantic.com/magazine/print/2012/05/american-mozart/8931/&#34;&gt;immensely enjoyable piece about Kanye and JayZ&lt;/a&gt; when I noticed an echo.&lt;/p&gt;
&lt;p&gt;Contrast this snippet&amp;hellip;&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;Those same iPhones illuminate the Garden like the cigarette lighters of yesteryear. There is the real Kanye West on the stage, with a giant close-up of his sweaty face projected above, and there are thousands of tiny Kanyes dancing and rapping in the palms of the audience: it’s the Watch the Phone tour, I realize, a weird, technologically mediated experience that makes the concert at once more intimate and more distant.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I was reading this <a href="http://www.theatlantic.com/magazine/print/2012/05/american-mozart/8931/">immensely enjoyable piece about Kanye and JayZ</a> when I noticed an echo.</p>
<p>Contrast this snippet&hellip;</p>
<blockquote>
  <p>Those same iPhones illuminate the Garden like the cigarette lighters of yesteryear. There is the real Kanye West on the stage, with a giant close-up of his sweaty face projected above, and there are thousands of tiny Kanyes dancing and rapping in the palms of the audience: it’s the Watch the Phone tour, I realize, a weird, technologically mediated experience that makes the concert at once more intimate and more distant.</p>
</blockquote>
<p>&hellip; with this one, taken from Stephenson&rsquo;s <a href="http://www.cryptonomicon.com/beginning.html">&ldquo;In the beginning was the command line&rdquo;</a>, written in 1999:</p>
<blockquote>
  <p>I was in Disney World recently, specifically the part of it called the Magic Kingdom, walking up Main Street USA. This is a perfect gingerbready Victorian small town that culminates in a Disney castle. It was very crowded; we shuffled rather than walked. Directly in front of me was a man with a camcorder. It was one of the new breed of camcorders where instead of peering through a viewfinder you gaze at a flat-panel color screen about the size of a playing card, which televises live coverage of whatever the camcorder is seeing. He was holding the appliance close to his face, so that it obstructed his view. Rather than go see a real small town for free, he had paid money to see a pretend one, and rather than see it with the naked eye he was watching it on television.</p>
</blockquote>
]]></content:encoded>
    </item>
    
    <item>
      <title>Reproducing papers</title>
      <link>http://vivekhaldar.com/articles/reproducing-papers/</link>
      <pubDate>Tue, 10 Apr 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/reproducing-papers/</guid>
      <description>&lt;p&gt;It turns out that a good fraction of &lt;a href=&#34;http://blog.scienceexchange.com/2012/04/the-need-for-reproducibility-in-academic-research/&#34;&gt;results documented in peer-reviewed scientific papers cannot be reproduced&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This comes as a huge surprise to everyone &lt;em&gt;except&lt;/em&gt; the scientists, grad students and post-docs who actually performed these experiments and wrote them up.&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;This is not failure of ethics. Scientists are &lt;em&gt;not&lt;/em&gt; trying to publish fabricated results. It is a failure of process and &lt;em&gt;documentation&lt;/em&gt;. If you teleported into the lab while the experiment was being done, you would actually see the same results that were written up.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>It turns out that a good fraction of <a href="http://blog.scienceexchange.com/2012/04/the-need-for-reproducibility-in-academic-research/">results documented in peer-reviewed scientific papers cannot be reproduced</a>.</p>
<p>This comes as a huge surprise to everyone <em>except</em> the scientists, grad students and post-docs who actually performed these experiments and wrote them up.</p>
<!-- more -->
<p>This is not failure of ethics. Scientists are <em>not</em> trying to publish fabricated results. It is a failure of process and <em>documentation</em>. If you teleported into the lab while the experiment was being done, you would actually see the same results that were written up.</p>
<p>But then going to another lab and trying to set it up just so, and get the exact same result? Good luck with that.</p>
<p>Ask any grad student and they&rsquo;ll tell you just how delicate these setups are. They work for months just to get a stable setup, and then when it works, they try not to breathe too hard on it and pump it for as much data as possible and publish a paper. They aren&rsquo;t going for <em>reproducability</em>, just <em>producability</em>.</p>
<p>Why?</p>
<p>Because the <em>paper</em> is the ultimate goal of all this. Grad students need them to graduate with a PhD. Professors need them for tenure and funding. The department needs them for prestige.</p>
<p>Like I&rsquo;ve argued before, <a href="http://blog.vivekhaldar.com/post/16229635176/repositories-of-science">the paper as a unit of dessimination of modern scientific results is outmoded</a>.</p>
<p>A paper doesn&rsquo;t even <em>contain</em> all the information and data required to reproduce a result. Because if it did, it would be the size of a book. It usually has just the high-level points and a summary of the data.</p>
<p>Instead, what if the paper was replaced by a publicly-visible activity log? A long series of small steps, each one small enough to understand and debug and&hellip; reproduce.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>If you see a stylus, they blew it. Not.</title>
      <link>http://vivekhaldar.com/articles/if-you-see-a-stylus-they-blew-it-not/</link>
      <pubDate>Mon, 09 Apr 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/if-you-see-a-stylus-they-blew-it-not/</guid>
      <description>&lt;p&gt;Steve Jobs is famous for saying “if you see a stylus, they blew it.” I think he is wrong because of the following:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Every time I sit down to think something through with pen and paper, I make so much more progress and have so much more clarity of thought, in a much shorter amount of time, compared to using any electronic device.&lt;/em&gt;&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;The downside, of course, is that paper is analog. It has life separate from your digital universe, which by now is most of your universe.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Steve Jobs is famous for saying “if you see a stylus, they blew it.” I think he is wrong because of the following:</p>
<p><em>Every time I sit down to think something through with pen and paper, I make so much more progress and have so much more clarity of thought, in a much shorter amount of time, compared to using any electronic device.</em></p>
<!-- more -->
<p>The downside, of course, is that paper is analog. It has life separate from your digital universe, which by now is most of your universe.</p>
<p>The solution isn&rsquo;t to make screens and keyboards behave more like paper. The better way to go is to think of ways to make the act of moving a pen–like instrument across a flat surface something that can be digitized.</p>
<p>One way to do that would be to make the surface, the “paper”, digital. This is the approach that Windows tablet PCs took in the last decade. You could use a stylus to write on the screen itself. The handwriting recognition was smart enough that your notes could be searched just like text, perfectly integrating them into your digital world.</p>
<p>Unfortunately, Tablet PCs faded, largely because they treated the stylus as a poor 2nd class citizen, shoehorning it into the regular mouse and pointer and clicking based Windows UI,  without trying to make an interface that felt more natural with a pen.  Also,  tablet PCs were basically just Windows laptops with capacitive screens–not the lightest and easiest things to carry around.</p>
<p>Another approach is to make  the instrument, the pen, digital.  This is what <a href="http://livescribe.com">Livescribe</a> has done.  You use one of their pens to write on regular paper<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>,  and it captures what you wrote. Later, you can connect the pen to your computer,  and get an electronic copy of everything you wrote or doodled.</p>
<p>Having an electronic pen and using it with analog paper has a bunch of advantages over having an electronic screen. When you&rsquo;re actually writing, paper is a lot more convenient than the screen. Also, the pen is much smaller and easier to carry around. I&rsquo;ve been using this for about a year, and I love it.</p>
<div class="footnotes" role="doc-endnotes">
<hr><ol><li id="fn:1" role="doc-endnote">
<p>You do need paper that has special micro dots printed on it.  You can either buy this from Livescribe,  or simply print it yourself. <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol></div>
]]></content:encoded>
    </item>
    
    <item>
      <title>Code review. Just do it.</title>
      <link>http://vivekhaldar.com/articles/code-review-just-do-it/</link>
      <pubDate>Sun, 01 Apr 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/code-review-just-do-it/</guid>
      <description>&lt;p&gt;There is one practice that has had more of an impact on my professional programming life than anything else–code review.&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;The role of code review at Google has been pretty well-documented &lt;a href=&#34;http://googlecode.blogspot.com/2008/07/looks-good-to-me-source-code-review.html&#34;&gt;by&lt;/a&gt; &lt;a href=&#34;http://scientopia.org/blogs/goodmath/2011/07/06/things-everyone-should-do-code-review/&#34;&gt;now&lt;/a&gt;. It is absolutely central to the way it builds and operates engineering systems. There is a small river of posts by programmers about how great code review is. And I&amp;rsquo;m going to add to that, because I don&amp;rsquo;t think is is something that can be stressed enough.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>There is one practice that has had more of an impact on my professional programming life than anything else–code review.</p>
<!-- more -->
<p>The role of code review at Google has been pretty well-documented <a href="http://googlecode.blogspot.com/2008/07/looks-good-to-me-source-code-review.html">by</a> <a href="http://scientopia.org/blogs/goodmath/2011/07/06/things-everyone-should-do-code-review/">now</a>. It is absolutely central to the way it builds and operates engineering systems. There is a small river of posts by programmers about how great code review is. And I&rsquo;m going to add to that, because I don&rsquo;t think is is something that can be stressed enough.</p>
<p><em>No matter how great or experienced a programmer you are, code review will always improve your code.</em></p>
<p>The sad truth is that <em>you are blind to your own code.</em> Once it compiles and runs and does what you want it to do, you don&rsquo;t want to go over it agian. &ldquo;It runs! Ship it!&rdquo; No. A fresh pair of eyes will tell you exactly what you missed. And you will go, &ldquo;Doh! Shoulda fixed that.&rdquo;</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Jonah Lehrer</title>
      <link>http://vivekhaldar.com/articles/jonah-lehrer/</link>
      <pubDate>Wed, 28 Mar 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/jonah-lehrer/</guid>
      <description>&lt;p&gt;A &lt;a href=&#34;http://www.themillions.com/2012/03/are-you-your-brain-on-jonah-lehrers-how-creativity-works.html&#34;&gt;recent review of Jonah Lehrer&amp;rsquo;s new book, Imagine&lt;/a&gt;, delves into how even a science writer as skilled and technically trained as Lehrer can fall into the trap of letting the narrative run over the science. (Disclaimer: I haven&amp;rsquo;t read the book.)&lt;/p&gt;
&lt;!-- more --&gt;
&lt;blockquote&gt;
  &lt;p&gt;If dubious interpretations of scientific data appeared only once in Imagine, it might be a worrisome fluke; but they appear multiple times, which is cause for real concern. Lehrer steps over the line again when connecting amphetamine use to creativity. He states that “Because the dopamine neurons in the midbrain are excited…the world is suddenly saturated with intensely interesting ideas.” Such definitive statements imply that neuroscience has already charted a causal course from neurotransmitter chemistry to a complex cognitive process — which simply isn’t true. That it should have come from a writer who so clearly has the ability to write about science critically and intelligently still comes as a bit of a surprise.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>A <a href="http://www.themillions.com/2012/03/are-you-your-brain-on-jonah-lehrers-how-creativity-works.html">recent review of Jonah Lehrer&rsquo;s new book, Imagine</a>, delves into how even a science writer as skilled and technically trained as Lehrer can fall into the trap of letting the narrative run over the science. (Disclaimer: I haven&rsquo;t read the book.)</p>
<!-- more -->
<blockquote>
  <p>If dubious interpretations of scientific data appeared only once in Imagine, it might be a worrisome fluke; but they appear multiple times, which is cause for real concern. Lehrer steps over the line again when connecting amphetamine use to creativity. He states that “Because the dopamine neurons in the midbrain are excited…the world is suddenly saturated with intensely interesting ideas.” Such definitive statements imply that neuroscience has already charted a causal course from neurotransmitter chemistry to a complex cognitive process — which simply isn’t true. That it should have come from a writer who so clearly has the ability to write about science critically and intelligently still comes as a bit of a surprise.</p>
  <p>We need good translators of science to the general public, and Lehrer has the public’s ear and the public’s trust. He is at his best when putting his considerable talents to the task of telling a story that is true according to the facts as we know them, rather than telling a story people want to hear.</p>
</blockquote>
<p>Lehrer  actually studied neuroscience in grad school and is fully capable of grasping the technical nuances of the research in the field. This is why <a href="http://blog.vivekhaldar.com/post/4112670117/the-shy-scientist"><em>practicing</em> scientists shy away from writing &ldquo;popular science&rdquo;</a>. They are scared of giving up the fine chisel of the lab for the broad strokes of prose.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Computational thinking</title>
      <link>http://vivekhaldar.com/articles/computational-thinking/</link>
      <pubDate>Sat, 24 Mar 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/computational-thinking/</guid>
      <description>&lt;p&gt;In &lt;a href=&#34;http://distorte.tumblr.com/post/19393698578/why-coding-is-not-the-new-literacy&#34;&gt;Why coding is not the new literacy&lt;/a&gt;, the author argues:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;Coding is not the new literacy because it will never be a requirement that every man, woman and child must know how to code in order to communicate fully. It is a function of the development of communication, not its application. As such, it is more true to compare coding to skills such as book-binding, or newspaper printing. It is sufficient for a relatively small proportion of the population to understand it in order for its benefits to accrue.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>In <a href="http://distorte.tumblr.com/post/19393698578/why-coding-is-not-the-new-literacy">Why coding is not the new literacy</a>, the author argues:</p>
<blockquote>
  <p>Coding is not the new literacy because it will never be a requirement that every man, woman and child must know how to code in order to communicate fully. It is a function of the development of communication, not its application. As such, it is more true to compare coding to skills such as book-binding, or newspaper printing. It is sufficient for a relatively small proportion of the population to understand it in order for its benefits to accrue.</p>
</blockquote>
<!-- more -->
<p>I think this is a shortsighted view to take. What qualifies as a “literacy” has drastically changed throughout history. The ancient Greeks considered oratory skills such as rhetoric and debating to be the foundation of their education. When writing came along, they resisted, thinking that committing thoughts to tablets would weaken their minds.</p>
<p>At the same time, I do realize that “coding is the new literacy” has become a cliché. But if you take a broader view, and think about not coding per se, but the thought processes around it, the concept becomes much more powerful. <em>Thinking computationally</em>, even about problems and domains that don&rsquo;t involve coding, is rapidly becoming an essential skill, and a mode of thinking that one needs to be familiar with to understand the modern world around us.</p>
<p><a href="http://www.cs.cmu.edu/afs/cs/usr/wing/www/publications/Wing06.pdf">Jeanette Wing  captures this reasoning perfectly</a> in her  description of computational thinking:</p>
<blockquote>
  <p>Computational thinking is a fundamental skill for everyone, not just for computer scientists. To reading, writing, and arithmetic, we should add computational thinking to every child’s analytical ability.
  We have witnessed the influence of computational thinking on other disciplines. For example, machine learning has transformed statistics. Statistical learning is being used for problems on a scale, in terms of both data size and dimension, unimaginable only a few years ago&hellip; Computational biology is changing the way biologists think. Similarly, computational game theory is changing the way economists think; nanocomputing, the way chemists think; and quantum computing, the way physicists think. This kind of thinking will be part of the skill set of not only other scientists but of everyone else.</p>
</blockquote>
]]></content:encoded>
    </item>
    
    <item>
      <title>Themes: Language</title>
      <link>http://vivekhaldar.com/articles/themes-language/</link>
      <pubDate>Tue, 20 Mar 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/themes-language/</guid>
      <description>&lt;p&gt;(Continuing a series where I look back &lt;a href=&#34;http://blog.vivekhaldar.com/post/19571998004/themes-the-economics-of-programming&#34;&gt;on&lt;/a&gt; &lt;a href=&#34;http://blog.vivekhaldar.com/post/19549798677/themes-modern-work&#34;&gt;themes&lt;/a&gt; that have emerged in this blog.)&lt;/p&gt;
&lt;p&gt;And another thing I&amp;rsquo;m fascinated by is language and etymology.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href=&#34;http://blog.vivekhaldar.com/post/564769323/english-words-lifted-from-hindi&#34;&gt;English words lifted from Hindi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.vivekhaldar.com/post/579755258/nouns-as-verbs-verbs-as-nouns&#34;&gt;Nouns as verbs, verbs as nouns&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.vivekhaldar.com/post/1028298630/the-18th-century-origins-of-lolcat-speak&#34;&gt;The 18th Century Origins of Lolcat-speak&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.vivekhaldar.com/post/2497988562/parsing-and-or&#34;&gt;Parsing &amp;ldquo;and/or&amp;rdquo;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.vivekhaldar.com/post/2738487530/englsh-wtht-vwls&#34;&gt;Englsh Wtht Vwls&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.vivekhaldar.com/post/572801806/upsight&#34;&gt;Upsight&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <content:encoded><![CDATA[<p>(Continuing a series where I look back <a href="http://blog.vivekhaldar.com/post/19571998004/themes-the-economics-of-programming">on</a> <a href="http://blog.vivekhaldar.com/post/19549798677/themes-modern-work">themes</a> that have emerged in this blog.)</p>
<p>And another thing I&rsquo;m fascinated by is language and etymology.</p>
<ul><li><a href="http://blog.vivekhaldar.com/post/564769323/english-words-lifted-from-hindi">English words lifted from Hindi</a></li>
<li><a href="http://blog.vivekhaldar.com/post/579755258/nouns-as-verbs-verbs-as-nouns">Nouns as verbs, verbs as nouns</a></li>
<li><a href="http://blog.vivekhaldar.com/post/1028298630/the-18th-century-origins-of-lolcat-speak">The 18th Century Origins of Lolcat-speak</a></li>
<li><a href="http://blog.vivekhaldar.com/post/2497988562/parsing-and-or">Parsing &ldquo;and/or&rdquo;</a></li>
<li><a href="http://blog.vivekhaldar.com/post/2738487530/englsh-wtht-vwls">Englsh Wtht Vwls</a></li>
<li><a href="http://blog.vivekhaldar.com/post/572801806/upsight">Upsight</a></li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Showing it</title>
      <link>http://vivekhaldar.com/articles/showing-it/</link>
      <pubDate>Mon, 19 Mar 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/showing-it/</guid>
      <description>&lt;blockquote&gt;
  &lt;p&gt;Or is it possible he just loves programming? No doubt the filmmakers considered this option, but you can see their dilemma: how to convey the pleasure of programming—if such a pleasure exists—in a way that is both cinematic and comprehensible? Movies are notoriously bad at showing the pleasures and rigors of art-making, even when the medium is familiar.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;(From Zadie Smith&amp;rsquo;s essay, &lt;a href=&#34;http://www.nybooks.com/articles/archives/2010/nov/25/generation-why/?pagination=false&#34;&gt;Generation Why&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;This is a problem that programmers often face. How exactly can they convey the sheer awesomeness of the stuff they create? Painters can point to their paintings. Mechanical engineers can point to shiny metallic objects. What can programmers show? Pages of incomprehensible code?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
  <p>Or is it possible he just loves programming? No doubt the filmmakers considered this option, but you can see their dilemma: how to convey the pleasure of programming—if such a pleasure exists—in a way that is both cinematic and comprehensible? Movies are notoriously bad at showing the pleasures and rigors of art-making, even when the medium is familiar.</p>
</blockquote>
<p>(From Zadie Smith&rsquo;s essay, <a href="http://www.nybooks.com/articles/archives/2010/nov/25/generation-why/?pagination=false">Generation Why</a>)</p>
<p>This is a problem that programmers often face. How exactly can they convey the sheer awesomeness of the stuff they create? Painters can point to their paintings. Mechanical engineers can point to shiny metallic objects. What can programmers show? Pages of incomprehensible code?</p>
<p>This problem is all the more exacerbated for programmers deep in the backend–those who hack infrastructure. At least programmers closer to the product and the front-end can point to shiny UIs and things happening on the screen and say “I made that!”</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Themes: The Economics of Programming</title>
      <link>http://vivekhaldar.com/articles/themes-the-economics-of-programming/</link>
      <pubDate>Mon, 19 Mar 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/themes-the-economics-of-programming/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been looking at &lt;a href=&#34;http://blog.vivekhaldar.com/post/19549798677/themes-modern-work&#34;&gt;themes that have emerged in my posts&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Another theme is &lt;em&gt;the economics of programming&lt;/em&gt;:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href=&#34;http://blog.vivekhaldar.com/post/10968747879/why-developers-should-learn-the-economics-of-code&#34;&gt;Why developers should learn the economics of code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.vivekhaldar.com/post/13855406981/the-0-1x-developer&#34;&gt;The 0.1x developer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.vivekhaldar.com/post/15628047570/the-cs-assignment-i-wish-i-had&#34;&gt;The CS assignment I wish I had&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.vivekhaldar.com/post/19345320355/innovators-dilemma-in-programming-languages&#34;&gt;Innovator&amp;rsquo;s dilemma in programming languages&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <content:encoded><![CDATA[<p>I&rsquo;ve been looking at <a href="http://blog.vivekhaldar.com/post/19549798677/themes-modern-work">themes that have emerged in my posts</a>.</p>
<p>Another theme is <em>the economics of programming</em>:</p>
<ul><li><a href="http://blog.vivekhaldar.com/post/10968747879/why-developers-should-learn-the-economics-of-code">Why developers should learn the economics of code</a></li>
<li><a href="http://blog.vivekhaldar.com/post/13855406981/the-0-1x-developer">The 0.1x developer</a></li>
<li><a href="http://blog.vivekhaldar.com/post/15628047570/the-cs-assignment-i-wish-i-had">The CS assignment I wish I had</a></li>
<li><a href="http://blog.vivekhaldar.com/post/19345320355/innovators-dilemma-in-programming-languages">Innovator&rsquo;s dilemma in programming languages</a></li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Themes: Modern Work</title>
      <link>http://vivekhaldar.com/articles/themes-modern-work/</link>
      <pubDate>Sun, 18 Mar 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/themes-modern-work/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve noticed a few themes emerging in my posts over the last couple of years. I didn&amp;rsquo;t plan to focus on those themes, but when I look back I notice clusters. I want to collect together posts along a common theme.&lt;/p&gt;
&lt;p&gt;One of the more prominent themes is the nature of modern work, and how it relates to Taylorism:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href=&#34;http://blog.vivekhaldar.com/post/754002281/taylorism-in-the-modern-tech-industry&#34;&gt;Taylorism in the modern tech industry&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.vivekhaldar.com/post/861625183/engineering-is-all-about-failure&#34;&gt;Engineering is all about failure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.vivekhaldar.com/post/2525332092/minimalism-is-not-a-viable-intellectual-strategy&#34;&gt;Minimalism is not a viable intellectual strategy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.vivekhaldar.com/post/13241026081/the-programming-assembly-line&#34;&gt;The programming assembly line&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <content:encoded><![CDATA[<p>I&rsquo;ve noticed a few themes emerging in my posts over the last couple of years. I didn&rsquo;t plan to focus on those themes, but when I look back I notice clusters. I want to collect together posts along a common theme.</p>
<p>One of the more prominent themes is the nature of modern work, and how it relates to Taylorism:</p>
<ul><li><a href="http://blog.vivekhaldar.com/post/754002281/taylorism-in-the-modern-tech-industry">Taylorism in the modern tech industry</a></li>
<li><a href="http://blog.vivekhaldar.com/post/861625183/engineering-is-all-about-failure">Engineering is all about failure</a></li>
<li><a href="http://blog.vivekhaldar.com/post/2525332092/minimalism-is-not-a-viable-intellectual-strategy">Minimalism is not a viable intellectual strategy</a></li>
<li><a href="http://blog.vivekhaldar.com/post/13241026081/the-programming-assembly-line">The programming assembly line</a></li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Blue Java</title>
      <link>http://vivekhaldar.com/articles/blue-java/</link>
      <pubDate>Fri, 16 Mar 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/blue-java/</guid>
      <description>&lt;p&gt;(Follow-on to the &lt;a href=&#34;http://blog.vivekhaldar.com/post/19345320355/innovators-dilemma-in-programming-languages&#34;&gt;last post&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s another interesting reason for using a specific language, but it becomes a factor very rarely &amp;ndash; &lt;em&gt;indirect competition&lt;/em&gt;. This is when company chooses and promotes a language primarily to beat back a competitor.&lt;/p&gt;
&lt;p&gt;This happened in the 90s when IBM decided to throw all its weight behind Java. Microsoft was ascendant, and so was its developer stack. IBM was &lt;em&gt;terrified&lt;/em&gt; that it would end up in a position where it would have to use (and license!!) Microsoft&amp;rsquo;s languages and compilers, and be shackled by the APIs of Redmond.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>(Follow-on to the <a href="http://blog.vivekhaldar.com/post/19345320355/innovators-dilemma-in-programming-languages">last post</a>)</p>
<p>There&rsquo;s another interesting reason for using a specific language, but it becomes a factor very rarely &ndash; <em>indirect competition</em>. This is when company chooses and promotes a language primarily to beat back a competitor.</p>
<p>This happened in the 90s when IBM decided to throw all its weight behind Java. Microsoft was ascendant, and so was its developer stack. IBM was <em>terrified</em> that it would end up in a position where it would have to use (and license!!) Microsoft&rsquo;s languages and compilers, and be shackled by the APIs of Redmond.</p>
<p>Along came Java, that too from a company whose <a href="http://en.wikipedia.org/wiki/Scott_McNealy">CEO at the time</a> was a sworn enemy of Redmond. It was a godsend for IBM. It made a strategic decision to throw all its weight behind Java.</p>
<p>Java&rsquo;s rise, particularly inside the enterprise, had a lot to do with Big Blue backing it over the next decade.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Innovator&#39;s dilemma in programming languages</title>
      <link>http://vivekhaldar.com/articles/innovators-dilemma-in-programming-languages/</link>
      <pubDate>Thu, 15 Mar 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/innovators-dilemma-in-programming-languages/</guid>
      <description>&lt;p&gt;(Follow on to &lt;a href=&#34;http://blog.vivekhaldar.com/post/18778436817/whither-programming-language-research&#34;&gt;this post&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;What is the &lt;a href=&#34;http://hbswk.hbs.edu/item/6496.html&#34;&gt;job that programming languages are hired to do?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Here is a &lt;em&gt;partial&lt;/em&gt; list of criteria for picking a programming language:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Technical&lt;/strong&gt;: the language is superior along some technical dimension. It might have great support for parallel message passing applications, for example. Unfortunately, most programming language debates stay stuck here.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Economic&lt;/strong&gt;: you run large applications on humongous numbers of machines, which cost a gargantuan amount of money. You would very much like to not waste any of that hardware, utilize it as much as possible, and reduce the marginal expenditure when the size of your application, or the number of its users, increases.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Business&lt;/strong&gt;: your code must react very quickly to changing markets, and new customer requirements.  Maybe the requirements are not clear, and the only way to learn is to release something, see how it does, and then adjust your product. Agility, and reducing the time it takes to implement a change, are of paramount importance, or else you will simply be squeezed out by more nimble players.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;A large company with acres of data centers and a small startup renting VMs over the net will &amp;ldquo;hire&amp;rdquo; languages to perform very different jobs.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>(Follow on to <a href="http://blog.vivekhaldar.com/post/18778436817/whither-programming-language-research">this post</a>.)</p>
<p>What is the <a href="http://hbswk.hbs.edu/item/6496.html">job that programming languages are hired to do?</a></p>
<p>Here is a <em>partial</em> list of criteria for picking a programming language:</p>
<ul><li><strong>Technical</strong>: the language is superior along some technical dimension. It might have great support for parallel message passing applications, for example. Unfortunately, most programming language debates stay stuck here.</li>
<li><strong>Economic</strong>: you run large applications on humongous numbers of machines, which cost a gargantuan amount of money. You would very much like to not waste any of that hardware, utilize it as much as possible, and reduce the marginal expenditure when the size of your application, or the number of its users, increases.</li>
<li><strong>Business</strong>: your code must react very quickly to changing markets, and new customer requirements.  Maybe the requirements are not clear, and the only way to learn is to release something, see how it does, and then adjust your product. Agility, and reducing the time it takes to implement a change, are of paramount importance, or else you will simply be squeezed out by more nimble players.</li>
</ul><p>A large company with acres of data centers and a small startup renting VMs over the net will &ldquo;hire&rdquo; languages to perform very different jobs.</p>
<p>Let me propose a new dividing line for programming languages:</p>
<ul><li><strong>Sustaining languages</strong>: these are the ones commonly thought of as &ldquo;large-scale industrial languages.&rdquo; They stress efficient use of hardware resources (CPU, RAM) over personal productivity and succintness. They are typically used for &ldquo;stable&rdquo; applications, where the market and requirements are well-known and slow-changing<sup id="fnref:6"><a href="#fn:6" class="footnote-ref" role="doc-noteref">1</a></sup>. They have been around for a long time. However, a continuous stream of incremental improvements has sustained their position.</li>
<li><strong>Disruptive languages</strong>: the new kids and upstarts. They stress agility of expression, succintness and individual productivity and expression, and are willing to use resources inefficiently to do so. They are usually looked down upon by the establishment (i.e. those who work with sustaining languages). They address a very different market. They are typically used at small scale, and for products whose requirements are not yet known, and will only be known by releasing something, getting user feedback, and iterating.</li>
</ul><p>Currently, C++ and Java are examples of the first, and Python and Ruby are examples of the second.</p>
<p>It is no surprise that C++ and Java came out of large companies, and Python and Ruby came out of <em>individuals</em> scratching an itch.</p>
<p>I call them disruptive languages because like Christensen&rsquo;s disruptive technologies they address a market not catered by the establishment, and are considered to address the &ldquo;lower end&rdquo; of the market.</p>
<p>But disruptive technologies are disruptive because they move &ldquo;upmarket&rdquo; and dislodge the incumbents. How might that happen with languages?</p>
<p>What is the tipping point at which a small company should consider re-engineering its software? In other words, when should it <em>stop spending hardware on people, and start spending people on hardware?</em> That starts to happen when hardware costs begin to approach people costs. For a small startup, that might happen when hardware costs cross the annual salary of one developer (or a few). If you look at <a href="http://aws.amazon.com/ec2/pricing/">AWS prices</a>, you&rsquo;ll see that you can rent a <em>lot</em> of hardware for that much.</p>
<p>But the cost of hardware has a clear trajectory over time &ndash; downwards. This means that the afore-mentioned tipping point will get pushed further over time. That in turn means that the scale (size of data, number of users, or whatever metric is relevant) up to which you can economically use disruptive languages is increasing over time.</p>
<div class="footnotes" role="doc-endnotes">
<hr><ol><li id="fn:6" role="doc-endnote">
<p>There is a single-digit number of companies in the world that operate at a scale where even <em>experimental</em> products with wildly changing requirements need to use sustaining languages. That is a whole different story. <a href="#fnref:6" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol></div>
]]></content:encoded>
    </item>
    
    <item>
      <title>T-shirts are currency</title>
      <link>http://vivekhaldar.com/articles/tshirts-are-currency/</link>
      <pubDate>Mon, 12 Mar 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/tshirts-are-currency/</guid>
      <description>&lt;p&gt;Recruiter: Someone dropped out of interviewing a candidate at the last minute. Can you fill in?&lt;/p&gt;
&lt;p&gt;Me: Hmmmmm&amp;hellip; what&amp;rsquo;s in it for me?&lt;/p&gt;
&lt;p&gt;Recruiter: A special t-shirt.&lt;/p&gt;
&lt;p&gt;Me: Cool. I&amp;rsquo;ll do it.&lt;/p&gt;
&lt;p&gt;Actually, the &amp;ldquo;what&amp;rsquo;s in it for me&amp;rdquo; is not spoken out loud. It&amp;rsquo;s an implicit contract.&lt;/p&gt;
&lt;p&gt;Time and again, I&amp;rsquo;ve seen myself and other people go to great lengths to earn a t-shirt. Above and beyond the call of duty. More than they would for cold hard cash&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Recruiter: Someone dropped out of interviewing a candidate at the last minute. Can you fill in?</p>
<p>Me: Hmmmmm&hellip; what&rsquo;s in it for me?</p>
<p>Recruiter: A special t-shirt.</p>
<p>Me: Cool. I&rsquo;ll do it.</p>
<p>Actually, the &ldquo;what&rsquo;s in it for me&rdquo; is not spoken out loud. It&rsquo;s an implicit contract.</p>
<p>Time and again, I&rsquo;ve seen myself and other people go to great lengths to earn a t-shirt. Above and beyond the call of duty. More than they would for cold hard cash<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>.</p>
<p>Everyone in tech knows exactly what I&rsquo;m talking about. <em>T-shirts are currency.</em></p>
<p>Money? Money is common. A dollar is like every other dollar. It&rsquo;s not special.</p>
<p>A t-shirt <em>says</em> something. It&rsquo;s <em>visible</em>. You can show it off. It&rsquo;s an invisible handshake among those who know what the t-shirt symbolizes. A team. An old, dead, but pioneering company. A small event. A place. You can gloat when someone asks &ldquo;Cool shirt. Where did you get it?&rdquo;</p>
<p>That&rsquo;s why their design is taken seriously. People spend time and effort and breath on it.</p>
<p>Think about that next time you want to ask someone for a favor.</p>
<div class="footnotes" role="doc-endnotes">
<hr><ol><li id="fn:1" role="doc-endnote">
<p>There&rsquo;s a lot of behvioral economics research that delves deeper into this. &ldquo;Predictably Irrational&rdquo;, by Dan Ariely, is a good place to start. <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol></div>
]]></content:encoded>
    </item>
    
    <item>
      <title>The intimacy of imperfect technologies</title>
      <link>http://vivekhaldar.com/articles/the-intimacy-of-imperfect-technologies/</link>
      <pubDate>Fri, 09 Mar 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-intimacy-of-imperfect-technologies/</guid>
      <description>&lt;p&gt;I had a humungous music collection on cassettes growing up. Yes, cassettes. Those analog thingies that held music, on &lt;em&gt;tape&lt;/em&gt;. I had built it up during my high school years. I had to get good grades and beg my parents for cassette money. That, and the PC upgrades (1 MB, up from 640 KB!!) were probably the only reasons I got decent grades.&lt;/p&gt;
&lt;p&gt;CDs had just arrived on the scene, but were totally unaffordable, costing about an order of magnitude more than cassettes. And they were so new that very few people (definitely none of my high school buddies) had CD players, killing any prospect of music sharing.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I had a humungous music collection on cassettes growing up. Yes, cassettes. Those analog thingies that held music, on <em>tape</em>. I had built it up during my high school years. I had to get good grades and beg my parents for cassette money. That, and the PC upgrades (1 MB, up from 640 KB!!) were probably the only reasons I got decent grades.</p>
<p>CDs had just arrived on the scene, but were totally unaffordable, costing about an order of magnitude more than cassettes. And they were so new that very few people (definitely none of my high school buddies) had CD players, killing any prospect of music sharing.</p>
<p>And so I gradually built up my music collection on cassettes. The thing about cassettes is, they weren&rsquo;t like CDs, or now, MP3s, where once you had the thing it was trivial to play it.</p>
<p>You see, not only were they analog, they were <em>mechanical</em>. They spun. Things rubbed against each other. They wore out. They got jammed. They got dirt in them. Sometimes, they just plain broke. And God forbid, if you forgot one of them in the car in the summer. They would <em>melt</em>. Sometimes, the trauma was recoverable. Often, it wasn&rsquo;t. Sometimes I had to transplant the tape from one cassette container into another one, or switch parts among them. And we haven&rsquo;t even got to the player, with it&rsquo;s motor, and the tape-reading head that got dirty and had to be cleaned.</p>
<p><img src="../../media/449104958.png" alt=""/></p>
<p>With cassettes, you had to be <em>involved</em>. At scale, with enough cassettes and wanting to listen to them for enough hours, getting your precious music to play off cassettes required active coaxing and an ongoing commitment of time and effort. Not unlike tending a garden.</p>
<p>You had to touch them. Tinker with them. Tear them apart. Put them back together. Appease them. But you <em>knew</em> them. Which ones were good. Which one would need some fixing before being played today. Which ones stuck around which songs. Some of them were unlendable because only you knew how to get the music out of them.</p>
<p>They were yours. You were intimate.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Whither programming language research?</title>
      <link>http://vivekhaldar.com/articles/whither-programming-language-research/</link>
      <pubDate>Sun, 04 Mar 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/whither-programming-language-research/</guid>
      <description>&lt;p&gt;Cristina Lopes (whom I&amp;rsquo;ve had the pleasure of being taught by, in a grad course on UbiComp) &lt;a href=&#34;http://tagide.com/blog/2012/03/research-in-programming-languages/&#34;&gt;laments the current state of programming language research&lt;/a&gt; and the lack of innovation in the field. You should go read the whole thing.&lt;/p&gt;
&lt;p&gt;I largely agree with her, but have a few observations to add:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;progress seems slow because &lt;a href=&#34;http://blog.vivekhaldar.com/post/14809797775/how-to-make-your-new-programming-language-successful&#34;&gt;being incremental is necessary&lt;/a&gt; for any hope of wide adoption. The population of practicing programmers, as well as the ocean of existing code, can only absorb so much change at a time. Languages that are too radical don&amp;rsquo;t make it beyond the paper they&amp;rsquo;re described in. For example, lambda expressions and closures have only recently made (or are making) the jump from largely academic functional languages to mainstream ones like Python, C++ and Java.&lt;/li&gt;
&lt;li&gt;this is further exacerbated because the window of opportunity for new languages to take off is extremely slim. Languages don&amp;rsquo;t take off by themselves, &lt;a href=&#34;http://blog.vivekhaldar.com/post/14809797775/how-to-make-your-new-programming-language-successful&#34;&gt;they ride on the backs of platforms&lt;/a&gt;, and those only come along once or twice a decade.&lt;/li&gt;
&lt;li&gt;the mantle of programming language innovation firmly passed to industry sometime in the 90s. Why? Because that&amp;rsquo;s where all the interesting problems were starkly revealed. &lt;a href=&#34;http://matt-welsh.blogspot.com/2010/11/why-im-leaving-harvard.html&#34;&gt;Matt Welsh went from Harvard to Google&lt;/a&gt; because he found &amp;ldquo;problems that are orders of magnitude larger and more interesting than I can work on at any university.&amp;rdquo; This is not to disparage academic PL research, because a big part of new PL design is cherry-picking the best constructs from past academic research.&lt;/li&gt;
&lt;li&gt;that said, I think currently we&amp;rsquo;re in the valley of &amp;ldquo;good enough&amp;rdquo; languages. There are certainly tons of annoyances and there will always be room for improvement in the mainstays (e.g. Java, C++ and Python, to count category representatives), but by and large they get the job done. &lt;em&gt;I have yet to run into a project where the language was the bottleneck for success&lt;/em&gt;. That doesn&amp;rsquo;t mean that there are not problems on the horizon (concurrency, distributed computing…) that will &lt;em&gt;eventually&lt;/em&gt; become painful enough to force a move to new languages (or old languages with new constructs).&lt;/li&gt;
&lt;li&gt;because of the above two points, language engineering resources have mostly been devoted to virtual machine and runtime engineering, because they provide an immediate &lt;a href=&#34;http://blog.vivekhaldar.com/post/10968747879/why-developers-should-learn-the-economics-of-code&#34;&gt;payback&lt;/a&gt; in terms of hardware dollars utilized and saved.&lt;/li&gt;
&lt;/ul&gt;</description>
      <content:encoded><![CDATA[<p>Cristina Lopes (whom I&rsquo;ve had the pleasure of being taught by, in a grad course on UbiComp) <a href="http://tagide.com/blog/2012/03/research-in-programming-languages/">laments the current state of programming language research</a> and the lack of innovation in the field. You should go read the whole thing.</p>
<p>I largely agree with her, but have a few observations to add:</p>
<ul><li>progress seems slow because <a href="http://blog.vivekhaldar.com/post/14809797775/how-to-make-your-new-programming-language-successful">being incremental is necessary</a> for any hope of wide adoption. The population of practicing programmers, as well as the ocean of existing code, can only absorb so much change at a time. Languages that are too radical don&rsquo;t make it beyond the paper they&rsquo;re described in. For example, lambda expressions and closures have only recently made (or are making) the jump from largely academic functional languages to mainstream ones like Python, C++ and Java.</li>
<li>this is further exacerbated because the window of opportunity for new languages to take off is extremely slim. Languages don&rsquo;t take off by themselves, <a href="http://blog.vivekhaldar.com/post/14809797775/how-to-make-your-new-programming-language-successful">they ride on the backs of platforms</a>, and those only come along once or twice a decade.</li>
<li>the mantle of programming language innovation firmly passed to industry sometime in the 90s. Why? Because that&rsquo;s where all the interesting problems were starkly revealed. <a href="http://matt-welsh.blogspot.com/2010/11/why-im-leaving-harvard.html">Matt Welsh went from Harvard to Google</a> because he found &ldquo;problems that are orders of magnitude larger and more interesting than I can work on at any university.&rdquo; This is not to disparage academic PL research, because a big part of new PL design is cherry-picking the best constructs from past academic research.</li>
<li>that said, I think currently we&rsquo;re in the valley of &ldquo;good enough&rdquo; languages. There are certainly tons of annoyances and there will always be room for improvement in the mainstays (e.g. Java, C++ and Python, to count category representatives), but by and large they get the job done. <em>I have yet to run into a project where the language was the bottleneck for success</em>. That doesn&rsquo;t mean that there are not problems on the horizon (concurrency, distributed computing…) that will <em>eventually</em> become painful enough to force a move to new languages (or old languages with new constructs).</li>
<li>because of the above two points, language engineering resources have mostly been devoted to virtual machine and runtime engineering, because they provide an immediate <a href="http://blog.vivekhaldar.com/post/10968747879/why-developers-should-learn-the-economics-of-code">payback</a> in terms of hardware dollars utilized and saved.</li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Taylorist Science</title>
      <link>http://vivekhaldar.com/articles/taylorist-science/</link>
      <pubDate>Sat, 03 Mar 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/taylorist-science/</guid>
      <description>&lt;p&gt;A &lt;a href=&#34;http://blog.vivekhaldar.com/post/754002281/taylorism-in-the-modern-tech-industry#comment-427720391&#34;&gt;comment by Mark on an old post&lt;/a&gt; is particularly applicable to my &lt;a href=&#34;http://blog.vivekhaldar.com/post/18541470199/team-science&#34;&gt;last post&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;I think there&amp;rsquo;s a good argument that a large portion of modern science is Taylorist. The myth of the lone genius with a &amp;ldquo;eureka&amp;rdquo; moment doesn&amp;rsquo;t describe the vast majority of science that actually takes place, especially in the more costly areas like physics and biology (mathematics might be different). Labs and universities are run on a quite industrialized basis, with professors typically supervising a whole stable of researchers, agendas driven by grants and metrics such as publication impact factors, and so on. It&amp;rsquo;s not 100% a factory, but I would say that 90% of it is at least 80% factory-like. Grad students are certainly cogs in a large number of cases.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>A <a href="http://blog.vivekhaldar.com/post/754002281/taylorism-in-the-modern-tech-industry#comment-427720391">comment by Mark on an old post</a> is particularly applicable to my <a href="http://blog.vivekhaldar.com/post/18541470199/team-science">last post</a>:</p>
<blockquote>
  <p>I think there&rsquo;s a good argument that a large portion of modern science is Taylorist. The myth of the lone genius with a &ldquo;eureka&rdquo; moment doesn&rsquo;t describe the vast majority of science that actually takes place, especially in the more costly areas like physics and biology (mathematics might be different). Labs and universities are run on a quite industrialized basis, with professors typically supervising a whole stable of researchers, agendas driven by grants and metrics such as publication impact factors, and so on. It&rsquo;s not 100% a factory, but I would say that 90% of it is at least 80% factory-like. Grad students are certainly cogs in a large number of cases.</p>
</blockquote>
]]></content:encoded>
    </item>
    
    <item>
      <title>Team Science</title>
      <link>http://vivekhaldar.com/articles/team-science/</link>
      <pubDate>Wed, 29 Feb 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/team-science/</guid>
      <description>&lt;p&gt;The era of the single-author paper is over, and has been for a
while&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;. Especially in the sciences, where the trend towards longer author
lists is strongest, and accelerating the fastest. Physics is at the forefront,
with the first thousand-author paper recently published.&lt;/p&gt;
&lt;p&gt;This is happening
without any loss of impact, i.e. team-authored papers have been getting more
citations than their solo-authored counterparts, and the gap is
widening.&lt;/p&gt;
&lt;p&gt;Extrapolating current trends, there will be no new single-author
papers in the sciences by approximately 2020.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The era of the single-author paper is over, and has been for a
while<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>. Especially in the sciences, where the trend towards longer author
lists is strongest, and accelerating the fastest. Physics is at the forefront,
with the first thousand-author paper recently published.</p>
<p>This is happening
without any loss of impact, i.e. team-authored papers have been getting more
citations than their solo-authored counterparts, and the gap is
widening.</p>
<p>Extrapolating current trends, there will be no new single-author
papers in the sciences by approximately 2020.</p>
<p><img src="../../media/449104958.png" alt=""/></p>
<p>The data only confirms what most people in the sciences already knew for a long
time. It is now completely a team activity. Each player is incredibly
specialized. So much so that to write a single paper, which itself is about
something highly specialized, requires a team of authors, each of whom has
specialized in one little part of <em>that</em>. You could be grinding away in a lab for months, doing experiments, generating data and analyzing it, and you could end up contributing only a few paragraphs.</p>
<p>Not even half a lifetime ago, the giants of science were comparable in stature to the size of their fields. But now, they are more like generals commanding vast armies to climb uphill. They might have the authority and the vision, but nobody, including themselves, believes even for a moment that they could have made their conquests without their armies.</p>
<p><strong>Special/General</strong></p>
<p>So should one specialize or generalize? It&rsquo;s a question of degree, but one can
still pick a direction: to know more and more about less and less, or to
sacrifice some depth to gain breadth.</p>
<p>In at least one study<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>, marked gains have been found for specialization. But
the study was done done in the context of pro football, and I&rsquo;m not sure about
its applicability to knowledge work.</p>
<p>However, all the macro-level forces are pushing researchers towards
specialization. The complexity simply demands it.</p>
<p>But then who has the bigger picture? Whose hands are on the rudder of this giant
ship of worker bees? More often than not, that person is a <em>technocrat</em>–a cross between a scientist and a bureaucrat. They are smart and technical enough to understand the work. They are good managers. They are great at selling the work to funding agencies. They are the ones keeping the lights on.</p>
<p>Just like in almost every other field of human endeavor, the middle is gradually being hollowed out. You start out as a lab rat. If you are really good, you will eventually become a technocrat. But if you are only mediocre, you will never be able to jump across the vast chasm between the two.</p>
<p>This is where deep specialization might actually end up hurting you. Because in order to be a technocrat you need to generalize. You need to know how your tiny little field fits into the bigger jigsaw puzzle. You need to convey this to the people with their hands on the purse strings.</p>
<p><strong>HAL, please list the experiments to be carried out</strong></p>
<p>At the end of Kevin Kelly&rsquo;s talk<sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">3</a></sup> about how science is carried out, someone asked an interesting question: “so we&rsquo;ve already seen the first thousand-author paper. When do you think we&rsquo;ll see the first zero-author paper?”</p>
<p>The answer to that question will probably define the nuts and bolts of how science is actually carried out in the future. If the totality of the knowledge in even a highly specialized field is beyond the comprehension of not just one but even a small team of humans, and if all they can hope to do is make a long series of small edits to the giant wiki of science<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">4</a></sup>, will we eventually turn to machines to summarize that knowledge into terms that can be readily understood, or going even further, suggest fruitful opportunities for investigation?</p>
<div class="footnotes" role="doc-endnotes">
<hr><ol><li id="fn:1" role="doc-endnote">
<p>The Increasing Dominance of Teams in Production of Knowledge, Stefan Wuchty, et al. Science 316, 1036 (2007) <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:2" role="doc-endnote">
<p>Does it pay to specialize? The story from the Gridiron, Rob Simmons and David Berri, Lancaster University Management School Working Paper 2007/044 <a href="#fnref:2" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:4" role="doc-endnote">
<p><a href="http://longnow.org/seminars/02006/mar/10/long-term-trends-in-the-scientific-method/">Kevin Kelly, The Next 100 Years of Science: Long-term Trends in the Scientific Method.</a> <a href="#fnref:4" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:3" role="doc-endnote">
<p><a href="http://blog.vivekhaldar.com/post/16229635176/repositories-of-science">Repositories of science</a> <a href="#fnref:3" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol></div>
]]></content:encoded>
    </item>
    
    <item>
      <title>How to debate</title>
      <link>http://vivekhaldar.com/articles/how-to-debate/</link>
      <pubDate>Tue, 21 Feb 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/how-to-debate/</guid>
      <description>&lt;p&gt;Rationalists believe that the way to convince people of a position is to present
them with facts (and implicitly, a few steps of inference) that will then &lt;em&gt;lead
them to believe that position.&lt;/em&gt; This view is driven by their belief in &lt;a href=&#34;http://blog.vivekhaldar.com/post/17766541433/rational-equivalence&#34;&gt;rational
equivalence&lt;/a&gt;. This works quite well with technical audiences, and
quite poorly with everyone else. I call this the &lt;em&gt;technical&lt;/em&gt; method.&lt;/p&gt;
&lt;p&gt;The &lt;em&gt;political&lt;/em&gt; method, on the other hand, targets &lt;em&gt;believers&lt;/em&gt; rather than
skeptics. Convincing people to switch is hard, but it is easier to give
believers even more reasons to strengthen their belief. Over time, the
believers, who are immune to changing their minds, will convert the undecideds.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Rationalists believe that the way to convince people of a position is to present
them with facts (and implicitly, a few steps of inference) that will then <em>lead
them to believe that position.</em> This view is driven by their belief in <a href="http://blog.vivekhaldar.com/post/17766541433/rational-equivalence">rational
equivalence</a>. This works quite well with technical audiences, and
quite poorly with everyone else. I call this the <em>technical</em> method.</p>
<p>The <em>political</em> method, on the other hand, targets <em>believers</em> rather than
skeptics. Convincing people to switch is hard, but it is easier to give
believers even more reasons to strengthen their belief. Over time, the
believers, who are immune to changing their minds, will convert the undecideds.</p>
<p>A recent paper<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> modeled precisely this effect, and backs up this tactic. Even
a small fraction (as little as 10%) of committed agents immmune to change can
rapidly convert the entire population to their position.</p>
<p>Note that the technical and political method differ not in their use of logic &ndash;
they both present facts and logic (or at least, what they perceive to be facts
and logic) &ndash; but in whom they target and how they are targeted.</p>
<div class="footnotes" role="doc-endnotes">
<hr><ol><li id="fn:1" role="doc-endnote">
<p>J. Xie et al, <a href="http://www.cs.rpi.edu/~szymansk/papers/pre.11.pdf">Social consensus through the influence of committed
minorities.</a> <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol></div>
]]></content:encoded>
    </item>
    
    <item>
      <title>Hookah</title>
      <link>http://vivekhaldar.com/articles/hookah/</link>
      <pubDate>Mon, 20 Feb 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/hookah/</guid>
      <description>&lt;p&gt;At the Indian Institute of Technology, New Delhi, we had a special name for the
humanities classes we were required to take to fulfill our non-technical course
credits. We called them hookah. A &lt;a href=&#34;http://en.wikipedia.org/wiki/Hookah&#34;&gt;hookah&lt;/a&gt; is a traditional smoking
instrument. Its name shared a first syllable with the word &amp;ldquo;humanities.&amp;rdquo; More
importantly, it symbolized that all these humanities classes were nothing but
blowing smoke. Why the hell were we forced to suffer through them?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>At the Indian Institute of Technology, New Delhi, we had a special name for the
humanities classes we were required to take to fulfill our non-technical course
credits. We called them hookah. A <a href="http://en.wikipedia.org/wiki/Hookah">hookah</a> is a traditional smoking
instrument. Its name shared a first syllable with the word &ldquo;humanities.&rdquo; More
importantly, it symbolized that all these humanities classes were nothing but
blowing smoke. Why the hell were we forced to suffer through them?</p>
<p>The students at the Institute believed in the religion of science and
reason. The entire modern world around them was built on it. And they were
learning the incantations that would one day allow them to be part of the
priesthood that creates it and cares for it and carries it forward. The baton of
progress and civilization would be passed on to them, and they would run with
it. Every (technical) class and textbook that they went through reinforced this
belief. Once they learned about the Fourier transform in their signals and
systems class, they looked around and were astounded by how much of the modern
world rested on that concept. The feeling was repeated with nearly every class
they took. They could&rsquo;t help but feel awe, quickly followed by a tingly sense of
power.</p>
<p>And then they had to go to some hookah, where a professor talked about art, or
sociology. There were no hard definitions. In fact, the biggest debates were
<em>about</em> definitions. E.g. &ldquo;What is art?&rdquo; The complexity was like quicksand,
all-envoloping, yet not something one could solidly stand on. In fact, the goal
was not to arrive at an &ldquo;answer&rdquo; but to find out how complex an issue could be.</p>
<p>It was only years (decades?) later that they realized that reason is not
everything, that people, not technology, are usually the bottleneck, and that
only by knowing the full range of the complexity of an issue can one hope to
understand what they&rsquo;re giving up when the time comes to collapse that
complexity down to a single choice.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Rational Equivalence</title>
      <link>http://vivekhaldar.com/articles/rational-equivalence/</link>
      <pubDate>Fri, 17 Feb 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/rational-equivalence/</guid>
      <description>&lt;p&gt;There is an implicit rule that most technical and engineering people grow into
over the course of their education. But even though it is implicit, it is
strong. Its violation causes great confusion. Most are confounded enough that
instead of reconciling the violation they simply learn to accept it, and move on
with life.&lt;/p&gt;
&lt;p&gt;What is this rule? I&amp;rsquo;m going to call it the &lt;em&gt;principle of rational equivalence&lt;/em&gt;:
two rational people, given the same set of facts, must arrive at identical
conclusions.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>There is an implicit rule that most technical and engineering people grow into
over the course of their education. But even though it is implicit, it is
strong. Its violation causes great confusion. Most are confounded enough that
instead of reconciling the violation they simply learn to accept it, and move on
with life.</p>
<p>What is this rule? I&rsquo;m going to call it the <em>principle of rational equivalence</em>:
two rational people, given the same set of facts, must arrive at identical
conclusions.</p>
<p>Of course, this is nothing but a fuzzy extension of <a href="http://en.wikipedia.org/wiki/Modus_ponens">modus ponens</a>, the very
bedrock of logic.</p>
<p>And of course, this is violated all the time in the real world. People see a
situation, which presumably is objectively invariant, and yet arrive at
completely opposing conclusions.</p>
<p>They are many explanations for the violation of rational equivalence (people are
not rational, the facts are incorrectly perceived, or even if people are
rational and the facts are correctly percieved, they make mistakes of logic etc
etc), but every time it happens it still confounds most rational technical
people. It&rsquo;s a cognitive blind spot. It&rsquo;s like one of those false proofs of
something absurd where you know the result can&rsquo;t be true, yet every step seems
legit.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Why I blog</title>
      <link>http://vivekhaldar.com/articles/why-i-blog/</link>
      <pubDate>Wed, 15 Feb 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/why-i-blog/</guid>
      <description>&lt;p&gt;In no particular order, the reasons that I blog:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;I love to write.&lt;/li&gt;
&lt;li&gt;Writing about something forces me to clarify my own understanding of it. Oftena thought rattles around in my head until I make an effort to write it out.&lt;/li&gt;
&lt;li&gt;I hope someone will correct me if I&amp;rsquo;m wrong, and I&amp;rsquo;ll learn.&lt;/li&gt;
&lt;li&gt;My blog collects my thoughts about stuff I read.&lt;/li&gt;
&lt;li&gt;I love the pageviews, retweets, likes, +1s. No, I&amp;rsquo;m not above that, as much as I&amp;rsquo;d like to be. Ironically, it is the analytics that expose the futility of chasing poopularity. Posts that I shot off often become popular, and posts that tortured me for months often sink without a trace.&lt;/li&gt;
&lt;/ul&gt;</description>
      <content:encoded><![CDATA[<p>In no particular order, the reasons that I blog:</p>
<ul><li>I love to write.</li>
<li>Writing about something forces me to clarify my own understanding of it. Oftena thought rattles around in my head until I make an effort to write it out.</li>
<li>I hope someone will correct me if I&rsquo;m wrong, and I&rsquo;ll learn.</li>
<li>My blog collects my thoughts about stuff I read.</li>
<li>I love the pageviews, retweets, likes, +1s. No, I&rsquo;m not above that, as much as I&rsquo;d like to be. Ironically, it is the analytics that expose the futility of chasing poopularity. Posts that I shot off often become popular, and posts that tortured me for months often sink without a trace.</li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>Carr and Kelly</title>
      <link>http://vivekhaldar.com/articles/carr-and-kelly/</link>
      <pubDate>Tue, 14 Feb 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/carr-and-kelly/</guid>
      <description>&lt;p&gt;Carr is the most eloquent and conscientious Luddite of our generation. Even though I disagree with much of what he says, his points are well-researched and sincere enough to instigate serious thought and make me re-examine and re-justify many of my pro-technology ideas.&lt;/p&gt;
&lt;p&gt;The perfect antidote to Carr is &lt;a href=&#34;http://kk.org&#34;&gt;Kevin Kelly&lt;/a&gt;. His &lt;a href=&#34;http://www.kk.org/books/what-technology-wants.php&#34;&gt;&amp;ldquo;What Technology Wants&amp;rdquo;&lt;/a&gt; is a thorough defense of the technological enterprise. What makes it special is that it is written largely from the point of view of a skeptic &amp;ndash; i.e. he is wary and distrustful of technology, yet ends up favoring it in the final analysis.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Carr is the most eloquent and conscientious Luddite of our generation. Even though I disagree with much of what he says, his points are well-researched and sincere enough to instigate serious thought and make me re-examine and re-justify many of my pro-technology ideas.</p>
<p>The perfect antidote to Carr is <a href="http://kk.org">Kevin Kelly</a>. His <a href="http://www.kk.org/books/what-technology-wants.php">&ldquo;What Technology Wants&rdquo;</a> is a thorough defense of the technological enterprise. What makes it special is that it is written largely from the point of view of a skeptic &ndash; i.e. he is wary and distrustful of technology, yet ends up favoring it in the final analysis.</p>
<p>A couple of previous posts instigated by Carr:</p>
<p><a href="http://blog.vivekhaldar.com/post/754002281/taylorism-in-the-modern-tech-industry">Taylorism in the modern tech industry</a></p>
<p><a href="http://blog.vivekhaldar.com/post/777274695/the-internet-is-making-us-smarter-but-is-it-making-me">The Internet is making us smarter, but is it making me stupid?</a></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Guru moment</title>
      <link>http://vivekhaldar.com/articles/guru-moment/</link>
      <pubDate>Sun, 12 Feb 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/guru-moment/</guid>
      <description>&lt;p&gt;Carrom was the favorite passtime at the hostel. I often spent a couple of hours
a day at the board. I was once playing someone much better than I. He was
reputed to be the best player in the hostel. It was late, so there were only the
two of us, and no crowd waiting for their turn at the board.&lt;/p&gt;
&lt;p&gt;We played a few turns. I was a little down, as expected. Then a funny thing
happened. It was my turn, and the board was particularly complicated. It would
take something fancy to drop a coin.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Carrom was the favorite passtime at the hostel. I often spent a couple of hours
a day at the board. I was once playing someone much better than I. He was
reputed to be the best player in the hostel. It was late, so there were only the
two of us, and no crowd waiting for their turn at the board.</p>
<p>We played a few turns. I was a little down, as expected. Then a funny thing
happened. It was my turn, and the board was particularly complicated. It would
take something fancy to drop a coin.</p>
<p>My opponent came over to my side of the board, analyzed it, and started
suggesting various shots.</p>
<p>&ldquo;What the hell are you doing? Why are you helping me? I&rsquo;m playing against you,
remember?&rdquo;</p>
<p>&ldquo;Who cares who&rsquo;s playing against whom? I want to make the game more
interesting.&rdquo;</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Repositories of science</title>
      <link>http://vivekhaldar.com/articles/repositories-of-science/</link>
      <pubDate>Sat, 21 Jan 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/repositories-of-science/</guid>
      <description>&lt;p&gt;The first scientific paper with more than 1000 authors (1055, to be precise) was
published recently&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;. It documented the first results from the large hadron
collider.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;I think a paper in a journal is an antiquated way to desseminate results this
complex, created by teams this big.&lt;/p&gt;
&lt;p&gt;There is a precedent for a system that can track, manage and publish the work of
large teams on a single, though complex, artifact &amp;ndash; source
control. Particularly, distributed source control systems such as git.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The first scientific paper with more than 1000 authors (1055, to be precise) was
published recently<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">1</a></sup>. It documented the first results from the large hadron
collider.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">2</a></sup></p>
<p>I think a paper in a journal is an antiquated way to desseminate results this
complex, created by teams this big.</p>
<p>There is a precedent for a system that can track, manage and publish the work of
large teams on a single, though complex, artifact &ndash; source
control. Particularly, distributed source control systems such as git.</p>
<p>Consider an alternative publishing model based on source control that works as
follows:</p>
<ul><li>all artifacts for the project (or at least, those that can be digitized)
<em>must</em> be checked in. Documents. Scripts. Data analysis. Raw data from
experiments. Lab notes. Diagrams. Everything.</li>
<li>every &ldquo;commit&rdquo; is subject to rigorous review by your peers. For day-to-day
commits this will usually be your immediate team members. For more substantial
&ldquo;commits&rdquo; or results, external reviewers may be called.</li>
</ul><p>Compared to the existing model of writing papers and submitting them to
journals, this model has a number of advantages:</p>
<ul><li>the progress of the project can be accurately traced over time, by looking at
the history of commits.</li>
<li>questions about results are easily answered. &ldquo;How did you arrive at this
table?&rdquo; &ldquo;Let me go look at the commit.&rdquo; There are no throwaway scripts lying
around in people&rsquo;s home directories that are lost. Every analysis is
reproducible.</li>
<li>individual contributions are clear. Just look at a person&rsquo;s commit history.</li>
<li>the process of producing scientific results can be clearly seen. With journal
papers, one could only see the end result of a long series of experiments and
analysis, rarely getting a glimpse into the meandering path which brought the
investigators there. By looking at not just the commits, but the comments made
during their review, one can get a deeper insight into that path.</li>
<li>collaboration across sites and universities is simplified. Ideally you
wouldn&rsquo;t even need permission. Repositories would be world-readable and you
could simply &ldquo;pull&rdquo; from them. If you spot a problem or have a contribution to
make, you don&rsquo;t even need to be part of that group. Pull, fix, then request a
review for your &ldquo;patch&rdquo;.</li>
</ul><p>What would a &ldquo;paper&rdquo; look like in this world? It would be a high-level journey
explaining the big picture of the repository in question, linking copiously to
artifacts in it. Almost like a top-level README. The curious would be free to
dig into the commits or series of commits they&rsquo;re more interested in.</p>
<p>What would a &ldquo;journal&rdquo; look like in this world? It would be nothing but a <em>link
aggregator</em>, pointing to repositories of projects and experiments the editors
deem worthy. You could cut editors out altogether, and move to a voting model
like Hacker News or Reddit.</p>
<div class="footnotes" role="doc-endnotes">
<hr><ol><li id="fn:2" role="doc-endnote">
<p><a href="http://www.mendeley.com/research/first-protonproton-collisions-lhc-observed-alice-detector-measurement-chargedparticle-pseudorapidity-density-s900-gev/">First proton&ndash;proton collisions at the LHC as observed with the ALICE detector</a> <a href="#fnref:2" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:1" role="doc-endnote">
<p>It would be an interesting back-story to see how the line for
authorship was drawn. Certainly there were many people who contributed who
didn&rsquo;t make it into the author list. <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol></div>
]]></content:encoded>
    </item>
    
    <item>
      <title>Computation in the wild</title>
      <link>http://vivekhaldar.com/articles/computation-in-the-wild/</link>
      <pubDate>Wed, 18 Jan 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/computation-in-the-wild/</guid>
      <description>&lt;p&gt;Karl Schroeder wonders why SETI has come up empty-handed&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;The mystery deepens almost by the day, because we&amp;rsquo;ve now identified 700
  extrasolar planets and the count is increasing rapidly. We should shortly be
  racking up lists of Earthlike worlds, and we&amp;rsquo;re closing in on good estimates of
  how many there must be in our galaxy. And the number is in the billions. So one
  central argument against the existence of alien life&amp;ndash;the &amp;lsquo;rare Earth&amp;rsquo; argument
  that environments to host it must be rare&amp;ndash;has been more or less disproven. And
  that, just this year.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Karl Schroeder wonders why SETI has come up empty-handed<sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">1</a></sup>.</p>
<blockquote>
  <p>The mystery deepens almost by the day, because we&rsquo;ve now identified 700
  extrasolar planets and the count is increasing rapidly. We should shortly be
  racking up lists of Earthlike worlds, and we&rsquo;re closing in on good estimates of
  how many there must be in our galaxy. And the number is in the billions. So one
  central argument against the existence of alien life&ndash;the &lsquo;rare Earth&rsquo; argument
  that environments to host it must be rare&ndash;has been more or less disproven. And
  that, just this year.</p>
</blockquote>
<p>He summarises with a quote that is sure to become as iconic as Clarke&rsquo;s
original, on which it is a riff:</p>
<blockquote>
  <p>&hellip;<strong>any sufficiently advanced technology is indistinguishable from
  Nature</strong>. Basically, either advanced alien civilizations don&rsquo;t exist, or we
  can&rsquo;t see them because they are indistinguishable from natural systems. &hellip; It
  amounts to saying that the universe provides us with a picture of the ultimate
  end-point of technological development. In the Great Silence, we see the future
  of technology, and it lies in achieving greater and greater efficiencies, until
  our machines approach the thermodynamic equilibria of their environment, and our
  economics is replaced by an ecology where nothing is wasted. After all, SETI is
  essentially a search for technological waste products: waste heat, waste light,
  waste electromagnetic signals. We merely have to posit that successful
  civilizations don&rsquo;t produce such waste, and the failure of SETI is explained.</p>
</blockquote>
<p>When I first read that the explanation didn&rsquo;t sit right with me. It took me a
while to express why.</p>
<p>There is a school of thought that views bits, not atoms, as the fundamental
building block of the universe. The march of civilization is nothing but an
evolution towards more and more sophisticated information structures, and deeper
and deeper stacks of abstraction. Living organisms are ephemeral, their true
purpose being to transport, mutate and advance the information substrate from
whence they came.</p>
<p>Whether you agree with this school of thought or not, the trend is
indisputable. Civilisation <em>is</em> nothing but a giant, distributed, continously
evolving information structure. To lose knowledge is equivalent to going back in
time. The fastest growing thing in the world is information.</p>
<p>And central to the information is acting on it, and changing it, and refining
it. In other words, <em>computing</em>. Civilization would be unthinkable without
intricate and advanced information processing and computation.</p>
<p>So how does that square with Schroeder&rsquo;s deduction? If civilization ultimately
&ldquo;re-wilds&rdquo;, where is all the information and computation? Do we give all that
up?</p>
<p>That seems like a pretty anti-climactic end to all this.</p>
<p>Then I ran into this paper<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">2</a></sup> that surveys how computation and biology can
take inspiration from each other: new algorithms that mimic biological systems,
and computational models that help understand biological systems.</p>
<p>I&rsquo;ve also noticed that large computer systems display organic behavior<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup>.</p>
<p>That in turn led me this paper<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">4</a></sup> which was one of the first in the field of
<em>molecular computation</em>. The abstract:</p>
<blockquote>
  <p>The tools of molecular biology are used to solve an instance of the directed
  Hamiltonian path problem. A small graph is encoded in molecules of DNA and the
  &ldquo;operations&rdquo; of the computation are performed with standard protocols and
  enzymes. This experiment demonstrates the feasibility of carrying out
  computations at the molecular level.</p>
</blockquote>
<p>Aha! That opens up a line of progress that is compatible with preserving
computation and moving technology closer to nature. We can <em>embed</em> computation
in nature, at microscopic levels.</p>
<p>Even better, computation at the molecular level turns out to be potentially extremely enery
efficient:</p>
<blockquote>
  <p>&hellip;in principle 1 joule is suffcient for approximately 2 * 10^19 such
  operations. This is remarkable energy effciency considering that the second law
  of thermodynamics dictates a theoretical maximum of 34 * 10^19 (irreversible)
  operations per joule.  Existing supercomputers are far less energy effcient;
  executing at most 10^9 operations per joule.</p>
</blockquote>
<p>I feel better now.</p>
<div class="footnotes" role="doc-endnotes">
<hr><ol><li id="fn:4" role="doc-endnote">
<p><a href="http://www.kschroeder.com/weblog/archive/2011/11/30/the-deepening-paradox">The deepening paradox</a> <a href="#fnref:4" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:1" role="doc-endnote">
<p><a href="http://www.nature.com/msb/journal/v7/n1/full/msb201178.html">Algorithms in nature: the convergence of systems biology and
computational thinking, Molecular Systems Biology 7: 546</a> <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:3" role="doc-endnote">
<p><a href="http://blog.vivekhaldar.com/post/6972614229/large-computer-systems-are-organic">Large computer systems are organic</a> <a href="#fnref:3" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:2" role="doc-endnote">
<p><a href="http://www.usc.edu/dept/molecular-science/papers/fp-sci94.pdf">Molecular Computation Of Solutions To Combinatorial
Problems</a> <a href="#fnref:2" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol></div>
]]></content:encoded>
    </item>
    
    <item>
      <title>The CS assignment I wish I had</title>
      <link>http://vivekhaldar.com/articles/the-cs-assignment-i-wish-i-had/</link>
      <pubDate>Tue, 10 Jan 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-cs-assignment-i-wish-i-had/</guid>
      <description>&lt;p&gt;When I came out of academia and started working in the real world, by far the
biggest gap in my CS education was that I had no idea of the real &lt;strong&gt;monetary
cost&lt;/strong&gt;, and associated tradeoffs, of accomplishing computational tasks.&lt;/p&gt;
&lt;p&gt;With the goal of rectifying that, I wish I had been given the following
assignments in some sort of advanced systems course, where people work in teams
and the team with the maximum metric for the assignment &amp;ldquo;wins&amp;rdquo;:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>When I came out of academia and started working in the real world, by far the
biggest gap in my CS education was that I had no idea of the real <strong>monetary
cost</strong>, and associated tradeoffs, of accomplishing computational tasks.</p>
<p>With the goal of rectifying that, I wish I had been given the following
assignments in some sort of advanced systems course, where people work in teams
and the team with the maximum metric for the assignment &ldquo;wins&rdquo;:</p>
<p><strong>Offline or batch:</strong> sort as many integers as you can in 1 hour <em>on a computer that costs $1000.</em></p>
<p><strong>Online queries:</strong> Build a plain text search and indexing system, and reply to
as many queries per second as you can <em>on a computer that costs $1000.</em></p>
<p>To keep the playing field level, the instructor should set the cost of various
components (CPU, disk, RAM, flash, network) to be the same for the entire
class. You are free to build your computer as you wish, as long as you stay within budget.</p>
<p>Perhaps you can do better with <em>two</em> computers, each of which costs $500. Go
wild.</p>
<p>Every year, the instructor should index the costs against the market, and either
make components cheaper, or decrease the overall allowed budget. That way students can compete not just with their own class, but classes of previous years as well. Just for fun, the instructor should maintain an all-time leaderboard.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Iteration</title>
      <link>http://vivekhaldar.com/articles/iteration/</link>
      <pubDate>Wed, 04 Jan 2012 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/iteration/</guid>
      <description>&lt;p&gt;Consider the acclaimed painting by Matisse, &lt;em&gt;Large Reclining Nude&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;It is a landmark piece of abstract art. But what made it special was that Matisse documented the evolution of the work from beginning to end, taking photographs of the intermediate phases over the five months he worked on it&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;. It started with some realistic depth and detail, and ended up with an abstract representation. And the journey was visible.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../media/449104958.png&#34; alt=&#34;&#34;/&gt;&lt;img src=&#34;../../media/449104958.png&#34; alt=&#34;&#34;/&gt;&lt;img src=&#34;../../media/449104958.png&#34; alt=&#34;&#34;/&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Consider the acclaimed painting by Matisse, <em>Large Reclining Nude</em>.</p>
<p>It is a landmark piece of abstract art. But what made it special was that Matisse documented the evolution of the work from beginning to end, taking photographs of the intermediate phases over the five months he worked on it<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>. It started with some realistic depth and detail, and ended up with an abstract representation. And the journey was visible.</p>
<p><img src="../../media/449104958.png" alt=""/><img src="../../media/449104958.png" alt=""/><img src="../../media/449104958.png" alt=""/></p>
<p>And the culmination:</p>
<p><img src="../../media/449104958.png" alt=""/></p>
<p>Matisse said<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">2</a></sup>: “Supposing I want to paint the body of a woman: first of all I endow it with grace and charm, but I know that something more than that is necessary. I try to condense the meaning of this body by drawing its essential lines. The charm will then become less apparent at first glance, but in the long run it will begin to emanate from the new image. The image at the same time will be enriched by a wider meaning, a more comprehensively human one …”</p>
<p>Then there’s <em>The Bull</em>, by Picasso <sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">3</a></sup>.</p>
<p>It starts like this…</p>
<p><img src="../../media/449104958.png" alt=""/></p>
<p>… evolves to this…</p>
<p><img src="../../media/449104958.png" alt=""/></p>
<p>… and this …</p>
<p><img src="../../media/449104958.png" alt=""/></p>
<p>and ends up at:</p>
<p><img src="../../media/449104958.png" alt=""/></p>
<p>In both these cases, you can see the exploration, but with a clear direction. You can behold not just the work of art, but how it got to be what it is.</p>
<div class="footnotes" role="doc-endnotes">
<hr><ol><li id="fn:1" role="doc-endnote">
<p><a href="http://www.thejewishmuseum.org/site/pages/uploaded_media/cone/matisse/index.html">Evolution of Large Reclining Nude</a> <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:3" role="doc-endnote">
<p><a href="http://www.andrewgrahamdixon.com/archive/readArticle/185%C2%A0">http://www.andrewgrahamdixon.com/archive/readArticle/185 </a><a href="#fnref:3" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:2" role="doc-endnote">
<p><a href="http://www.artyfactory.com/art_appreciation/animals_in_art/pablo_picasso/pablo_picasso.htm">Evolution of the Bull</a> <a href="#fnref:2" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol></div>
]]></content:encoded>
    </item>
    
    <item>
      <title>Best of 2011</title>
      <link>http://vivekhaldar.com/articles/best-of-2011/</link>
      <pubDate>Wed, 28 Dec 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/best-of-2011/</guid>
      <description>&lt;p&gt;Traffic grew 7X in 2011, compared to 2010. Here&amp;rsquo;s a round up of the most popular posts of 2011.&lt;/p&gt;
&lt;p&gt;Thanks for reading!&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href=&#34;http://blog.vivekhaldar.com/post/10669678292/size-is-the-best-predictor-of-code-quality&#34;&gt;Size is the best predictor of code quality&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.vivekhaldar.com/post/3339907908/the-cognitive-style-of-unix&#34;&gt;The Cognitive Style of Unix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.vivekhaldar.com/post/8950163616/gui-vs-cli-operation-vs-expression&#34;&gt;GUI vs. CLI: Operation vs. Expression&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.vivekhaldar.com/post/10126017769/smeeds-law-for-programming&#34;&gt;Smeed&amp;rsquo;s Law for Programming&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.vivekhaldar.com/post/5667398073/stallmans-dystopia&#34;&gt;Stallman&amp;rsquo;s dystopia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.vivekhaldar.com/post/2525332092/minimalism-is-not-a-viable-intellectual-strategy&#34;&gt;Minimalism is not a viable intellectual strategy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.vivekhaldar.com/post/1649745633/editing-google-docs-in-emacs&#34;&gt;Editing Google Docs in Emacs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.vivekhaldar.com/post/4525315474/oop-fp&#34;&gt;OOP = FP?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Also:  &lt;a href=&#34;http://blog.vivekhaldar.com/post/2541096073/best-of-2010&#34;&gt;Best of 2010&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Traffic grew 7X in 2011, compared to 2010. Here&rsquo;s a round up of the most popular posts of 2011.</p>
<p>Thanks for reading!</p>
<ul><li><a href="http://blog.vivekhaldar.com/post/10669678292/size-is-the-best-predictor-of-code-quality">Size is the best predictor of code quality</a></li>
<li><a href="http://blog.vivekhaldar.com/post/3339907908/the-cognitive-style-of-unix">The Cognitive Style of Unix</a></li>
<li><a href="http://blog.vivekhaldar.com/post/8950163616/gui-vs-cli-operation-vs-expression">GUI vs. CLI: Operation vs. Expression</a></li>
<li><a href="http://blog.vivekhaldar.com/post/10126017769/smeeds-law-for-programming">Smeed&rsquo;s Law for Programming</a></li>
<li><a href="http://blog.vivekhaldar.com/post/5667398073/stallmans-dystopia">Stallman&rsquo;s dystopia</a></li>
<li><a href="http://blog.vivekhaldar.com/post/2525332092/minimalism-is-not-a-viable-intellectual-strategy">Minimalism is not a viable intellectual strategy</a></li>
<li><a href="http://blog.vivekhaldar.com/post/1649745633/editing-google-docs-in-emacs">Editing Google Docs in Emacs</a></li>
<li><a href="http://blog.vivekhaldar.com/post/4525315474/oop-fp">OOP = FP?</a></li>
</ul><p>Also:  <a href="http://blog.vivekhaldar.com/post/2541096073/best-of-2010">Best of 2010</a></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>How to make your new programming language successful</title>
      <link>http://vivekhaldar.com/articles/how-to-make-your-new-programming-language-successful/</link>
      <pubDate>Mon, 26 Dec 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/how-to-make-your-new-programming-language-successful/</guid>
      <description>&lt;p&gt;Say you have cooked up a brand-new programming language. Now what can you do to dislodge the incumbents and have your language take over the world?&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Be incremental.&lt;/strong&gt; Your new programming language must be understandable in terms of concepts that most programmers already understand. If you are going into new territory, you must justify it with shortcomings in the incumbents.&lt;/p&gt;
&lt;p&gt;C, which was probably the biggest jump we have ever seen in terms of how different it was from other languages of the time, i.e. assembly specific to your hardware architecture, was all the same close enough to the metal that one could conceptualize the assembly code corresponding to a snippet of C code.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Say you have cooked up a brand-new programming language. Now what can you do to dislodge the incumbents and have your language take over the world?</p>
<ol><li><p><strong>Be incremental.</strong> Your new programming language must be understandable in terms of concepts that most programmers already understand. If you are going into new territory, you must justify it with shortcomings in the incumbents.</p>
<p>C, which was probably the biggest jump we have ever seen in terms of how different it was from other languages of the time, i.e. assembly specific to your hardware architecture, was all the same close enough to the metal that one could conceptualize the assembly code corresponding to a snippet of C code.</p>
<p>C++ grafted the concept of classes and objects on to C in a manner that would provide the gentlest on-ramp for C programmers. In fact, the earliest C++ compilers did not emit machine code, but simply compiled C++ down to C, and then used the C compiler.</p>
<p>Repeating the same script, Java adopted a syntax that would make C and C++ programmers feel right at home. By the time it was introduced, most programmers were comfortable with object-oriented concepts.</p></li>
<li><p><strong>Ride a platform.</strong> Languages are incidental. What people really adopt are <em>platforms</em>. So if you want a language to be successful, you should tie it to a rising platform early in both their lives.</p>
<p>C got popular on the back of UNIX.</p>
<p>JavaScript rode the browser and the web.</p>
<p>Ruby got popular because people wanted Rails.</p></li>
<li><p><strong>Get taught in computer science courses.</strong> It really helps when the next generation of programmers are already familiar with your language when they graduate.</p></li>
</ol><p>These are all necessary, but not sufficient conditions. If you look at the long list of programming languages which have failed to achieve mass usage, you will see that they did not satisfy one or more of the above.</p>
<p>PS: what counts as success for a programming language is itself complex and open to much debate. For the purposes of this article, I equate success with mass usage and popularity.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>The 0.1x developer</title>
      <link>http://vivekhaldar.com/articles/the-01x-developer/</link>
      <pubDate>Tue, 06 Dec 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-01x-developer/</guid>
      <description>&lt;p&gt;One of the strongest myths in software is that of the 10x developer. The one who is 10 times more productive than the average developer. It keeps coming up again and again. I most recently saw a reference to it in Venkat’s Developeronomics piece&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;It is a fallacy. Not in the sense that certain developers aren&amp;rsquo;t 10 times as productive as the average, but in the &lt;em&gt;way&lt;/em&gt; they achieve that productivity.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>One of the strongest myths in software is that of the 10x developer. The one who is 10 times more productive than the average developer. It keeps coming up again and again. I most recently saw a reference to it in Venkat’s Developeronomics piece<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>.</p>
<p>It is a fallacy. Not in the sense that certain developers aren&rsquo;t 10 times as productive as the average, but in the <em>way</em> they achieve that productivity.</p>
<p>People often think that the 10x developer can churn out tons of code in short periods of time, or build massive systems from scratch. That might be true, but it is a side effect, not the root cause of their productivity. These days, if you auto complete 10 times in a decent Java IDE, you can end up with a few hundred lines of code. In fact, seasoned developers often look at a high rate of writing code with suspicion, because the number of bugs you write goes up with the number of lines of code you write<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup><sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup>.</p>
<p>10x developers achieve their productivity by focusing on the 0.1x   of the solution that will have   the greatest impact.   What makes them special  is their ability to figure out  what that one tenth is.  And then blind out everything else. This usually requires a deep understanding not just of the technical aspects of the solution, but also the underlying business problems<sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup>.</p>
<p>So,  recruiters should actually be looking for 0.1x  developers,  not 10x  developers.</p>
<div class="footnotes" role="doc-endnotes">
<hr><ol><li id="fn:1" role="doc-endnote">
<p><a href="http://www.readability.com/articles/c1xma652">The Rise of Developernomics</a> <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:2" role="doc-endnote">
<p><a href="http://blog.vivekhaldar.com/post/10669678292/size-is-the-best-predictor-of-code-quality">Size is the best predictor of code quality</a> <a href="#fnref:2" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:3" role="doc-endnote">
<p><a href="http://blog.vivekhaldar.com/post/10126017769/smeeds-law-for-programming">Smeed’s Law for programming</a> <a href="#fnref:3" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:4" role="doc-endnote">
<p><a href="http://blog.vivekhaldar.com/post/10968747879/why-developers-should-learn-the-economics-of-code">Why developers should learn the economics of code</a> <a href="#fnref:4" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol></div>
]]></content:encoded>
    </item>
    
    <item>
      <title>The monk tax</title>
      <link>http://vivekhaldar.com/articles/the-monk-tax/</link>
      <pubDate>Mon, 05 Dec 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-monk-tax/</guid>
      <description>&lt;p&gt;The idea of going to college seems to be falling out of favor. It&amp;rsquo;s expensive, and not all that useful, and saddles most graduates with debt, the naysayers argue. All this, in spite of incontrovertible data that education still pays&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;. But I want to draw our attention not to college, not to how they are administered, not to those who pass through them, but to that which contains all of these–the University.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The idea of going to college seems to be falling out of favor. It&rsquo;s expensive, and not all that useful, and saddles most graduates with debt, the naysayers argue. All this, in spite of incontrovertible data that education still pays<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">1</a></sup>. But I want to draw our attention not to college, not to how they are administered, not to those who pass through them, but to that which contains all of these–the University.</p>
<p>66 institutions have had an unbroken existence from the 16th century to the present day, and of those, 62 are universities<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">2</a></sup>. This is an astonishing fact given that universities wield almost no power, and compared to other institutions such as parliaments or corporations, have very little impact in the short term. This longevity can only be explained by the fact that we as a society recognize at some deep, unstated level that universities are crucial and worth preserving.</p>
<p>But crucial to what, and how?</p>
<p>In the ancient world, Buddhist monks would go from door to door asking for alms. They were called <em>bhikku</em>, or <em>bhikshu</em> <sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup>, which stems from the Sanskrit root for “beg” (<em>bhik</em>). This pattern is repeated in all major religions. All have a monastic tradition, and one that usually survives on charity.</p>
<p>The earliest universities were nothing but learning monasteries<sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup>. From the dawn of civilization society has been paying a “monk tax”, supporting those who have to some extent checked out from the turbulence of day-to-day life to focus deeply on something for the longer-term.</p>
<p>In this sense, universities are like the seed corn of civilization. Eating your seed corn might fill you now, but will surely lead to famine in the future.</p>
<p>And now we have come full circle. In the modern world, if you want to check out from the turbulence of day-to-day life to focus deeply on something, but not in a religious way, and do so surrounded by a few kindred souls, the place to do that is a university.</p>
<p>At their core, universities are modern, secular monasteries.</p>
<div class="footnotes" role="doc-endnotes">
<hr><ol><li id="fn:2" role="doc-endnote">
<p><a href="http://www.bls.gov/emp/ep_chart_001.htm">Education Pays</a> <a href="#fnref:2" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:1" role="doc-endnote">
<p><a href="http://www.cs.utexas.edu/users/EWD/transcriptions/EWD11xx/EWD1175.html">The Strengths of The Academic Enterprise, Edsger W. Dijkstra</a> <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:3" role="doc-endnote">
<p><a href="http://en.wikipedia.org/wiki/Bhikkhu">Bhikku</a> <a href="#fnref:3" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:4" role="doc-endnote">
<p><a href="http://www.cwrl.utexas.edu/~bump/OriginUniversities.html">The Origin of Universities</a> <a href="#fnref:4" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol></div>
]]></content:encoded>
    </item>
    
    <item>
      <title>The programming assembly-line</title>
      <link>http://vivekhaldar.com/articles/the-programming-assemblyline/</link>
      <pubDate>Wed, 23 Nov 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-programming-assemblyline/</guid>
      <description>&lt;p&gt;I read Matthew Crawford&amp;rsquo;s book, &amp;ldquo;Shop Class as Soul Craft&amp;rdquo;&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;, nearly 2 years ago,
and in that time no other book has been on my mind more. There are things about
it that ring deeply true to me, and others I think are deeply
misunderstood. What&amp;rsquo;s worse, the topic is so raw and close to my heart that the
thought of writing about it makes me singe. Anyway, here goes.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I read Matthew Crawford&rsquo;s book, &ldquo;Shop Class as Soul Craft&rdquo;<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">1</a></sup>, nearly 2 years ago,
and in that time no other book has been on my mind more. There are things about
it that ring deeply true to me, and others I think are deeply
misunderstood. What&rsquo;s worse, the topic is so raw and close to my heart that the
thought of writing about it makes me singe. Anyway, here goes.</p>
<p>The book is a philosophical meditation on the concept of work. What makes work
meaningful, satisfying and enjoyable? What makes it dull, boring and soul
crushing? He talks about how blue-collar work can be intellectually challenging
and satisfying, and how white-collar &ldquo;knowledge work&rdquo; can be repetitive and
stultifying. Whether or not you agree with his conclusions, his examination of
the underlying issues is stimulating, and is peppered with colorful and
entertaining episodes from his own life. He was the director of a Washington
think tank, but ended up as the proprietor of a bike repair shop specializing in
Japanese motor bikes. So he speaks from experience on both sides of the fence,
which already gives him more credibility than most authors on the topic. If you
want a shorter introduction to some of the core issues discussed in the book,
read these two<sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">2</a></sup> essays<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup> by him.</p>
<p>The primary culprit for the dehumanization of work, according to Crawford, is
Taylorism. So we must look at that first, and then we will loop back to what all
this has to do with programmers and programming.</p>
<p><strong>Taylorism</strong></p>
<p>Taylorism is so deeply ingrained in every aspect of not just modern commerce but
life in general that it is almost impossible to identify it. Just like a fish
doesn&rsquo;t even know that it is in water. If you haven&rsquo;t read his &ldquo;Principles of
Scientific Management&rdquo;<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">4</a></sup>, it is a short and easy read, and now available free on
Project Gutenberg. After reading it, you will realize that it is one of the
founding documents of modern life, as well as the progenitor of the &ldquo;business
book&rdquo; category.</p>
<p>Briefly, Taylorism has two central tenets:</p>
<ol><li><strong>Measurement</strong>: associate metrics with all aspects of work.</li>
<li><strong>The separation of thinking and doing</strong>: An educated class of managers
measures and plans all the work, and is responsible for the overall process,
while a class of laborers carries out the implementation of those plans.</li>
</ol><p>Taylor was convinced that the laborers he was studying were
&ldquo;soldiering&rdquo;&ndash;knowingly working slowly to maintain work and wages for all their
brethren.</p>
<p>Consider this dialogue that Taylor had with a worker in order to
convince him to move more pig iron:</p>
<blockquote>
  <p>&ldquo;Schmidt, are you a high-priced man?&rdquo;</p>
  <p>&ldquo;Vell, I don&rsquo;t know vat you mean.&rdquo;</p>
  <p>&ldquo;Oh, come now, you answer my questions. what I want to find out is whether you
  are a high-priced man or one of these cheap fellows here. What I want to find
  out is whether you want to earn $1.85 a day or whether you are satisfied with
  $1.15, just the same as all those cheap fellows are getting.&rdquo;</p>
  <p>&ldquo;Did I vant $1.85 a day? Vas dot a high-priced man? Vell, yes, I vas a
  high-priced man.&rdquo;</p>
  <p>&ldquo;Well, if you are a high-priced man, you will load that pig iron on that car
  to-morrow for $1.85. Now do wake up and answer my question. Tell me whether you
  are a high-priced man or not.&rdquo;</p>
  <p>&ldquo;Vell&ndash;did I got $1.85 for loading dot pig iron on dot car to-morrow?&rdquo;</p>
  <p>&ldquo;Yes, of course you do, and you get $1.85 for loading a pile like that every day
  right through the year. That is what a high-priced man does, and you know it
  just as well as I do.&rdquo;</p>
  <p>&ldquo;Vell, den, I vas a high-priced man.&rdquo;</p>
  <p>&ldquo;Now, hold on, hold on. <strong>You know just as well as I do that a high-priced man
  has to do exactly as he&rsquo;s told from morning till night</strong>.  Well, if you are a
  high-priced man, you will do exactly as this man tells you to-morrow, from
  morning till night. When he tells you to pick up a pig and walk, you pick it up
  and you walk, and when he tells you to sit down and rest, you sit down. You do
  that right straight through the day. And what&rsquo;s more, no back talk. Now a
  high-priced man does just what he&rsquo;s told to do, and no back talk. Do you
  understand that? When this man tells you to walk, you walk; when he tells you to
  sit down, you sit down, and you don&rsquo;t talk back at him. Now you come on to work
  here to-morrow morning and I&rsquo;ll know before night whether you are really a
  high-priced man or not.&rdquo;</p>
</blockquote>
<p>(emphasis mine)</p>
<p>The net effect of all this was that the worker could, under the appropriate
supervision, now load 47 tons of iron a day, up from his previous 12 &frac12; tons a
day. He got a 60% pay raise, while the company moving the iron decreased its
labor per ton by about the same percentage (from 9.2 c/ton to 3.9 c/ton). But
another windfall for the company was the saving in time. Previously, moving 100
tons using 2 workers would have taken 4 days, whereas now it would take just a
little over 1 day.</p>
<p><strong>The assembly line</strong></p>
<p>The earliest well-known enterprise to go whole-hog Taylorist was Ford, with its
assembly line for manufacturing cars. The world never looked back.</p>
<p>The assembly line with narrowly specialized roles for each worker is a
consequence of the thinking/doing separation. The smarts are in the process, the
assembly line. The workers operating it are fungible. Of course, the workers did
not like this at all. Skilled craftsmen that built entire artifacts were
replaced with machines that required only semi-skilled operators churning out
one tiny part of the whole. The pace of their work was determined by the speed
of the assembly-line, which was set by managers. They had lost all autonomy and
control over their work. Their work had been de-skilled. The transfer of power
from skilled, knowledgeable craft workers to &ldquo;the management&rdquo; was sealed. Ford
made this palatable by paying his workers high wages.<sup id="fnref:14"><a href="#fn:14" class="footnote-ref" role="doc-noteref">5</a></sup></p>
<p>In his book, Dan Pink<sup id="fnref:15"><a href="#fn:15" class="footnote-ref" role="doc-noteref">6</a></sup> talks about the three factors that make work
meaningful: autonomy, mastery and purpose. The fungible non-distinguishable
worker manning the assembly line was stripped of all three.</p>
<p><strong>The drive to specialize</strong></p>
<p>The seeds of Taylorism go back to 1817, when David Ricardo outlined the
principle of <em>comparitive advantage</em>. He explained how two parties could gain by
making goods they were efficient at and then trading with each other, even if
each of them could make the traded good on its own. So even if the other party
is worse than you at making something, you are better off trading and focusing on
your specialty, because of the saved opportunity costs. (See the Wikipedia
article for a number of concrete examples<sup id="fnref:10"><a href="#fn:10" class="footnote-ref" role="doc-noteref">7</a></sup>).</p>
<p>The undeniable math of comparitive advantage is the natural driver for
specialization. Taylor brought the concept down from the level of countries to
individual workers.</p>
<p><strong>What does this have to do with writing software?</strong></p>
<p>The field of software engineering was built on firmly Taylorist principles. It
had no other choice, because that was the default school of thought.</p>
<p>In 1968, NATO called a conference on the subject of &ldquo;software engineering&rdquo; (the
field did not have a name back then, and NATO&rsquo;s pick of terminology
stuck)<sup id="fnref:9"><a href="#fn:9" class="footnote-ref" role="doc-noteref">8</a></sup>. The industry was having a lot of trouble creating large and complex
software, and it was about time something was done about it.</p>
<p>Doug McIlroy expressed what  became the rallying cry for the field:
&ldquo;The software industry is not industrialized&rdquo;!<sup id="fnref:8"><a href="#fn:8" class="footnote-ref" role="doc-noteref">9</a></sup> He said:</p>
<blockquote>
  <p>Software production today appears in the scale of industrialization somewhere
  below the more backward construction industries.  I think its proper place is
  considerably higher, and would like to investigate the prospects for
  mass-production techniques in software.  In the phrase &ldquo;mass production
  techniques,&rdquo; my emphasis is on &ldquo;techniques&rdquo; and not on mass production plain.
  Of course mass production, in the sense of limitless replication of a prototype,
  is trivial for software.  But certain ideas from industrial technique I claim
  are relevant.  The idea of subassemblies carries over directly and is well
  exploited.  The idea of interchangeable parts corresponds roughly to our term
  `modularity,&rsquo; and is fitfully respected.  The idea of machine tools has an
  analogue in assembly programs and compilers.  Yet this fragile analogy is belied
  when we seek for analogues of other tangible symbols of mass production.  There
  do not exist manufacturers of standard parts, much less catalogues of standard
  parts.  One may not order parts to individual specifications of size,
  ruggedness, speed, capacity, precision or character set.</p>
</blockquote>
<p>More than 40 years later that still remains the Holy Grail of software
engineering.</p>
<p>McIlroy envisioned a world where we would be constructing software by picking
components off a shelf, and snapping them together like Legos. The hard work
would be building the right blocks, and then it would be easy to snap them
together.</p>
<p>Later, Osterweil played a neat recursive trick and argued that the <em>process</em> of
making software could be expressed as software too<sup id="fnref:17"><a href="#fn:17" class="footnote-ref" role="doc-noteref">10</a></sup>. The implication was that
it could be <em>executed</em>, just like software.</p>
<p>In some ways this vision has come true, in other ways, it hasn&rsquo;t.</p>
<p>The biggest example of how the dream of software components has come to pass is
web applications. All the components are quite well-understood and, by now,
standard. The database. The object-relational mapping. The web server. The
Javascript frontend. The webapp developer can pick and choose from a wide
variety of choices for each of those. In fact, some grumble that the number of
choices adds complexity. All the same, unless you&rsquo;re building something that
must scale to the planet (like Google, Amazon etc), it is ridiculously easy to
cobble together a web application that meets 80% of your vision within a day.</p>
<p>Post-modern programming<sup id="fnref:6"><a href="#fn:6" class="footnote-ref" role="doc-noteref">11</a></sup> starts with Googling, and ends with glue code.</p>
<p>In fact, this componentization has come far enough that many developers complain
that the plumbing of pre-existing parts has drained the joy and skill out of
their profession<sup id="fnref:11"><a href="#fn:11" class="footnote-ref" role="doc-noteref">12</a></sup>.  Does that sound familiar? The
craftsman-turned-assembly-line worker of the 20th century had exactly the same
lament!</p>
<p>John D. Cook argues that calling somebody &ldquo;plumber programmer&rdquo;<sup id="fnref:13"><a href="#fn:13" class="footnote-ref" role="doc-noteref">13</a></sup> is actually a
compliment, because it&rsquo;s the plumbing and connecting and impedance matching that
is hard. But I suspect today that&rsquo;s true because it&rsquo;s only the plumbing that is
left to do.</p>
<p>How many times can you build a cookie-cutter CRUD app with a web frontend that
fetches and displays data from a SQL backend before you feel like all you are
doing is cranking a lever? If your Java IDE generates half your code for you,
and you auto-complete (Ctrl-Space!) most of the rest, do you feel like you are
operating machinery, and not really engaging in expression?<sup id="fnref:12"><a href="#fn:12" class="footnote-ref" role="doc-noteref">14</a></sup></p>
<p><strong>The pyramid</strong></p>
<p>In other ways, McIlroy&rsquo;s vision is still a dream.</p>
<p>Massive development effort still goes into applications that are young and not
standardized. There are no components that will let you build your own web-scale
search engine quickly, for example.</p>
<p>Programmers are certainly not fungible assembly-line operators<sup id="fnref:16"><a href="#fn:16" class="footnote-ref" role="doc-noteref">15</a></sup>.</p>
<p>As in all things in life, there is a hierarchy to these things. There is a small
number of elite wizard programmers who do write significant things from
scratch. Think of those who have implemented language compilers and runtimes,
database engines, search engines, operating system kernels and the
like. Unfortunately, such projects come along rarely, and the bar for
contribution is extremely high.</p>
<p>(By the way, if you are tired of plumbing together databases and PHP and really
want to experience the wild West of programming, go contribute patches to the
Linux kernel. No fancy languages or libraries that make you soft in
userspace. Just plain old C.)</p>
<p>Some problems, such as building webapps backed by databases, are well
understood, and their solutions have become templatized. Others, such as
indexing a billion documents, or storing a bazillion petabytes across a
gajillion machines, are at the edge of our knowledge, and their solutions are
still being actively explored.</p>
<p>If you think you are writing cookie-cutter code, it is because you are working
on a cookie-cutter problem.</p>
<p><strong>Gratitude</strong></p>
<p>But we must all realize that at the end of the day, we work on something that is
in economic demand (in other words, software engineers are well-paid),
intellectually challenging (at least, on most days) and in some small way
improves the world and helps people. Even all this self-examination and
criticism is a luxury that many do not have.</p>
<p>So, be grateful.</p>
<div class="footnotes" role="doc-endnotes">
<hr><ol><li id="fn:2" role="doc-endnote">
<p><a href="http://www.amazon.com/Shop-Class-Soulcraft-Inquiry-Value/dp/1594202230">Shop Class as Soulcraft: An Inquiry Into the Value of Work, Matthew B. Crawford</a> <a href="#fnref:2" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:4" role="doc-endnote">
<p><a href="http://www.thenewatlantis.com/publications/shop-class-as-soulcraft">Shop Class as Soulcraft, essay in The New Atlantic</a> <a href="#fnref:4" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:3" role="doc-endnote">
<p><a href="http://www.nytimes.com/2009/05/24/magazine/24labor-t.html?pagewanted=print">The Case for Working with Your Hands</a> <a href="#fnref:3" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:1" role="doc-endnote">
<p><a href="http://www.gutenberg.org/cache/epub/6435/pg6435.html">The Principles of Scientific Management, by Frederick Winslow Taylor</a> <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:14" role="doc-endnote">
<p><a href="http://books.google.com/books/about/Auto_opium.html?id=9DqQb1kl7i0C">Auto opium: a social history of American automobile design</a> <a href="#fnref:14" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:15" role="doc-endnote">
<p><a href="http://www.danpink.com/drive">Drive, by Dan Pink</a> <a href="#fnref:15" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:10" role="doc-endnote">
<p><a href="http://en.wikipedia.org/wiki/Comparative_advantage">Comparitive advantage</a> <a href="#fnref:10" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:9" role="doc-endnote">
<p><a href="http://homepages.cs.ncl.ac.uk/brian.randell/NATO/Introduction.html">The NATO Conference on Software Engineering</a> <a href="#fnref:9" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:8" role="doc-endnote">
<p><a href="http://www.cs.dartmouth.edu/~doug/components.txt">Mass Produced Software Components, Doug McIlroy</a> <a href="#fnref:8" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:17" role="doc-endnote">
<p><a href="http://blog.vivekhaldar.com/post/450355817/software-processes-are-software-too">Software Processes are Software Too</a> <a href="#fnref:17" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:6" role="doc-endnote">
<p><a href="http://homepages.mcs.vuw.ac.nz/~kjx/papers/nopp.pdf">Notes on Postmodern Programming, OOPSLA 2002</a> <a href="#fnref:6" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:11" role="doc-endnote">
<p><a href="http://reprog.wordpress.com/2010/03/03/whatever-happened-to-programming/">Whatever happened to programming?</a> <a href="#fnref:11" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:13" role="doc-endnote">
<p><a href="http://www.johndcook.com/blog/2011/11/15/plumber-programmers/">The plumber programmer</a> <a href="#fnref:13" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:12" role="doc-endnote">
<p><a href="http://blog.vivekhaldar.com/post/8950163616/gui-vs-cli-operation-vs-expression">Operation vs. Expression</a> <a href="#fnref:12" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:16" role="doc-endnote">
<p><a href="http://blog.vivekhaldar.com/post/754002281/taylorism-in-the-modern-tech-industry">Taylorism in the Modern Tech Industry</a> <a href="#fnref:16" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol></div>
]]></content:encoded>
    </item>
    
    <item>
      <title>The abstraction-optimization tradeoff</title>
      <link>http://vivekhaldar.com/articles/the-abstractionoptimization-tradeoff/</link>
      <pubDate>Mon, 14 Nov 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-abstractionoptimization-tradeoff/</guid>
      <description>&lt;p&gt;There are several well-known tradeoffs in computer science. For example, the
time-space tradeoff, where often you can use more memory to compute an answer
faster. Or the time-accuracy tradeoff, where you can compute an approximate
answer quickly, and a precise one given more time.&lt;/p&gt;
&lt;p&gt;But one tradeoff that I think is widely known in folklore but not widely taught
is the &lt;strong&gt;abstraction-optimization tradeoff.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Before I try to explain what it is, let me give two examples.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>There are several well-known tradeoffs in computer science. For example, the
time-space tradeoff, where often you can use more memory to compute an answer
faster. Or the time-accuracy tradeoff, where you can compute an approximate
answer quickly, and a precise one given more time.</p>
<p>But one tradeoff that I think is widely known in folklore but not widely taught
is the <strong>abstraction-optimization tradeoff.</strong></p>
<p>Before I try to explain what it is, let me give two examples.</p>
<ol><li><strong>Compilation to a portable format, and its execution</strong>: Let&rsquo;s take the
concrete case of the Java language, and the Java Virtual Machine. The two are
distinct. A compiler transforms your pretty high-level Java source code into
<em>Java bytecode</em>, which is essentially portable assembly language<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>. Now
bytecode is still at a higher level of abstraction than the real assembly
language of your hardware architecture, which is why you need a Java Virtual
Machine to further compile that bytecode into fast, efficient machine code.</li>
</ol><p>Java source has rich structure. It can be represented by an abstract syntax
tree, which is the first thing the compiler does with the source code. The
process of conversion to bytecode is the process of whittling down that
structure to something simple and flat. Bytecode is simple, flat and
structureless compared to the source that it came from.</p>
<p>The rules bytecode must adhere to are much more lax compared to those for Java
source. In fact, you can write bytecode which has no corresponding legal Java
source<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>. This is the reason why the JVM needs to verify bytecode before
executing it<sup id="fnref:6"><a href="#fn:6" class="footnote-ref" role="doc-noteref">3</a></sup>.</p>
<p>When it&rsquo;s time to execute bytecode and further compile it down to the machine
code for the real hardware its running on, the very first thing the JVM does is
build a control flow graph<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">4</a></sup>, which is a feeble attempt at recovering some of
that high-level structure of the original source code that was lost in the
process of compiling down to bytecode. This is a prerequisite for almost every
compiler optimization. Most optimizations depend on teasing out high-level
structure from the bytecode.</p>
<p>We started with something with rich structure (source code), compiled it down to
something flat and structureless (bytecode), and then had to infer some of
that lost structure when it was time to execute and optimize bytecode.</p>
<p>The astute reader might suggest at this point: why not simply make the portable
format, the bytecode, something that is higher-level and encodes more structure?
I spent a couple of years in grad school exploring that route<sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">5</a></sup><sup id="fnref:5"><a href="#fn:5" class="footnote-ref" role="doc-noteref">6</a></sup>. It had
some compelling advantages over bytecode &ndash; it was safe, much more compact, and
had the high-level structure necessary for optimization. But it was a
non-starter for the &ldquo;real&rdquo; world because such a high-level encoding was too
coupled to the Java language. If you wanted a portable format for another
language, you would have to build a new encoding.</p>
<p>The upside of having a low-level bytecode format is that it decouples the source
from the bytecode. This is what allows multiple languages to compile down into
bytecode and inter-operate (Jython, JRuby etc).</p>
<p>And that is exactly the tradeoff I&rsquo;m  getting at.</p>
<p>But first, one more example. Because two points are all I need to fit my curve.</p>
<ol start="2"><li><strong>Effectively Caching IO in an operating system</strong>:
A similar effect takes place in the caching and IO sub-systems of operating
system kernels. Operating systems cache frequently accessed data in memory, to
avoid hitting disk as much as possible. This cache is critical for
achieving anything like reasonable performance. But the operating system has
very little information to go on. It doesn&rsquo;t know which data is going to get
accessed next. So most use a least-recently-used strategy as a next best
guess. The longer data in the cache remains un-accessed, the likelier it is to
get pushed out. And this usually works pretty well.</li>
</ol><p>So who does know more about data access patterns? The application! And it can
tell the OS what kinds of patterns to expect, using &ldquo;hinting&rdquo; mechanisms like
the POSIX <em>fadvise</em><sup id="fnref:8"><a href="#fn:8" class="footnote-ref" role="doc-noteref">7</a></sup> call.</p>
<p>Again we see the same pattern. Higher levels in the stack have richer and more
structured knowledge, most of which is lost as it travels down to the lower
layers of the stack, but that very knowledge turns out to be critical when
optimizing for performance. In this case, the application has knowledge of IO
access patterns, which is lost in the OS kernel, but is critical for achieving
decent IO performance.</p>
<p>Exokernels<sup id="fnref:9"><a href="#fn:9" class="footnote-ref" role="doc-noteref">8</a></sup> was an attempt to solve this problem. As they put it, &ldquo;An
exokernel eliminates the notion that an operating system should provide
abstractions on which applications are built. Instead, it concentrates solely on
securely multiplexing the raw hardware: from basic hardware primitives,
application-level libraries and servers can directly implement traditional
operating system abstractions, specialized for appropriateness and speed. &rdquo; But
with great performance comes a great price, and that price is that they have
done away with abstraction. Every time you write an application, you have to
pick and choose the OS primitives you want, and think about how you want to wire
them together. That&rsquo;s a big burden.</p>
<p>With the examples behind us, let me make another attempt at phrasing the
tradeoff:</p>
<p>The <strong>abstraction-optimization tradeoff</strong> is between building upon layers of
abstraction and achieving optimal performance. Building upon abstraction is
often quicker and results in easier to understand solutions, but they might have
sub-optimal performance. Sacrificing abstraction leads to near-optimal
performance, but at the cost of a more complex solution. The underlying
assumption is that richer, more structured information about the thing being
optimized (code, time, space) exists at higher layers in the abstraction stack,
is lost in the lower layers, yet is critical for achieving optimal performance.</p>
<div class="footnotes" role="doc-endnotes">
<hr><ol><li id="fn:1" role="doc-endnote">
<p>Strictly speaking, it is stack-based and not register-based, like most
common architectures (x86, PowerPC, ARM etc) in use today. <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:2" role="doc-endnote">
<p>Security Threats from Deviant Java Byte Code <a href="#fnref:2" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:6" role="doc-endnote">
<p><a href="http://java.sun.com/docs/white/langenv/Security.doc3.html">The Java Bytecode Verification Process</a> <a href="#fnref:6" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:3" role="doc-endnote">
<p><a href="http://en.wikipedia.org/wiki/Control_flow_graph%C2%A0">http://en.wikipedia.org/wiki/Control_flow_graph </a><a href="#fnref:3" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:4" role="doc-endnote">
<p><a href="http://www.vivekhaldar.com/pubs/ire2001.pdf">Christian H. Stork and Vivek Haldar; Compressed Abstract Syntax Trees for Mobile Code Workshop on Intermediate Representation Engineering (IRE 2001), July 2001.</a> <a href="#fnref:4" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:5" role="doc-endnote">
<p><a href="http://www.vivekhaldar.com/pubs/nspw.pdf">Vivek Haldar, Christian H. Stork and Michael Franz; The Source is the Proof; New Security Paradigms Workshop, September 2002.</a> <a href="#fnref:5" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:8" role="doc-endnote">
<p><a href="http://linux.die.net/man/2/fadvise">fadvise - Give advice about file access</a> <a href="#fnref:8" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:9" role="doc-endnote">
<p><a href="http://pdos.csail.mit.edu/exo.html">MIT Exokernel Operating System</a> <a href="#fnref:9" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol></div>
]]></content:encoded>
    </item>
    
    <item>
      <title>The origins of Silicon Valley</title>
      <link>http://vivekhaldar.com/articles/the-origins-of-silicon-valley/</link>
      <pubDate>Tue, 08 Nov 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-origins-of-silicon-valley/</guid>
      <description>&lt;p&gt;If you work in tech, your Mecca is Silicon Valley. And &lt;a href=&#34;http://www.stanford.edu/class/e140/e140a/content/noyce.html&#34;&gt;this story&lt;/a&gt; (from back in 1983) traces in lifelike detail the journey of a mid-western boy called Robert Noyce from Iowa to Palo Alto, and how he founded what is now called Silicon Valley. Even if you think you know about the Valley&amp;rsquo;s history, read this.&lt;/p&gt;
&lt;p&gt;What stood out to me was how the culture of those who work in the Valley is essentially unchanged from what Noyce created half a century ago.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>If you work in tech, your Mecca is Silicon Valley. And <a href="http://www.stanford.edu/class/e140/e140a/content/noyce.html">this story</a> (from back in 1983) traces in lifelike detail the journey of a mid-western boy called Robert Noyce from Iowa to Palo Alto, and how he founded what is now called Silicon Valley. Even if you think you know about the Valley&rsquo;s history, read this.</p>
<p>What stood out to me was how the culture of those who work in the Valley is essentially unchanged from what Noyce created half a century ago.</p>
<blockquote>
  <p>People who run even the newest companies in the Valley repeat Noycisms with conviction and with relish. The young CEOs all say: &ldquo;Datadyne is not a corporation, it&rsquo;s a culture, &rdquo; or &ldquo;Cybernetek is not a corporation, it&rsquo;s a society, &rdquo; or &ldquo;Honey Bear&rsquo;s assets&rdquo;? the latest vogue is for down-home nontech names?&ldquo;Honey Bear&rsquo;s assets aren&rsquo;t hardware, they&rsquo;re the software of the three thousand souls who work here.&rdquo; They talk about the soul and spiritual vision as if it were the most natural subject in the world for a well-run company to be concerned about.</p>
</blockquote>
<p>And at the root of all that was Noyce&rsquo;s hatred of the class system in corporations from the East Coast, then dominant.</p>
<blockquote>
  <p>Noyce realized how much he detested the eastern corporate system of class and status with its endless gradations, topped off by the CEOs and vice-presidents who conducted their daily lives as if they were a corporate court and aristocracy. He rejected the idea of a social hierarchy at Fairchild. Not only would there be no limousines and chauffeurs, there would not even be any reserved parking places. Work began at eight A.M. for one and all, and it would be first come, first served, in the parking lot, for Noyce, Gordon Moore, Jean Hoerni, and everybody else. &ldquo;If you come late,&rdquo; Noyce liked to say, &ldquo;you just have to park in the back forty.&rdquo; And there would be no baronial office suites. The glorified warehouse on Charleston Road was divided into work bays and a couple of rows of cramped office cubicles. The cubicles were never improved. The decor remained Glorified Warehouse, and the doors were always open.</p>
</blockquote>
]]></content:encoded>
    </item>
    
    <item>
      <title>Jumping to analysis</title>
      <link>http://vivekhaldar.com/articles/jumping-to-analysis/</link>
      <pubDate>Mon, 07 Nov 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/jumping-to-analysis/</guid>
      <description>&lt;p&gt;A long, long time ago, I remember watching a TV interview with &lt;a href=&#34;http://www.zakirhussain.com/&#34;&gt;Zakir Husain&lt;/a&gt;, the world&amp;rsquo;s leading tabla player. He was asked how and what kind of music he enjoys. I don&amp;rsquo;t remember the exact words, but his gist was that he thought the way he approached and listened to music was very different than the layman&amp;rsquo;s. He would instinctively begin analyzing the music, its structures, its rhythm, its possibilities. To him, listening to music was an analytically intense experience. It was hard for him to let go of all that and simply enjoy the flow and emotion of the music, as he suspected most regular people did.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>A long, long time ago, I remember watching a TV interview with <a href="http://www.zakirhussain.com/">Zakir Husain</a>, the world&rsquo;s leading tabla player. He was asked how and what kind of music he enjoys. I don&rsquo;t remember the exact words, but his gist was that he thought the way he approached and listened to music was very different than the layman&rsquo;s. He would instinctively begin analyzing the music, its structures, its rhythm, its possibilities. To him, listening to music was an analytically intense experience. It was hard for him to let go of all that and simply enjoy the flow and emotion of the music, as he suspected most regular people did.</p>
<p>I suspect this happens a lot to scientists and engineers too. Almost every experience they have is analyzed. Ever been to an arena rock concert and wondered about the stage setup, the sound, the lights, the speakers, the pickups, the mics? Read something that wants to move your soul but constantly wondered about the writer and his process? Then, you too, have the curse of analysis.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>The empirical science of happiness</title>
      <link>http://vivekhaldar.com/articles/the-empirical-science-of-happiness/</link>
      <pubDate>Thu, 27 Oct 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-empirical-science-of-happiness/</guid>
      <description>&lt;p&gt;&amp;ldquo;What makes one happy?&amp;rdquo; is one of the founding questions of philosophy. It is
probably much older than philosophy, perhaps as old as human thought itself. But
what the ancients probably did not suspect was that one day far in the future
empirical research would answer the question with some degree of objectivity.&lt;/p&gt;
&lt;p&gt;There is now a vast body of research that that documents broad behaviors that
make us happy, as well as the cognitive biases that trick us into straying from
that path. Yes, happiness, that fuzzy touchy-feely concept is rapidy becoming an
&lt;strong&gt;empirical science&lt;/strong&gt;. And that&amp;rsquo;s great!&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>&ldquo;What makes one happy?&rdquo; is one of the founding questions of philosophy. It is
probably much older than philosophy, perhaps as old as human thought itself. But
what the ancients probably did not suspect was that one day far in the future
empirical research would answer the question with some degree of objectivity.</p>
<p>There is now a vast body of research that that documents broad behaviors that
make us happy, as well as the cognitive biases that trick us into straying from
that path. Yes, happiness, that fuzzy touchy-feely concept is rapidy becoming an
<strong>empirical science</strong>. And that&rsquo;s great!</p>
<p>I recently came across several papers that drove this point home for me. It is
well known that money does indeed buy happiness, but only up to a point. But why
does happiness plateau after a certain level of material fulfillment? How can
you better use your money to increase your happiness?</p>
<p>Robert Frank, in &ldquo;How Not to Buy Happiness&rdquo;<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> talks about how channeling money
away from conspicuous consumption will make you happier. He constructs two
imaginary universes, one in which everyone has huge houses, but no free time for
exercise, very little time to spend with friends, and very little vacation, and
another one where the houses are just a little smaller (3000 sq ft vs 4000 sq
ft), but where people time for exercise and friends and vacations. Study after
study has shown that we will be happier in the second universe. And yet, most
developed nations are steadily moving towards the first. Frank posits that this
is because <strong>everyone else</strong> is buying larger and larger houses, which makes the
one with the small house feel inadequate. It&rsquo;s an arms race.</p>
<p>In &ldquo;If money doesn&rsquo;t make you happy, then you probably aren&rsquo;t
spending it right&rdquo;<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>, the authors start with the premise:</p>
<blockquote>
  <p>If money can buy happiness, then why doesn&rsquo;t it?  Because people don&rsquo;t spend it
  right. Most people don&rsquo;t know the basic scientific facts about happiness—about
  what brings it and what sustains it—and so they don&rsquo;t know how to use their
  money to acquire it. It is not surprising when wealthy people who know nothing
  about wine end up with cellars that aren&rsquo;t that much better stocked than their
  neighbors&rsquo;, and it should not be surprising when wealthy people who know nothing
  about happiness end up with lives that aren&rsquo;t that much happier than anyone
  else&rsquo;s. Money is an opportunity for happiness, but it is an opportunity that
  people routinely squander because the things they think will make them happy
  often don&rsquo;t.</p>
</blockquote>
<p>They go on to explain all the cognitive biases and adaptations that routinely
push us towards the choices that will ultimately bring us unhappiness. For
example, our capacity for rapid adaptation means that shizy gizmo&rsquo;s glean wears
off quickly, leaving us mystified why we don&rsquo;t feel as good as we thought we
would when we lusted after it. They prescribe eight concrete behaviors which
research has shown will likely increase your happiness. Go read the paper &ndash; it
is a quick, pleasant read, worth every minute. Among their recommendations: buy
experiences rather than things, and buy many small pleasures instead of a few
big ones.</p>
<p>But by far the most surprising study was one that finds the causal link between
unhappiness and a wandering mind<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup>. If you ask almost anyone, they will say
that unhappiness causes the mind to wander. If life sucks, you look around for
anything else other than your current situation. But the authors prove the
opposite. <strong>Unhappiness is caused by a wandering mind</strong>. In other words, being
focused will make you happier. Don&rsquo;t try to be happy first so that you can then
be focused. (They used a neat time-delay analysis to tease apart the causal link.)</p>
<p>Will we pay heed?</p>
<p><strong>Update, June 26, 2012:</strong> I recently came across another interesting paper in this vein: If Money Doesn&rsquo;t Make You Happy, Consider Time<sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup>. It talks about how we should spend our <em>time</em> to increase our happiness.</p>
<div class="footnotes" role="doc-endnotes">
<hr><ol><li id="fn:1" role="doc-endnote">
<p><a href="http://www.amacad.org/publications/spring2004/frank.pdf">How not
to buy happiness, Robert H. Frank, Dædalus  Spring 2004</a> <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:2" role="doc-endnote">
<p><a href="http://www.wjh.harvard.edu/~dtg/DUNN%20GILBERT%20&amp;%20WILSON%20(2011).pdf">If money doesn&rsquo;t make you happy, then you probably aren&rsquo;t
spending it right,  Elizabeth W. Dunn, Daniel T. Gilbert, Timothy D. Wilson, Journal of Consumer Psychology 21 (2011) 115 – 125</a> <a href="#fnref:2" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:3" role="doc-endnote">
<p><a href="http://scholar.harvard.edu/sites/scholar.iq.harvard.edu/files/danielgilbert/files/a-wandering-mind-is-an-unhapy-mind-killingsworthe-ma-science-2010.pdf">A
Wandering Mind is an Unhappy Mind, Matthew A. Killingsworth and Daniel
T. Gilbert, Nov 2010, Science.</a> <a href="#fnref:3" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:4" role="doc-endnote">
<p><a href="http://papers.ssrn.com/sol3/papers.cfm?abstract_id=1706968">If Money Doesn&rsquo;t Make You Happy, Consider Time. Jennifer Aaker, Melanie Rudd, Cassie Mogilner. Journal of Consumer Psychology, 2011, Stanford Graduate School of Business Research Series No. 2067 </a><a href="#fnref:4" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol></div>
]]></content:encoded>
    </item>
    
    <item>
      <title>Flash Crisis</title>
      <link>http://vivekhaldar.com/articles/flash-crisis/</link>
      <pubDate>Mon, 17 Oct 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/flash-crisis/</guid>
      <description>&lt;p&gt;Robert X. Cringely absolutely nails it in his recent column about some of the consequences of rapidly reducing IO times on programming languages&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;. His major point was that slow but expressive&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; high-level scripting languages such as Ruby and Python have been getting away with their lack of performance due to slow disks. With super-fast seekless flash expected to replace, or at least complement, spinning disks in the storage hierarchy, the long honeymoon of Python and Ruby will come to an end when profiling reveals that IO is fast, and the runtime or interpreter is the bottleneck.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Robert X. Cringely absolutely nails it in his recent column about some of the consequences of rapidly reducing IO times on programming languages<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>. His major point was that slow but expressive<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> high-level scripting languages such as Ruby and Python have been getting away with their lack of performance due to slow disks. With super-fast seekless flash expected to replace, or at least complement, spinning disks in the storage hierarchy, the long honeymoon of Python and Ruby will come to an end when profiling reveals that IO is fast, and the runtime or interpreter is the bottleneck.</p>
<p>This impending “flash crisis” is well known in system circles. It&rsquo;s almost like a mini Y2K.</p>
<p>However, its repercussions are much deeper than just the choice of programming language and runtime<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup>.</p>
<p>It&rsquo;s depressing to see graphs of things like CPU speed and disk and RAM capacity, which keep going up, up, up, compared with those of disk throughput and seeks, which for all practical purposes has remained mostly flat. A  100 GB drive from a few years ago does about the same number of seeks per second as a 2 TB drive today. Drive seeks have become the straw through which we’re trying to drink the ocean.</p>
<p>If you look at the current software stack, all the way down to the operating system kernel, you will find that the slowness of disks is a baked-in assumption throughout. Operating systems play intricate games with IO scheduling and how files are laid out on disk and caching disk blocks in memory, and spend millions of CPU cycles doing so, because the few microseconds taken for those millions of CPU cycles is noise compared to the tens of milliseconds it might take to hit the disk. Pushed to the extreme, this obsession with avoiding the disk leads to schemes like RAMSter<sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup>, because even accessing the memory of a different computer over the network fabric is faster than going to local disk.</p>
<p>In essence, we have been trading plentiful resources such as CPU cycles and RAM for precious disk seeks. Most web-ish serving workloads almost demand this, because they tend to be IO rather than CPU bound.</p>
<p>What happens when you blow up the “slow disk” assumption is that your entire software stack begins to crumble. When the cushion provided by those 10 ms of seek time goes away, CPU becomes your bottleneck. You have to start rethinking a lot of design choices.</p>
<p>There are a few saving graces which will buy us time. Flash hasn&rsquo;t hit the price point where it can en masse replace spinning disks<sup id="fnref:5"><a href="#fn:5" class="footnote-ref" role="doc-noteref">5</a></sup>. And the shakedown will start from the top of the stack. Programmers will first discover bottlenecks in their application code, then in their choice of language and runtime, and finally, after those layers have been tuned to death will they look at things like filesystems and the operating system kernel.</p>
<div class="footnotes" role="doc-endnotes">
<hr><ol><li id="fn:1" role="doc-endnote">
<p><a href="http://www.cringely.com/2011/10/the-second-coming-of-java/">The Second Coming of Java, by Robert X. Cringely.</a> <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:2" role="doc-endnote">
<p>“slow but expressive”–I believe that&rsquo;s a false dichotomy. You can be fast and expressive too. But that&rsquo;s a whole other topic. <a href="#fnref:2" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:3" role="doc-endnote">
<p>Also, I disagree with Cringely that Java, and the JVM, is the answer. There are good reasons why, even though the JVM has thrived at the application layer, it has yet to make any inroads into the lower layers of the stack. <a href="#fnref:3" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:4" role="doc-endnote">
<p><a href="http://marc.info/?l=linux-mm&amp;m=129684345708855">Transcendent memory for the Linux kernel</a> <a href="#fnref:4" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:5" role="doc-endnote">
<p>On NewEgg, the cheapest 1 TB disk was $69.99, whereas I couldn’t even find a 1TB SSD for desktops, and the cheapest 500 GB SSD was $729.99. <a href="#fnref:5" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol></div>
]]></content:encoded>
    </item>
    
    <item>
      <title>Deft with descriptive filenames</title>
      <link>http://vivekhaldar.com/articles/deft-with-descriptive-filenames/</link>
      <pubDate>Sun, 02 Oct 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/deft-with-descriptive-filenames/</guid>
      <description>&lt;p&gt;A month or so ago, &lt;a href=&#34;http://jblevins.org&#34;&gt;Jason Blevin&lt;/a&gt; announced &lt;a href=&#34;http://jblevins.org/projects/deft/&#34;&gt;Deft&lt;/a&gt;, an Emacs package for searching and managing notes in plain text files, very much inspired by &lt;a href=&#34;http://notational.net/&#34;&gt;Notational Velocity&lt;/a&gt;. I started using it, and immediately became a fan. (Notational Velocity, while it looked pretty good, was a nonstarter for me by virtue of not being Emacs.)&lt;/p&gt;
&lt;p&gt;There was just one tiny hitch. I already had a bunch of notes spread across text files, but unlike Deft, which simply named new files “deft-xxx” and regarded the first line of the contents of the file as its title, I used long descriptive filenames for my files, and considered the filename itself to be the title.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>A month or so ago, <a href="http://jblevins.org">Jason Blevin</a> announced <a href="http://jblevins.org/projects/deft/">Deft</a>, an Emacs package for searching and managing notes in plain text files, very much inspired by <a href="http://notational.net/">Notational Velocity</a>. I started using it, and immediately became a fan. (Notational Velocity, while it looked pretty good, was a nonstarter for me by virtue of not being Emacs.)</p>
<p>There was just one tiny hitch. I already had a bunch of notes spread across text files, but unlike Deft, which simply named new files “deft-xxx” and regarded the first line of the contents of the file as its title, I used long descriptive filenames for my files, and considered the filename itself to be the title.</p>
<p>However, Jason was kind enough to accept a <a href="http://jblevins.org/git/deft.git/commit/?id=d41bf39c6fdda466b28f9d6dc46f836e23abf13f">patch from me</a> that allowed Deft to (optionally) behave in the mode that I was used to. In case you do something similar, you can grab the latest copy from his <a href="http://jblevins.org/git/deft.git">git repository</a>.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Why developers should learn the economics of code</title>
      <link>http://vivekhaldar.com/articles/why-developers-should-learn-the-economics-of-code/</link>
      <pubDate>Sun, 02 Oct 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/why-developers-should-learn-the-economics-of-code/</guid>
      <description>&lt;p&gt;Say you are a software developer who doesn&amp;rsquo;t entirely suck, and are wondering how to take your effectiveness to next level. Should you start learning some cool new language? Functional programming? Order a bunch of books written by bearded mobsters&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;?&lt;/p&gt;
&lt;p&gt;No. To elevate your craft to the next level you need to step out of it, and start thinking about what fuels your position.&lt;/p&gt;
&lt;p&gt;By that, I mean what sustains your position as a software developer, and the team of software developers you work with, the building you work in, your chair, your desk, your workstation, your huge monitor–in short, the entire abstraction layer on top of which you sit pretty and write code&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Say you are a software developer who doesn&rsquo;t entirely suck, and are wondering how to take your effectiveness to next level. Should you start learning some cool new language? Functional programming? Order a bunch of books written by bearded mobsters<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>?</p>
<p>No. To elevate your craft to the next level you need to step out of it, and start thinking about what fuels your position.</p>
<p>By that, I mean what sustains your position as a software developer, and the team of software developers you work with, the building you work in, your chair, your desk, your workstation, your huge monitor–in short, the entire abstraction layer on top of which you sit pretty and write code<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>.</p>
<p>The fuel is money. You should ask yourself: <em>what are the economics of the software you are producing?</em></p>
<p>(And yes, this applies to free/open source software. It is driven by economics too, it&rsquo;s just that its economics are different from that of commercial software. Open-source hackers need to make a living too.)</p>
<p>In my personal experience, less than 1% of new engineers, and maybe about half of longtime engineers who have been working for decades, understand this. Unfortunately, this is not something that is part of the computer science curriculum. One has to infer these things by watching shadows on the walls of a cave. If you pay attention to the way managers and directors and VPs (at least, the really good ones) dig into technical issues, you will catch a whiff of the issues involved.</p>
<p>But why? Why should you try to understand this bean counting? The whole reason you got into programming was so that you would never have to deal with this stuff. The answer is simple–<em>understanding the economics of software will make you a better engineer</em>, and improve the quality and effectiveness of the artifacts you produce. You will see that if you throw in economic considerations into technical debates, the choices will often become much clearer. You might become less attached to your solely technical view, and see the bigger picture. Technical decisions almost always have economic drivers.</p>
<p>Until you make at least an effort to understand this, you are like the kid taken to Disneyland with no idea how much the ticket and food and the hotel and the car and the plane cost.</p>
<p>Here are some of the axes along which economic considerations fall:</p>
<ul><li><strong>the cost of labor</strong>: this is the easiest one to understand as well as quantify. It shows up directly on the books. Obviously, the company is making more money from your labor than it is paying you. If not, then you should be worried, both for yourself as well as the company.</li>
<li><strong>the cost of acquiring labor</strong>: does your enterprise depend on languages, frameworks and technologies whose sole practitioners live as ascetics on Himalayan mountain tops, and even if you could convince them to come down from there, would never work for your filthy moneygrubbing corporation? Not good. Does an army of modern programmers know and love the stuff you use? Is that population added to every year with the graduating class? Good. Though you might sneer at blub languages<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup>, sometimes they are the best solution. Think about this next time you want to introduce your favorite shiny new leaves-Java-in-the-dust language into the company.</li>
<li><strong>the cost of time</strong>: How much time do you have? Are competitors breathing down your neck? Even if they aren&rsquo;t, remember that developer time is money spent. What is the cost of getting it wrong? What is the cost of getting it mostly right and then refining? What is the cost of not getting it absolutely polished and perfect?</li>
<li><strong>the cost of maintenance</strong>: how long will your product last? How long will you have to support it? Provide patches and bug fixes? Ironically, with modern server-side software, the answer is often “forever, or until the company goes bust.” Server-side software has no EOL, just a continuous stream of tiny revisions. And the more crucial the software is, the longer it will last (e.g. UNIX).</li>
<li><strong>the cost of machines</strong>: this is typically the least understood, and the most misunderstood one. Unfortunately, an entire generation of programmers has been raised on the idea that “programmer time is more expensive than machine time.” This was certainly true in the singular–“machine.” But this assumption begins to break down when writing an application that runs on a warehouse scale computer<sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup>. If your code runs on a bazillion machines, then it is very likely that even tiny savings in resources (CPU, RAM, disk, packets sent on the network, power) across all those machines will pay your salary.</li>
</ul><div class="footnotes" role="doc-endnotes">
<hr><ol><li id="fn:1" role="doc-endnote">
<p>Design Patterns, written by the “gang of four”: Refactoring, by Martin Fowler, etc. <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:2" role="doc-endnote">
<p><a href="http://www.joelonsoftware.com/articles/DevelopmentAbstraction.com">The Development Abstraction, by Joel Spolsky</a> <a href="#fnref:2" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:3" role="doc-endnote">
<p><a href="http://www.paulgraham.com/avg.html">Beating the Averages, Paul Graham</a> <a href="#fnref:3" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:4" role="doc-endnote">
<p><a href="http://www.morganclaypool.com/doi/abs/10.2200/S00193ED1V01Y200905CAC006">The Datacenter as a Computer: An Introduction to the Design of Warehouse-Scale Machines</a> <a href="#fnref:4" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol></div>
]]></content:encoded>
    </item>
    
    <item>
      <title>Size is the best predictor of code quality</title>
      <link>http://vivekhaldar.com/articles/size-is-the-best-predictor-of-code-quality/</link>
      <pubDate>Sun, 25 Sep 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/size-is-the-best-predictor-of-code-quality/</guid>
      <description>&lt;p&gt;After my &lt;a href=&#34;http://blog.vivekhaldar.com/post/10126017769/smeeds-law-for-programming&#34;&gt;last post&lt;/a&gt;, which hypothesized a relationship between the total size of a program and the bugs in it, I was led to &lt;a href=&#34;http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.20.2141&#34;&gt;this paper&lt;/a&gt;, via &lt;a href=&#34;http://www.neverworkintheory.org/?p=58&#34;&gt;this blog post&lt;/a&gt;, via &lt;a href=&#34;http://news.ycombinator.com/item?id=2991224&#34;&gt;this comment&lt;/a&gt;. This, by the way, is my favorite thing about blogging.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Khaled El Emam, Saida Benlarbi, Nishith Goel, and Shesh N. Rai: “The Confounding Effect of Class Size on the Validity of Object-Oriented Metrics“. IEEE Transasctions on Software Engineering, 27(7), July 2001.&lt;/em&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>After my <a href="http://blog.vivekhaldar.com/post/10126017769/smeeds-law-for-programming">last post</a>, which hypothesized a relationship between the total size of a program and the bugs in it, I was led to <a href="http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.20.2141">this paper</a>, via <a href="http://www.neverworkintheory.org/?p=58">this blog post</a>, via <a href="http://news.ycombinator.com/item?id=2991224">this comment</a>. This, by the way, is my favorite thing about blogging.</p>
<p><em>Khaled El Emam, Saida Benlarbi, Nishith Goel, and Shesh N. Rai: “The Confounding Effect of Class Size on the Validity of Object-Oriented Metrics“. IEEE Transasctions on Software Engineering, 27(7), July 2001.</em></p>
<p>It is a long and well-written paper, and contains a lot of background about code metrics.</p>
<p>If you want to understand all the nuances, I will not reproduce them here–go read the full paper.</p>
<p>However, here&rsquo;s the tl;dr:</p>
<p>A long paper trail of software engineering studies has shown that many <em>internal</em> code metrics (such as methods per class, depth of inheritance tree, coupling among classes etc.) are correlated with <em>external</em> attributes, the most important of which is bugs. What the authors of this paper show is that when they introduce a second variable, namely, the total size of the program, into the statistical analysis and control for it, the correlation between all these code metrics and bugs <em>disappears</em>.</p>
<p>The old model was something like this: the structural properties of code, which can be measured with various metrics, affect its cognitive complexity, which in turn affects external attributes such as the number of bugs, maintainability etc.</p>
<p><img src="../../media/449104958.png" alt=""/></p>
<p>However, this paper uncovers a strong association between most code metrics and the size of the code, both of which together lead to the externally observable attributes like bugs.</p>
<p><img src="../../media/449104958.png" alt=""/></p>
<p>So this partially backs up my hypothesis that the number of bugs can primarily be predicted only by the total lines of code. Yegge got it right when he said that <a href="http://steve-yegge.blogspot.com/2007/12/codes-worst-enemy.html">size was code’s worst enemy</a>. However, I still haven&rsquo;t found any studies which show what this relationship is like. Does the number of bugs grow linearly with code size? Sub-linearly? Super-linearly? My gut feeling still says “sub-linear”.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Smeed&#39;s Law for Programming</title>
      <link>http://vivekhaldar.com/articles/smeeds-law-for-programming/</link>
      <pubDate>Mon, 12 Sep 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/smeeds-law-for-programming/</guid>
      <description>&lt;p&gt;Smeed&amp;rsquo;s law is an empirical relationship that predicts the number of deaths in traffic accidents in a country, normalized to the number of vehicles in it. There are two astounding things about this law. Firstly, the only variable used in it is the number of vehicles per capita. Secondly, the death rate increases sub-linearly with this variable.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../media/449104958.png&#34; alt=&#34;&#34;/&gt;&lt;/p&gt;
&lt;p&gt;Here, D = number of deaths, N = number of vehicles, P = population.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Smeed&rsquo;s law is an empirical relationship that predicts the number of deaths in traffic accidents in a country, normalized to the number of vehicles in it. There are two astounding things about this law. Firstly, the only variable used in it is the number of vehicles per capita. Secondly, the death rate increases sub-linearly with this variable.</p>
<p><img src="../../media/449104958.png" alt=""/></p>
<p>Here, D = number of deaths, N = number of vehicles, P = population.</p>
<p>(Graph taken from this paper<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>.)</p>
<p>Note some of the things that one might think have an impact on traffic fatalities that according to Smeed&rsquo;s law do not: better traffic signage, traffic rules, more stringent enforcement of such rules, mass adoption of safety equipment etc. According to Smeed&rsquo;s law—which has held up to a surprising degree of accuracy, across a large number of countries, across long time spans—none of that matters. The only thing that does matter is the <em>number of vehicles per capita</em>, which can be looked upon as a proxy for <em>how much the population at large is exposed to traffic</em>. It is particularly telling how the 1966 vehicle safety legislation had no statistical effect<sup id="fnref:5"><a href="#fn:5" class="footnote-ref" role="doc-noteref">2</a></sup>:</p>
<blockquote>
  <p>Most of the vehicle safety standards adopted in the US and 1966 have been implemented worldwide… Yet, when (modern) vehicles are driven in Third World countries, they achieve kill rates per vehicle as high or higher than those achieved in Britain and the US in the early years of this century with model T Fords.</p>
</blockquote>
<p>Another way to look at this is that we all have a fixed appetite for risk, and we revert to it. This is called <em>risk homeostatis</em> <sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup><sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup>, or <em>risk compensation</em>. When we reduce risk in some areas, we tend to take on more risk in others. For example, a study showed that automatic braking systems(ABS) did not reduce the number of accidents, because drivers with ABS tended to drive faster and closer to other cars. Another study showed that drivers drove more carefully around non-helmeted cyclists than helmeted ones.</p>
<hr><p>And now that I&rsquo;ve talked about some hard data and rigorous research, I&rsquo;m going to venture into the territory of pure anecdote and speculation.</p>
<p>Here&rsquo;s the thing: I’ve noticed something similar to Smeed&rsquo;s law when it comes to programming. More specifically, large-scale programming, where large teams with lots of flux build large systems, over long periods of time.</p>
<p>Let&rsquo;s use bugs per line of code as a parallel to deaths per vehicle. As a system grows and matures, the number of bugs in it per line of code decreases. In other words, the total number of bugs increases sub-linearly with lines of code.</p>
<p>Of course, I have no hard data to back this up, but think about the alternative for a minute: that the number of bugs increases at least linearly, or possibly super-linearly with lines of code. This would make it practically impossible to build any large system.</p>
<p>Also, factors that you would think have a big impact on how many bugs are created, such as the choice of programming language, end up having little or no effect. You would think that languages like C or C++, where one has to manually manage memory, and it&rsquo;s very easy to write code with buffer overruns, would have a propensity for more bugs than languages like Java, which have strong memory safety and garbage collection. Programmers get used to the “risk profile” of each language, and adjust their behavior accordingly. For example, a C programmer is hypervigilant about buffer overflows, and that balances out the language’s lack of safeguards. On the flip side, Java programmers “save” the risk of buffer overruns and other memory errors, but they “spend” that saved risk in other places, such as complicated frameworks and deep class hierarchies.</p>
<p>Does your experience as a programmer support or contradict my conjecture?</p>
<div class="footnotes" role="doc-endnotes">
<hr><ol><li id="fn:1" role="doc-endnote">
<p>John G. U. Adams, <a href="http://www.subaruforester.org/vbulletin/attachments/f100/3590d1163697517-tribeca-heavy-mother-smeeds-law.pdf">Smeed’s Law: Some further thoughts</a>. <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:5" role="doc-endnote">
<p><a href="http://en.wikipedia.org/wiki/National_Traffic_and_Motor_Vehicle_Safety_Act%C2%A0">http://en.wikipedia.org/wiki/National_Traffic_and_Motor_Vehicle_Safety_Act </a><a href="#fnref:5" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:3" role="doc-endnote">
<p>Gerald J. S. Wilde, <a href="http://www.ncbi.nlm.nih.gov/pmc/articles/PMC1730348/pdf/v004p00089.pdf">Risk homeostasis theory: an overview</a> <a href="#fnref:3" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:4" role="doc-endnote">
<p><a href="http://en.wikipedia.org/wiki/Risk_homeostasis%C2%A0">http://en.wikipedia.org/wiki/Risk_homeostasis </a><a href="#fnref:4" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol></div>
]]></content:encoded>
    </item>
    
    <item>
      <title>The Poisonous Long Tail</title>
      <link>http://vivekhaldar.com/articles/the-poisonous-long-tail/</link>
      <pubDate>Tue, 06 Sep 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-poisonous-long-tail/</guid>
      <description>&lt;p&gt;If you are at all curious or interested in where systems are headed, and the unique challenges in building warehouse-scale (not datacenter scale,  there is a difference) computers, then this &lt;a href=&#34;http://dl.acm.org/citation.cfm?id=2019527&#34;&gt;talk by Googler Luiz Andre Barroso&lt;/a&gt; is a must-see. Storage, disks, flash, energy efficiency, networking–you will learn something about all of these, and more.&lt;/p&gt;
&lt;p&gt;One of his points that I want to highlight is why backend engineers spend so much time worrying about long-tail performance, and trying to curb it. For an application running in a warehouse scale computer, every entity that is touched in the process of answering a query has a performance tail that is significantly worse than its “usual” performance, often by an order of magnitude or more.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>If you are at all curious or interested in where systems are headed, and the unique challenges in building warehouse-scale (not datacenter scale,  there is a difference) computers, then this <a href="http://dl.acm.org/citation.cfm?id=2019527">talk by Googler Luiz Andre Barroso</a> is a must-see. Storage, disks, flash, energy efficiency, networking–you will learn something about all of these, and more.</p>
<p>One of his points that I want to highlight is why backend engineers spend so much time worrying about long-tail performance, and trying to curb it. For an application running in a warehouse scale computer, every entity that is touched in the process of answering a query has a performance tail that is significantly worse than its “usual” performance, often by an order of magnitude or more.</p>
<p>Using the example from the talk: consider a server that gives you a very quick response (much  lower than 1 second) 99% of the time, but takes more than one second the other 1% of the time. Now imagine that you have to talk to 10 such servers to answer your query. Now 10% of your queries take longer than 1 second. With 50 servers, 40% of your queries are slow. And with 100 servers, two thirds of your queries take longer than one second. It&rsquo;s not unusual for complicated services to be composed of these many other services.</p>
<p>Thus, a long tail in the extremely high percentiles for every component rapidly spreads out into the distribution of the entire service. It&rsquo;s like the one drop of dye that colors an entire cauldron.</p>
<p>(On the brighter side, <a href="http://blog.vivekhaldar.com/post/5333377223/more-machines-more-reliability">operating at scale does buy you reliability</a>.)</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>How things grow</title>
      <link>http://vivekhaldar.com/articles/how-things-grow/</link>
      <pubDate>Sun, 28 Aug 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/how-things-grow/</guid>
      <description>&lt;p&gt;How do things–natural as well as man-made–grow? If you double the size of something, what happens to its other properties?&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://en.wikipedia.org/wiki/Geoffrey_West&#34;&gt;Geoff West&lt;/a&gt; and his colleagues have spent a lot of time studying such questions. Their findings are fascinating. &lt;a href=&#34;http://biology.unm.edu/jhbrown/Documents/Publications/West&amp;amp;Brown2004PT.pdf&#34; title=&#34;Life&#39;s Universal Scaling Laws&#34;&gt;Living things grow sub-linearly&lt;/a&gt;: doubling the mass of living things only increases their metabolic rate by about 70% (to be more precise, the scaling exponent is about 0.75). &lt;a href=&#34;http://www.uvm.edu/~cmplxsys/newsevents/pdfs/2007/bettencourt2007a.pdf&#34; title=&#34;Growth, innovation, scaling, and the pace of life in cities&#34;&gt;Cities&lt;/a&gt;, however, have very different growth patterns. The infrastructure required scales sub-linearly with the population of the city, but emergent properties such as innovation and wages grow super-linearly. Double the size of the city, and you will only need about 75% more roads and 70% more gas stations, but you will get 120% more innovation (as measured by the number of patents produced) and wages will grow by about 110%. In other words, &lt;em&gt;the costs per capita go down, but the returns go up&lt;/em&gt;. That perfectly sums up the reason for humanities&amp;rsquo; mass exodus to urbanization.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>How do things–natural as well as man-made–grow? If you double the size of something, what happens to its other properties?</p>
<p><a href="http://en.wikipedia.org/wiki/Geoffrey_West">Geoff West</a> and his colleagues have spent a lot of time studying such questions. Their findings are fascinating. <a href="http://biology.unm.edu/jhbrown/Documents/Publications/West&amp;Brown2004PT.pdf" title="Life's Universal Scaling Laws">Living things grow sub-linearly</a>: doubling the mass of living things only increases their metabolic rate by about 70% (to be more precise, the scaling exponent is about 0.75). <a href="http://www.uvm.edu/~cmplxsys/newsevents/pdfs/2007/bettencourt2007a.pdf" title="Growth, innovation, scaling, and the pace of life in cities">Cities</a>, however, have very different growth patterns. The infrastructure required scales sub-linearly with the population of the city, but emergent properties such as innovation and wages grow super-linearly. Double the size of the city, and you will only need about 75% more roads and 70% more gas stations, but you will get 120% more innovation (as measured by the number of patents produced) and wages will grow by about 110%. In other words, <em>the costs per capita go down, but the returns go up</em>. That perfectly sums up the reason for humanities&rsquo; mass exodus to urbanization.</p>
<p>In a recent talk, West revealed some prepublication numbers describing the <a href="http://longnow.org/seminars/02011/jul/25/why-cities-keep-growing-corporations-always-die-and-life-gets-faster/" title="Geoff West's talk at the Longnow Foundation">growth of companies</a>–and the outlook was grim. Companies scale sub-linearly. As they grow larger, they extract lesser profit per employee, and have a harder time doing so.</p>
<p>This got me thinking about how another man-made artifact–software–scales. One study suggests that the <a href="http://dirkriehle.com/2008/03/14/the-total-growth-of-open-source/" title="The Total Growth of Open Source">total amount of software is growing exponentially with time</a> (at least for open source software). That is not really surprising, because <a href="http://www.kk.org/thetechnium/archives/2008/10/the_expansion_o.php" title="The fastest growing entity today is information">&ldquo;the fastest growing entity today is information&rdquo;</a>, and software, after all, is part of that. It would be surprising if its growth was <em>not</em> exponential.</p>
<p>But the more interesting question is not how <em>all</em> software grows with time, but how a specific project grows, and whether it can sustain that growth. What happens to its properties as its size grows. If the lines of code are doubled, what happens to its complexity, maintainability etc.?</p>
<p>Some of the <a href="http://www.doc.ic.ac.uk/~mml/feast" title="Evolution And Software Technology (FEAST) web site.">earliest studies looked at commercial software</a>, and found that <a href="http://dl.acm.org/citation.cfm?id=602463" title="Lehman, M.M., Ramil, J.F., Evolution in Software and Related Areas. Proceedings of the 4th International Workshop on Principles of Software Evolution. Sept. 2001.">software systems grew linearly or sub-linearly</a>. This is in line with the intuition and experience of most software engineers. We all have seen how systems go through an early growth spurt, and then start tapering off, as complexity makes them unwieldy, and changes become more incremental.</p>
<p>So it came as a big surprise when it was found that <a href="http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.20.6929&amp;rep=rep1&amp;type=pdf" title="Growth, Evolution, and Structural Change in Open Source Software">Linux has been sustaining super-linear growth for a while</a>. The same held true for many other large, successful open source projects. What&rsquo;s more, Linux was <a href="http://plg.uwaterloo.ca/~migod/papers/2000/icsm00.pdf" title="Evolution in Open Source Software: A Case Study">maintaining a high level of code quality</a> as it went through this growth. However, <a href="http://www.cs.colostate.edu/~bieman/Pubs/isese06izurieta.finalVersion.pdf" title="The Evolution of FreeBSD and Linux">this finding was contested</a>. Which means that the jury is still out on whether open source software scales fundamentally differently than commercial software, and whether it is able to sustain super-linear growth.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Reading Happiness</title>
      <link>http://vivekhaldar.com/articles/reading-happiness/</link>
      <pubDate>Fri, 26 Aug 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/reading-happiness/</guid>
      <description>&lt;p&gt;I keep rediscovering and re-reading this article in The Atlantic, &amp;ldquo;&lt;a href=&#34;http://www.theatlantic.com/magazine/print/2009/06/what-makes-us-happy/7439/&#34;&gt;What Makes Us Happy?&lt;/a&gt;&amp;rdquo;, about the &lt;a href=&#34;http://adultdev.bwh.harvard.edu/research-SAD.html&#34;&gt;longest longitudinal study of adult life ever conducted&lt;/a&gt;. It is a marvelous and poignant piece of writing. &lt;a href=&#34;http://www.shenk.net/&#34;&gt;Joshua Wolf Shenk&lt;/a&gt;, the author, does not shy away from the complexity of the issue, and does not pretend that he, or Vaillant, the protagonist of the piece, have any easy answers.&lt;/p&gt;
&lt;p&gt;What haunts me is the style of the article: long stretches that build atmosphere, interleaved with quick punches of insight. Just go read it. Some of my favorite vignettes:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I keep rediscovering and re-reading this article in The Atlantic, &ldquo;<a href="http://www.theatlantic.com/magazine/print/2009/06/what-makes-us-happy/7439/">What Makes Us Happy?</a>&rdquo;, about the <a href="http://adultdev.bwh.harvard.edu/research-SAD.html">longest longitudinal study of adult life ever conducted</a>. It is a marvelous and poignant piece of writing. <a href="http://www.shenk.net/">Joshua Wolf Shenk</a>, the author, does not shy away from the complexity of the issue, and does not pretend that he, or Vaillant, the protagonist of the piece, have any easy answers.</p>
<p>What haunts me is the style of the article: long stretches that build atmosphere, interleaved with quick punches of insight. Just go read it. Some of my favorite vignettes:</p>
<blockquote>
<p>The undertones of psychoanalysis are tragic; Freud dismissed the very idea of “normality” as “an ideal fiction” and famously remarked that he hoped to transform “hysterical misery into common unhappiness.” The spirit of modern social science, by contrast, draws on a brash optimism that the secrets to life can be laid bare. Vaillant is an optimist marinated in tragedy, not just in his life experience, but in his taste.</p>
</blockquote>
<blockquote>
<p>What allows people to work, and love, as they grow old? By the time the Grant Study men had entered retirement, Vaillant, who had then been following them for a quarter century, had identified seven major factors that predict healthy aging, both physically and psychologically.</p>
<p>Employing mature adaptations was one. The others were education, stable marriage, not smoking, not abusing alcohol, some exercise, and healthy weight. Of the 106 Harvard men who had five or six of these factors in their favor at age 50, half ended up at 80 as what Vaillant called “happy-well” and only 7.5 percent as “sad-sick.” Meanwhile, of the men who had three or fewer of the health factors at age 50, none ended up “happy-well” at 80. Even if they had been in adequate physical shape at 50, the men who had three or fewer protective factors were three times as likely to be dead at 80 as those with four or more factors.</p>
</blockquote>
]]></content:encoded>
    </item>
    
    <item>
      <title>GUI vs CLI: Operation vs Expression</title>
      <link>http://vivekhaldar.com/articles/gui-vs-cli-operation-vs-expression/</link>
      <pubDate>Mon, 15 Aug 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/gui-vs-cli-operation-vs-expression/</guid>
      <description>&lt;p&gt;Consider this user interface for a car:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&#34;tmblr-full&#34; data-orig-height=&#34;400&#34; data-orig-width=&#34;500&#34;&gt;&lt;img src=&#34;https://64.media.tumblr.com/03163421a86cd947c8498a19df9e9257/f923988d779c3af9-0c/s540x810/6885ce9f3419a08af93607c563d96f9713651d28.jpg&#34; data-orig-height=&#34;400&#34; data-orig-width=&#34;500&#34;/&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;The goal of these interfaces is to make you &lt;strong&gt;operate&lt;/strong&gt; something, and operate it efficiently and safely. The grooves and clicks and limits &lt;strong&gt;constrain&lt;/strong&gt; the range of motion and the number of choices. The visual look heavily hints at how to actively use it. They are usually not hard to learn. More importantly, the learning curve plateaus. Once you learn how to drive a car, there&amp;rsquo;s not much progression after that. &lt;strong&gt;Boundedness&lt;/strong&gt; is an important property of these interfaces, by design.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Consider this user interface for a car:</p>
<p><figure class="tmblr-full" data-orig-height="400" data-orig-width="500"><img src="https://64.media.tumblr.com/03163421a86cd947c8498a19df9e9257/f923988d779c3af9-0c/s540x810/6885ce9f3419a08af93607c563d96f9713651d28.jpg" data-orig-height="400" data-orig-width="500"/></figure></p>
<p>The goal of these interfaces is to make you <strong>operate</strong> something, and operate it efficiently and safely. The grooves and clicks and limits <strong>constrain</strong> the range of motion and the number of choices. The visual look heavily hints at how to actively use it. They are usually not hard to learn. More importantly, the learning curve plateaus. Once you learn how to drive a car, there&rsquo;s not much progression after that. <strong>Boundedness</strong> is an important property of these interfaces, by design.</p>
<p>Now look at this &ldquo;user interface&rdquo; for playing music:</p>
<p><figure class="tmblr-full" data-orig-height="400" data-orig-width="400"><img src="https://64.media.tumblr.com/c818a7e088f7556076a40d47f3b325d9/f923988d779c3af9-67/s540x810/efd46bdef989640f65f925c6e53ccf63efe02724.jpg" data-orig-height="400" data-orig-width="400"/></figure></p>
<p>Or this one for, among other things, manipulating words:</p>
<p><figure class="tmblr-full" data-orig-height="415" data-orig-width="500"><img src="https://64.media.tumblr.com/7bc5d73b60441ee10273abaf927b5d05/f923988d779c3af9-89/s540x810/62f747133181529ab31a0453379d37ae6ec0a71b.png" data-orig-height="415" data-orig-width="500"/></figure></p>
<p>The goal of these interfaces is to <strong>express and create</strong>. Note the almost total <strong>lack of constraints</strong>. There are no hints in the interface as to how to &ldquo;correctly&rdquo; use these. To a newbie, a first look offers no hints for how to operate them. You have to go through a steep learning process to even begin to use these. More importantly, the learning curve never flattens. You could be playing a guitar for decades and still learn new things. <strong>Unboundedness</strong> is an important property of these interfaces, by design.</p>
<p>What makes one type of interface bounded and the other one unbounded? It&rsquo;s <strong>the ability to combine</strong>. Physical interfaces (and by extension, GUIs) cannot combine at will to create new behavior. You can&rsquo;t make changes to the way your odometer behaves, without ripping it out and putting in a new one. You can&rsquo;t &ldquo;pipe&rdquo; the reading from it to an alarm that beeps when you go over a certain limit.</p>
<p>GUIs are modeled on physical metaphors and ultimately are grounded in the same motivations. They are intended to make you operate something, to get the job done. They want to narrow your set of choices at each juncture, towards the &ldquo;right&rdquo; choice.</p>
<p>The &ldquo;right&rdquo; choices are baked into the design, through a deliberate thought process. How will this be used? What are its users trying to accomplish? Which actions are more common than others? Which actions have the potential for confusion? Which actions are likely to be mistakes and should be discouraged? All these decisions are made by the designers and encoded in the user interface.</p>
<p>CLIs, on the other hand, are modeled on more abstract, non-physical models. GUIs continuously offer cues to the user about what to do. They strive for an <strong>externalization</strong> of knowledge. CLIs are for users with <strong>internalized</strong> knowledge. This fundamental cognitive difference is important. <a href="http://blog.vivekhaldar.com/post/3339907908/the-cognitive-style-of-unix">Internalization is critical for power use.</a></p>
<p>This explains why programmers of tool-heavy languages like Java often complain about IDEs being a necessary evil. Yes, they help you get the job done faster, but IDEs tilt the mode of thinking from expression towards operation. That&rsquo;s why they feel stifling. How often have you felt like an <strong>IDE-operator rather than a programmer</strong>?</p>
<p>There is a time for operation, and a time for expression. Most interface debates are misinformed because they are about creators complaining about operation interfaces, or operators complaining about creation interfaces. We need both. But we also need to understand when.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>The Upside of Complexity</title>
      <link>http://vivekhaldar.com/articles/the-upside-of-complexity/</link>
      <pubDate>Tue, 09 Aug 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-upside-of-complexity/</guid>
      <description>&lt;p&gt;Consider the task scheduling function of the Linux kernel–back from version 1.2, released in 1995. It starts with this comment:&lt;/p&gt;
&lt;pre&gt;/*
 *  &#39;schedule()&#39; is the scheduler function. It&#39;s a very simple and nice
 * scheduler: it&#39;s not perfect, but certainly works for most things.
 * The one thing you might take a look at is the signal-handler code here.
 *
 *   NOTE!!  Task 0 is the &#39;idle&#39; task, which gets called when no other
 * tasks can run. It can not be killed, and it cannot sleep. The &#39;state&#39;
 * information in task[0] is never used.
 *
 * The &#34;confuse_gcc&#34; goto is used only to get better assembly code..
 * Dijkstra probably hates me.
 */
&lt;/pre&gt;
&lt;p&gt;After that, it consists of 82 lines of code. The entire file, sched.c, weighs in at only 777 lines of code. The directory that contains it, &amp;ldquo;kernel&amp;rdquo;, has 16 C files, totaling to just over 5000 lines of code.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Consider the task scheduling function of the Linux kernel–back from version 1.2, released in 1995. It starts with this comment:</p>
<pre>/*
 *  'schedule()' is the scheduler function. It's a very simple and nice
 * scheduler: it's not perfect, but certainly works for most things.
 * The one thing you might take a look at is the signal-handler code here.
 *
 *   NOTE!!  Task 0 is the 'idle' task, which gets called when no other
 * tasks can run. It can not be killed, and it cannot sleep. The 'state'
 * information in task[0] is never used.
 *
 * The "confuse_gcc" goto is used only to get better assembly code..
 * Dijkstra probably hates me.
 */
</pre>
<p>After that, it consists of 82 lines of code. The entire file, sched.c, weighs in at only 777 lines of code. The directory that contains it, &ldquo;kernel&rdquo;, has 16 C files, totaling to just over 5000 lines of code.</p>
<p>Fast forward sixteen years to 2011. Look at the <a href="http://lxr.linux.no/linux+v3.0.1/kernel/sched.c#L4247">same function in version 3.0</a>. Amazingly, it&rsquo;s still about 80 lines of code, but that&rsquo;s just a front. The file sched.c now has 9337 lines of code, nearly double what the entire kernel directory contained back in 1.2. The directory now has more than a whopping 174,000 lines of code!</p>
<p>What is the difference between these two? Why is the second one so much larger and more complex? Is that a good thing?</p>
<p>Let&rsquo;s take a look at all the things that the second scheduler does, that the first one doesn&rsquo;t. These are a few that pop into my mind, and I&rsquo;m probably missing a whole bunch.</p>
<ul><li><a href="http://www.linuxjournal.com/article/5600">The kernel is pre-emptible.</a> </li>
<li>It can run on multi-processor systems. </li>
<li>It has a much more sophisticated <a href="http://en.wikipedia.org/wiki/Completely_Fair_Scheduler">scheduler</a>. </li>
<li><a href="http://en.wikipedia.org/wiki/Cgroups">Control groups</a> can be used to isolate resource consumption. </li>
<li><a href="http://elinux.org/Kernel_Trace_Systems">Tracing infrastructure.</a> </li>
<li>Profiling infrastructure. </li>
</ul><p>…and the list goes on and on.</p>
<p>Looked at this way,<strong> complexity is a sign of growth and vitality</strong>. In some sense, complexity is the result of progress. The steady increase of complexity only looks bad until you compare it with the opposite scenario–a steady decrease in complexity. Imagine what your system would look like if it always decreased in complexity with time. What would the logical culmination of that be?</p>
<p>As engineers, we constantly struggle with complexity. The number one thing engineers whine about is the complexity of the systems and tools they work with. But it is engineers themselves who brought the system to that level of complexity. It is engineers that are adding on the next feature, the one that will incrementally increase the complexity of the system.</p>
<p>There are two types of complexity, and it is important to know which one you&rsquo;re dealing with–so that you can fight against the right one.</p>
<p>There is “real” complexity. This is the complexity that comes from real-world constraints and requirements. Dealing with this type of complexity, and choosing to take it on, is almost always an economic decision, one that weighs the cost of leaving the system as it is against the cost of building and maintaining the additional complexity. For example, you could simply beef up your hardware and continue to run your simple, unoptimized program, or you could pay for the manpower to optimize it, and maintain the resulting program. Which side of the equation saves you money depends on your particular situation.</p>
<p>And then there&rsquo;s “artificial” complexity. This is complexity that&rsquo;s created out of whole cloth, not in response to any real constraint or requirement. This is the complexity of grand visions and cute designs. This is the complexity that often arises from too many resources–so much so that you don&rsquo;t have to choose or cut down or budget. This is the complexity we should all be fighting against.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Do you have an RSI prevention plan?</title>
      <link>http://vivekhaldar.com/articles/do-you-have-an-rsi-prevention-plan/</link>
      <pubDate>Mon, 01 Aug 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/do-you-have-an-rsi-prevention-plan/</guid>
      <description>&lt;p&gt;If you jaywalk a busy street, you might get away with it a few times. But if you do it every day, day in and day out, sooner or later you will get hit. The same way, if your job involves sitting in front of the computer and using it all day, it&amp;rsquo;s only a matter of time before you develop some sort of RSI or related injury. It&amp;rsquo;s not even a question of if, just when. And it&amp;rsquo;s extremely likely that if you do have such a job, you spend a good fraction of your nonworking hours on a computer as well.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>If you jaywalk a busy street, you might get away with it a few times. But if you do it every day, day in and day out, sooner or later you will get hit. The same way, if your job involves sitting in front of the computer and using it all day, it&rsquo;s only a matter of time before you develop some sort of RSI or related injury. It&rsquo;s not even a question of if, just when. And it&rsquo;s extremely likely that if you do have such a job, you spend a good fraction of your nonworking hours on a computer as well.</p>
<p>I can&rsquo;t tell you how often I hear programmers joking about busting their wrists, and how often I see them rolling and stretching their wrists and fingers to relieve the pain–and then get right back to typing furiously. Usually, they are engrossed enough in their jobs that they only pay attention to the pain when it becomes severe.</p>
<p>This is a really bad idea.</p>
<p>So how about this–pretend that you have severe RSI right now. What would you do to work around it? How would you change your habits? How would you use your computer differently? Figure that out. And then, even though you do not have RSI now, pretend like you do, and make those changes. Experiment. <a href="http://blog.vivekhaldar.com/post/8171137332/an-ergonomic-keyboard-and-mouse-configuration">Find a configuration that works for you.</a> In effect, <a href="http://blog.vivekhaldar.com/post/2126488524/use-accessibility-technologies-before-you-have-to">do these things voluntarily, before you are forced to.</a></p>
<p>Now here&rsquo;s the thing–this will almost certainly result in a slight drop in productivity in the short term. Most touch typists are fast enough that moving to voice recognition software might actually slow them down. But you really need to take the long term view on this. Do you want to be that furious clickety click typist for just the next few years and then fall off a cliff?</p>
<p>Some prominent bloggers have perpetrated the myth that typing is the bottleneck activity in programming. I could not disagree more. If all you are doing is pounding out code, and never stepping away from the computer to think or design, then you&rsquo;re doing something wrong. For me at least, my thinking is much slower than my typing, so it wouldn&rsquo;t matter if I could type faster. I suspect that is true of most professional programmers. The converse–the programmer who is a slow typist–would be a red flag.</p>
<p>Protect your hands and wrists and fingers, so that you can enjoy using them for a long time.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>An ergonomic keyboard and mouse configuration</title>
      <link>http://vivekhaldar.com/articles/an-ergonomic-keyboard-and-mouse-configuration/</link>
      <pubDate>Thu, 28 Jul 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/an-ergonomic-keyboard-and-mouse-configuration/</guid>
      <description>&lt;p&gt;I have long been searching for a keyboard and mouse configuration that is comfortable, ergonomic, reduces the impact on my fingers and wrists, and yet is productive.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve tried them all. Vertical mice. Trackballs. All types of keyboards. What I have finally settled on is the &lt;a href=&#34;http://www.goldtouch.com/p-65-goldtouch-adjustable-keyboard-putty.aspx&#34;&gt;Goldtouch split keyboard&lt;/a&gt;, and the &lt;a href=&#34;http://www.apple.com/magictrackpad/&#34;&gt;Apple Bluetooth magic trackpad&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;My setup looks like this:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&#34;tmblr-full&#34; data-orig-height=&#34;375&#34; data-orig-width=&#34;500&#34;&gt;&lt;img src=&#34;https://64.media.tumblr.com/08c4e413a7d5541bec03593912e8b586/b1fe0674c1f53e9a-c0/s540x810/2672cb2eb1b40f2b92017af013bd5399cf054bdb.jpg&#34; data-orig-height=&#34;375&#34; data-orig-width=&#34;500&#34;/&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Yes, it&amp;rsquo;s like an enlarged bottom half of a laptop.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I have long been searching for a keyboard and mouse configuration that is comfortable, ergonomic, reduces the impact on my fingers and wrists, and yet is productive.</p>
<p>I&rsquo;ve tried them all. Vertical mice. Trackballs. All types of keyboards. What I have finally settled on is the <a href="http://www.goldtouch.com/p-65-goldtouch-adjustable-keyboard-putty.aspx">Goldtouch split keyboard</a>, and the <a href="http://www.apple.com/magictrackpad/">Apple Bluetooth magic trackpad</a>.</p>
<p>My setup looks like this:</p>
<p><figure class="tmblr-full" data-orig-height="375" data-orig-width="500"><img src="https://64.media.tumblr.com/08c4e413a7d5541bec03593912e8b586/b1fe0674c1f53e9a-c0/s540x810/2672cb2eb1b40f2b92017af013bd5399cf054bdb.jpg" data-orig-height="375" data-orig-width="500"/></figure></p>
<p>Yes, it&rsquo;s like an enlarged bottom half of a laptop.</p>
<p>The keyboard is tactile and very comfortable. The split angle is much easier on my wrists than a straight keyboard. And the trackpad slips right under it. I have to move my hand only slightly to move between the trackpad and keyboard. <a href="http://blog.vivekhaldar.com/post/2126488524/use-accessibility-technologies-before-you-have-to">Combined with mouseclick</a>, this also eliminates a lot of pressing and clicking. I&rsquo;ve been using this setup for a few months now, and I think I&rsquo;ve hit a sweet spot with it.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Media Meta Argument</title>
      <link>http://vivekhaldar.com/articles/media-meta-argument/</link>
      <pubDate>Mon, 11 Jul 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/media-meta-argument/</guid>
      <description>&lt;p&gt;Whenever a new medium for expression ascends, there is a vigorous debate comparing it with the predominant medium, and  whether it should be adopted en masse.  A &lt;a href=&#34;http://blog.vivekhaldar.com/post/567499370/medium-shear&#34;&gt;new medium always shears&lt;/a&gt; against the predominant one. Many argue against it. These arguments often have a common structure:&lt;/p&gt;
&lt;p&gt;The new medium is&amp;hellip;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;technologically inferior &lt;/li&gt;
&lt;li&gt;more expensive &lt;/li&gt;
&lt;li&gt;not &amp;ldquo;necessary&amp;rdquo; &lt;/li&gt;
&lt;li&gt;not good for us &lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;These are tautologies for every fledgling medium.&lt;/p&gt;
&lt;p&gt;The old medium has been around for quite a while, it is dominant and it has been continuously refined. The new medium is raw, unrefined and has rough edges.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Whenever a new medium for expression ascends, there is a vigorous debate comparing it with the predominant medium, and  whether it should be adopted en masse.  A <a href="http://blog.vivekhaldar.com/post/567499370/medium-shear">new medium always shears</a> against the predominant one. Many argue against it. These arguments often have a common structure:</p>
<p>The new medium is&hellip;</p>
<ul><li>technologically inferior </li>
<li>more expensive </li>
<li>not &ldquo;necessary&rdquo; </li>
<li>not good for us </li>
</ul><p>These are tautologies for every fledgling medium.</p>
<p>The old medium has been around for quite a while, it is dominant and it has been continuously refined. The new medium is raw, unrefined and has rough edges.</p>
<p>The incumbent media has finely tuned supply-chains, marketing, advertising and economies of scale. The new one doesn&rsquo;t.</p>
<p>The old medium has been serving everybody&rsquo;s needs just fine, often for quite a while. Nobody &ldquo;needs&rdquo; the new medium.</p>
<p>And then there&rsquo;s the pompous argument that the new medium will ruin our minds and corrupt our culture and turn us all into zombies.</p>
<p>The latest incarnation of this argument template is <a href="http://www.newsweek.com/2010/04/30/why-i-hate-3-d-and-you-should-too.html">Roger Ebert&rsquo;s argument against 3D movies</a>. As you read that, keep the above list in mind. He hits each of these points.</p>
<p>I&rsquo;m not trying to refute his (or anybody else&rsquo;s) argument. I&rsquo;m more interested in the meta-argument &ndash; the <em>structure of a class of arguments</em>.</p>
<p>The fascinating thing about the new-media-vs-old-media argument template is that even though it holds weight, every incarnation of it throughout history has been futile. Writing overtook the oral tradition. Recording overtook live performance. TV overtook radio.</p>
<p>But my use of the word &ldquo;overtook&rdquo; is misplaced. The new medium doesn&rsquo;t overtake the old one, it helps it find it true niche, what it was <em>really</em> meant for. Only after the new medium starts doing all the things we thought the old one did, do we realize the special circumstances where the old one shines.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Large Computer Systems are Organic</title>
      <link>http://vivekhaldar.com/articles/large-computer-systems-are-organic/</link>
      <pubDate>Mon, 27 Jun 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/large-computer-systems-are-organic/</guid>
      <description>&lt;p&gt;Large computer systems, the kind that span multiple datacenters, are rapidly approaching organicity. This may not be readilty apparent if you look at the systems themselves, which display only limited forms of adaptive behavior, and certainly almost none of the autonomy that are the signs of living things, though the trend is positive. But it is more obvious when you look at the way humans, i.e. engineers, tend to these systems.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Large computer systems, the kind that span multiple datacenters, are rapidly approaching organicity. This may not be readilty apparent if you look at the systems themselves, which display only limited forms of adaptive behavior, and certainly almost none of the autonomy that are the signs of living things, though the trend is positive. But it is more obvious when you look at the way humans, i.e. engineers, tend to these systems.</p>
<p>And the way engineers tend to planet-scale systems has many parallels with the way doctors treat patients.</p>
<p>Like biology, (and unlike physics) very few things about large systems can be predicted or calculated precisely. There are no closed-form solutions. Often, one has to work with estimates with an order of magnitude error margin.</p>
<p>Like doctors prescribing drugs, engineers treat day-to-day failures and problems with playbook solutions that have been known to work in the past, without necessarily understanding the root cause or the exact mechanism that explains why the solution works. Just as many drugs work, but its not perfectly understood why.</p>
<p>Solutions to problems also often work like drugs. They take time to propagate through the system. They might trigger unexpected side-effects.</p>
<p>In the fog of complexity, visibility is paramount. Often the first thing a doctor does when treating a patient is a battery of tests and scans. As these systems grow larger and more complex, more and more effort is spent in simply getting visibility into how they operate, tracing something up and down the layers of abstractions. Without that, you have no hope of even making a feeble attempt when something goes wrong.</p>
<p>There is an upside &ndash; <a href="http://blog.vivekhaldar.com/post/5333377223/more-machines-more-reliability">large numbers bring resilience</a>. An application running on one machine has a much higher probability of failure than one running across a hundred.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Emacs as a login shell</title>
      <link>http://vivekhaldar.com/articles/emacs-as-a-login-shell/</link>
      <pubDate>Tue, 07 Jun 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/emacs-as-a-login-shell/</guid>
      <description>&lt;p&gt;About the only thing I use a regular shell for these days is to fire up an Emacs client against the daemon that is almost always running. That&amp;rsquo;s also the first thing I do when I ssh or log into a machine. As for shells, I&amp;rsquo;ve been exclusively using &lt;a href=&#34;http://snarfed.org/why_i_run_shells_inside_emacs&#34;&gt;shells inside Emacs&lt;/a&gt; for quite a while now.&lt;/p&gt;
&lt;p&gt;So I decided to script it up into my bash profile so it happens automatically when I log in. There&amp;rsquo;s no magic here, it&amp;rsquo;s quite straightforward. If the daemon   is not already running, it starts that. Then depending whether you&amp;rsquo;re   graphical or not, it starts the appropriate emacs client, putting you in a   shell buffer titled &amp;ldquo;@login&amp;rdquo;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>About the only thing I use a regular shell for these days is to fire up an Emacs client against the daemon that is almost always running. That&rsquo;s also the first thing I do when I ssh or log into a machine. As for shells, I&rsquo;ve been exclusively using <a href="http://snarfed.org/why_i_run_shells_inside_emacs">shells inside Emacs</a> for quite a while now.</p>
<p>So I decided to script it up into my bash profile so it happens automatically when I log in. There&rsquo;s no magic here, it&rsquo;s quite straightforward. If the daemon   is not already running, it starts that. Then depending whether you&rsquo;re   graphical or not, it starts the appropriate emacs client, putting you in a   shell buffer titled &ldquo;@login&rdquo;.</p>
<pre># Start the emacs daemon if not already running.
daemon_running=`ps ux | grep "[e]macs --daemon"`
if [[ $daemon_running ]]; then
    echo "Emacs daemon already running."
else
    echo "Emacs daemon not running. Starting it."
    emacs --daemon
fi
<h1 id="check-whether-were-graphical-or-not">Check whether we&rsquo;re graphical or not.</h1>
<p>if [[ $DISPLAY ]]; then
emacsclient -c -n -e &ldquo;(shell &quot;@login&quot;)&rdquo;
else
emacsclient -t -n -e &ldquo;(shell &quot;@login&quot;)&rdquo;
fi
</pre></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Comments on Stallman&#39;s Dystopia</title>
      <link>http://vivekhaldar.com/articles/comments-on-stallmans-dystopia/</link>
      <pubDate>Sat, 21 May 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/comments-on-stallmans-dystopia/</guid>
      <description>&lt;p&gt;It’s worth reproducing the top-voted comment on the &lt;a href=&#34;http://news.ycombinator.com/item?id=2567852&#34;&gt;Hacker News
discussion&lt;/a&gt; of my &lt;a href=&#34;http://blog.vivekhaldar.com/post/5667398073/stallmans-dystopia&#34;&gt;last
post&lt;/a&gt;, by user &lt;a href=&#34;http://news.ycombinator.com/user?id=kwantam&#34;&gt;kwantam&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Freedom is almost always lost in small steps.
&lt;/p&gt;&lt;p&gt;
Sure, discontinuities happen in extreme cases (e.g., the WTC&amp;rsquo;s
destruction -&amp;gt; the PATRIOT Act), and when they do a lot of people
notice. The more subtle losses in freedom that occur
gradually (the DMCA and its progeny, for example) are harder to
notice until one day you look back and say &amp;ldquo;huh, how did we get
here?&amp;rdquo;
&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>It’s worth reproducing the top-voted comment on the <a href="http://news.ycombinator.com/item?id=2567852">Hacker News
discussion</a> of my <a href="http://blog.vivekhaldar.com/post/5667398073/stallmans-dystopia">last
post</a>, by user <a href="http://news.ycombinator.com/user?id=kwantam">kwantam</a>:</p>
<blockquote>
<p>Freedom is almost always lost in small steps.
</p><p>
Sure, discontinuities happen in extreme cases (e.g., the WTC&rsquo;s
destruction -&gt; the PATRIOT Act), and when they do a lot of people
notice. The more subtle losses in freedom that occur
gradually (the DMCA and its progeny, for example) are harder to
notice until one day you look back and say &ldquo;huh, how did we get
here?&rdquo;
</p><p>
The concept of the Overton Window is interesting and germane
here. 20 years ago the idea that you couldn&rsquo;t lend a book you own
to your friend or loan them the new album you just bought would
have seemed insane. Over time, a gradual shift in the concept of
ownership has changed the scope of the issue to the point where
many people would now accept that it seems reasonable that you
can&rsquo;t lend your books to someone else.
</p><p>
People at the edge of the <a href="http://en.wikipedia.org/wiki/Overton_window%0A">Overton window</a> are like our canaries in the coal
mine. Gradual shifts in the window are hard to notice from the
middle, but easy to notice as the &ldquo;edge&rdquo; passes over you. In that
respect, to me RMS seems most valuable to us for precisely the
reasons others call him a crackpot.
</p></blockquote>
]]></content:encoded>
    </item>
    
    <item>
      <title>Stallman&#39;s Dystopia</title>
      <link>http://vivekhaldar.com/articles/stallmans-dystopia/</link>
      <pubDate>Fri, 20 May 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/stallmans-dystopia/</guid>
      <description>&lt;p&gt;
I was a year into college when flipping through the latest CACM in the library I
came across &lt;a href=&#34;http://www.gnu.org/philosophy/right-to-read.html&#34;&gt;Richard
Stallman&amp;rsquo;s dystopian view of the future&lt;/a&gt;:
&lt;/p&gt;&lt;blockquote&gt;
&amp;hellip;if he lent her his computer, she might read his books. Aside from the fact
that you could go to prison for many years for letting someone else read your
books, the very idea shocked him at first. Like everyone, he had been taught
since elementary school that sharing books was nasty and wrong—something that
only pirates would do.
&lt;/blockquote&gt;
&lt;p&gt;
It sounded like a ridiculous, unbelievable dystopia. It was even written like
sci-fi. Of course that would never happen! Nobody would stand for this, ever,
right?
&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>
I was a year into college when flipping through the latest CACM in the library I
came across <a href="http://www.gnu.org/philosophy/right-to-read.html">Richard
Stallman&rsquo;s dystopian view of the future</a>:
</p><blockquote>
&hellip;if he lent her his computer, she might read his books. Aside from the fact
that you could go to prison for many years for letting someone else read your
books, the very idea shocked him at first. Like everyone, he had been taught
since elementary school that sharing books was nasty and wrong—something that
only pirates would do.
</blockquote>
<p>
It sounded like a ridiculous, unbelievable dystopia. It was even written like
sci-fi. Of course that would never happen! Nobody would stand for this, ever,
right?
</p><p>
But exactly what Stallman described has come to pass, with very little
protest.
</p><p>
For example, here are the terms under which you
can <a href="http://www.amazon.com/gp/help/customer/display.html?nodeId=200549320">lend
your Kindle books</a>: books where lending is <em>enabled by the seller</em>,
&ldquo;can be loaned once for a period of 14 days.&rdquo; Most other ebook stores and audio
book stores have similarly restrictive policies.
</p><p>
<a href="http://www.stevenberlinjohnson.com/2010/04/the-glass-box-and-the-commonplace-book.html">Steven
  Berlin Johnson calls this the textual glass box.</a> On the iPad book reader:
</p><blockquote>
&hellip;what happens when you try to copy a paragraph of text. You get the familiar
iPhone-style clipping handles, and you get two options &ldquo;Highlight&rdquo; and
&ldquo;Bookmark.&rdquo; But you can&rsquo;t actually copy the text, to paste it into your own
private commonplace book, or email it to a friend, or blog about it. And of
course there&rsquo;s no way to link to it. What&rsquo;s worse: the book in question is
Penguin&rsquo;s edition of Darwin&rsquo;s Descent of Man, which is in the public
domain. Those are our words on that screen. We have a right to them&hellip;
<p>When your digital news feed doesn’t contain links, when it cannot be linked to,
when it can’t be indexed, when you can’t copy a paragraph and paste it into
another application: when this happens your news feed is not flawed or backwards
looking or frustrating. It is broken.</p>
</blockquote>
]]></content:encoded>
    </item>
    
    <item>
      <title>The Perils of Closed Worlds</title>
      <link>http://vivekhaldar.com/articles/the-perils-of-closed-worlds/</link>
      <pubDate>Mon, 16 May 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-perils-of-closed-worlds/</guid>
      <description>&lt;p&gt;Hackers love closed worlds. I don&amp;rsquo;t mean closed in the sense of &amp;ldquo;not being open source&amp;rdquo;, but in the sense of being islands. Prime examples of such systems are early lisp systems, Smalltalk and most of its descendants. Such systems had two major characteristics that set them apart.&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;&lt;strong&gt;All or nothing:&lt;/strong&gt; The operating system, programming language and   user-level applications were tightly integrated. The line between compiler and   kernel was blurry. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enforced primacy of a single programming language:&lt;/strong&gt; This is a corollary of the point above, but deserves special mention. The entire   system (except some low-level processor-specific routines) was implemented in   one programming language. It was hard and usually impossible to interface with   other languages. &lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;Take, for example, &lt;a href=&#34;http://www.squeak.org/&#34;&gt;Squeak&lt;/a&gt;, a modern descendent of Smalltalk. You can&amp;rsquo;t just fire up your favorite editor, write a Squeak program, and compile or interpret it. You have to download an entire virtual machine, which presents you its own interfce, its own world, with its own editor and utilities and tools and jargon. You have to leave your world, and go into Squeak&amp;rsquo;s world. This is what I mean by &amp;ldquo;all or nothing.&amp;rdquo;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Hackers love closed worlds. I don&rsquo;t mean closed in the sense of &ldquo;not being open source&rdquo;, but in the sense of being islands. Prime examples of such systems are early lisp systems, Smalltalk and most of its descendants. Such systems had two major characteristics that set them apart.</p>
<ol><li><strong>All or nothing:</strong> The operating system, programming language and   user-level applications were tightly integrated. The line between compiler and   kernel was blurry. </li>
<li><strong>Enforced primacy of a single programming language:</strong> This is a corollary of the point above, but deserves special mention. The entire   system (except some low-level processor-specific routines) was implemented in   one programming language. It was hard and usually impossible to interface with   other languages. </li>
</ol><p>Take, for example, <a href="http://www.squeak.org/">Squeak</a>, a modern descendent of Smalltalk. You can&rsquo;t just fire up your favorite editor, write a Squeak program, and compile or interpret it. You have to download an entire virtual machine, which presents you its own interfce, its own world, with its own editor and utilities and tools and jargon. You have to leave your world, and go into Squeak&rsquo;s world. This is what I mean by &ldquo;all or nothing.&rdquo;</p>
<p>The existence of closed-world systems is no accident, because hackers love them. They are consistent worlds unto themselves. They are fueled by the desire of one designer to build everything just so, and to not let anyone else soil it. <a href="http://dx.doi.org/10.1016/0165-6074(85)90032-8">Programming is theory-building</a>, which is just a fancy way of saying &ldquo;world building.&rdquo;</p>
<p>Closed systems might be beautiful and elegant, but  ultimately most do not succeed. They are too imposing, too inflexible. Above all, they don&rsquo;t encourage promiscuity of their constituent parts.</p>
<p>The most well-known counterpoint to closed systems, the anti-closed system, is, of course, Unix. Nearly every part of it, from the very beginning, was &ldquo;detachable&rdquo;. You could take the OS, the tools, the editors, the languages and make them work on almost any other system under the sun. Many of them might have been conceived in and for Unix, but they were only loosely tied to it. They were promiscuous.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>More machines, more reliability</title>
      <link>http://vivekhaldar.com/articles/more-machines-more-reliability/</link>
      <pubDate>Mon, 09 May 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/more-machines-more-reliability/</guid>
      <description>&lt;p&gt;Lets say your application is buggy, and crashes every now and then. Lets say it&amp;rsquo;s mean time to failure (or in this case, to crash) is &amp;rsquo;t&amp;rsquo;. This is usually modeled as an &lt;a href=&#34;http://www.odyseus.nildram.co.uk/Systems_And_Devices_Files/Component%20Reliability%20Tutorial.pdf&#34;&gt;exponential probability distribution&lt;/a&gt;, so that after time t, the probability of your application being up is only 37%, or conversely, the probability of it having crashed is 67%. If your application only runs on &lt;em&gt;one machine&lt;/em&gt;, then those are your probabilities.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Lets say your application is buggy, and crashes every now and then. Lets say it&rsquo;s mean time to failure (or in this case, to crash) is &rsquo;t&rsquo;. This is usually modeled as an <a href="http://www.odyseus.nildram.co.uk/Systems_And_Devices_Files/Component%20Reliability%20Tutorial.pdf">exponential probability distribution</a>, so that after time t, the probability of your application being up is only 37%, or conversely, the probability of it having crashed is 67%. If your application only runs on <em>one machine</em>, then those are your probabilities.</p>
<p>But if your application is a server that is load-balanced on two machines, the  definition of success is different. Assuming either machine can handle the full  load, your application will continue working even if it crashes on one of the  machines. Your entire application fails is <em>both</em> machines do. Thus, the  probability of failure after time &rsquo;t&rsquo; now becomes <em>0.67 x 0.67 = 0.45</em>,  or 45%.</p>
<p>If your application is load-balanced on three machines, and it crashes on   one, then the remaining two servers only have to bear 50% more load (as   opposed to 100% more load in the two-machine case.) The probability of failure   after time &rsquo;t&rsquo; is <em>0.67 x 0.67 x 0.67 = 0.30, </em>or 30%.</p>
<p>With just ten instances, you&rsquo;re down to an under 2% chance of failure after   time &rsquo;t&rsquo;.</p>
<p>(If you&rsquo;ve been paying very close attention, you&rsquo;ll realize that the probability of failure above is conservative, because it assumes a failed server never comes back. In real life, some sort of daemon will restart crashed servers, making the probability of real failure very small. In the one-machine case, this will be visible as downtime while the server is restarting, but in the multiple machine case it will usually not even be visibile to the outside world.)</p>
<p>This means that reliability or uptime of a <em>single instance</em> of your program is a much bigger problem for client software that runs on a desktop or a phone, than servers that run in giant datacenters on many, many machines. Client software is the one-machine case, where every crash is a bad impression and lost business. Scaling an application across a large number of machines is certainly not easy, but it does have this one saving grace.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Teaching as performance</title>
      <link>http://vivekhaldar.com/articles/teaching-as-performance/</link>
      <pubDate>Thu, 05 May 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/teaching-as-performance/</guid>
      <description>&lt;p&gt;
A recent &lt;a href=&#34;http://www.washington.edu/news/articles/college-students2019-use-of-kindle-dx-points-to-e-reader2019s-role-in-academia&#34;&gt;paper&lt;/a&gt;  finally put into words what I&amp;rsquo;d felt for a long time: the
phenomenon of remembering concepts and facts from a textbook by relating them to
their physical location in the book and on the page:
&lt;/p&gt;&lt;blockquote&gt;
The digital text also disrupted a technique called cognitive mapping, in which
readers used physical cues such as the location on the page and the position in
the book to go back and find a section of text or even to help retain and recall
the information they had read.
&lt;/blockquote&gt;
&lt;p&gt;
This also begins to explain why the recent trend of professors and teachers
using computer-projected slides instead of black (or white) boards upsets
me. The board is alive. The slide is inert.
&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>
A recent <a href="http://www.washington.edu/news/articles/college-students2019-use-of-kindle-dx-points-to-e-reader2019s-role-in-academia">paper</a>  finally put into words what I&rsquo;d felt for a long time: the
phenomenon of remembering concepts and facts from a textbook by relating them to
their physical location in the book and on the page:
</p><blockquote>
The digital text also disrupted a technique called cognitive mapping, in which
readers used physical cues such as the location on the page and the position in
the book to go back and find a section of text or even to help retain and recall
the information they had read.
</blockquote>
<p>
This also begins to explain why the recent trend of professors and teachers
using computer-projected slides instead of black (or white) boards upsets
me. The board is alive. The slide is inert.
</p><p>
I still remember the physical movements of a great math class as it unfolded on
the board. The order in which terms were written. Some terms cancelled each
other out. Swish. Swish. A quick slash. Some terms got factored out. A small rub
and overwrite. Oh &ndash; and the crunching together and shrinking of the size of the
writing as space began to run out at the bottom. And finally, a long pause as
things came to a logical conclusion and the board was wiped clean for the next
concept.
</p><p>
All this seems silly, but it is what made the class come alive for me, what made
me remember stuff. It was <b>teaching done as a performance art</b>. </p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Side effects of PhD programs</title>
      <link>http://vivekhaldar.com/articles/side-effects-of-phd-programs/</link>
      <pubDate>Wed, 27 Apr 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/side-effects-of-phd-programs/</guid>
      <description>&lt;p&gt;Some recent articles &lt;sup&gt;&lt;a name=&#34;fnr.1&#34; href=&#34;#fn.1&#34; id=&#34;fnr.1&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;sup&gt;&lt;a name=&#34;fnr.2&#34; href=&#34;#fn.2&#34; id=&#34;fnr.2&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; bemoan the oversupply of PhDs, and poor prospects of future doctorate holders. But, at least in the &lt;strong&gt;special case of technical   doctoral programs in the US&lt;/strong&gt;, these articles miss two important side effects.&lt;/p&gt;
&lt;p&gt;PhD students are the &lt;strong&gt;labor pool from which teaching assistants are drawn&lt;/strong&gt;. It is these teaching assistants that do most of the grunt work required to take undergrads through their education &amp;ndash; holding office hours, designing assignments, and most importantly, grading assignments and papers. The professor gives lectures and sets the curriculum, and the teaching assistants are left with everything else. And they do it for dirt cheap rates. The typical teaching assistant, handling one class with anywhere between 50 to 100 students, makes approximately $20,000 a year. There is absolutely zero chance of professors supporting a reduction in doctoral program enrollment, because it would directly translate into more work for them, and that too of the kind they despise &amp;ndash; dealing with undergrads, and grading their papers.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Some recent articles <sup><a name="fnr.1" href="#fn.1" id="fnr.1">1</a></sup><sup><a name="fnr.2" href="#fn.2" id="fnr.2">2</a></sup> bemoan the oversupply of PhDs, and poor prospects of future doctorate holders. But, at least in the <strong>special case of technical   doctoral programs in the US</strong>, these articles miss two important side effects.</p>
<p>PhD students are the <strong>labor pool from which teaching assistants are drawn</strong>. It is these teaching assistants that do most of the grunt work required to take undergrads through their education &ndash; holding office hours, designing assignments, and most importantly, grading assignments and papers. The professor gives lectures and sets the curriculum, and the teaching assistants are left with everything else. And they do it for dirt cheap rates. The typical teaching assistant, handling one class with anywhere between 50 to 100 students, makes approximately $20,000 a year. There is absolutely zero chance of professors supporting a reduction in doctoral program enrollment, because it would directly translate into more work for them, and that too of the kind they despise &ndash; dealing with undergrads, and grading their papers.</p>
<p>The second side effect: it is these doctoral programs that attract the brightest foreign students from all over the world into the US, who in turn feed the demand for technical talent in the US (even if many &ldquo;drop out&rdquo; after a masters&rsquo; degree). In this sense, these programs are the best immigration filters the industry could wish for. In Silicon Valley, most immigrants have a prototypical story: came to the US as a graduate student, then started working here.</p>
<p class="footnote"><sup><a name="fn.1" href="#fnr.1" id="fn.1">1</a></sup><a href="http://www.nature.com/news/2011/110420/full/472276a.html">The PhD Factory</a></p>
<p class="footnote"><sup><a name="fn.2" href="#fnr.2" id="fn.2">2</a></sup><a href="http://www.nature.com/naturejobs/2011/110421/full/nj7343-381a.html">What is a Phd really worth?</a></p>
<p class="footnote"><strong>Update:</strong> <a href="http://news.ycombinator.com/item?id=2490001">Interesting comments on this over at Hacker News</a>.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>dotEmacs Extract: Interactively change font size</title>
      <link>http://vivekhaldar.com/articles/dotemacs-extract-interactively-change-font-size/</link>
      <pubDate>Thu, 21 Apr 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/dotemacs-extract-interactively-change-font-size/</guid>
      <description>&lt;p&gt;I use this very often and find it extremely useful, so I thought I would share this.
&lt;/p&gt;&lt;p&gt;This is what I use to interactively increase or decrease the font size in Emacs. It behaves just like Ctrl-+/- or Cmd-+/- in most browsers. I also have them bound to convenient keyboard shortcuts.
&lt;/p&gt;&lt;pre&gt;
(defun zoom-in ()
  &#34;Increase font size by 10 points&#34;
  (interactive)
  (set-face-attribute &#39;default nil
      		      :height
		      (+ (face-attribute &#39;default :height)
		         10)))
&lt;p&gt;(defun zoom-out ()
&amp;ldquo;Decrease font size by 10 points&amp;rdquo;
(interactive)
(set-face-attribute &amp;lsquo;default nil
:height
(- (face-attribute &amp;lsquo;default :height)
10)))&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I use this very often and find it extremely useful, so I thought I would share this.
</p><p>This is what I use to interactively increase or decrease the font size in Emacs. It behaves just like Ctrl-+/- or Cmd-+/- in most browsers. I also have them bound to convenient keyboard shortcuts.
</p><pre>
(defun zoom-in ()
  "Increase font size by 10 points"
  (interactive)
  (set-face-attribute 'default nil
      		      :height
		      (+ (face-attribute 'default :height)
		         10)))
<p>(defun zoom-out ()
&ldquo;Decrease font size by 10 points&rdquo;
(interactive)
(set-face-attribute &lsquo;default nil
:height
(- (face-attribute &lsquo;default :height)
10)))</p>
<p>;; change font size, interactively
(global-set-key (kbd &ldquo;C-.&rdquo;) &lsquo;zoom-in)
(global-set-key (kbd &ldquo;C-,&rdquo;) &lsquo;zoom-out)
</pre></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>OOP = FP?</title>
      <link>http://vivekhaldar.com/articles/oop--fp/</link>
      <pubDate>Mon, 11 Apr 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/oop--fp/</guid>
      <description>&lt;p&gt;
&lt;a href=&#34;http://www.smalltalk.org/smalltalk/TheEarlyHistoryOfSmalltalk_TOC.html&#34;&gt;Alan
  Kay&amp;rsquo;s vision of object oriented programming&lt;/a&gt; was very different than that
  embodied in today&amp;rsquo;s popular OO languages such as Java and C++. One of his
  central goals for objects
  was &lt;a href=&#34;http://www.smalltalk.org/smalltalk/TheEarlyHistoryOfSmalltalk_I.html&#34;&gt;immutability&lt;/a&gt;:
&lt;/p&gt;&lt;blockquote&gt;
Though OOP came from many motivations, two were central. The large scale one was
to find a better module scheme for complex systems involving hiding of details,
and the small scale one was to find a &lt;b&gt;more flexible version of assignment,
and then to try to eliminate it altogether.&lt;/b&gt;
&lt;p&gt;
&lt;b&gt;The last thing you wanted any programmer to do is mess with internal
state&lt;/b&gt; even if presented figuratively. Instead, the objects should be
presented as site of higher level behaviors more appropriate for use as dynamic
component&amp;hellip;It is unfortunate that much of what is called &amp;ldquo;object-oriented
programming&amp;rdquo; today is simply old style programming with fancier constructs. Many
programs are loaded with &amp;ldquo;assignment-style&amp;rdquo; operations now done by more
expensive attached procedures.
&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>
<a href="http://www.smalltalk.org/smalltalk/TheEarlyHistoryOfSmalltalk_TOC.html">Alan
  Kay&rsquo;s vision of object oriented programming</a> was very different than that
  embodied in today&rsquo;s popular OO languages such as Java and C++. One of his
  central goals for objects
  was <a href="http://www.smalltalk.org/smalltalk/TheEarlyHistoryOfSmalltalk_I.html">immutability</a>:
</p><blockquote>
Though OOP came from many motivations, two were central. The large scale one was
to find a better module scheme for complex systems involving hiding of details,
and the small scale one was to find a <b>more flexible version of assignment,
and then to try to eliminate it altogether.</b>
<p>
<b>The last thing you wanted any programmer to do is mess with internal
state</b> even if presented figuratively. Instead, the objects should be
presented as site of higher level behaviors more appropriate for use as dynamic
component&hellip;It is unfortunate that much of what is called &ldquo;object-oriented
programming&rdquo; today is simply old style programming with fancier constructs. Many
programs are loaded with &ldquo;assignment-style&rdquo; operations now done by more
expensive attached procedures.
</p></blockquote>
<p>
(emphasis mine)
</p><p>
In this sense, the object-oriented school of thought is very close to functional
programming. This is hard to believe, given how common mutable state is in the
way OOP is practiced today. When was the last time you saw a class without a
raft of setter methods?
</p><p>
Somewhere along the line, imperative-ness perverted the
object-oriented paradigm. </p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Sun Ray</title>
      <link>http://vivekhaldar.com/articles/sun-ray/</link>
      <pubDate>Mon, 11 Apr 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/sun-ray/</guid>
      <description>&lt;p&gt;
This is a nostalgia trip. I was sad to
see &lt;a href=&#34;http://blogs.sun.com/OTNGarage/entry/sun_com_will_disappear_after&#34;&gt;sun.com
swallowed into oracle.com&lt;/a&gt;. It was jarring to see content that I&amp;rsquo;d been
seeing for years on sun.com (Java docs mostly) on oracle.com, with a different
visual style. But it was also unsettling to see a company with so much
world-class technology unable to survive financially. That&amp;rsquo;s something techies
and engineers should always think about.
&lt;/p&gt;&lt;p&gt;
I spent two summers &amp;ndash; 2002 and 2004 &amp;ndash; as an intern at Sun Labs. They had tons
of cool technology round every corner, and icons like like Dan Sutherland and
Whitfield Diffie walking the halls. But the thing that bowled me over was on
everybody&amp;rsquo;s desks &amp;ndash; the &lt;a href=&#34;http://en.wikipedia.org/wiki/Sun_Ray&#34;&gt;Sun
Ray&lt;/a&gt; thin terminal. It&amp;rsquo;s a concept that even today doesn&amp;rsquo;t have an
implementation as good.
&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>
This is a nostalgia trip. I was sad to
see <a href="http://blogs.sun.com/OTNGarage/entry/sun_com_will_disappear_after">sun.com
swallowed into oracle.com</a>. It was jarring to see content that I&rsquo;d been
seeing for years on sun.com (Java docs mostly) on oracle.com, with a different
visual style. But it was also unsettling to see a company with so much
world-class technology unable to survive financially. That&rsquo;s something techies
and engineers should always think about.
</p><p>
I spent two summers &ndash; 2002 and 2004 &ndash; as an intern at Sun Labs. They had tons
of cool technology round every corner, and icons like like Dan Sutherland and
Whitfield Diffie walking the halls. But the thing that bowled me over was on
everybody&rsquo;s desks &ndash; the <a href="http://en.wikipedia.org/wiki/Sun_Ray">Sun
Ray</a> thin terminal. It&rsquo;s a concept that even today doesn&rsquo;t have an
implementation as good.
</p><p>
It was a network terminal. Your files and entire session were on the server. Your
&ldquo;local&rdquo; terminal consisted only of a network interface and enough compute power
to display your session. The way they had it set up was that you could insert
your Sun employee ID &ndash; the same card used to get into the building &ndash; into a
slot in the terminal. That authenticated you to the server and displayed
your session. Want to show a colleage something you&rsquo;re working on? Just put your
ID into their Sun Ray and show them exactly what you were doing. That was cool!
It was a frictionless way to demo and collaborate.
</p><p>
So long, Sun, and thanks for all the tech goodies. </p>
]]></content:encoded>
    </item>
    
    <item>
      <title>The Shy Scientist</title>
      <link>http://vivekhaldar.com/articles/the-shy-scientist/</link>
      <pubDate>Sat, 26 Mar 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-shy-scientist/</guid>
      <description>&lt;p&gt;There has recently been a spate of best-selling popular science books that attempt to explain to the masses some fairly intricate ideas from fields such as psychology, neuroscience, mathematics, and biology. But they leave me somewhat uncomfortable. Most of them were written by non-technical authors.
&lt;/p&gt;
&lt;p&gt;
Dan Pink &lt;sup&gt;&lt;a class=&#34;footref&#34; name=&#34;fnr.1&#34; href=&#34;#fn.1&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; has written books about psychology and neuroscience, but he holds a degree in law, and has no technical background. Malcolm Gladwell &lt;sup&gt;&lt;a class=&#34;footref&#34; name=&#34;fnr.2&#34; href=&#34;#fn.2&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; is a scintillating writer and a thorough journalist, but he too has no technical credentials. One exception who stands out is Jonah Lehrer, who, according to the bio on his dust jacket, actually spent time as a graduate student in a neuroscience laboratory.
&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>There has recently been a spate of best-selling popular science books that attempt to explain to the masses some fairly intricate ideas from fields such as psychology, neuroscience, mathematics, and biology. But they leave me somewhat uncomfortable. Most of them were written by non-technical authors.
</p>
<p>
Dan Pink <sup><a class="footref" name="fnr.1" href="#fn.1">1</a></sup> has written books about psychology and neuroscience, but he holds a degree in law, and has no technical background. Malcolm Gladwell <sup><a class="footref" name="fnr.2" href="#fn.2">2</a></sup> is a scintillating writer and a thorough journalist, but he too has no technical credentials. One exception who stands out is Jonah Lehrer, who, according to the bio on his dust jacket, actually spent time as a graduate student in a neuroscience laboratory.
</p>
<p>
Steve Pinker chastises Gladwell for getting the term &ldquo;eigenvalue&rdquo; wrong <sup><a class="footref" name="fnr.3" href="#fn.3">3</a></sup>. At that point, Gladwell has surely lost almost all of his technical readers. How could he possibly move on to explaining concepts that are built on understanding what an eigenvalue <sup><a class="footref" name="fnr.4" href="#fn.4">4</a></sup> is, when he doesn&rsquo;t understand what an eigenvalue (or linear algebra, for that matter) is?
</p>
<p>
But what about  the actual scientists  doing all this work that is being written about? Why aren&rsquo;t they the ones writing books like these? For one, they&rsquo;re too busy actually doing science, and writing up the results in technical papers, for a technical audience. But I don&rsquo;t think that&rsquo;s the real reason holding them back.
</p>
<p>
The central value drilled into scientists through their long years of training <sup><a class="footref" name="fnr.5" href="#fn.5">5</a></sup> is skepticism. This leaves them with a deep discomfort with blanket truths and generalizations. Scientific truth is extremely hard to pin down, and even then, it is usually preconditioned upon a long list of precise factors. Most scientists&rsquo; careers follow the path of narrower and deeper specialization, strengthening their aversion to wide generalizations.
</p>
<p>
Authors, on the other hand, want to believe. They want to find the parts of a dense technical paper that help them build a colorful story and support a somewhat related generalization.
</p>
<p>
Where does that leave the reader? If you truly want to understand a topic, treat these books as jumping points. Question their narrative. Most of all, flip back to the bibliography, and try to dig into the original sources.
</p>
<p class="footnote"><sup><a class="footnum" name="fn.1" href="#fnr.1">1</a></sup><a href="http://www.danpink.com/about">http://www.danpink.com/about</a>
</p>
<p class="footnote"><sup><a class="footnum" name="fn.2" href="#fnr.2">2</a></sup><a href="http://www.gladwell.com/bio.html">http://www.gladwell.com/bio.html</a>
</p>
<p class="footnote"><sup><a class="footnum" name="fn.3" href="#fnr.3">3</a></sup><a href="http://www.nytimes.com/2009/11/15/books/review/Pinker-t.html?_r=2&amp;pagewanted=print">http://www.nytimes.com/2009/11/15/books/review/Pinker-t.html?_r=2&amp;pagewanted=print</a>
</p>
<p class="footnote"><sup><a class="footnum" name="fn.4" href="#fnr.4">4</a></sup><a href="http://en.wikipedia.org/wiki/Eigenvalues_and_eigenvectors">http://en.wikipedia.org/wiki/Eigenvalues_and_eigenvectors</a>
</p>
<p class="footnote"><sup><a class="footnum" name="fn.5" href="#fnr.5">5</a></sup> They are usually in their late 20s by the time they get their PhD&rsquo;s, which is when their career actually starts
</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>The levels of Emacs proficiency</title>
      <link>http://vivekhaldar.com/articles/the-levels-of-emacs-proficiency/</link>
      <pubDate>Mon, 21 Mar 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-levels-of-emacs-proficiency/</guid>
      <description>&lt;p&gt;&lt;strong&gt;0. Awareness&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You know about the existence of Emacs. You know that &amp;ldquo;C-x C-c&amp;rdquo; will get out of it. You also know that &amp;ldquo;C-h t&amp;rdquo; will go to the built-in tutorial, and you slowly and clumsily start making your way through it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Basic usage&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You can use Emacs for basic text editing. You are beginning to get comfortable moving around files, searching, and you know how to open multiple buffers, navigate among them, and split frames. You are now at the level where you can use Emacs as a substitute for a basic text editor like Notepad/Textedit/whatever.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><strong>0. Awareness</strong></p>
<p>You know about the existence of Emacs. You know that &ldquo;C-x C-c&rdquo; will get out of it. You also know that &ldquo;C-h t&rdquo; will go to the built-in tutorial, and you slowly and clumsily start making your way through it.</p>
<p><strong>1. Basic usage</strong></p>
<p>You can use Emacs for basic text editing. You are beginning to get comfortable moving around files, searching, and you know how to open multiple buffers, navigate among them, and split frames. You are now at the level where you can use Emacs as a substitute for a basic text editor like Notepad/Textedit/whatever.</p>
<p><strong>2. Basic customization</strong></p>
<p>You are now beginning to use Emacs on a regular basis, and begin to feel the need for minor tweaking. You learn how to customize Emacs by adding some text to a file called .emacs in your home directory. You don&rsquo;t yet know or understand Emacs Lisp, but googling around has taught you that &ldquo;(global-font-lock-mode t)&rdquo; will turn on the pretty syntax highlighting everywhere automatically.</p>
<p><strong>3. Advanced usage</strong></p>
<p>Reading the built-in documentation, as well as websites and blog posts, you begin to incorporate some of the more advanced features of Emacs into your day to day editing. This includes things like using regular expressions, registers, dired, tramp, and the intricacies of various modes for the programming languages you edit regularly.</p>
<p>But the big aha moment comes when you use <strong>keyboard macros to refactor the usage of a function in 40 different files in 30 seconds</strong>. You marvel at how easy it was, and how you ever got by without it. Dreadful memories of similar refactorings carried out manually, one file at a time, one usage at a time, reinforce your determination to never go back.</p>
<p><strong>4. Shell inside Emacs</strong></p>
<p>At first this sounds like just another &ldquo;advanced usage&rdquo; topic, but this is the first quantum leap on the Emacs learning curve which illustrates how Emacs can <strong>subsume activities that were typically carried out outside it</strong>. Hence, it deserves special treatment.</p>
<p>Up until now, you probably had one large Emacs window plus many other shell windows spread out on your screen. Also, if you are a typical developer, you often had to cut and paste text between those windows. And that was a major road bump, because you had to use the mouse to select text in an xterm. Often, the text you really wanted had scrolled off the window.</p>
<p>And then, you learned about it: <strong>M-x &ldquo;shell&rdquo;</strong>.</p>
<p><strong>It was all just text.</strong> Why did you need another application for it? Why should only the shell prompt be editable? Why can&rsquo;t I move my cursor up a few lines to where the last command spewed out its results? All these problems simply disappear when your shell (or shells) simply becomes another Emacs buffer, upon which all of the text manipulation power of Emacs can be brought to bear.</p>
<p>Another reason this level is special is that now begins to pain you to watch other people flicking between their shell windows and editor windows, wasting time mousing around, wasting time eyeballing command output because it is not searchable. &ldquo;There is a better way! Why are they still doing this?&rdquo; you wonder to yourself. This feeling only gets worse as you continue climbing up the Emacs curve.</p>
<p><strong>5. Advanced customization</strong></p>
<p>You begin to pick up Emacs Lisp. Your .emacs starts to accumulate small functions that you have written to solve your own little problems. You realize that the rich libraries for text manipulation that Emacs comes with are like an intricate domain-specific language for fine text surgery, built up over decades. Now whenever there is some friction, you put some thought into how it can be smoothed out with some customization, or Emacs Lisp automation.</p>
<p><strong>6. Emacs-ifying everything</strong></p>
<p>You long to move into Emacs every application that has anything to do with the entry and manipulation of text. For most programmers, this is pretty much everything. E-mail is the first obvious target. But you can even move a good fraction of your web surfing (sites where you just plain read, that are not JavaScript heavy) into Emacs as well. You can even turn Emacs into a <a href="http://www.emacswiki.org/emacs/TwitteringMode">full-fledged twitter client</a>.</p>
<p>The transformation is visually apparent on your screen. At the earlier levels, you probably had one Emacs window, and then a few shell and browser windows. By now, you have one maximized Emacs window, probably split among some shell and text buffers, and the browser window behind it, which you occasionally Alt-Tab into.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Cracks in Minimalism</title>
      <link>http://vivekhaldar.com/articles/cracks-in-minimalism/</link>
      <pubDate>Sat, 19 Mar 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/cracks-in-minimalism/</guid>
      <description>&lt;p&gt;More people are catching on to the cracks in the minimalism mantra. &lt;a href=&#34;http://blog.penelopetrunk.com/2011/03/07/beware-of-leo-babautas-minimalist-lifestyle/&#34;&gt;Here&amp;rsquo;s Penelope Trunk: &lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;I told Leo I thought it was BS that he is Mr. Minimalism and he moved to San Francisco. I told him that the biggest cultural shift for me from New York City to the farm is the surprise shift to extreme minimalism. So I am sure that his move to San Francisco means he is tossing in the minimalism towel.  Leo has great resources on his blog about leading a minimalist lifestyle. But I think &lt;strong&gt;minimalism is lifestyle porn. It&amp;rsquo;s something that people think would be nice to dream about for their lives, but in fact, there is the dirty flip side to minimalism: It&amp;rsquo;s scary boring&lt;/strong&gt;, which, I think, is why Leo moved his family to San Francisco—to expand what&amp;rsquo;s available to his kids.&lt;/blockquote&gt;
&lt;p&gt;(emphasis mine)&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>More people are catching on to the cracks in the minimalism mantra. <a href="http://blog.penelopetrunk.com/2011/03/07/beware-of-leo-babautas-minimalist-lifestyle/">Here&rsquo;s Penelope Trunk: </a></p>
<blockquote>I told Leo I thought it was BS that he is Mr. Minimalism and he moved to San Francisco. I told him that the biggest cultural shift for me from New York City to the farm is the surprise shift to extreme minimalism. So I am sure that his move to San Francisco means he is tossing in the minimalism towel.  Leo has great resources on his blog about leading a minimalist lifestyle. But I think <strong>minimalism is lifestyle porn. It&rsquo;s something that people think would be nice to dream about for their lives, but in fact, there is the dirty flip side to minimalism: It&rsquo;s scary boring</strong>, which, I think, is why Leo moved his family to San Francisco—to expand what&rsquo;s available to his kids.</blockquote>
<p>(emphasis mine)</p>
<p><a href="http://blog.vivekhaldar.com/post/2525332092/minimalism-is-not-a-viable-intellectual-strategy">My own thoughts on the topic.</a></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>tldr summary: The role of deliberate practice in the acquisition of expert performance</title>
      <link>http://vivekhaldar.com/articles/tldr-summary-the-role-of-deliberate-practice-in-the-acquisition-of-expert-performance/</link>
      <pubDate>Tue, 15 Mar 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/tldr-summary-the-role-of-deliberate-practice-in-the-acquisition-of-expert-performance/</guid>
      <description>&lt;p&gt;I’ve often come across citations of &lt;a href=&#34;http://psycnet.apa.org/?fa=main.doiLanding&amp;amp;uid=1993-40718-001&#34;&gt;this paper&lt;/a&gt;, and I finally took the time to read it. It is an engaging and lucid read, but it is long &amp;ndash; forty pages of dense journal layout. For those too lazy to read the whole thing, here’s my summary.&lt;br/&gt;&lt;br/&gt;The paper is part survey, part original work. It’s goal is to investigate the factors that go into expert, world-class performance in any given field. The standing theory that it challenges is the importance of “natural ability” or “innate talent”, as opposed to something that can be built up and attained over time. That something, the authors argue, is &lt;em&gt;deliberate practice&lt;/em&gt;.&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;Poor correlation between ability measures and performance:&lt;/strong&gt; Ability tests tests predict “new graduate” performance (performance on a job immediately after training) with a correlation of 0.3, and that goes down to 0.2 for long-term performance.&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;Experts can rarely move across domains:&lt;/strong&gt; Again and again, experts have failed to transfer their gifts to a new domain. Their gift works only in their own domain. &lt;br/&gt;&lt;br/&gt;“The search for stable heritable characteristics that could predict or at least account for superior performance&amp;hellip; has been unsuccessful.”&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;Just practice is not enough, and there is usually a plateau:&lt;/strong&gt; mere repetition of a task leads to a performance plateau. Most adults perform at less than maximal levels even for tasks they do frequently. Looking at long-term performance records (mostly in sports), performance of the best has had a constant upward trend (i.e. world records are regularly broken).&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;The ten-year rule:&lt;/strong&gt; Surveying many experts in many fields reveals that it takes at least 10 years to achieve world-class performance.&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;Three types of activity: Work, play, and deliberate practice.&lt;/strong&gt; Work is extrinsically motivated, and performance stability and predictability (i.e. that you’ll get the job done) are paramount, performance growth is not. Play is intrinsically motivated and pleasurable, but not goal-directed, and not structured to improve performance. Deliberate practice is structured, effortful practice, usually not pleasurable, focused on specific performance bottlenecks.&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;Characteristics of deliberate practice: &lt;/strong&gt;Tailored to subject’s existing level and weaknesses. Must get immediate feedback on performance. Subjects should actively try out new methods and refine them to match new performance goals. Since deliberate practice is effortful and not pleasurable, subjects must be motivated enough by the promise of increased performance to go through it.&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;Intensity:&lt;/strong&gt; deliberate practice must push your limits. One must push their maximal level. This is in contrast to both work (where the goal is steady-state performance) and play (where the goal is to have fun). &lt;br/&gt;&lt;br/&gt;&lt;strong&gt;Monotonic benefits: &lt;/strong&gt;Performance increases monotonically with deliberate practice. This is perhaps the most important point of the paper. You can break past plateaus and crank up your performance &amp;ndash; if you are ready to put in the hours of deliberate practice.&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;The importance of rest:&lt;/strong&gt; deliberate practice is intense and exhausting, and can only be sustained for a limited time each day. There were no benefits from doing this for more than four hours a day, and benefits trailed off after two hours a day. Adequate recovery time is essential.&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;The importance of support structures:&lt;/strong&gt; the commitment to deliberate practice involves not just the individual, but an intricate support structure consisting of parents and teachers and facilities, sustained over a long period of time.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I’ve often come across citations of <a href="http://psycnet.apa.org/?fa=main.doiLanding&amp;uid=1993-40718-001">this paper</a>, and I finally took the time to read it. It is an engaging and lucid read, but it is long &ndash; forty pages of dense journal layout. For those too lazy to read the whole thing, here’s my summary.<br/><br/>The paper is part survey, part original work. It’s goal is to investigate the factors that go into expert, world-class performance in any given field. The standing theory that it challenges is the importance of “natural ability” or “innate talent”, as opposed to something that can be built up and attained over time. That something, the authors argue, is <em>deliberate practice</em>.<br/><br/><strong>Poor correlation between ability measures and performance:</strong> Ability tests tests predict “new graduate” performance (performance on a job immediately after training) with a correlation of 0.3, and that goes down to 0.2 for long-term performance.<br/><br/><strong>Experts can rarely move across domains:</strong> Again and again, experts have failed to transfer their gifts to a new domain. Their gift works only in their own domain. <br/><br/>“The search for stable heritable characteristics that could predict or at least account for superior performance&hellip; has been unsuccessful.”<br/><br/><strong>Just practice is not enough, and there is usually a plateau:</strong> mere repetition of a task leads to a performance plateau. Most adults perform at less than maximal levels even for tasks they do frequently. Looking at long-term performance records (mostly in sports), performance of the best has had a constant upward trend (i.e. world records are regularly broken).<br/><br/><strong>The ten-year rule:</strong> Surveying many experts in many fields reveals that it takes at least 10 years to achieve world-class performance.<br/><br/><strong>Three types of activity: Work, play, and deliberate practice.</strong> Work is extrinsically motivated, and performance stability and predictability (i.e. that you’ll get the job done) are paramount, performance growth is not. Play is intrinsically motivated and pleasurable, but not goal-directed, and not structured to improve performance. Deliberate practice is structured, effortful practice, usually not pleasurable, focused on specific performance bottlenecks.<br/><br/><strong>Characteristics of deliberate practice: </strong>Tailored to subject’s existing level and weaknesses. Must get immediate feedback on performance. Subjects should actively try out new methods and refine them to match new performance goals. Since deliberate practice is effortful and not pleasurable, subjects must be motivated enough by the promise of increased performance to go through it.<br/><br/><strong>Intensity:</strong> deliberate practice must push your limits. One must push their maximal level. This is in contrast to both work (where the goal is steady-state performance) and play (where the goal is to have fun). <br/><br/><strong>Monotonic benefits: </strong>Performance increases monotonically with deliberate practice. This is perhaps the most important point of the paper. You can break past plateaus and crank up your performance &ndash; if you are ready to put in the hours of deliberate practice.<br/><br/><strong>The importance of rest:</strong> deliberate practice is intense and exhausting, and can only be sustained for a limited time each day. There were no benefits from doing this for more than four hours a day, and benefits trailed off after two hours a day. Adequate recovery time is essential.<br/><br/><strong>The importance of support structures:</strong> the commitment to deliberate practice involves not just the individual, but an intricate support structure consisting of parents and teachers and facilities, sustained over a long period of time.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>In Aggregate</title>
      <link>http://vivekhaldar.com/articles/in-aggregate/</link>
      <pubDate>Tue, 08 Mar 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/in-aggregate/</guid>
      <description>&lt;p&gt;It is safe to say &lt;a href=&#34;http://en.wikipedia.org/wiki/Daily_Me&#34;&gt;Nicholos Negroponte&amp;rsquo;s prediction of the &amp;ldquo;Daily Me&amp;rdquo;&lt;/a&gt; has come to pass, possibly even beyond his wildest expectations. His original vision was of a &amp;ldquo;virtual daily newspaper customized for an individual&amp;rsquo;s tastes.&amp;rdquo; But, as Wikipedia puts it:&lt;/p&gt;
&lt;blockquote&gt;The term has also been associated with the phenomenon of individuals customizing and personalizing their news feeds, resulting in their being exposed only to content they are already inclined to agree with. The Daily Me can thus be a critical component of the &amp;ldquo;echo chamber&amp;rdquo; effect, defined in an article in Salon by David Weinberger as &amp;ldquo;those Internet spaces where like-minded people listen only to those people who already agree with them.&amp;rdquo;&lt;/blockquote&gt;
&lt;p&gt;It is a well-known fact in debating societies &amp;ndash; and among political campaigners &amp;ndash; that the best way strenghthen your position is to &lt;em&gt;not&lt;/em&gt; focus on winning over people who don&amp;rsquo;t believe you, but give your believers even more reasons to believe. Iterate this over a few hundred years and you end up with cliques of people with strongly held  and inflexible views.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>It is safe to say <a href="http://en.wikipedia.org/wiki/Daily_Me">Nicholos Negroponte&rsquo;s prediction of the &ldquo;Daily Me&rdquo;</a> has come to pass, possibly even beyond his wildest expectations. His original vision was of a &ldquo;virtual daily newspaper customized for an individual&rsquo;s tastes.&rdquo; But, as Wikipedia puts it:</p>
<blockquote>The term has also been associated with the phenomenon of individuals customizing and personalizing their news feeds, resulting in their being exposed only to content they are already inclined to agree with. The Daily Me can thus be a critical component of the &ldquo;echo chamber&rdquo; effect, defined in an article in Salon by David Weinberger as &ldquo;those Internet spaces where like-minded people listen only to those people who already agree with them.&rdquo;</blockquote>
<p>It is a well-known fact in debating societies &ndash; and among political campaigners &ndash; that the best way strenghthen your position is to <em>not</em> focus on winning over people who don&rsquo;t believe you, but give your believers even more reasons to believe. Iterate this over a few hundred years and you end up with cliques of people with strongly held  and inflexible views.</p>
<p>And all they want to do when they reach for the newspaper, or the laptop, is reconfirm those views.</p>
<p>I don&rsquo;t know anyone, including myself, who actively seeks out news sources outside their regular sources. Do you? Doesn&rsquo;t Reddit, Hacker News, NYT and the blogroll of tech bloggers get old after a while?</p>
<p>We all get a majority of our news through aggregators where the top stories are the ones with most upvotes. In this sense, aggregators are nothing but machines for providing us a steady stream of agreement.</p>
<p><a href="#%22http://bostonreview.net/BR26.3/sunstein.php">Cass Sunstein has written a critique of the Daily Me idea</a>, arguing that being exposed to ideas one does not agree with is crucial for a healthy democracy. The central idea is that of group polarization:</p>
<blockquote>The idea is that after deliberating with one another, people are likely to move toward a more extreme point in the direction to which they were previously inclined, as indicated by the median of their predeliberation judgments. With respect to the Internet, the implication is that groups of people, especially if they are like-minded, will end up thinking the same thing that they thought before—but in more extreme form.</blockquote>
<p>Part of the problem is that the average modern urban human lives in an almost completely mediated world, where experiences and ideas come to him many times removed from their original source. Think of all the beliefs you hold, and then tally up how many of them you have arrived at through your own <em>direct experience</em>. For most people, that tally is vanishingly small. Of course, mediation &ndash; and shelter &ndash; from the harsh natural world is what technology is all about. The tension between the atavistic pull of the primordial and the natural curiousity of invention is at the heart of the value of technology. (<a href="http://www.kk.org/books/what-technology-wants.php">Kevin Kelly&rsquo;s &ldquo;What Technology Wants&rdquo;</a> is by far the best exposition of this idea I&rsquo;ve read).</p>
<p>Michael Crichton, in his autobiographical <a href="http://books.google.com/books?id=QYilZGadTEYC&amp;printsec=frontcover&amp;dq=crichton+travels&amp;source=bl&amp;ots=dQwEeULf9c&amp;sig=vcq855QDFddHIHaQPfbLbXNAyPY&amp;hl=en&amp;ei=dIFyTfi3LJDGsAO06szDCQ&amp;sa=X&amp;oi=book_result&amp;ct=result&amp;resnum=4&amp;ved=0CDAQ6AEwAw#v=onepage&amp;q&amp;f=true">&ldquo;Travels</a>&rdquo;, makes a deeper point about living in a mediated world for extended periods of time. It&rsquo;s not just that one becomes used to seeing the same things all the time, but that it makes one <em>incapable</em> of perceiving things outside their tunnel-vision.</p>
<blockquote>One of the most difficult features of direct experience is that it is unfiltered by any theories and expectations. It&rsquo;s hard to observe without imposing a theory to explain what we&rsquo;re seeing, but the trouble with theories, as Einstein said, is that they explain not only what is observed but what <em>can be</em> observed. We start to build expectations based on our theories. And often those expectations get in the way.</blockquote>
<p>Is there a way out of the spiralling Daily-Me cycle? I can think of two ways: deep uninterrupted thinking, and direct unmediated experieces of the sort Crichton talks about in &ldquo;Travels&rdquo;. If you read the book, you&rsquo;ll see how his contrarian views stem from his unmediated experieces.</p>
<p>On the rare occasions that I get an unbroken tract of time to just think and do nothing else, I&rsquo;m surprised by how my thoughts wander into areas and conclusions that are contrary to the echo chamber I&rsquo;m usually submerged in. Being unplugged and not deluged by the thoughts of others probably has something to do with it. <a href="http://blog.vivekhaldar.com/post/2525332092/minimalism-is-not-a-viable-intellectual-strategy">Being plugged in certainly has its benefits, just not all the time</a>.    <!-- ;;; local variables: ;;; gdocs-docid: "1gDtJB7pKoGXzkJch3vhT8anjBjnj1K3-2FUbVOHj_bQ" ;;; gdocs-user-email: "vh@vivekhaldar.com" ;;; end: --></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Turn your blog into an online magazine - a blogmag</title>
      <link>http://vivekhaldar.com/articles/turn-your-blog-into-an-online-magazine--a-blogmag/</link>
      <pubDate>Thu, 03 Mar 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/turn-your-blog-into-an-online-magazine--a-blogmag/</guid>
      <description>&lt;p&gt;
I recently ran into &lt;a href=&#34;http://treesaver.net/&#34;&gt;Treesaver&lt;/a&gt;, &amp;ldquo;a new HTML5 platform for narrative experiences—with text and pictures and video. Treesaver divides content into pages, automatically adjusting to the size of any screen.&amp;rdquo; The promise seemed pretty appealing. You write clean HTML, and the framework dynamically lays it out in the browser, across multiple platforms such as desktops, Android and iOs. Take a look at their &lt;a href=&#34;http://treesaver.net/portfolio/&#34;&gt;first few online zines&lt;/a&gt;. Very slick.
&lt;/p&gt;&lt;p&gt;
It seemed to provide a much more readable experience than a vertically flowing webpage. You can move around the article with the arrow keys. Past an article boundary the arrow keys will take you to the next (or previous) article. The great thing was that it didn&amp;rsquo;t break the web model &amp;mdash; the URL for each article showed up in the location bar as I flipped around.
&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>
I recently ran into <a href="http://treesaver.net/">Treesaver</a>, &ldquo;a new HTML5 platform for narrative experiences—with text and pictures and video. Treesaver divides content into pages, automatically adjusting to the size of any screen.&rdquo; The promise seemed pretty appealing. You write clean HTML, and the framework dynamically lays it out in the browser, across multiple platforms such as desktops, Android and iOs. Take a look at their <a href="http://treesaver.net/portfolio/">first few online zines</a>. Very slick.
</p><p>
It seemed to provide a much more readable experience than a vertically flowing webpage. You can move around the article with the arrow keys. Past an article boundary the arrow keys will take you to the next (or previous) article. The great thing was that it didn&rsquo;t break the web model &mdash; the URL for each article showed up in the location bar as I flipped around.
</p><p>
And its <a href="https://github.com/Treesaver/">open-sourced on
GitHub</a>. And you can <a href="https://github.com/Treesaver/treesaver/wiki/Analytics">hook
it up with Google Analytics.</a>
</p><p>
So I <a href="http://www.tumblr.com/docs/en/api">pulled down all my Tumblr posts using their API</a>, and threw together a quick script to re-render them as plain individual HTML files with the <a href="https://github.com/Treesaver/treesaver/wiki/Walkthrough">correct incantations to invoke the Treesaver javascript</a>, which is turns out, is pretty lightweight.
</p><p>
The end-result is what I call a <b>blogmag</b>, <a href="http://www.vivekhaldar.com/blogmag">this blog laid out as an online magazine</a>. Flip around. </p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Michael Crichton</title>
      <link>http://vivekhaldar.com/articles/michael-crichton/</link>
      <pubDate>Sat, 26 Feb 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/michael-crichton/</guid>
      <description>&lt;p&gt;
(I wrote this shortly after Michael Crichton&amp;rsquo;s death in late 2008.)
&lt;/p&gt;&lt;p&gt;
The first Michael Crichton book I read was &amp;ldquo;Jurassic Park&amp;rdquo;. Right
after I watched the movie. Yes, I realize it does not get any more
cliched than that. But I was enthralled. I started reading more. Soon,
I had bought into the author, not just the books.
&lt;/p&gt;&lt;p&gt;
His recent death made me sad, by surprise. I had counted on enjoying a
new Crichton every year or so. The loss of that voice was real.
&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>
(I wrote this shortly after Michael Crichton&rsquo;s death in late 2008.)
</p><p>
The first Michael Crichton book I read was &ldquo;Jurassic Park&rdquo;. Right
after I watched the movie. Yes, I realize it does not get any more
cliched than that. But I was enthralled. I started reading more. Soon,
I had bought into the author, not just the books.
</p><p>
His recent death made me sad, by surprise. I had counted on enjoying a
new Crichton every year or so. The loss of that voice was real.
</p><p>
He wrote sci-fi, but of an immediate flavor. Not fantastic sci-fi like
that of Asimov or Clarke set centuries from now, but in the current
day or very soon after it. The advances he detailed titillatingly
skirted the boundary between suspend-your-belief galactic travel and
taking today&rsquo;s cutting edge and extrapolating it a few years. But it
was the characters in his book that had me hooked. They were perfectly
human. The &ldquo;bad guys&rdquo; were sometimes good, and vice versa. Everyone
was conflicted about the course they were tumbling through. Many of
his characters made me think, &ldquo;I know someone like that.&rdquo; A few made
me identify with them.
</p><p>
He revisited a few common themes in many of this novels.
</p><p>
One was organizational psychology. His forte was picking a bunch of
mostly staid but slightly extraordinary people, and throwing them
together, usually in the context of a larger organization or group
(The Jurassic series, Congo, Andromeda Strain, The Sphere). I was
deeply fascinated by how his characters handled crisis behavior, and
how modes of failure always took the most unexpected route,
culminating in a perfect storm. As an enginner, you can&rsquo;t help but
identify with that. To add to the realism, he weaved in pressures from
politics, lobbying, journalism and public perception (Disclosure,
Airframe, Next).
</p><p>
Another common theme was man&rsquo;s relationship to nature. His stance was,
again, rooted in realism. His wiser characters believed man could
shape nature to his benefit, but at the same time were deeply humble
towards natural forces. His foolish characters carried a romantic
city-slicker notion of the wild and usually paid dearly for it. In his
non-fiction writings, he argued against global warming alarmists. His
critics confused it with arguing against global warming. He plainly
acknowledged that humans had changed climate, but advocated a measured
approach to address it. He wanted us to think of any redress as a
tradeoff, and carefully consider the costs of both the disease and the
cure.
</p><p>
If you&rsquo;ve read a few Crichtons, you&rsquo;ll see all this. It is what was
&ldquo;between the books&rdquo; that he deserves most credit for.
</p><p>
He was a perpetual grad student. Each of his novels was the
side-effect of a long deep-dive into a specialized topic. Read the
detailed, annotated bibliography at the end of most of his books. He
was not in a university, but he led a life of the mind. In his
autobiographical &ldquo;Travels&rdquo;, he talks about the real feel of first-hand
knowledge from personal experience. He lamented the futility of a
single human understanding any significant fraction of knowledge in
the modern world.
</p><p>
It seems to me he tried anyway. </p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Alone Together</title>
      <link>http://vivekhaldar.com/articles/alone-together/</link>
      <pubDate>Sun, 20 Feb 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/alone-together/</guid>
      <description>&lt;p&gt;I just finished reading &lt;a href=&#34;http://www.amazon.com/Alone-Together-Expect-Technology-Other/dp/0465010210/&#34;&gt;Sherry Turkle&amp;rsquo;s &amp;ldquo;Alone Together&amp;rdquo;&lt;/a&gt;, and I want to jot down some thoughts while the book is still fresh in my memory. This is not a review, just random thoughts triggered by the book.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;http://ecx.images-amazon.com/images/I/51JuIPM8FhL._SL500_AA300_.jpg&#34;/&gt;&lt;/p&gt;
&lt;p&gt;For me this book evenly rounded off a trio of books on technology. Matt Ridley&amp;rsquo;s &lt;a href=&#34;http://www.amazon.com/Rational-Optimist-How-Prosperity-Evolves/dp/006145205X&#34;&gt;&amp;ldquo;The Rational Optimist&amp;rdquo;&lt;/a&gt; is unabashedly optimistic, and makes a strong case for being so. It is an unapologetic celebration of the constant improving arc of technology as the engine for our quality of life, a strong rebuff to the nay-sayers and Luddites. Kevin Kelly&amp;rsquo;s &lt;a href=&#34;http://www.amazon.com/What-Technology-Wants-Kevin-Kelly/dp/0670022152&#34;&gt;&amp;ldquo;What Technology Wants&amp;rdquo;&lt;/a&gt; takes an unblinking look at both the good and bad that technology has wrought, and concludes that on balance, technology is good. In fact, it makes a strong &lt;strong&gt;moral&lt;/strong&gt; argument for technology If, as a technologist, you ever have doubts about your line of work, read this book. It will not banish your doubts – if might actually reinforce them – but give you good reasons to stick with technology nonetheless.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I just finished reading <a href="http://www.amazon.com/Alone-Together-Expect-Technology-Other/dp/0465010210/">Sherry Turkle&rsquo;s &ldquo;Alone Together&rdquo;</a>, and I want to jot down some thoughts while the book is still fresh in my memory. This is not a review, just random thoughts triggered by the book.</p>
<p><img src="http://ecx.images-amazon.com/images/I/51JuIPM8FhL._SL500_AA300_.jpg"/></p>
<p>For me this book evenly rounded off a trio of books on technology. Matt Ridley&rsquo;s <a href="http://www.amazon.com/Rational-Optimist-How-Prosperity-Evolves/dp/006145205X">&ldquo;The Rational Optimist&rdquo;</a> is unabashedly optimistic, and makes a strong case for being so. It is an unapologetic celebration of the constant improving arc of technology as the engine for our quality of life, a strong rebuff to the nay-sayers and Luddites. Kevin Kelly&rsquo;s <a href="http://www.amazon.com/What-Technology-Wants-Kevin-Kelly/dp/0670022152">&ldquo;What Technology Wants&rdquo;</a> takes an unblinking look at both the good and bad that technology has wrought, and concludes that on balance, technology is good. In fact, it makes a strong <strong>moral</strong> argument for technology If, as a technologist, you ever have doubts about your line of work, read this book. It will not banish your doubts – if might actually reinforce them – but give you good reasons to stick with technology nonetheless.</p>
<p>And then, Turkle&rsquo;s latest looks at technology from a human, personal and psychological point of view, and even though it is brilliantly written, there is a constant dark, gloomy tone to it.</p>
<p><img src="http://ecx.images-amazon.com/images/I/41lE-6SCVdL._SL500_AA300_.jpg"/><img src="http://ecx.images-amazon.com/images/I/61jtoj2lJVL._SL500_AA300_.jpg"/></p>
<ul><li> The book is evenly split into two parts. The first looks at robots, and how humans interact with them. Will we let robots raise our children and take care of our aging? Should we? If a robot makes eye contact, has warm skin, responds to what you say — and here&rsquo;s the clincher – will never hurt you, will you prefer it to humans? Is a simulation of emotion as good as the real thing? </li>
<li> The second half looks at the culture of connection. Being always on, always connected, unpredictably simulated by pellets of information. I was surprised that a serious discussion of addiction didn&rsquo;t come until the last three chapters. For me, this part resonated much more than the first one, because, well, I live and struggle with the lures of the Net and how my brain interacts with it day in and day out, but I&rsquo;ve never met a robot. </li>
<li> The beating heart of the book is her subjects — the people she talks to and questions about their lives and their technology. Middle-aged people with families seeking shelter in the &ldquo;cool shade of the Web&rdquo; and teenagers overcooked by cellphones, longing for something else, something they don&rsquo;t know. She quotes them directly and extensively. </li>
<li> She brings technology&rsquo;s problems into sharp relief, but unfortunately, offers no solutions. This, to me, was the book&rsquo;s major fault. </li>
<li> (This might be a spoiler.) The entire piece is revealed only when you finally realize that the author has a daughter who has just left for college. She worries if her daughter&rsquo;s recollections of her, colored by ephemera such as email and Skype, will have the same richness and permanence as those that she has for her mother, formed when the world was analog, when handwritten letters could be dusted off after half a century and trigger a rush of emotion. </li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>The Cognitive Style of Unix</title>
      <link>http://vivekhaldar.com/articles/the-cognitive-style-of-unix/</link>
      <pubDate>Thu, 17 Feb 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-cognitive-style-of-unix/</guid>
      <description>&lt;p&gt;One of the most deeply held beliefs in the culture of *nix (and everything that springs from it) is that the steep learning curve pays off. Yes, the tools &lt;strong&gt;seem&lt;/strong&gt; cryptic and &amp;ldquo;hard-to-use&amp;rdquo;, with hardly any crutches for the beginner. But if you stick with it and keep learning you will be rewarded. When you grok the power of economical command lines, composability and extensibility, you&amp;rsquo;re glad you didn&amp;rsquo;t run back to the arms of the GUI on the first day. It was worth it.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>One of the most deeply held beliefs in the culture of *nix (and everything that springs from it) is that the steep learning curve pays off. Yes, the tools <strong>seem</strong> cryptic and &ldquo;hard-to-use&rdquo;, with hardly any crutches for the beginner. But if you stick with it and keep learning you will be rewarded. When you grok the power of economical command lines, composability and extensibility, you&rsquo;re glad you didn&rsquo;t run back to the arms of the GUI on the first day. It was worth it.</p>
<p>There is another belief that goes deeper, and it is the reason that after decades of existence and millions of newbie-suffering-hours, the learning curve has not become any easier, or gone away. That belief is: the learning curve has value, it is essential for learning, and it needs to be preserved, not whittled away in the name of &ldquo;ease-of-use.&rdquo; <sup><a name="fnr.1" id="fnr.1" href="#fn.1">1</a></sup></p>
<p>I recently came across some research which rigorously backs up this line of thinking.</p>
<p>Dr. Christof van Nimwegen <sup><a name="fnr.2" id="fnr.2" href="#fn.2">2</a></sup> is a cognitive psychologist researching user interface issues. He has published several papers <sup><a name="fnr.3" id="fnr.3" href="#fn.3">3</a></sup><sup><a name="fnr.4" id="fnr.4" href="#fn.4">4</a></sup><sup><a name="fnr.5" id="fnr.5" href="#fn.5">5</a></sup>, leading up to a doctoral dissertation <sup><a name="fnr.6" id="fnr.6" href="#fn.6">6</a></sup>, that investigate how cues in software interfaces affect how people solve problems and interact with those interfaces.</p>
<p>He frames the issue in terms of <strong>internalization</strong> vs <strong>externalization</strong>. Some software tries to be &ldquo;easy-to-use&rdquo; by externalizing rules and knowledge into the interface, so that the user does not have to think and can merely follow the cues. An example is inactivating parts of the interface that are not relevant or allowed in a particular context. Software that does not externalize such rules and knowledge relies instead on the user internalizing those, and mindfully coming up with plans to solve the problem at hand.</p>
<p>The traditional belief is that internalization is slow at first, but faster and more powerful as time goes on, whereas externalization helps newbies come up to speed fast and eventually approach guru-level. That belief translates to the following learning curve:</p>
<p><img src="http://www.vivekhaldar.com/curve1.png" alt="http://www.vivekhaldar.com/curve1.png"/></p>
<p>However, Nimwegen&rsquo;s studies reveal the following curve:</p>
<p><img src="http://www.vivekhaldar.com/curve2.png" alt="http://www.vivekhaldar.com/curve2.png"/></p>
<p>From the paper:</p>
<blockquote>Our first hypothesis stating that <strong>internalization leads to more planning and better performance</strong> is supported.  Internalization resulted in longer thinking times before starting to work on the problem and to more time between moves. It indicates that when information has to be internalized, more contemplation is provoked and users ponder longer before acting&hellip; Internalization subjects solved the problems with fewer superfluous moves, thus with greater economy&hellip; <strong>Our results suggest that internalization provokes more “thinking before acting” than externalization.</strong>&hellip;  <strong>not at any measure, externalization resulted in better performance.</strong> Once more we found positive effects of internalization on problem-solving behavior: it led to more plan-based behavior, smarter solution paths and better declarative knowledge. Externalization led to a more display-based approach resulting in less economic solutions and shallower thinking.</blockquote>
<p>(emphasis mine)</p>
<p>Their recommendation is <strong>less</strong> assistance:</p>
<blockquote>Designers could consider making interactions “less assisted” to persuade users into specific behavior.  This issue is beyond plain usability issues and focuses on more meta cognitive aspects of interface-induced behavior such as planfulness and user engagement.</blockquote>
<p>Another benefit of internalization was that <strong>interruptions were less disruptive.</strong></p>
<blockquote>&hellip;after the interruption, internalization-subjects kept improving, while externalization fell back&hellip;  internalization-subjects continue to work on base of the plan-based strategy as they did before, while externalization on the other hand performs worse after interruption. They fell back depending on the interface, having a less elaborated plan.</blockquote>
<p>Internalization was also helpful in <strong>retaining knowledge</strong>.</p>
<blockquote>The third hypothesis in which we expected that internalization would remember more knowledge elements was supported. We assumed that internalization- subjects had to build a stronger, more elaborated plan and could rely less on interface information, and indeed working with the internalized version resulted in having significantly better knowledge of the problems rules and problem space. There was also the tendency that internalization-subjects rated the clarity of the rules higher.</blockquote>
<p class="footnote"><sup><a name="fn.1" id="fn.1" href="#fnr.1">1</a></sup> Neal Stephenson&rsquo;s <a href="http://www.cryptonomicon.com/beginning.html">&ldquo;In the beginning was the command line&rdquo;</a> is a deep and thoroughly enjoyable exploration of this topic.</p>
<p class="footnote"><sup><a name="fn.2" id="fn.2" href="#fnr.2">2</a></sup><a href="http://soc.kuleuven.be/com/mediac/cuo/?p=member&amp;id=37">Homepage</a></p>
<p class="footnote"><sup><a name="fn.3" id="fn.3" href="#fnr.3">3</a></sup> Christof van Nimwegen, Herre van Oostendorp, Daniel Burgos, and Rob Koper. 2006. <a href="http://portal.acm.org/citation.cfm?id=1150148">Does an interface with less assistance provoke more thoughtful behavior?</a> Proceedings of the 7th international conference on Learning sciences (ICLS &lsquo;06). International Society of the Learning Sciences 785-791.</p>
<p class="footnote"><sup><a name="fn.4" id="fn.4" href="#fnr.4">4</a></sup> Nimwegen, C. van; Oostendorp, H. van; Tabachneck-Schijf, H.J.M. 2005. The role of interface style in planning during problem solving. Proceedings of the 27th Annual Cognitive Science Conference, (2005), pp. 2271-2276</p>
<p class="footnote"><sup><a name="fn.5" id="fn.5" href="#fnr.5">5</a></sup> van Nimwegen, C.; van Oostendorp, H.; Schijf, H.J.M.T.; , &ldquo;Externalization vs. internalization: the influence on problem solving performance,&rdquo; Advanced Learning Technologies, 2004. Proceedings. IEEE International Conference on , vol., no., pp. 311- 315, 30 Aug.-1 Sept. 2004 <a href="http://interruptions.net/literature/van_Nimwegen-ICALT04-21810311.pdf">PDF</a></p>
<p class="footnote"><sup><a name="fn.6" id="fn.6" href="#fnr.6">6</a></sup> The paradox of the guided user: assistance can be counter-effective (2008)  <a href="http://en.scientificcommons.org/30004846">http://en.scientificcommons.org/30004846</a></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>How the first Gulf War brought modernity to India</title>
      <link>http://vivekhaldar.com/articles/how-the-first-gulf-war-brought-modernity-to-india/</link>
      <pubDate>Fri, 28 Jan 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/how-the-first-gulf-war-brought-modernity-to-india/</guid>
      <description>&lt;p&gt;I came across this article in an old Wired issue about how &lt;a href=&#34;http://www.wired.com/wired/archive/1.02/dishwallahs_pr.html&#34;&gt;cable
and dish TV overtook India rapidly in 1990&lt;/a&gt;, when the first Gulf
War started. It brought back some memories.
&lt;/p&gt;&lt;blockquote&gt;
For countless Indian city dwellers, January 1990 will be
remembered as the month when the world at large - long an impenetrable
nut - was finally cracked open. As US troops assaulted Iraq, the
satellite revolution struck India with equal force.
&lt;/blockquote&gt;
&lt;p&gt;
I remember the time vividly. I was in high school. Wars were something we read about in history textbooks. But here was a live one, happening in my time, right now. And it was on TV. The fledgling CNN left no stone unturned in bringing us non-stop footage. Sad as it sounds, the truth is that the human cost was lost on most of us viewers. This was TV, dammit! It was &amp;ndash; dare I say it? &amp;ndash; entertainment.
&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I came across this article in an old Wired issue about how <a href="http://www.wired.com/wired/archive/1.02/dishwallahs_pr.html">cable
and dish TV overtook India rapidly in 1990</a>, when the first Gulf
War started. It brought back some memories.
</p><blockquote>
For countless Indian city dwellers, January 1990 will be
remembered as the month when the world at large - long an impenetrable
nut - was finally cracked open. As US troops assaulted Iraq, the
satellite revolution struck India with equal force.
</blockquote>
<p>
I remember the time vividly. I was in high school. Wars were something we read about in history textbooks. But here was a live one, happening in my time, right now. And it was on TV. The fledgling CNN left no stone unturned in bringing us non-stop footage. Sad as it sounds, the truth is that the human cost was lost on most of us viewers. This was TV, dammit! It was &ndash; dare I say it? &ndash; entertainment.
</p><p>
But more significantly, it was a dazzling display of technology. It was the first war fought (at least by the US side) with modern technology. Everyday, we were exposed to reports of missiles that covered hundreds, even thousands, of miles to strike a particular window in a particular building. We were taken on gigantic aircraft carriers, floating cities unto themselves. We went with pilots on sorties over Baghdad, <a href="http://deoxy.org/wc/wc-myth.htm">&ldquo;lighting it up like a Christmas tree.&rdquo;</a>
</p><blockquote>
The first images of the 42-day Mideast war mesmerized most viewers - nighttime television pictures of targeted Iraqi bunkers and buildings, many in downtown Baghdad, being surgically destroyed by precision-guided bombs dropped by stealthy aircraft. The crosshairs of an aircraft high-tech laser targeting system lined up on the rooftop of the Iraqi Ministry of Defense, moments later a laser-seeking 2,000 pound bomb blew the building apart.
</blockquote>
<p>
And when we were not watching the military-industrial complex peacocking, we were soaking in its cultural counterpart. Baywatch. MTV. Moonlighting. We didn&rsquo;t even have to filter the crap. Only the hits were re-broadcast. Suddenly our culture seemed parochial. Suddenly our things seemed archaic, clunky.
</p><p>
In <a href="http://en.wikipedia.org/wiki/Economic_liberalisation_in_India">1991</a>, the Indian government finally abandoned Nehru&rsquo;s socialist market ideology and began to embrace a market open to the world and free of governmental shackles. Did the hockey-stick adoption of cable TV, and the cultural jolt that came with it, contribute to setting the stage for this? Certainly. Once you&rsquo;ve seen precision long-range missiles and MTV, it&rsquo;s hard to justify a closed market.
</p><p>
It did feel like somebody had flipped a switch. There was no going back. The Gulf war brought India into the 21st century.
<!--
;;; local variables:
;;; gdocs-docid: "1DkaFBn2ztmywppiQhcyV8EXxAs6oSb7Y9C3_bWC73Wo"
;;; gdocs-user-email: "vh@vivekhaldar.com"
;;; end:
--> </p>
]]></content:encoded>
    </item>
    
    <item>
      <title>How to Write a Twitter Bot in Python</title>
      <link>http://vivekhaldar.com/articles/how-to-write-a-twitter-bot-in-python/</link>
      <pubDate>Wed, 19 Jan 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/how-to-write-a-twitter-bot-in-python/</guid>
      <description>&lt;p&gt;For the purposes of this post, a Twitter bot is a program that automatically posts status updates to its account (we&amp;rsquo;re assuming the bot is associated with an account), perhaps also responding to @ messages sent to it.
&lt;/p&gt;&lt;p&gt;
I&amp;rsquo;ve wanted to write one for a while, just for the fun of it.
&lt;/p&gt;&lt;p&gt;
&lt;b&gt;What we&amp;rsquo;ll build:&lt;/b&gt;
I&amp;rsquo;m hooking up the Twitter API to an Eliza program, so that when you send it an @-message, it will reply with some silly psychoanalysis.
&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>For the purposes of this post, a Twitter bot is a program that automatically posts status updates to its account (we&rsquo;re assuming the bot is associated with an account), perhaps also responding to @ messages sent to it.
</p><p>
I&rsquo;ve wanted to write one for a while, just for the fun of it.
</p><p>
<b>What we&rsquo;ll build:</b>
I&rsquo;m hooking up the Twitter API to an Eliza program, so that when you send it an @-message, it will reply with some silly psychoanalysis.
</p><p>
<b>What you&rsquo;ll need:</b>
</p><ol><li>Mike Verdone&rsquo;s excellent <a href="https://github.com/sixohsix/twitter">Twitter Tools for Python</a>, which presents an easy-to-use abstraction over the Twitter API.
	</li><li>I&rsquo;m also using a <a href="http://www.jezuk.co.uk/cgi-bin/view/software/eliza">Python version of Eliza by Jez Higgins.</a>
</li></ol><p>
<b>Before you get started</b> install Twitter Tools using the accompanying setup.py. This will leave you with a command-line tool called &ldquo;twitter&rdquo;. Run &ldquo;twitter authorize&rdquo; to do the OAuth dance through the web-browser, give the resulting PIN back to the command-line tool, and have it
cache your credentials locally. Future invocations of the API will need this.
</p><p>
<b>The overall structure of the bot</b> is to repeat the following in an infinite loop:
</p><ul><li>Search for @-mentions to me.
	</li><li>Reply to the authors of those @-mentions.
</li></ul><p>
There is one remaining piece to the puzzle: you don&rsquo;t want to reply more than once to a given @-mention, so you need some way to remember which ones you&rsquo;re already replied to. Turns out, there&rsquo;s a simple way to do that. <a href="http://apiwiki.twitter.com/w/page/22554756/Twitter-Search-API-Method:-search">The Twitter search API supports a parameter called &ldquo;since_id&rdquo;</a>, which, when provided, only returns search results later than that ID. So all you have to do is remember the ID of the last message you replied to, and only request results from that point on.
</p><p>
The code is pretty simple, barely sixty-something lines, and you can see it <a href="https://github.com/vivekhaldar/the_shrinkbot">on github.</a>
</p><p>
<b>The result</b> of this is <a href="http://twitter.com/the_shrinkbot">the_shrinkbot</a>, a Twitter account which, if you sent it an @-message, will reply with some Eliza-like psychoanalysis. (The bot runs on my laptop, so will have periods of downtime.)
</p><p>Go build your own!
<!--
;;; local variables:
;;; gdocs-docid: "15AX_2P91RIB-3kmYcz7V2GXL9BcLR7Neh6BnPBW5FfY"
;;; gdocs-user-email: "vh@vivekhaldar.com"
;;; end:
--> </p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Englsh Wtht Vwls</title>
      <link>http://vivekhaldar.com/articles/englsh-wtht-vwls/</link>
      <pubDate>Thu, 13 Jan 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/englsh-wtht-vwls/</guid>
      <description>&lt;p&gt;
Could you read that title? How well can you read the following somewhat garbled text?
&lt;/p&gt;&lt;blockquote&gt;
Evr snc the hbt of wrtng frst tk hld of me as a tngr, I knw prcsly why I did it, and why I did it so cmplsvly: to hdg agnst the trrr of hvng a trrbl mmry. Thgh stll yng engh to expct no sympthy, I cnstntly fl the brdn of ths hndcp. Cnfrmtn of it, and tht wrtng is its cr, I dscvr evry tm I pck up smthng I wrt yrs, or evn mnths ag. Rdng ths thngs pts me in an uncnny stt, lk a pst-lf rgrssn. Mnwhl, unrcrdd imprssns, syngs, old frnds, and gd bks vnsh wtht wrnng or trc. Sm rd and wrt to win etrnl lf; I wld be hppy engh jst to kp a hld of ths on.
&lt;/blockquote&gt;
&lt;p&gt;
The original text (taken from Nathan Schneider&amp;rsquo;s &lt;a href=&#34;http://www.openlettersmonthly.com/in-defense-of-the-memory-theater/&#34;&gt;In Defense of the Memory Theatre.&lt;/a&gt;) reads as follows:
&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>
Could you read that title? How well can you read the following somewhat garbled text?
</p><blockquote>
Evr snc the hbt of wrtng frst tk hld of me as a tngr, I knw prcsly why I did it, and why I did it so cmplsvly: to hdg agnst the trrr of hvng a trrbl mmry. Thgh stll yng engh to expct no sympthy, I cnstntly fl the brdn of ths hndcp. Cnfrmtn of it, and tht wrtng is its cr, I dscvr evry tm I pck up smthng I wrt yrs, or evn mnths ag. Rdng ths thngs pts me in an uncnny stt, lk a pst-lf rgrssn. Mnwhl, unrcrdd imprssns, syngs, old frnds, and gd bks vnsh wtht wrnng or trc. Sm rd and wrt to win etrnl lf; I wld be hppy engh jst to kp a hld of ths on.
</blockquote>
<p>
The original text (taken from Nathan Schneider&rsquo;s <a href="http://www.openlettersmonthly.com/in-defense-of-the-memory-theater/">In Defense of the Memory Theatre.</a>) reads as follows:
</p><blockquote>
Ever since the habit of writing first took hold of me as a teenager, I knew precisely why I did it, and why I did it so compulsively: to hedge against the terror of having a terrible memory. Though still young enough to expect no sympathy, I constantly feel the burden of this handicap. Confirmation of it, and that writing is its cure, I discover every time I pick up something I wrote years, or even months ago. Reading those things puts me in an uncanny state, like a past-life regression. Meanwhile, unrecorded impressions, sayings, old friends, and good books vanish without warning or trace. Some read and write to win eternal life; I would be happy enough just to keep a hold of this one.
</blockquote>
<p>
The abbreviated form was derived from the original by dropping all vowels, except those that begin a word, or in words three letters or shorter.
</p><p>
You might have struggled with some of the abbreviations, but don&rsquo;t you think overall you could understand most of the passage? While you wouldn&rsquo;t want to read an entire essay like this, its pretty good for short messages. Turns out vowels are surprisingly redundant.
</p><p>
<a href="http://vivekhaldar.com/novowel.html">You can try it out with your own text here.</a>
</p><p>
(This wasn&rsquo;t my idea. The characters in Michael Crichton&rsquo;s book &ldquo;Congo&rdquo; used vowel-less abbreviated English for sending messages over an expensive satellite link.) </p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Presentism</title>
      <link>http://vivekhaldar.com/articles/presentism/</link>
      <pubDate>Sat, 08 Jan 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/presentism/</guid>
      <description>&lt;p&gt;From the &lt;a href=&#34;http://blog.longnow.org/2011/01/04/presentism-in-google-books/&#34;&gt;Long Now Blog&lt;/a&gt;, a reference to a study of how we refer to given years over time, as revealed by the &lt;a href=&#34;http://ngrams.googlelabs.com/&#34;&gt;Google Ngram Viewer&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
They found a general trend each individual year follows: a spike just before the year followed by a downward trending long tail as it recedes into history.  They also, however, noticed a trend amongst that pattern: higher peaks with shorter tails.
&lt;blockquote&gt;
When the team looked at the frequency of individual years, they found a consistent pattern. In their own words: &amp;ldquo;&amp;lsquo;1951&amp;rsquo; was rarely discussed until the years immediately preceding 1951. Its frequency soared in 1951, remained high for three years, and then underwent a rapid decay, dropping by half over the next fifteen years.&amp;rdquo; But the shape of these graphs is changing. The peak gets higher with every year and we are forgetting our past with greater speed. The half-life of &#39;1880&amp;rsquo; was 32 years, but that of &#39;1973&amp;rsquo; was a mere 10 years.
&lt;/blockquote&gt;
&lt;p&gt;So, at a cultural level, we can see a developing ‘presentism’ in which the year we’re currently inhabiting takes on great significance, but is more quickly forgotten once it’s passed.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>From the <a href="http://blog.longnow.org/2011/01/04/presentism-in-google-books/">Long Now Blog</a>, a reference to a study of how we refer to given years over time, as revealed by the <a href="http://ngrams.googlelabs.com/">Google Ngram Viewer</a>:</p>
<blockquote>
They found a general trend each individual year follows: a spike just before the year followed by a downward trending long tail as it recedes into history.  They also, however, noticed a trend amongst that pattern: higher peaks with shorter tails.
<blockquote>
When the team looked at the frequency of individual years, they found a consistent pattern. In their own words: &ldquo;&lsquo;1951&rsquo; was rarely discussed until the years immediately preceding 1951. Its frequency soared in 1951, remained high for three years, and then underwent a rapid decay, dropping by half over the next fifteen years.&rdquo; But the shape of these graphs is changing. The peak gets higher with every year and we are forgetting our past with greater speed. The half-life of '1880&rsquo; was 32 years, but that of '1973&rsquo; was a mere 10 years.
</blockquote>
<p>So, at a cultural level, we can see a developing ‘presentism’ in which the year we’re currently inhabiting takes on great significance, but is more quickly forgotten once it’s passed.</p>
</blockquote>
<p><img src="http://ngrams.googlelabs.com/chart?content=1930,1940,1950,1960,1970,1980,&amp;corpus=0&amp;smoothing=3&amp;year_start=1920&amp;year_end=2008"/><p>
This agrees with a much-discussed <a href="http://www.sciencemag.org/content/321/5887/395.short">study in Science that analyzes how citation patterns change as papers become available online</a>:</p>
</p><blockquote>
&hellip;as more journal issues came online, the articles referenced tended to be more recent, fewer journals and articles were cited, and more of those citations were to fewer journals and articles.
</blockquote>
<!--
;;; local variables:
;;; gdocs-docid: "1iUSVwu8zANftDrXwX12vgn4TlvREWy-YTIrq-_yeIxU"
;;; gdocs-user-email: "vh@vivekhaldar.com"
;;; end:
-->
]]></content:encoded>
    </item>
    
    <item>
      <title>Stephenson on Emacs</title>
      <link>http://vivekhaldar.com/articles/stephenson-on-emacs/</link>
      <pubDate>Wed, 05 Jan 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/stephenson-on-emacs/</guid>
      <description>&lt;p&gt;
This quote from &lt;a href=&#34;http://www.cryptonomicon.com/beginning.html&#34;&gt;&amp;ldquo;In the Beginning was the Command Line&amp;rdquo; by Neal Stephenson&lt;/a&gt; still lights me up. Is there anything more glorious than a geek writing eloquently about his tools?
&lt;/p&gt;&lt;blockquote&gt;
I use emacs, which might be thought of as a thermonuclear word processor. It was created by Richard Stallman; enough said. It is written in Lisp, which is the only computer language that is beautiful. It is colossal, and yet it only edits straight ASCII text files, which is to say, no fonts, no boldface, no underlining. In other words, the engineer-hours that, in the case of Microsoft Word, were devoted to features like mail merge, and the ability to embed feature-length motion pictures in corporate memoranda, were, in the case of emacs, focused with maniacal intensity on the deceptively simple-seeming problem of editing text. If you are a professional writer&amp;ndash;i.e., if someone else is getting paid to worry about how your words are formatted and printed&amp;ndash;emacs outshines all other editing software in approximately the same way that the noonday sun does the stars. It is not just bigger and brighter; it simply makes everything else vanish.
&lt;/blockquote&gt;</description>
      <content:encoded><![CDATA[<p>
This quote from <a href="http://www.cryptonomicon.com/beginning.html">&ldquo;In the Beginning was the Command Line&rdquo; by Neal Stephenson</a> still lights me up. Is there anything more glorious than a geek writing eloquently about his tools?
</p><blockquote>
I use emacs, which might be thought of as a thermonuclear word processor. It was created by Richard Stallman; enough said. It is written in Lisp, which is the only computer language that is beautiful. It is colossal, and yet it only edits straight ASCII text files, which is to say, no fonts, no boldface, no underlining. In other words, the engineer-hours that, in the case of Microsoft Word, were devoted to features like mail merge, and the ability to embed feature-length motion pictures in corporate memoranda, were, in the case of emacs, focused with maniacal intensity on the deceptively simple-seeming problem of editing text. If you are a professional writer&ndash;i.e., if someone else is getting paid to worry about how your words are formatted and printed&ndash;emacs outshines all other editing software in approximately the same way that the noonday sun does the stars. It is not just bigger and brighter; it simply makes everything else vanish.
</blockquote>
]]></content:encoded>
    </item>
    
    <item>
      <title>Text Input: The Next Frontier</title>
      <link>http://vivekhaldar.com/articles/text-input-the-next-frontier/</link>
      <pubDate>Tue, 04 Jan 2011 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/text-input-the-next-frontier/</guid>
      <description>&lt;p&gt;
The next big frontier for mobile devices is heavy-duty text input. As &lt;a href=&#34;http://www.tbray.org/ongoing/When/201x/2010/12/28/Mobile-Market&#34;&gt;Tim Bray puts it&lt;/a&gt;:
&lt;/p&gt;&lt;blockquote&gt;
Tablets and handsets can displace computers as play and reading devices, but they really can’t become dominant as work tools until we have a better solution for high-speed low-friction text input. On the other hand, I wouldn’t be surprised to see dramatic progress in this area; it’s so obviously the number-one usability barrier for everything that isn’t badged as a “computer”.
&lt;/blockquote&gt;
&lt;p&gt;
Also, &lt;a href=&#34;http://www.mattcutts.com/blog/2009-predictions/&#34;&gt;Matt Cutts, from way back in 2009&lt;/a&gt;:
&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>
The next big frontier for mobile devices is heavy-duty text input. As <a href="http://www.tbray.org/ongoing/When/201x/2010/12/28/Mobile-Market">Tim Bray puts it</a>:
</p><blockquote>
Tablets and handsets can displace computers as play and reading devices, but they really can’t become dominant as work tools until we have a better solution for high-speed low-friction text input. On the other hand, I wouldn’t be surprised to see dramatic progress in this area; it’s so obviously the number-one usability barrier for everything that isn’t badged as a “computer”.
</blockquote>
<p>
Also, <a href="http://www.mattcutts.com/blog/2009-predictions/">Matt Cutts, from way back in 2009</a>:
</p><blockquote>&gt;
By the way, if anyone figures out how to lick the problem of satisfactory output/input, e.g. heads-up displays or retinal lasers and a virtual keyboard or something with as high a bandwidth as normal typing (and they will), your computer will migrate into your phone. Solving the input/output problem is one of the most important problems for the next decade. Witness the efforts that companies have put into pen-based computing and voice recognition, for example.
</blockquote>
<p>
I don&rsquo;t pretend to have any solutions, but here are some observations.
</p><p>
This is not just a factor that separates devices, but also cleaves the market &mdash; into those who regularly input large amounts of text, and those who rarely do so. Most people get by just fine inputting short fragments of text, and consuming large amounts of it. In fact, almost every mobile device is targeted exactly to this market. Another distinction is the context in which the text input is done. Almost everybody has to wrangle large amounts of text for work, where they use the regular tools (keyboards attached to large computers). But only a vanishingly small fraction of people care about inputting more than short text fragments outside work, and that&rsquo;s when they use their mobile devices.
</p><p>
Voice recognition is getting pretty good, at least on powerful computers. I regularly use Dragon Dictate, and it works pretty well on my laptop. (They also have a mobile offering, but I haven&rsquo;t used it, so not sure how good it is compared to the desktop offering.) The handwriting recognition on Windows Tablet PCs was always spot on for me. I would enter handwritten notes, and they could be searched as regular text. Each has it&rsquo;s downsides. I wouldn&rsquo;t want to dictate an email into my phone in a crowded space. And most mobile devices are too small to serve as a good handwriting surface.
</p><p>
But their biggest problem is that there&rsquo;s a long tail of fine-grained text surgery that they simply cannot deal with. I&rsquo;m not talking about just source code, but even formatting regular text and making small adjustments &mdash; moving around words, capitalizing, and the other small motions that go into crafting a sentence just so. And this is where we still revert to keyboards. The keyboard is still the escape hatch. </p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Best of 2010</title>
      <link>http://vivekhaldar.com/articles/best-of-2010/</link>
      <pubDate>Fri, 31 Dec 2010 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/best-of-2010/</guid>
      <description>&lt;p&gt;Here are the most popular posts of 2010. Thanks for reading!&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;&lt;a href=&#34;http://vivekhaldar.tumblr.com/post/1649745633/editing-google-docs-in-emacs&#34;&gt;Editing Google Docs in Emacs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://vivekhaldar.tumblr.com/post/1243047026/coding-blind&#34;&gt;Coding blind&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://vivekhaldar.tumblr.com/post/428652690/google-apps-script-spreadsheets-mashup-hub&#34;&gt;Google Apps Script + Spreadsheets = Mashup Hub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://vivekhaldar.tumblr.com/post/861625183/engineering-is-all-about-failure&#34;&gt;Engineering is all about failure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://vivekhaldar.tumblr.com/post/754002281/taylorism-in-the-modern-tech-industry&#34;&gt;Taylorism in the modern tech industry&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;Some posts that I thought were good but didn&amp;rsquo;t get as popular:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href=&#34;http://vivekhaldar.tumblr.com/post/456961455/gabriel-vs-brooks&#34;&gt;Gabriel vs Brooks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://vivekhaldar.tumblr.com/post/485220674/collecting-needles&#34;&gt;Collecting Needles&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;ol&gt;&lt;/ol&gt;</description>
      <content:encoded><![CDATA[<p>Here are the most popular posts of 2010. Thanks for reading!</p>
<ol><li><a href="http://vivekhaldar.tumblr.com/post/1649745633/editing-google-docs-in-emacs">Editing Google Docs in Emacs</a></li>
<li><a href="http://vivekhaldar.tumblr.com/post/1243047026/coding-blind">Coding blind</a></li>
<li><a href="http://vivekhaldar.tumblr.com/post/428652690/google-apps-script-spreadsheets-mashup-hub">Google Apps Script + Spreadsheets = Mashup Hub</a></li>
<li><a href="http://vivekhaldar.tumblr.com/post/861625183/engineering-is-all-about-failure">Engineering is all about failure</a></li>
<li><a href="http://vivekhaldar.tumblr.com/post/754002281/taylorism-in-the-modern-tech-industry">Taylorism in the modern tech industry</a></li>
</ol><p>Some posts that I thought were good but didn&rsquo;t get as popular:</p>
<ul><li><a href="http://vivekhaldar.tumblr.com/post/456961455/gabriel-vs-brooks">Gabriel vs Brooks</a></li>
<li><a href="http://vivekhaldar.tumblr.com/post/485220674/collecting-needles">Collecting Needles</a></li>
</ul><ol></ol>
]]></content:encoded>
    </item>
    
    <item>
      <title>More on and or</title>
      <link>http://vivekhaldar.com/articles/more-on-and-or/</link>
      <pubDate>Fri, 31 Dec 2010 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/more-on-and-or/</guid>
      <description>&lt;p&gt;There is an &lt;a href=&#34;http://www.reddit.com/r/programming/comments/eskdx/parsing_andor/&#34;&gt;interesting comment thread on reddit&lt;/a&gt; about &lt;a href=&#34;http://vivekhaldar.tumblr.com/post/2497988562/parsing-and-or&#34;&gt;my recent post about &amp;ldquo;and/or&amp;rdquo;&lt;/a&gt;. My favorite:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;TL;DR: applying Boolean logic to linguistics is an exercise in futility.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Another commenter points out something I had missed:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Also, &amp;ldquo;/&amp;rdquo; does not just mean logical AND. Two counterexamples: &amp;ldquo;his/her&amp;rdquo;, &amp;ldquo;male/female&amp;rdquo;. In these cases, as with &amp;ldquo;and/or&amp;rdquo;, it means logical XOR. Applying that to &amp;ldquo;and/or&amp;rdquo;, you have (A AND B) XOR (A XOR B) = A OR B.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>There is an <a href="http://www.reddit.com/r/programming/comments/eskdx/parsing_andor/">interesting comment thread on reddit</a> about <a href="http://vivekhaldar.tumblr.com/post/2497988562/parsing-and-or">my recent post about &ldquo;and/or&rdquo;</a>. My favorite:</p>
<blockquote>
<p>TL;DR: applying Boolean logic to linguistics is an exercise in futility.</p>
</blockquote>
<p>Another commenter points out something I had missed:</p>
<blockquote>
<p>Also, &ldquo;/&rdquo; does not just mean logical AND. Two counterexamples: &ldquo;his/her&rdquo;, &ldquo;male/female&rdquo;. In these cases, as with &ldquo;and/or&rdquo;, it means logical XOR. Applying that to &ldquo;and/or&rdquo;, you have (A AND B) XOR (A XOR B) = A OR B.</p>
</blockquote>
]]></content:encoded>
    </item>
    
    <item>
      <title>Minimalism is not a viable intellectual strategy</title>
      <link>http://vivekhaldar.com/articles/minimalism-is-not-a-viable-intellectual-strategy/</link>
      <pubDate>Thu, 30 Dec 2010 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/minimalism-is-not-a-viable-intellectual-strategy/</guid>
      <description>&lt;p&gt;There is a wave sweeping through the Internet cognoscenti – minimalism. The juggernaut of technology has brought us to a place where our minds are forced to march to the un-human rhythms of the global machine, our brains sizzling with pellets and factoids, with nary a clean break for a clear thought.&lt;/p&gt;
&lt;p&gt;The answer to this, the minimalist pundits claim, is to retreat. Retreat from technology, and retreat from things &lt;sup&gt;&lt;a name=&#34;fnr.1&#34; href=&#34;#fn.1&#34; id=&#34;fnr.1&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;. It&amp;rsquo;s asceticism, a bit of a sanyaas &lt;sup&gt;&lt;a name=&#34;fnr.2&#34; href=&#34;#fn.2&#34; id=&#34;fnr.2&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>There is a wave sweeping through the Internet cognoscenti – minimalism. The juggernaut of technology has brought us to a place where our minds are forced to march to the un-human rhythms of the global machine, our brains sizzling with pellets and factoids, with nary a clean break for a clear thought.</p>
<p>The answer to this, the minimalist pundits claim, is to retreat. Retreat from technology, and retreat from things <sup><a name="fnr.1" href="#fn.1" id="fnr.1">1</a></sup>. It&rsquo;s asceticism, a bit of a sanyaas <sup><a name="fnr.2" href="#fn.2" id="fnr.2">2</a></sup>.</p>
<p>I like to separate the recent cry for minimalism into two related strands — intellectual, and physical. They&rsquo;re manifestations of each other. The intellectual strand calls for minimizing distractions, single-tasking, cutting out aimless surfing and a Zen attitude. The physical strand advocates paring down to the essentials, down-sizing your abode, and living out of a backpack. Less is more.</p>
<p>The zenith of both these strands is a calm geek, sitting in a bare room with a desk upon which sits only a MacBook Air, his backpack of possessions on one side, the broadband internet cable available but unplugged, fingers ready to type into the empty white screen of a minimalist editor <sup><a name="fnr.3" href="#fn.3" id="fnr.3">3</a></sup>.</p>
<p>There&rsquo;s something wrong with this picture.</p>
<p>Have you ever seen a clean, bare creative space? Most creative spaces are a mess, an assault on the senses. There is a story behind every strewn bit of paper, history and context in the depth of the pile.</p>
<p>The intellectual powerhouses of the Renaissance were not minimalists. They immersed themselves in everything they could find.</p>
<p>One of the most common pieces of advice writers give to other writers: read. Read everything you can. Then read some more.</p>
<p>The typical creative professional is not a minimalist. They also immerse themselves unapologetically into the messy organic diversity of this world, into things both digital and analog. It is from this chaotic mess that new ideas emerge.</p>
<p>This is a simple consequence of network math. Ideas are combinations and variations of other ideas <sup><a name="fnr.4" href="#fn.4" id="fnr.4">4</a></sup>. The more ideas you ingest, the more you are likely to produce.</p>
<p>Now I agree with most of the premises of the minimalists — that technology scrambles our brains and attention, that the decrease of long-form reading, writing and thinking is a real loss and that indeed to get stuff done we need to unplug sometimes — and even some of their techniques. My gripe is with the way they sell it as a <strong>way</strong> of life. It&rsquo;s much more valuable as a <strong>periodic phase</strong> of life.</p>
<p>Minimalism cannot be a long-term strategy, but it makes an excellent short-term tactic.</p>
<p>A lot of recent commentary makes out the flittering mind to be a curse, when it is the source of plenty we live in.</p>
<hr><p class="footnote"><sup><a name="fn.1" href="#fnr.1" id="fn.1">1</a></sup><a href="http://cultofless.com">http://cultofless.com</a> documents one geek&rsquo;s efforts to find a minimal kernel of physical possessions</p>
<p class="footnote"><sup><a name="fn.2" href="#fnr.2" id="fn.2">2</a></sup><a href="http://en.wikipedia.org/wiki/Sannyasa">http://en.wikipedia.org/wiki/Sannyasa</a></p>
<p class="footnote"><sup><a name="fn.3" href="#fnr.3" id="fn.3">3</a></sup> There is now a minor movement for minimalist editors. WriteRoom started it, but there are also OmmWriter (which plays soothing strains of calm music interspersed with the sound of dripping water), DarkRoom and many others</p>
<p class="footnote"><sup><a name="fn.4" href="#fnr.4" id="fn.4">4</a></sup> Scott Berkun&rsquo;s &ldquo;The Myths of Innovation&rdquo; does an excellent job of explaining why novelty counts for very little when it comes to innovation</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>  Parsing &#34;and/or&#34;
  </title>
      <link>http://vivekhaldar.com/articles/parsing-andor/</link>
      <pubDate>Tue, 28 Dec 2010 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/parsing-andor/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m flummoxed when I see come across the phrase &amp;ldquo;and/or&amp;rdquo;. What exactly does it mean when someone says &amp;ldquo;you can have lunch and/or dinner&amp;rdquo;? According to the &lt;a href=&#34;http://en.wikipedia.org/wiki/And/or&#34;&gt;Wikipedia entry&lt;/a&gt;, that would mean that you can choose among three possibilities: only lunch, only dinner, or both. It&amp;rsquo;s that last choice which makes it different from saying &amp;ldquo;you can have lunch or dinner&amp;rdquo;, which would mean that you could have either lunch or dinner, but not both. Most definitions of &amp;ldquo;and/or&amp;rdquo; leave out the fourth possibility: have neither lunch nor dinner.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I&rsquo;m flummoxed when I see come across the phrase &ldquo;and/or&rdquo;. What exactly does it mean when someone says &ldquo;you can have lunch and/or dinner&rdquo;? According to the <a href="http://en.wikipedia.org/wiki/And/or">Wikipedia entry</a>, that would mean that you can choose among three possibilities: only lunch, only dinner, or both. It&rsquo;s that last choice which makes it different from saying &ldquo;you can have lunch or dinner&rdquo;, which would mean that you could have either lunch or dinner, but not both. Most definitions of &ldquo;and/or&rdquo; leave out the fourth possibility: have neither lunch nor dinner.</p>
<p>In the lingo of Boolean arithmetic, the English word &ldquo;or&rdquo; corresponds to the boolean &ldquo;exclusive or&rdquo; (xor).</p>
<p>What does the truth table for &ldquo;and/or&rdquo; look like?</p>
<pre>A       B       A and/or B
true    false   true
false   true    true
true    true    true
false   false   false
</pre>
<p>In other words, the phrase &ldquo;and/or&rdquo; corresponds exactly to the <strong>boolean</strong> sense of the English word &ldquo;or&rdquo;. Unfortunately, the English word &ldquo;or&rdquo; is already used for the boolean <strong>xor</strong>.</p>
<p><strong>What logical operator does the &ldquo;/&rdquo; stand for?</strong></p>
<p>But what logical operation does the &ldquo;/&rdquo; stand for? Let&rsquo;s see:</p>
<pre>A       B       A or B       A and B           A and/or B     (A or B) or (A and B)
true    false   true         false             true	        true
false   true    true         false             true             true
true    true    true         true              true             true
false   false   false        false             false            false
</pre>
<p>This shows us that (at least for the cases we care about), the &ldquo;/&rdquo; in &ldquo;and/or&rdquo; is equivalent to the boolean <strong>or</strong>.</p>
<p>Which brings me to the root of my dislike for &ldquo;and/or&rdquo;. In the other common use of &ldquo;/&rdquo; in the language — in constructions such as &ldquo;singer/songwriter, &quot;actor/director&rdquo; — the &ldquo;/&rdquo; means <strong>and</strong>. When we say someone is a &ldquo;singer/songwriter&rdquo; we mean that they are a singer <strong>and</strong> a songwriter. The connotation of &ldquo;/&rdquo; in &ldquo;and/or&rdquo; is completely different from that.</p>
<p>In any case, I think that &ldquo;and/or&rdquo; always leaves room for confusion and uncertainty, and should be substituted with the slightly more verbose but much clearer &ldquo;you can have lunch, or dinner, or both.&rdquo;</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Use Accessibility Technologies Before You Have To</title>
      <link>http://vivekhaldar.com/articles/use-accessibility-technologies-before-you-have-to/</link>
      <pubDate>Mon, 06 Dec 2010 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/use-accessibility-technologies-before-you-have-to/</guid>
      <description>&lt;p&gt;All you touch typists out there, spending 10 hours a day at your keyboard &amp;ndash; listen up. Repetitive stress injuries will catch up with you sooner or later, it&amp;rsquo;s just a question of when. You&amp;rsquo;re probably already feeling slight tinges of pain at the end of the workday, and ignoring it, because it always goes away the next morning. Don&amp;rsquo;t do that! Start thinking right now about what you can do and what tools you can use to ease strain.
&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>All you touch typists out there, spending 10 hours a day at your keyboard &ndash; listen up. Repetitive stress injuries will catch up with you sooner or later, it&rsquo;s just a question of when. You&rsquo;re probably already feeling slight tinges of pain at the end of the workday, and ignoring it, because it always goes away the next morning. Don&rsquo;t do that! Start thinking right now about what you can do and what tools you can use to ease strain.
</p><p>
Here are some of the tools and techniques that have greatly reduced the strain on my wrists:
</p><p>
1. <b>Voice to text software</b>: I&rsquo;ve used <a href="http://www.nuance.com/talk/">Dragon NaturallySpeaking</a> on Windows, and now I&rsquo;m using <a href="http://www.macspeech.com/">MacSpeech Dictate</a> on the Mac. I use it for pretty much all my text input that is not coding. The technology still has a long way to go before it can handle the fine-grained text surgery required for coding, but for scenarios where you want to transfer a large number of words from your head onto the screen, it works amazingly well. If you are not a touch typist, it will certainly be much faster. If you are a pretty good touch typist already, it will probably be about the same speed, maybe a little slower at first, but that sacrifice is worth it for how much typing it saves you. (I&rsquo;m composing this blog post purely by dictating.)
</p><p>
2. <b><a href="http://ufridman.org/mouseclick.html">Mouseclick</a></b>: this is a nifty little tool that does just one thing &ndash; when you stop moving the mouse, it delivers a click. This means that the usual routine of moving the mouse somewhere on the screen, and then clicking is reduced to simply moving the mouse to the desired point. This has two effects. Obviously, it saves you a lot of clicking. But because of the automatic clicks, it also makes you much more conscious of how you use the mouse, which in turn makes you only use the mouse when absolutely necessary.
</p><p>
3. <b>Sticky Keys</b>: this is a setting hidden away somewhere in either the keyboard or the accessibility preferences of your OS. What it does is let you enter key combinations one key at a time as opposed to holding down all the keys simultaneously. It&rsquo;s amazing how much easier it is to press the combination Ctrl-Meta-x by first pressing Ctrl, then pressing Meta, and finally pressing x, than to have to hold down all those three keys at once. Again, it takes a bit of getting used to, but greatly reduces the awkward positions you need to twist your fingers into. Emacs users will know exactly what I&rsquo;m talking about.
</p><p>
So take a break, sit back, and think about it. These are just some of the tools and techniques that I&rsquo;ve found useful, but I&rsquo;m sure there are many more out there. Give your wrists a break.
<!--
;;; local variables:
;;; gdocs-docid: "1Kwe4HJ0wdXxQrDpEKOc_KaPUPnvN2NgVwBVVFUfwC10"
;;; gdocs-user-email: "vh@vivekhaldar.com"
;;; end:
--> </p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Editing Google Docs in Emacs</title>
      <link>http://vivekhaldar.com/articles/editing-google-docs-in-emacs/</link>
      <pubDate>Mon, 22 Nov 2010 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/editing-google-docs-in-emacs/</guid>
      <description>&lt;p&gt;
I recently submitted a
&lt;a href=&#34;http://code.google.com/p/emacspeak/source/diff?spec=svn6633&amp;amp;r=6633&amp;amp;format=side&amp;amp;path=/trunk/lisp/g-client/gdocs.el&#34;&gt;few&lt;/a&gt;
&lt;a href=&#34;http://code.google.com/p/emacspeak/source/diff?spec=svn6634&amp;amp;r=6634&amp;amp;format=side&amp;amp;path=/trunk/lisp/g-client/gdocs.el&#34;&gt;patches&lt;/a&gt;
&lt;a href=&#34;http://code.google.com/p/emacspeak/source/diff?spec=svn6636&amp;amp;r=6636&amp;amp;format=side&amp;amp;path=/trunk/lisp/g-client/gdocs.el&#34;&gt;to&lt;/a&gt; T.V. Raman&amp;rsquo;s excellent
g-client Emacs package
(which is a sub-package of his &lt;a href=&#34;http://emacspeak.googlecode.com/&#34;&gt;emacspeak&lt;/a&gt; package)
that allow me to edit Google Docs in Emacs.
&lt;/p&gt;&lt;p&gt; You will need to get &lt;a href=&#34;http://code.google.com/p/emacspeak/source/checkout&#34;&gt;emacspeak
from Google Code svn&lt;/a&gt;, synced at least to r6636.
&lt;/p&gt;&lt;p&gt;Sign in with &lt;em&gt;M-x gdocs-sign-in&lt;/em&gt;. It will prompt you for
your Google email and password, authenticate you, and cache your
authentication token.
&lt;/p&gt;&lt;p&gt;Here are the important functions:
&lt;/p&gt;&lt;p&gt;&lt;b&gt;Publishing a new document&lt;/b&gt;
&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>
I recently submitted a
<a href="http://code.google.com/p/emacspeak/source/diff?spec=svn6633&amp;r=6633&amp;format=side&amp;path=/trunk/lisp/g-client/gdocs.el">few</a>
<a href="http://code.google.com/p/emacspeak/source/diff?spec=svn6634&amp;r=6634&amp;format=side&amp;path=/trunk/lisp/g-client/gdocs.el">patches</a>
<a href="http://code.google.com/p/emacspeak/source/diff?spec=svn6636&amp;r=6636&amp;format=side&amp;path=/trunk/lisp/g-client/gdocs.el">to</a> T.V. Raman&rsquo;s excellent
g-client Emacs package
(which is a sub-package of his <a href="http://emacspeak.googlecode.com/">emacspeak</a> package)
that allow me to edit Google Docs in Emacs.
</p><p> You will need to get <a href="http://code.google.com/p/emacspeak/source/checkout">emacspeak
from Google Code svn</a>, synced at least to r6636.
</p><p>Sign in with <em>M-x gdocs-sign-in</em>. It will prompt you for
your Google email and password, authenticate you, and cache your
authentication token.
</p><p>Here are the important functions:
</p><p><b>Publishing a new document</b>
</p><ul><li> <em>gdocs-publish-from-text</em> Exports a buffer&rsquo;s text to a new Google document.
</li><li> <em>gdocs-publish-from-html</em> Exports a buffer containing HTML to a new Google document.
</li><li> <em>gdocs-publish-from-org</em> Exports an org buffer as HTML to a new Google document.
</li></ul><p><b>Update an existing document:</b> These functions prompt for
which docid to update. The docid appears in the URL of the
document. To save yourself entering the docid repeatedly, you can
store it in a <a href="http://www.gnu.org/software/emacs/manual/html_node/emacs/File-Variables.html">file
variable</a> called <em>gdocs-docid</em>.
</p><p><b>Warning!</b> These functions blindly update. If the document on
the server has changes more recent than your buffer, they will be
overwritten.
</p><ul><li> <em>gdocs-update-from-text</em> Exports a buffer&rsquo;s text to an existing Google document.
</li><li> <em>gdocs-update-from-html</em> Exports a buffer containing HTML to a new Google document.
</li></ul><p><b>Fetching an existing document:</b> These also prompt for which
docid to fetch. If you are in a buffer with a file variable called
<em>gdocs-docid</em> defined, that will be used. The exported data goes into a buffer called <em>*g scratch*</em>.
</p><ul><li> <em>gdocs-fetch-document-text</em> Exports an existing Google document to plain text.
</li><li> <em>gdocs-fetch-document-html</em> Exports an existing Google document to HTML.
</li></ul><!--
;;; local variables:
;;; gdocs-docid: "1kZyYKxDQA0fOySiZ2nK5kN1ytHrhs3DPy6pV6M8siMk"
;;; gdocs-user-email: "vh@vivekhaldar.com"
;;; end:
-->
]]></content:encoded>
    </item>
    
    <item>
      <title>Ode to the Album</title>
      <link>http://vivekhaldar.com/articles/ode-to-the-album/</link>
      <pubDate>Mon, 22 Nov 2010 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/ode-to-the-album/</guid>
      <description>&lt;p&gt;With the recent arrival of The Beatles on the iTunes store, the
last major holdout of the album as a unit of music has caved in.
&lt;/p&gt;&lt;p&gt;&lt;img src=&#34;http://upload.wikimedia.org/wikipedia/en/4/42/Beatles_-_Abbey_Road.jpg&#34;/&gt;&lt;/p&gt;&lt;p&gt;
An album is more than just a compilation of individual tracks. Done
right, it&amp;rsquo;s like a book, with tracks as chapters. It tells a story. It
has a progression.
&lt;/p&gt;&lt;p&gt;
&lt;img src=&#34;http://upload.wikimedia.org/wikipedia/en/c/c0/Greenday_americanidiot.png&#34;/&gt;&lt;/p&gt;&lt;p&gt; Pink Floyd were masters of telling a story through an album. In
many of their albums the boundaries between songs seem artificial. One
could enjoy the whole album as one unified entity.
&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>With the recent arrival of The Beatles on the iTunes store, the
last major holdout of the album as a unit of music has caved in.
</p><p><img src="http://upload.wikimedia.org/wikipedia/en/4/42/Beatles_-_Abbey_Road.jpg"/></p><p>
An album is more than just a compilation of individual tracks. Done
right, it&rsquo;s like a book, with tracks as chapters. It tells a story. It
has a progression.
</p><p>
<img src="http://upload.wikimedia.org/wikipedia/en/c/c0/Greenday_americanidiot.png"/></p><p> Pink Floyd were masters of telling a story through an album. In
many of their albums the boundaries between songs seem artificial. One
could enjoy the whole album as one unified entity.
</p><p>
<img src="http://upload.wikimedia.org/wikipedia/en/7/74/Pink_Floyd-Animals-Frontal.jpg"/></p><p> You can listen to Pink Floyd songs individually, but they feel
like quotes rather than complete entities. You miss out on the
surrounding context.
</p><p>
<img src="http://upload.wikimedia.org/wikipedia/en/1/13/PinkFloydWallCoverOriginalNoText.jpg"/></p><p> Listening to music used to be an intesely situated activity. I
used to lock myself in my room, turn off the lights, and listen to
entire albums at a stretch, beginning to end. And when I was
listening, that was all I was doing. I wasn&rsquo;t surfing, reading,
running, walking, reading, or driving.
</p><p>
<img src="http://upload.wikimedia.org/wikipedia/en/b/b1/Billy_Joel_-_River_of_Dreams.jpg"/></p><p>
Then music went portable. It went from being the main event,
commanding our undivided attention, to the <a href="http://thememorypalace.us/2010/10/episode-35-a-brief-eulogy-for-a-consumer-electronics-product/">background
soundtrack</a> of&hellip; whatever we happened to be doing. Commuting,
working, exercising.
</p><p>
<img src="http://upload.wikimedia.org/wikipedia/en/7/77/LedZeppelinFourSymbols.jpg"/></p><p>
The album is dead. Long live the album.
<!--
;;; local variables:
;;; gdocs-docid: "1ebZTx0kxsin7TYSuSIBjSAajUfwbMscHhL2VLiw47AQ"
;;; gdocs-user-email: "vh@vivekhaldar.com"
;;; end:
--> </p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Posting to Tumblr from Emacs</title>
      <link>http://vivekhaldar.com/articles/posting-to-tumblr-from-emacs/</link>
      <pubDate>Sat, 20 Nov 2010 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/posting-to-tumblr-from-emacs/</guid>
      <description>&lt;p&gt;Just testing
&lt;a href=&#34;http://www.febuiles.com/tumble/&#34;&gt;posting from Emacs using Tumble.&lt;/a&gt;
&lt;/p&gt;&lt;p&gt;.
Did that work? &lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Just testing
<a href="http://www.febuiles.com/tumble/">posting from Emacs using Tumble.</a>
</p><p>.
Did that work? </p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Coding blind</title>
      <link>http://vivekhaldar.com/articles/coding-blind/</link>
      <pubDate>Mon, 04 Oct 2010 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/coding-blind/</guid>
      <description>&lt;p&gt;&lt;br/&gt;When carpenters learn their trade, they do so by seeing others. They see other carpenters hammer nails and saw wood. Same thing with surgeons. They see other surgeons operate. But it’s not like that for programmers. They’re “taught” programming in school, or teach they themselves, but they don’t literally see other programmers work. In the carpenter analogy, it’s as if you were taught the theory of how to hammer nails, then had to go do it for the rest of your professional life, and every other carpenter worked in a closed room.&lt;br/&gt;&lt;br/&gt;Due to high quality open source, it’s easy to see the final output of world-class programmers. Just download the source, and start reading it. But what about the nuts and bolts, the mechanics? You can’t see the seemingly insignificant things that you have to repeat a thousand times over to get to clean and working code. Working your editor or IDE. Running the build. Running the tests. Keyboard shortcuts. Customizations. Shell scripts. Sketching out designs. Sketching out pseudo-code. Writing a ton of code, then having to back out of it and start over.&lt;br/&gt;&lt;br/&gt;Great artists and writers often leave behind a large amount of work exhaust other than their finished masterpieces: notebooks, sketches, letters and journals. These auxiliary work products are as important as the finished item in understanding them and their work. But in programming, all that is shunned. The only thing that counts is the finished code, checked in. But one could often learn a lot more from that dirty piece of code, strewn with commented-out sections, that got thrown away.&lt;br/&gt;&lt;br/&gt;That’s probably the reason programmers are such voracious readers of what other programmers write about their tools and tricks. It’s a tiny peek into their actual “hammering.” That’s also why (now I know) it irks me so much when I see another programmer use a tool inefficiently. For example, wade through menus and sub-menus for 30 seconds to accomplish something when you could do it in half a second with a keyboard shortcut. Or keep typing in the same long commands and not write a shell script for it.&lt;br/&gt;&lt;br/&gt;We’re all coding blind, each in our own little bubble.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><br/>When carpenters learn their trade, they do so by seeing others. They see other carpenters hammer nails and saw wood. Same thing with surgeons. They see other surgeons operate. But it’s not like that for programmers. They’re “taught” programming in school, or teach they themselves, but they don’t literally see other programmers work. In the carpenter analogy, it’s as if you were taught the theory of how to hammer nails, then had to go do it for the rest of your professional life, and every other carpenter worked in a closed room.<br/><br/>Due to high quality open source, it’s easy to see the final output of world-class programmers. Just download the source, and start reading it. But what about the nuts and bolts, the mechanics? You can’t see the seemingly insignificant things that you have to repeat a thousand times over to get to clean and working code. Working your editor or IDE. Running the build. Running the tests. Keyboard shortcuts. Customizations. Shell scripts. Sketching out designs. Sketching out pseudo-code. Writing a ton of code, then having to back out of it and start over.<br/><br/>Great artists and writers often leave behind a large amount of work exhaust other than their finished masterpieces: notebooks, sketches, letters and journals. These auxiliary work products are as important as the finished item in understanding them and their work. But in programming, all that is shunned. The only thing that counts is the finished code, checked in. But one could often learn a lot more from that dirty piece of code, strewn with commented-out sections, that got thrown away.<br/><br/>That’s probably the reason programmers are such voracious readers of what other programmers write about their tools and tricks. It’s a tiny peek into their actual “hammering.” That’s also why (now I know) it irks me so much when I see another programmer use a tool inefficiently. For example, wade through menus and sub-menus for 30 seconds to accomplish something when you could do it in half a second with a keyboard shortcut. Or keep typing in the same long commands and not write a shell script for it.<br/><br/>We’re all coding blind, each in our own little bubble.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>My favorite Chrome extensions</title>
      <link>http://vivekhaldar.com/articles/my-favorite-chrome-extensions/</link>
      <pubDate>Wed, 29 Sep 2010 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/my-favorite-chrome-extensions/</guid>
      <description>&lt;p&gt;I find these extensions invaluable in my daily use of Chrome:&lt;br/&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;a href=&#34;http://thegleebox.com/&#34;&gt;GleeBox&lt;/a&gt;: let’s you do almost everything &amp;ndash; select links, tabs, and a whole lot more &amp;ndash; from the keyboard. Drastically reduces mouse usage.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://chrome.google.com/extensions/detail/alelhddbbhepgpmgidjdcjakblofbmce&#34;&gt;Awesome Screenshot&lt;/a&gt;: takes screenshots of the webpages, and let’s you annotate and edit them right in the browser.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://chrome.google.com/extensions/detail/goicaghfpnaogbpejmaodednkiilckfo&#34;&gt;iSlide&lt;/a&gt;: takes an HTTP directory listing of images, and presents a slideshow. Beats clicking on an image filename, going back, clicking on an image filename&amp;hellip;&lt;/li&gt;
&lt;/ol&gt;</description>
      <content:encoded><![CDATA[<p>I find these extensions invaluable in my daily use of Chrome:<br/></p><ol><li><a href="http://thegleebox.com/">GleeBox</a>: let’s you do almost everything &ndash; select links, tabs, and a whole lot more &ndash; from the keyboard. Drastically reduces mouse usage.</li>
<li><a href="https://chrome.google.com/extensions/detail/alelhddbbhepgpmgidjdcjakblofbmce">Awesome Screenshot</a>: takes screenshots of the webpages, and let’s you annotate and edit them right in the browser.</li>
<li><a href="https://chrome.google.com/extensions/detail/goicaghfpnaogbpejmaodednkiilckfo">iSlide</a>: takes an HTTP directory listing of images, and presents a slideshow. Beats clicking on an image filename, going back, clicking on an image filename&hellip;</li>
</ol>
]]></content:encoded>
    </item>
    
    <item>
      <title>The 18th Century Origins of Lolcat-speak</title>
      <link>http://vivekhaldar.com/articles/the-18th-century-origins-of-lolcatspeak/</link>
      <pubDate>Sat, 28 Aug 2010 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-18th-century-origins-of-lolcatspeak/</guid>
      <description>&lt;p&gt;Let me propose some rules for converting regular English to Lolcat-speak:&lt;br/&gt;&lt;br/&gt;1. The omission of all superfluous or silent letters; as a in bread. Thus &lt;em&gt;bread, head, give, breast, built, meant, realm, friend&lt;/em&gt;, would be spelt, &lt;em&gt;bred, hed, giv, brest, bilt, ment, relm, frend&lt;/em&gt;.&lt;br/&gt;&lt;br/&gt;&lt;span&gt;2. A substitution of a character that has a certain definite sound, for one that is more vague and indeterminate. Thus by putting ee instead of ea or ie, the words &lt;/span&gt;&lt;em&gt;mean, near, speak grieve, zeal&lt;/em&gt;, would become &lt;em&gt;meen, neer, speek, greev, zeel&lt;/em&gt;&lt;em&gt;. &lt;/em&gt;&lt;br/&gt;&lt;br/&gt;3. ch in French derivatives should be changed into sh; &lt;em&gt;machine, chaise, chevalier&lt;/em&gt;, should be written &lt;em&gt;masheen, shaze, shevaleer&lt;/em&gt;; and &lt;em&gt;pique, tour, oblique&lt;/em&gt;, should be &lt;em&gt;written &lt;/em&gt;&lt;em&gt;peek, toor, obleek&lt;/em&gt;.&lt;br/&gt;&lt;br/&gt;Here are some examples of phrases after transforming them using these rules:&lt;br/&gt;&lt;br/&gt;&amp;ldquo;I built this machine&amp;rdquo; becomes &amp;ldquo;I bilt this masheen.&amp;rdquo;&lt;br/&gt;&amp;ldquo;I meant to grieve with my friend&amp;rdquo; becomes &amp;ldquo;I ment to greev with my frend.&amp;rdquo;&lt;br/&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Let me propose some rules for converting regular English to Lolcat-speak:<br/><br/>1. The omission of all superfluous or silent letters; as a in bread. Thus <em>bread, head, give, breast, built, meant, realm, friend</em>, would be spelt, <em>bred, hed, giv, brest, bilt, ment, relm, frend</em>.<br/><br/><span>2. A substitution of a character that has a certain definite sound, for one that is more vague and indeterminate. Thus by putting ee instead of ea or ie, the words </span><em>mean, near, speak grieve, zeal</em>, would become <em>meen, neer, speek, greev, zeel</em><em>. </em><br/><br/>3. ch in French derivatives should be changed into sh; <em>machine, chaise, chevalier</em>, should be written <em>masheen, shaze, shevaleer</em>; and <em>pique, tour, oblique</em>, should be <em>written </em><em>peek, toor, obleek</em>.<br/><br/>Here are some examples of phrases after transforming them using these rules:<br/><br/>&ldquo;I built this machine&rdquo; becomes &ldquo;I bilt this masheen.&rdquo;<br/>&ldquo;I meant to grieve with my friend&rdquo; becomes &ldquo;I ment to greev with my frend.&rdquo;<br/></p>
<p>The truth is I didn&rsquo;t come up with these rules. Noah Webster, the creator of the Webster&rsquo;s Dictionary, <a id="xckk" title="proposed these rules in an essay written in 1789" href="http://edweb.sdsu.edu/people/DKitchen/new_655/webster_language.htm">proposed these rules in an essay written in 1789</a>. He was inspired by <a id="ab52" title="Benjamin Franklin's proposal for a new phonetic alphabet" href="http://www.omniglot.com/writing/franklin.htm">Benjamin Franklin&rsquo;s proposal for a new phonetic alphabet</a> for the English Language, but could not get himself to let go of the latin alphabet altogether. He did agree with the spirit of making spelling more regular and logical. <br/></p>
<p>Another greater motivation for him was to unite the new states with a new language. They had just broken free of the British, and they wanted to break free of their language as well. &ldquo;&hellip;a national language is a band of national union. Every engine should be employed to render the people of this country national; to call their attachments home to their own country; and to inspire them with the pride of national character&rdquo;, he wrote. As you can tell by the course of English in America, Webster and Franklin&rsquo;s ideas did not catch on, except in small differences in spelling (<em>color</em> vs <em>colour</em>).</p>
<p>More than 200 years later, such spellings are finding common use again, on lolcats, text messages, forums, webpages, and even <a id="mz4g" title="school essays" href="http://www.technologyreview.com/BizTech/17927/">school essays</a>. Will it stick this time?</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>To jump or not to jump?</title>
      <link>http://vivekhaldar.com/articles/to-jump-or-not-to-jump/</link>
      <pubDate>Fri, 20 Aug 2010 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/to-jump-or-not-to-jump/</guid>
      <description>&lt;p&gt;In professional-league football, the probability that a penalty kicker will shoot towards the middle of the goal is roughly 29%. On the other hand, the probability that the goalkeeper will stay at the center of the goal, and not jump left or right, is only 6%.&lt;br/&gt;&lt;br/&gt;&lt;img src=&#34;https://docs.google.com/a/google.com/File?id=ahfsnn8gbw_18cgp4jmfw_b&#34;/&gt;&lt;br/&gt;This is a scenario where experienced professionals have huge financial incentives to make the correct decision. The goalkeeper cannot feign ignorance, because he clearly must have faced a large number of penalty kicks during his career. Then what explains this behavior?&lt;br/&gt;&lt;br/&gt;&lt;em&gt;Norm theory&lt;/em&gt; posits that regret from a bad outcome is much worse when the outcome follows an unusual action &amp;ndash; whether or not the action was the cause of the outcome. In a given scenario, if the norm is to do nothing, and you end up in a mess because you did something, it feels much worse than if you ended up in a mess doing nothing. Conversely, like in the case of goalkeepers, if the norm is to move, and your opponent scores a goal because you stood still, that looks much worse than if you jumped.&lt;br/&gt;&lt;br/&gt;Often we end up following the normal course of action even if it is not optimal. When something goes wrong, our first instinct is to change something. When things are going well, on the other hand, the tendency is to not change. Just because these are the normal actions, we should question ourselves every time we catch ourselves doing it.&lt;br/&gt;&lt;br/&gt;How do you know if your behavior in a situation is optimal, and not just the psychological reflex predicted by norm theory? You can tell what the norm is by simply observing a situation for some time. To both players and followers of football, it is obvious after a while that, for goalkeepers, jumping is much more common than standing still. But to really know what course is &amp;ldquo;optimal&amp;rdquo;, you need hard data. You need to know that kickers will shoot center 29% of the time.&lt;br/&gt;&lt;br/&gt;&lt;span&gt;This post is based on the following paper:&lt;/span&gt;&lt;br/&gt;Bar Eli, Michael, Azar, Ofer H., Ritov, Ilana, Keidar-Levin, Yael and Schein, Galit, &lt;a id=&#34;dvz6&#34; title=&#34;Action Bias Among Elite Soccer Goalkeepers: The Case of Penalty Kicks.&#34; href=&#34;http://www.google.com/url?sa=D&amp;amp;q=http://papers.ssrn.com/sol3/papers.cfm%3Fabstract_id%3D1091662&#34;&gt;Action Bias Among Elite Soccer Goalkeepers: The Case of Penalty Kicks.&lt;/a&gt; Journal of Economic Psychology, Vol. 28, No. 5, 2007. &lt;a href=&#34;http://www.google.com/url?sa=D&amp;amp;q=http://mpra.ub.uni-muenchen.de/4477/1/MPRA_paper_4477.pdf&#34;&gt;Full paper (PDF)&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>In professional-league football, the probability that a penalty kicker will shoot towards the middle of the goal is roughly 29%. On the other hand, the probability that the goalkeeper will stay at the center of the goal, and not jump left or right, is only 6%.<br/><br/><img src="https://docs.google.com/a/google.com/File?id=ahfsnn8gbw_18cgp4jmfw_b"/><br/>This is a scenario where experienced professionals have huge financial incentives to make the correct decision. The goalkeeper cannot feign ignorance, because he clearly must have faced a large number of penalty kicks during his career. Then what explains this behavior?<br/><br/><em>Norm theory</em> posits that regret from a bad outcome is much worse when the outcome follows an unusual action &ndash; whether or not the action was the cause of the outcome. In a given scenario, if the norm is to do nothing, and you end up in a mess because you did something, it feels much worse than if you ended up in a mess doing nothing. Conversely, like in the case of goalkeepers, if the norm is to move, and your opponent scores a goal because you stood still, that looks much worse than if you jumped.<br/><br/>Often we end up following the normal course of action even if it is not optimal. When something goes wrong, our first instinct is to change something. When things are going well, on the other hand, the tendency is to not change. Just because these are the normal actions, we should question ourselves every time we catch ourselves doing it.<br/><br/>How do you know if your behavior in a situation is optimal, and not just the psychological reflex predicted by norm theory? You can tell what the norm is by simply observing a situation for some time. To both players and followers of football, it is obvious after a while that, for goalkeepers, jumping is much more common than standing still. But to really know what course is &ldquo;optimal&rdquo;, you need hard data. You need to know that kickers will shoot center 29% of the time.<br/><br/><span>This post is based on the following paper:</span><br/>Bar Eli, Michael, Azar, Ofer H., Ritov, Ilana, Keidar-Levin, Yael and Schein, Galit, <a id="dvz6" title="Action Bias Among Elite Soccer Goalkeepers: The Case of Penalty Kicks." href="http://www.google.com/url?sa=D&amp;q=http://papers.ssrn.com/sol3/papers.cfm%3Fabstract_id%3D1091662">Action Bias Among Elite Soccer Goalkeepers: The Case of Penalty Kicks.</a> Journal of Economic Psychology, Vol. 28, No. 5, 2007. <a href="http://www.google.com/url?sa=D&amp;q=http://mpra.ub.uni-muenchen.de/4477/1/MPRA_paper_4477.pdf">Full paper (PDF)</a></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Deresiewicz: Essays about the Internet</title>
      <link>http://vivekhaldar.com/articles/deresiewicz-essays-about-the-internet/</link>
      <pubDate>Mon, 16 Aug 2010 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/deresiewicz-essays-about-the-internet/</guid>
      <description>&lt;p&gt;William Deresiewicz has recently published a few probing and insightful essays about the Internet, and it&amp;rsquo;s effect on solitude and friendship. They will surprise you and make you think. They&amp;rsquo;ve lingered with me for months. So this post is a shout out to them. &lt;/p&gt;
&lt;p&gt;&lt;a id=&#34;gaok&#34; title=&#34;The End of Solitude&#34; href=&#34;http://chronicle.com/article/The-End-of-Solitude/3708&#34;&gt;The End of Solitude&lt;/a&gt;.&lt;br/&gt;&lt;/p&gt;
&lt;blockquote&gt;I once asked my students about the place that solitude has in their lives. One of them admitted that she finds the prospect of being alone so unsettling that she&amp;rsquo;ll sit with a friend even when she has a paper to write. Another said, why would anyone want to be alone? &amp;hellip; What does friendship mean when you have 532 &amp;ldquo;friends&amp;rdquo;? How does it enhance my sense of closeness when my Facebook News Feed tells me that Sally Smith (whom I haven&amp;rsquo;t seen since high school, and wasn&amp;rsquo;t all that friendly with even then) &amp;ldquo;is making coffee and staring off into space&amp;rdquo;? My students told me they have little time for intimacy. And of course, they have no time at all for solitude.&lt;/blockquote&gt;
&lt;p&gt;&lt;a id=&#34;vv29&#34; title=&#34;Faux Friendship&#34; href=&#34;http://chronicle.com/article/Faux-Friendship/49308/&#34;&gt;Faux Friendship&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>William Deresiewicz has recently published a few probing and insightful essays about the Internet, and it&rsquo;s effect on solitude and friendship. They will surprise you and make you think. They&rsquo;ve lingered with me for months. So this post is a shout out to them. </p>
<p><a id="gaok" title="The End of Solitude" href="http://chronicle.com/article/The-End-of-Solitude/3708">The End of Solitude</a>.<br/></p>
<blockquote>I once asked my students about the place that solitude has in their lives. One of them admitted that she finds the prospect of being alone so unsettling that she&rsquo;ll sit with a friend even when she has a paper to write. Another said, why would anyone want to be alone? &hellip; What does friendship mean when you have 532 &ldquo;friends&rdquo;? How does it enhance my sense of closeness when my Facebook News Feed tells me that Sally Smith (whom I haven&rsquo;t seen since high school, and wasn&rsquo;t all that friendly with even then) &ldquo;is making coffee and staring off into space&rdquo;? My students told me they have little time for intimacy. And of course, they have no time at all for solitude.</blockquote>
<p><a id="vv29" title="Faux Friendship" href="http://chronicle.com/article/Faux-Friendship/49308/">Faux Friendship</a>.</p>
<blockquote>Facebook&rsquo;s very premise—and promise—is that it makes our friendship circles visible. There they are, my friends, all in the same place. Except, of course, they&rsquo;re not in the same place, or, rather, they&rsquo;re not my friends. They&rsquo;re simulacra of my friends, little dehydrated packets of images and information, no more my friends than a set of baseball cards is the New York Mets&hellip; Friendship is devolving, in other words, from a relationship to a feeling—from something people share to something each of us hugs privately to ourselves in the loneliness of our electronic caves, rearranging the tokens of connection like a lonely child playing with dolls.</blockquote>
<p><a id="ahrw" title="Solitude and Leadership" href="http://www.theamericanscholar.org/solitude-and-leadership/">Solitude and Leadership</a>.</p>
<blockquote>
<p>Concentrating, focusing. You can just as easily consider this lecture to be about concentration as about solitude. Think about what the word means. It means gathering yourself together into a single point rather than letting yourself be dispersed everywhere into a cloud of electronic and social input. It seems to me that Facebook and Twitter and YouTube—and just so you don’t think this is a generational thing, TV and radio and magazines and even newspapers, too—are all ultimately just an elaborate excuse to run away from yourself. To avoid the difficult and troubling questions that being human throws in your way. Am I doing the right thing with my life? Do I believe the things I was taught as a child? What do the words I live by—words like duty, honor, and country—really mean? Am I happy?</p>
</blockquote>
]]></content:encoded>
    </item>
    
    <item>
      <title>Listening to your reading</title>
      <link>http://vivekhaldar.com/articles/listening-to-your-reading/</link>
      <pubDate>Mon, 09 Aug 2010 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/listening-to-your-reading/</guid>
      <description>&lt;p&gt;I often commute a couple of hours a day, and make it enjoyable by listening to stuff on my iPod. I mostly &lt;a href=&#34;http://vivekhaldar.tumblr.com/post/495036544/text-to-speech-in-macos-x-automatically&#34;&gt;listen to articles that I’ve automatically converted to speech&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Listening to articles in &lt;a href=&#34;http://www.tuaw.com/2007/10/26/24-hours-of-leopard-alex-the-new-voice-of-mac-os-x/&#34;&gt;Alex’s synthetic voice&lt;/a&gt; is surprisingly pleasant and comprehensible. Listening to your reading also has the advantage of not being distraction-heavy like the web. There are no links or tabs. You can sit back, close your eyes, and just listen. Its an immersive and soothing reading experience.&lt;br/&gt;&lt;br/&gt;But I’ve often wondered &amp;mdash; is there any difference in comprehension between reading and listening?&lt;br/&gt;&lt;br/&gt;I found a rigorous treatment of this question in a paper from 1973: “&lt;a&gt;A comparison of reading and listening comprehension with rate of presentation controlled&lt;/a&gt;”. The author compared how well subjects understood the same passage when read and when heard. They concluded:&lt;br/&gt;&lt;br/&gt;&amp;ldquo;&amp;hellip;readers and listeners scored about the same on the immediate test. Under the conditions of the study, neither method of learning seemed to be superior for recalling facts, recalling ideas, or generating valid inferences.&amp;rdquo;&lt;br/&gt;&lt;br/&gt;That’s good to know.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I often commute a couple of hours a day, and make it enjoyable by listening to stuff on my iPod. I mostly <a href="http://vivekhaldar.tumblr.com/post/495036544/text-to-speech-in-macos-x-automatically">listen to articles that I’ve automatically converted to speech</a>.<br/><br/>Listening to articles in <a href="http://www.tuaw.com/2007/10/26/24-hours-of-leopard-alex-the-new-voice-of-mac-os-x/">Alex’s synthetic voice</a> is surprisingly pleasant and comprehensible. Listening to your reading also has the advantage of not being distraction-heavy like the web. There are no links or tabs. You can sit back, close your eyes, and just listen. Its an immersive and soothing reading experience.<br/><br/>But I’ve often wondered &mdash; is there any difference in comprehension between reading and listening?<br/><br/>I found a rigorous treatment of this question in a paper from 1973: “<a>A comparison of reading and listening comprehension with rate of presentation controlled</a>”. The author compared how well subjects understood the same passage when read and when heard. They concluded:<br/><br/>&ldquo;&hellip;readers and listeners scored about the same on the immediate test. Under the conditions of the study, neither method of learning seemed to be superior for recalling facts, recalling ideas, or generating valid inferences.&rdquo;<br/><br/>That’s good to know.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Engineering is all about failure</title>
      <link>http://vivekhaldar.com/articles/engineering-is-all-about-failure/</link>
      <pubDate>Mon, 26 Jul 2010 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/engineering-is-all-about-failure/</guid>
      <description>&lt;p&gt;The debate of how the practice of programming differs from what a computer science curriculum teaches is an old one. Which topics are neglected? Which are not? But in the larger scheme of things, a solid foundation in mathematics, algorithms and data structures, coupled with an analytical and inquisitive mind are all one needs to come up to speed with unfamiliar topics that a job might require.&lt;br/&gt;&lt;br/&gt;The missing ingredient is an an attitude of dealing with failure.&lt;br/&gt;&lt;br/&gt;To be a successful software engineer (or indeed, any engineer), one first needs to be utterly and completely broken by failure. One must be so humiliated by a complex system that they give up and realize that the only chance of moving forward comes from being a supplicant to the complexity, by approaching it with humility and caution, not with hubris. You have to listen to the system, coax it into behaving. Commanding it does not work.&lt;br/&gt;&lt;br/&gt;In the real world, progress follows a path akin to a blindfolded person bouncing off the walls of a canyon. The path zigs and zags. You often hit hard walls, but inch forward.&lt;br/&gt;&lt;br/&gt;This is why it’s important to take “hard” courses. They’re hard not just because the projects and subject matter are hard, but because they make you comfortable with failure. The difference between the “hard” sciences and the “soft” arts is that in the former there is a clear, objective line between success and failure. Either the system works or it doesn’t. Unlike the soft arts, failure is stark and undismissable. It is not just another interpretation or point of view. There is certainly no “no wrong way.”&lt;br/&gt;&lt;br/&gt;Let failure teach you. Don’t be afraid of it. Only then do you realize the crucial truth about engineering. Engineering is all about failure. The daily life of an engineer is one of constant failure, peppered with a few rare successes. In fact, you can tell a seasoned engineer by how quickly they get over their successes, because they know they’ll be engulfed by failure soon enough.&lt;br/&gt;&lt;br/&gt;Failure is not just pervasive in the daily practice of an engineer. The consideration of failure also permeates the design and implementation of the artifacts they build. You know the difference between your neat CS assignment and the million LOC behemoths that the world actually runs on? The latter must deal with failures both seen and not yet imagined, and still try to do their best. The first question any artifact &amp;ndash; whether it’s just a design or a real running system &amp;ndash; must be subjected to is: “under what conditions will it break?”&lt;br/&gt;&lt;br/&gt;A corollary of this failure-paranoia is that solid engineering goes hand in hand with solid testing. Real engineers run a constant loop of build-test-build-test. Even then, there are so many variables that nothing short of a real test in a real environment will convince an engineer, however begrudgingly, that the artifact he has engineered has some chance of working. &lt;br/&gt;&lt;br/&gt;I’ve painted a depressing picture of the professional life of a software engineer. Don’t they go crazy dealing with all this failure? Why would anyone want to subject themselves to this on a daily basis?&lt;br/&gt;&lt;br/&gt;First of all, there is the pleasure of having created something. True engineers are loyal first to the thing they’re building. The artifact produced is an objective and independent statement of success, and is recognized as such by the community of engineers. “Your crew built a system that handles 10k qps @ 20ms latency? Respect.” But more than that, creating it taught you something. It didn’t kill you, it made you stronger. You now have a brighter flashlight with which to approach the complexity of your next task.&lt;br/&gt;&lt;br/&gt;There is also, paradoxically, a sense of calm that comes from attacking problems with objective measures. Even behind the most maddening this-is-impossible bug is clear, unassailable logic. It’s just that you can’t see it. But the bug is trying to teach it to you. The artifacts an engineer deals with, no matter how frustrating they sometimes are, still possess a clean rationality. In this sense, engineering is a refuge from a world that can sometimes be too irrational.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The debate of how the practice of programming differs from what a computer science curriculum teaches is an old one. Which topics are neglected? Which are not? But in the larger scheme of things, a solid foundation in mathematics, algorithms and data structures, coupled with an analytical and inquisitive mind are all one needs to come up to speed with unfamiliar topics that a job might require.<br/><br/>The missing ingredient is an an attitude of dealing with failure.<br/><br/>To be a successful software engineer (or indeed, any engineer), one first needs to be utterly and completely broken by failure. One must be so humiliated by a complex system that they give up and realize that the only chance of moving forward comes from being a supplicant to the complexity, by approaching it with humility and caution, not with hubris. You have to listen to the system, coax it into behaving. Commanding it does not work.<br/><br/>In the real world, progress follows a path akin to a blindfolded person bouncing off the walls of a canyon. The path zigs and zags. You often hit hard walls, but inch forward.<br/><br/>This is why it’s important to take “hard” courses. They’re hard not just because the projects and subject matter are hard, but because they make you comfortable with failure. The difference between the “hard” sciences and the “soft” arts is that in the former there is a clear, objective line between success and failure. Either the system works or it doesn’t. Unlike the soft arts, failure is stark and undismissable. It is not just another interpretation or point of view. There is certainly no “no wrong way.”<br/><br/>Let failure teach you. Don’t be afraid of it. Only then do you realize the crucial truth about engineering. Engineering is all about failure. The daily life of an engineer is one of constant failure, peppered with a few rare successes. In fact, you can tell a seasoned engineer by how quickly they get over their successes, because they know they’ll be engulfed by failure soon enough.<br/><br/>Failure is not just pervasive in the daily practice of an engineer. The consideration of failure also permeates the design and implementation of the artifacts they build. You know the difference between your neat CS assignment and the million LOC behemoths that the world actually runs on? The latter must deal with failures both seen and not yet imagined, and still try to do their best. The first question any artifact &ndash; whether it’s just a design or a real running system &ndash; must be subjected to is: “under what conditions will it break?”<br/><br/>A corollary of this failure-paranoia is that solid engineering goes hand in hand with solid testing. Real engineers run a constant loop of build-test-build-test. Even then, there are so many variables that nothing short of a real test in a real environment will convince an engineer, however begrudgingly, that the artifact he has engineered has some chance of working. <br/><br/>I’ve painted a depressing picture of the professional life of a software engineer. Don’t they go crazy dealing with all this failure? Why would anyone want to subject themselves to this on a daily basis?<br/><br/>First of all, there is the pleasure of having created something. True engineers are loyal first to the thing they’re building. The artifact produced is an objective and independent statement of success, and is recognized as such by the community of engineers. “Your crew built a system that handles 10k qps @ 20ms latency? Respect.” But more than that, creating it taught you something. It didn’t kill you, it made you stronger. You now have a brighter flashlight with which to approach the complexity of your next task.<br/><br/>There is also, paradoxically, a sense of calm that comes from attacking problems with objective measures. Even behind the most maddening this-is-impossible bug is clear, unassailable logic. It’s just that you can’t see it. But the bug is trying to teach it to you. The artifacts an engineer deals with, no matter how frustrating they sometimes are, still possess a clean rationality. In this sense, engineering is a refuge from a world that can sometimes be too irrational.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Accessing Google&#39;s RESTful APIs from Google Apps Script</title>
      <link>http://vivekhaldar.com/articles/accessing-googles-restful-apis-from-google-apps-script/</link>
      <pubDate>Wed, 14 Jul 2010 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/accessing-googles-restful-apis-from-google-apps-script/</guid>
      <description>&lt;p&gt;Let&amp;rsquo;s talk about how we can access &lt;a id=&#34;le20&#34; title=&#34;Google&#39;s RESTful APIs&#34; href=&#34;http://code.google.com/more/&#34;&gt;Google&amp;rsquo;s RESTful APIs&lt;/a&gt; from &lt;a id=&#34;tgxl&#34; title=&#34;Google Apps Script&#34; href=&#34;http://code.google.com/googleapps/appsscript/index.html&#34;&gt;Google Apps Script&lt;/a&gt;. As a concrete example, we&amp;rsquo;ll access our Google Analytics data and bring it into a spreadsheet.&lt;/p&gt;
&lt;p&gt;The first step is to authenticate using &lt;a id=&#34;npz3&#34; title=&#34;ClientLogin&#34; href=&#34;http://code.google.com/apis/accounts/docs/AuthForInstalledApps.html&#34;&gt;ClientLogin&lt;/a&gt;. So open up a new spreadsheet, and open up the script editor (Tools &amp;gt; Script &amp;gt; Script Editor). We need to authenticate with our Google username and password and get a token. This token will be used later to request data.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Let&rsquo;s talk about how we can access <a id="le20" title="Google's RESTful APIs" href="http://code.google.com/more/">Google&rsquo;s RESTful APIs</a> from <a id="tgxl" title="Google Apps Script" href="http://code.google.com/googleapps/appsscript/index.html">Google Apps Script</a>. As a concrete example, we&rsquo;ll access our Google Analytics data and bring it into a spreadsheet.</p>
<p>The first step is to authenticate using <a id="npz3" title="ClientLogin" href="http://code.google.com/apis/accounts/docs/AuthForInstalledApps.html">ClientLogin</a>. So open up a new spreadsheet, and open up the script editor (Tools &gt; Script &gt; Script Editor). We need to authenticate with our Google username and password and get a token. This token will be used later to request data.</p>
<p>The script to authenticate looks like this:</p>
<pre>function getAuthToken() {
  var advancedArgs = {
    method: "post",
    payload: "AccountType=HOSTED_OR_GOOGLE" +
      "&amp;Email=&lt;email&gt;" +
      "&amp;Passwd=&lt;password&gt;" +
      "&amp;service=analytics" +
      "&amp;source=vh_googapp_script",
  };
  var response = UrlFetchApp.fetch(
    "https://www.google.com/accounts/ClientLogin", advancedArgs);
  var authToken = response.getContentText().split("\n")[2];
  return authToken;
}
</pre>
<p>Remember to substitute your own username and password in the above script. Also, don&rsquo;t share the spreadsheet because it has your username and password :-#.</p>
<p>Now you can use that like a function in a spreadsheet cell, by typing &ldquo;=getAuthToken()&rdquo; in a cell.</p>
<p>Say we want to get a list of the sites for which we&rsquo;re collecting analytics data, your &ldquo;feed list.&rdquo; The script for that is:<br/><br/></p>
<pre>function getFeedList(token) {
  var advancedArgs = {
    headers: {"Authorization": "GoogleLogin" + token}};
  var response = UrlFetchApp.fetch(
    "https://www.google.com/analytics/feeds/accounts/default",
    advancedArgs);
  return response.getContentText();
}
</pre>
<p>The &ldquo;token&rdquo; parameter is the auth token returned by getAuthToken(). This will give you back an XML description of your analytics feeds.</p>
<p>Now say you pick a single feed for which you want to get hits and bounces for a specific date. The script to get that data looks like:</p>
<pre>function getVisitsForDay(token, tableId,day) {
  var advancedArgs = {
    headers: {"Authorization": "GoogleLogin" + token}};
  var response = UrlFetchApp.fetch(
    "https://www.google.com/analytics/feeds/data?ids=" +
    tableId + "&amp;metrics=ga:visits&amp;start-date=" + day +
    "&amp;end-date=" + day,
    advancedArgs);
  var parsedXml = Xml.parse(response.getContentText());
  var visits = parsedXml.getElement().getElement("entry")
      .getElement("http://schemas.google.com/analytics/2009", "metric")
      .getAttribute("value").getValue();
  return visits;
}
<p>function getBouncesForDay(token, tableId, day) {
var advancedArgs = {
headers: {&ldquo;Authorization&rdquo;: &ldquo;GoogleLogin&rdquo; + token}};
var response = UrlFetchApp.fetch(
&ldquo;<a href="https://www.google.com/analytics/feeds/data?ids=%22">https://www.google.com/analytics/feeds/data?ids=&quot;</a> +
tableId + &ldquo;&amp;metrics=ga:bounces&amp;start-date=&rdquo; + day +
&ldquo;&amp;end-date=&rdquo; + day, advancedArgs);
var parsedXml = Xml.parse(response.getContentText());
var visits = parsedXml.getElement().getElement(&ldquo;entry&rdquo;)
.getElement(&ldquo;<a href="http://schemas.google.com/analytics/2009%22">http://schemas.google.com/analytics/2009&quot;</a>, &ldquo;metric&rdquo;)
.getAttribute(&ldquo;value&rdquo;).getValue();
return visits;
}
</pre></p>
<p>&ldquo;tableId&rdquo; is of the form &ldquo;ga:nnnnnnn&rdquo; and will be listed in the feeds list. And the &ldquo;day&rdquo; parameter is the date for which you want the data, in the format &ldquo;YYYY-MM-DD&rdquo;. As with all script functions, you can now use these in your spreadsheet cells. For example, you could put into a cell the formula &ldquo;=getVisitsForDay(A2, B5, &quot;2010-07-11&rdquo;)&ldquo; to get the number of visits to your site on July 11 2010, assuming cell A2 contained your auth token, and cell B5 contained your table or profile ID.</p>
<p>As you can probably see by now, these functions have a common structure: put the auth token in the HTTP request header, construct the HTTP URL for the request, and parse the returned XML to get at the exact piece of data you want. Hope this sets you on your way.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>The Internet is making us smarter, but is it making me dumber?</title>
      <link>http://vivekhaldar.com/articles/the-internet-is-making-us-smarter-but-is-it-making-me-dumber/</link>
      <pubDate>Tue, 06 Jul 2010 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/the-internet-is-making-us-smarter-but-is-it-making-me-dumber/</guid>
      <description>&lt;p&gt;&lt;span id=&#34;internal-source-marker_0.06380392052233219&#34;&gt;One of today’s most interesting debates is brewing between Clay Shirky and Nick Carr, about whether the internet is making us smarter or dumber. They each have a book arguing their positions: &lt;/span&gt;&lt;a href=&#34;http://www.amazon.com/Shallows-What-Internet-Doing-Brains/dp/0393072223&#34;&gt;Carr’s “The Shallows: What the Internet is Doing to Our Brains”&lt;/a&gt;, and &lt;a href=&#34;http://www.amazon.com/Cognitive-Surplus-Creativity-Generosity-Connected/dp/1594202532&#34;&gt;Shirky’s “Cognitive Surplus: Creativity and Generosity in a Connected Age&lt;/a&gt;.” They even had dueling WSJ op-eds (&lt;a href=&#34;http://online.wsj.com/article/SB10001424052748704025304575284981644790098.html&#34;&gt;Carr&lt;/a&gt;, &lt;a href=&#34;http://online.wsj.com/article/SB10001424052748704025304575284973472694334.html&#34;&gt;Shirky&lt;/a&gt;).&lt;br/&gt; &lt;br/&gt;But Carr and Shirky are talking about very different topics. Shirky is talking about the effect of the Internet on us, as a society. Carr is talking about the effect of the Internet on me, as an individual. &lt;br/&gt;All the examples in Shirky’s book &amp;ndash; open source, Wikipedia, and a whole raft of social websites &amp;ndash; have two common themes. They use the Internet to aggregate a vast number of small pieces of information that would be useless on their own. The best example of this class is a website where users write reviews for various products, or an aggregator like ushahidi.com where individual reports from disparate users are used to piece together a larger picture. Another theme is the use of the Internet as a coordination medium, to enable and harness the action of diverse groups. Examples of this are charity groups, Wikipedia, and websites that let you find carpool rides. The book is all about society, groups, and collective action.&lt;br/&gt;&lt;br/&gt;Digital natives will find the conclusions of Shirky’s book quite self-evident &amp;ndash; after all, they grew up with it. Of course the Internet can be used to connect and coordinate disparate groups, and assemble large and complex collective works. So what&amp;rsquo;s the news? His real contribution is the exposition leading up to those conclusions. Why do people engage in this seemingly altruistic collective behavior? What kind of culture is needed to cultivate it?&lt;br/&gt;&lt;br/&gt;On the other hand, Carr’s book tackles a much more focused question: how does the Internet affect the way one thinks? The entire book is about the effects of the Internet on individual cognition.&lt;br/&gt;&lt;br/&gt;I am no Luddite, but at an individual level I do sympathize with Carr’s motivation. The germ for the book was his own struggle with a shift in the way he thought. That shift is real, and I suspect it&amp;rsquo;s discussion strikes a chord with everyone who has spent some fraction of their adult life in the era before the Internet. I too have found my attention shredded by surfing the web and rapid multitasking. I too sometimes wish for time when a single book could occupy an entire afternoon.&lt;br/&gt;&lt;br/&gt;But those who label him a Luddite misunderstand his arguments. I don&amp;rsquo;t think he is arguing for turning back the Internet, or for stopping its use &amp;ndash; just tempering it.&lt;br/&gt;&lt;br/&gt;They are both talking about the same thing &amp;ndash; the Internet &amp;ndash; but very different aspects of it. And that is why they keep talking past each other. Shirky keeps talking about society and collective action. Carr keeps talking about the brain and neuroscience and cognition. The disconnect between them and be summed up as follows: the Internet might be making us smarter, but is it making me dumber?&lt;br/&gt;  &lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><span id="internal-source-marker_0.06380392052233219">One of today’s most interesting debates is brewing between Clay Shirky and Nick Carr, about whether the internet is making us smarter or dumber. They each have a book arguing their positions: </span><a href="http://www.amazon.com/Shallows-What-Internet-Doing-Brains/dp/0393072223">Carr’s “The Shallows: What the Internet is Doing to Our Brains”</a>, and <a href="http://www.amazon.com/Cognitive-Surplus-Creativity-Generosity-Connected/dp/1594202532">Shirky’s “Cognitive Surplus: Creativity and Generosity in a Connected Age</a>.” They even had dueling WSJ op-eds (<a href="http://online.wsj.com/article/SB10001424052748704025304575284981644790098.html">Carr</a>, <a href="http://online.wsj.com/article/SB10001424052748704025304575284973472694334.html">Shirky</a>).<br/> <br/>But Carr and Shirky are talking about very different topics. Shirky is talking about the effect of the Internet on us, as a society. Carr is talking about the effect of the Internet on me, as an individual. <br/>All the examples in Shirky’s book &ndash; open source, Wikipedia, and a whole raft of social websites &ndash; have two common themes. They use the Internet to aggregate a vast number of small pieces of information that would be useless on their own. The best example of this class is a website where users write reviews for various products, or an aggregator like ushahidi.com where individual reports from disparate users are used to piece together a larger picture. Another theme is the use of the Internet as a coordination medium, to enable and harness the action of diverse groups. Examples of this are charity groups, Wikipedia, and websites that let you find carpool rides. The book is all about society, groups, and collective action.<br/><br/>Digital natives will find the conclusions of Shirky’s book quite self-evident &ndash; after all, they grew up with it. Of course the Internet can be used to connect and coordinate disparate groups, and assemble large and complex collective works. So what&rsquo;s the news? His real contribution is the exposition leading up to those conclusions. Why do people engage in this seemingly altruistic collective behavior? What kind of culture is needed to cultivate it?<br/><br/>On the other hand, Carr’s book tackles a much more focused question: how does the Internet affect the way one thinks? The entire book is about the effects of the Internet on individual cognition.<br/><br/>I am no Luddite, but at an individual level I do sympathize with Carr’s motivation. The germ for the book was his own struggle with a shift in the way he thought. That shift is real, and I suspect it&rsquo;s discussion strikes a chord with everyone who has spent some fraction of their adult life in the era before the Internet. I too have found my attention shredded by surfing the web and rapid multitasking. I too sometimes wish for time when a single book could occupy an entire afternoon.<br/><br/>But those who label him a Luddite misunderstand his arguments. I don&rsquo;t think he is arguing for turning back the Internet, or for stopping its use &ndash; just tempering it.<br/><br/>They are both talking about the same thing &ndash; the Internet &ndash; but very different aspects of it. And that is why they keep talking past each other. Shirky keeps talking about society and collective action. Carr keeps talking about the brain and neuroscience and cognition. The disconnect between them and be summed up as follows: the Internet might be making us smarter, but is it making me dumber?<br/>  </p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Taylorism in the modern tech industry</title>
      <link>http://vivekhaldar.com/articles/taylorism-in-the-modern-tech-industry/</link>
      <pubDate>Wed, 30 Jun 2010 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/taylorism-in-the-modern-tech-industry/</guid>
      <description>&lt;p&gt;&lt;span id=&#34;internal-source-marker_0.90068718791008&#34;&gt;I’m reading &lt;/span&gt;&lt;a href=&#34;http://www.amazon.com/Shallows-What-Internet-Doing-Brains/dp/0393072223&#34;&gt;&lt;span&gt;Nicholas Carr’s “The Shallows”&lt;/span&gt;&lt;/a&gt;&lt;span&gt;, and thoroughly enjoying it. Whether I agree with everything he says or not, he is eloquent and thought-provoking. &lt;/span&gt;&lt;/p&gt;
&lt;span&gt; &lt;/span&gt;One of the chapters in the book is “The Church of Google”, in which Carr examines the way Google operates, and draws the conclusion that it is &lt;a href=&#34;http://en.wikipedia.org/wiki/Scientific_management&#34;&gt;Taylorist&lt;/a&gt;:
&lt;blockquote&gt;Google’s Silicon Valley headquarters&amp;hellip; is the Internet’s high church, and the religion practiced inside its walls is Taylorism. The company, says CEO Eric Schmidt, is “founded around the science of measurement.” It is striving to “systematize everything” it does. “We try to be very data-driven, and quantify everything,” adds another Google executive&amp;hellip; What Taylor did for the work of the hand, Google is doing for the work of the mind.&lt;/blockquote&gt;
(Emphasis mine.)&lt;br/&gt;&lt;br/&gt;This belief stems from a misunderstanding of how software is created, and what Taylorism truly means in that context. It is tempting to make parallels between industrial production and writing software, and indeed, Carr is not the first to make the leap. At the dawn of the field, the lament was that “&lt;a href=&#34;http://www.cs.dartmouth.edu/~doug/components.txt&#34;&gt;the software industry is not industrialized.&lt;/a&gt;” They holy grail was “reusable components” &amp;ndash; lego-like blocks that could be snapped together to make a specific end-product. Forty years later, we’re nowhere near that goal. &lt;br/&gt;&lt;br/&gt;Industrial manufacturing is all about reducing uncertainty and variance in both the process (“build 10 nuts a minute”) and the product (“the nut’s diameter must be 10mm with a standard deviation of 0.1mm”). Taylor’s time and motion studies observed the process, rooted out inefficiencies and drove down variances. A worker turning a lever at a given frequency, not pausing for reflection or applying judgment, is better for predictably cranking out widgets.&lt;br/&gt;&lt;br/&gt;But when it comes to creating software, pausing for reflection and applying judgment cannot be eliminated. Indeed, they are central to the entire endeavor. The inception, design, implementation, maintenance, and debugging of software is anything but a predictable assembly line. There are questions, uncertainties and leaps of faith at every step, in spite of insights gleaned from vast amounts of data.&lt;br/&gt;&lt;br/&gt;Yes, Google, and every software company to some degree, is data-driven. Data shines some light on an activity that is otherwise filled with chaos and uncertainty. Software engineering deals with complex artifacts, and data helps. It helps answer questions about usage unambiguously, as Carr rightly points out. Which features are users actually using? What layout gets more clicks? However, these are still answers only about the finished product. The process by which that product actually gets made is still not a predictable, reductionist assembly line. It is a different a world than the one Taylor imagined, and then created, for manufacturing.&lt;br/&gt;&lt;br/&gt;But the most important disconnect between Carr’s fantasy of a Taylorist software factory and reality is in the role of programmers in creating software. In Taylor’s worldview, workers are unskilled, replaceable cogs. Programmers are anything but. (There might be some author bias here, but still). There is a wide variance in the productivity of programmers, and the best ones are more than an order of magnitude better than the average ones. In this sense, programmers are more like writers, or even artists. This difference is at odds with Taylorism’s thesis of workers having roughly similar productivity, and hence being replaceable.&lt;br/&gt;&lt;br/&gt;Most modern science is intensely data-centric. New insights are often gleaned by e&lt;a href=&#34;http://www.computer.org/portal/web/csdl/doi/10.1109/MIS.2009.36&#34;&gt;xtracting patterns from vast amounts of data&lt;/a&gt;. Does this mean the entire enterprise of modern science is Taylorist, with scientists nothing but faceless cogs, freely replaceable? Of course not.&lt;br/&gt;&lt;br/&gt;Carr is making the mistake of noticing one central tenet of Taylorism &amp;ndash; measurement and data &amp;ndash; in an enterprise and labeling the entire entire enterprise Taylorist. There is another name for this method of creative, intelligent agents using data and measurement in the pursuit of complex tasks &amp;ndash; &lt;a href=&#34;http://en.wikipedia.org/wiki/Empiricism&#34;&gt;empericism&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;[Full disclosure: I’m employed by Google. These are my own views, not Google’s.]</description>
      <content:encoded><![CDATA[<p><span id="internal-source-marker_0.90068718791008">I’m reading </span><a href="http://www.amazon.com/Shallows-What-Internet-Doing-Brains/dp/0393072223"><span>Nicholas Carr’s “The Shallows”</span></a><span>, and thoroughly enjoying it. Whether I agree with everything he says or not, he is eloquent and thought-provoking. </span></p>
<span> </span>One of the chapters in the book is “The Church of Google”, in which Carr examines the way Google operates, and draws the conclusion that it is <a href="http://en.wikipedia.org/wiki/Scientific_management">Taylorist</a>:
<blockquote>Google’s Silicon Valley headquarters&hellip; is the Internet’s high church, and the religion practiced inside its walls is Taylorism. The company, says CEO Eric Schmidt, is “founded around the science of measurement.” It is striving to “systematize everything” it does. “We try to be very data-driven, and quantify everything,” adds another Google executive&hellip; What Taylor did for the work of the hand, Google is doing for the work of the mind.</blockquote>
(Emphasis mine.)<br/><br/>This belief stems from a misunderstanding of how software is created, and what Taylorism truly means in that context. It is tempting to make parallels between industrial production and writing software, and indeed, Carr is not the first to make the leap. At the dawn of the field, the lament was that “<a href="http://www.cs.dartmouth.edu/~doug/components.txt">the software industry is not industrialized.</a>” They holy grail was “reusable components” &ndash; lego-like blocks that could be snapped together to make a specific end-product. Forty years later, we’re nowhere near that goal. <br/><br/>Industrial manufacturing is all about reducing uncertainty and variance in both the process (“build 10 nuts a minute”) and the product (“the nut’s diameter must be 10mm with a standard deviation of 0.1mm”). Taylor’s time and motion studies observed the process, rooted out inefficiencies and drove down variances. A worker turning a lever at a given frequency, not pausing for reflection or applying judgment, is better for predictably cranking out widgets.<br/><br/>But when it comes to creating software, pausing for reflection and applying judgment cannot be eliminated. Indeed, they are central to the entire endeavor. The inception, design, implementation, maintenance, and debugging of software is anything but a predictable assembly line. There are questions, uncertainties and leaps of faith at every step, in spite of insights gleaned from vast amounts of data.<br/><br/>Yes, Google, and every software company to some degree, is data-driven. Data shines some light on an activity that is otherwise filled with chaos and uncertainty. Software engineering deals with complex artifacts, and data helps. It helps answer questions about usage unambiguously, as Carr rightly points out. Which features are users actually using? What layout gets more clicks? However, these are still answers only about the finished product. The process by which that product actually gets made is still not a predictable, reductionist assembly line. It is a different a world than the one Taylor imagined, and then created, for manufacturing.<br/><br/>But the most important disconnect between Carr’s fantasy of a Taylorist software factory and reality is in the role of programmers in creating software. In Taylor’s worldview, workers are unskilled, replaceable cogs. Programmers are anything but. (There might be some author bias here, but still). There is a wide variance in the productivity of programmers, and the best ones are more than an order of magnitude better than the average ones. In this sense, programmers are more like writers, or even artists. This difference is at odds with Taylorism’s thesis of workers having roughly similar productivity, and hence being replaceable.<br/><br/>Most modern science is intensely data-centric. New insights are often gleaned by e<a href="http://www.computer.org/portal/web/csdl/doi/10.1109/MIS.2009.36">xtracting patterns from vast amounts of data</a>. Does this mean the entire enterprise of modern science is Taylorist, with scientists nothing but faceless cogs, freely replaceable? Of course not.<br/><br/>Carr is making the mistake of noticing one central tenet of Taylorism &ndash; measurement and data &ndash; in an enterprise and labeling the entire entire enterprise Taylorist. There is another name for this method of creative, intelligent agents using data and measurement in the pursuit of complex tasks &ndash; <a href="http://en.wikipedia.org/wiki/Empiricism">empericism</a>.<br/><br/><br/>[Full disclosure: I’m employed by Google. These are my own views, not Google’s.]
]]></content:encoded>
    </item>
    
    <item>
      <title>Checking into Internet rehab - and sneaking out</title>
      <link>http://vivekhaldar.com/articles/checking-into-internet-rehab--and-sneaking-out/</link>
      <pubDate>Mon, 21 Jun 2010 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/checking-into-internet-rehab--and-sneaking-out/</guid>
      <description>&lt;p&gt;I’ve started using the &lt;a href=&#34;https://chrome.google.com/extensions/detail/laankejkbhbdhmipfmgcngdelahlfoji&#34;&gt;StayFocusd plugin for Chrome&lt;/a&gt; to cut down on my random, useless surfing. Give it a list of sites, and a total time limit per day, and it will cut you off when you go over that time. I cranked myself all the way down to 10 minutes per day &amp;mdash; I needed to do something drastic &amp;mdash; and added all my “jumping off” sites to the list: Google Reader, Twitter, Hacker News and a few others.&lt;br/&gt;&lt;br/&gt;The plugin has its own icon next to the address bar. When at a non-blocked site, it is a calm blue. On a blocked site, it turns red. When you are on your last minute, a tiny countdown of the seconds appears on the icon. Your time is about to run out, buddy. And finally, as soon as your time is up, it redirects to a page that says “Shouldn’t you be working?” in large type. At work, it’s more embarrassing to have that up than music videos on YouTube.&lt;br/&gt;&lt;br/&gt;The first few times I ran into my limit and got the prod, it was rude and jarring. Are you kidding me? Nobody stops me from surfing the web! But the hundredth time I saw “Shouldn’t you be working?” in big bold type, it made me think, you know what, I really should be working. Those productivity tips on reddit aren’t really increasing my productivity. And you really only need to see NYT once a day. Like a good farm animal, I soon learned to stay away from the prod.&lt;br/&gt;&lt;br/&gt;But this wouldn’t be a story about addiction if I didn’t talk about sneaking out of rehab. And there were plenty of ways to do that. The plug-in wouldn’t work in incognito windows. Of course, I could always use another browser, or use another machine, and romp through the web unrestricted. And indeed, during the first few days, I often did that. &lt;br/&gt;&lt;br/&gt;There was a barrier to escaping the plugin’s walls, and I did that lesser with time. More surprisingly, after the initial craving for a missing fix, I didn’t enjoy the random surfing as much as I used to. Every morning, I knew I had just 10 minutes,  and I tried to make the most of it. Hit up RSS feeds in Reader, open interesting pieces in new tabs (I know, that’s cheating a little bit), and be done. So I suppose the rehab regimen enforced by the plugin is working.&lt;br/&gt;&lt;br/&gt;What do you do to keep yourself from wasteful surfing?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I’ve started using the <a href="https://chrome.google.com/extensions/detail/laankejkbhbdhmipfmgcngdelahlfoji">StayFocusd plugin for Chrome</a> to cut down on my random, useless surfing. Give it a list of sites, and a total time limit per day, and it will cut you off when you go over that time. I cranked myself all the way down to 10 minutes per day &mdash; I needed to do something drastic &mdash; and added all my “jumping off” sites to the list: Google Reader, Twitter, Hacker News and a few others.<br/><br/>The plugin has its own icon next to the address bar. When at a non-blocked site, it is a calm blue. On a blocked site, it turns red. When you are on your last minute, a tiny countdown of the seconds appears on the icon. Your time is about to run out, buddy. And finally, as soon as your time is up, it redirects to a page that says “Shouldn’t you be working?” in large type. At work, it’s more embarrassing to have that up than music videos on YouTube.<br/><br/>The first few times I ran into my limit and got the prod, it was rude and jarring. Are you kidding me? Nobody stops me from surfing the web! But the hundredth time I saw “Shouldn’t you be working?” in big bold type, it made me think, you know what, I really should be working. Those productivity tips on reddit aren’t really increasing my productivity. And you really only need to see NYT once a day. Like a good farm animal, I soon learned to stay away from the prod.<br/><br/>But this wouldn’t be a story about addiction if I didn’t talk about sneaking out of rehab. And there were plenty of ways to do that. The plug-in wouldn’t work in incognito windows. Of course, I could always use another browser, or use another machine, and romp through the web unrestricted. And indeed, during the first few days, I often did that. <br/><br/>There was a barrier to escaping the plugin’s walls, and I did that lesser with time. More surprisingly, after the initial craving for a missing fix, I didn’t enjoy the random surfing as much as I used to. Every morning, I knew I had just 10 minutes,  and I tried to make the most of it. Hit up RSS feeds in Reader, open interesting pieces in new tabs (I know, that’s cheating a little bit), and be done. So I suppose the rehab regimen enforced by the plugin is working.<br/><br/>What do you do to keep yourself from wasteful surfing?</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>What can Kanye and U2 teach you about teamwork?</title>
      <link>http://vivekhaldar.com/articles/what-can-kanye-and-u2-teach-you-about-teamwork/</link>
      <pubDate>Thu, 17 Jun 2010 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/what-can-kanye-and-u2-teach-you-about-teamwork/</guid>
      <description>&lt;p&gt;A couple of personal vignettes about teamwork:&lt;br/&gt;&lt;br/&gt;U2 performing live: it happens to the most seasoned professionals when performing live. Sometimes you mess up, miss a beat, hit the wrong chord. It happened to them as well. I noticed only because I was new to the guitar, and was keeping track of the chords in my head. Larry did the old drummer trick of inserting a quick half beat to cover up. Bono held his &amp;ldquo;yeah&amp;rdquo; a little longer. The song went on. It was a memorable performance.&lt;br/&gt;&lt;br/&gt;Kanye West performing live: Things went just a little bit off beat, and he came to a screeching halt. &amp;ldquo;Hey, hey, hey! You f***ed it up&amp;rdquo;, he said to the band. A few moments of awkward silence. And then on to the next song. The band were wearing dark glasses, so you couldn&amp;rsquo;t tell if they were giving Kanye dirty looks.&lt;br/&gt;&lt;br/&gt;You want to be in a team that&amp;rsquo;s like U2, not Kanye&amp;rsquo;s touring band.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>A couple of personal vignettes about teamwork:<br/><br/>U2 performing live: it happens to the most seasoned professionals when performing live. Sometimes you mess up, miss a beat, hit the wrong chord. It happened to them as well. I noticed only because I was new to the guitar, and was keeping track of the chords in my head. Larry did the old drummer trick of inserting a quick half beat to cover up. Bono held his &ldquo;yeah&rdquo; a little longer. The song went on. It was a memorable performance.<br/><br/>Kanye West performing live: Things went just a little bit off beat, and he came to a screeching halt. &ldquo;Hey, hey, hey! You f***ed it up&rdquo;, he said to the band. A few moments of awkward silence. And then on to the next song. The band were wearing dark glasses, so you couldn&rsquo;t tell if they were giving Kanye dirty looks.<br/><br/>You want to be in a team that&rsquo;s like U2, not Kanye&rsquo;s touring band.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Nouns as verbs, verbs as nouns</title>
      <link>http://vivekhaldar.com/articles/nouns-as-verbs-verbs-as-nouns/</link>
      <pubDate>Fri, 07 May 2010 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/nouns-as-verbs-verbs-as-nouns/</guid>
      <description>&lt;p&gt;The line between nouns and verbs is being gradually blurred. There are many common examples of nouns being used as verbs: &amp;ldquo;I need to Xerox this form&amp;rdquo;, &amp;ldquo;Let me Google that.&amp;quot; &lt;br/&gt;&lt;br/&gt;Lately, the current has been flowing the other way too, and it&amp;rsquo;s not unusual to hear verbs being used as nouns. A common example is the &lt;a id=&#34;xwaq&#34; title=&#39;verb &#34;ask&#34; being used as a noun&#39; href=&#34;http://blogs.msdn.com/larryosterman/archive/2005/08/04/447702.aspx&#34;&gt;verb &amp;quot;ask&amp;rdquo; being used as a noun&lt;/a&gt;: &amp;ldquo;My ask is that you make this button green.&amp;rdquo; Even more egregious: &amp;ldquo;I want to action this plan&amp;rdquo;, or, &amp;ldquo;I am &lt;a id=&#34;r-9l&#34; title=&#34;ambitionistic about actioning progress.&#34; href=&#34;http://www.fakesteve.net/2009/07/lets-all-take-deep-breath-and-get-some.html&#34;&gt;ambitionistic about actioning progress.&lt;/a&gt;&amp;rdquo;&lt;br/&gt;&lt;br/&gt;This always strikes me as wrong, sticking out like a jarring sawtooth in everyday speech. I have some sympathy for noun-as-verb usage because it mostly originated in the speech of regular people. But the verb-as-noun case seems to have been the proud creation of a narrow band of meeting-crazed office workers. I&amp;rsquo;ve noticed a strong correlation between verb-as-noun usage and number of hours per day spent in meetings. Just say no.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The line between nouns and verbs is being gradually blurred. There are many common examples of nouns being used as verbs: &ldquo;I need to Xerox this form&rdquo;, &ldquo;Let me Google that.&quot; <br/><br/>Lately, the current has been flowing the other way too, and it&rsquo;s not unusual to hear verbs being used as nouns. A common example is the <a id="xwaq" title='verb "ask" being used as a noun' href="http://blogs.msdn.com/larryosterman/archive/2005/08/04/447702.aspx">verb &quot;ask&rdquo; being used as a noun</a>: &ldquo;My ask is that you make this button green.&rdquo; Even more egregious: &ldquo;I want to action this plan&rdquo;, or, &ldquo;I am <a id="r-9l" title="ambitionistic about actioning progress." href="http://www.fakesteve.net/2009/07/lets-all-take-deep-breath-and-get-some.html">ambitionistic about actioning progress.</a>&rdquo;<br/><br/>This always strikes me as wrong, sticking out like a jarring sawtooth in everyday speech. I have some sympathy for noun-as-verb usage because it mostly originated in the speech of regular people. But the verb-as-noun case seems to have been the proud creation of a narrow band of meeting-crazed office workers. I&rsquo;ve noticed a strong correlation between verb-as-noun usage and number of hours per day spent in meetings. Just say no.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Upsight</title>
      <link>http://vivekhaldar.com/articles/upsight/</link>
      <pubDate>Tue, 04 May 2010 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/upsight/</guid>
      <description>&lt;p&gt;Every &lt;a id=&#34;iai:&#34; title=&#34;new word&#34; href=&#34;http://www.askoxford.com/worldofwords/newwords/?view=uk&#34;&gt;new word&lt;/a&gt; coined is a wonder. There used to be a feeling or a phenomenon or a concept that was vague and kept slipping from your grasp, but now &amp;ndash; now there is a word for it! A single word, that means exactly what you want, like a flagpole declaring ownership over a vast wilderness.&lt;/p&gt;
&lt;p&gt;One of my favorite examples from recent memory: in &lt;a id=&#34;gzee&#34; title=&#34;Anathem&#34; href=&#34;http://www.nealstephenson.com/anathem/&#34;&gt;Anathem&lt;/a&gt;, Neal Stephenson uses the word &amp;ldquo;upsight&amp;rdquo;. He doesn&amp;rsquo;t define it. That&amp;rsquo;s just the way words from a speculative universe are. But it&amp;rsquo;s meaning is instantly clear from the context. It&amp;rsquo;s a riff on the well-known &amp;ldquo;insight&amp;rdquo;, of course, but subtly different, and much more powerful. To have &lt;a id=&#34;o8.-&#34; title=&#34;insight&#34; href=&#34;http://www.google.com/dictionary?aq=f&amp;amp;langpair=en%7Cen&amp;amp;hl=en&amp;amp;q=insight&#34;&gt;insight&lt;/a&gt; into something means to have a deep and accurate understanding of it, often in ways opaque to most. What could &amp;ldquo;upsight&amp;rdquo; mean? I propose: to have an upsight, one must not just deeply and accurately understand something, but generalize that understanding to a much broader &lt;em&gt;class&lt;/em&gt; of things. To understand addition of integers well would give you &lt;em&gt;insight &lt;/em&gt;into it, but to understand that it is but a trivial example of a &lt;a id=&#34;xsrd&#34; title=&#34;group&#34; href=&#34;http://en.wikipedia.org/wiki/Group_(mathematics)#First_example:_the_integers&#34;&gt;group&lt;/a&gt; would give you an &lt;em&gt;upsight.&lt;/em&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Every <a id="iai:" title="new word" href="http://www.askoxford.com/worldofwords/newwords/?view=uk">new word</a> coined is a wonder. There used to be a feeling or a phenomenon or a concept that was vague and kept slipping from your grasp, but now &ndash; now there is a word for it! A single word, that means exactly what you want, like a flagpole declaring ownership over a vast wilderness.</p>
<p>One of my favorite examples from recent memory: in <a id="gzee" title="Anathem" href="http://www.nealstephenson.com/anathem/">Anathem</a>, Neal Stephenson uses the word &ldquo;upsight&rdquo;. He doesn&rsquo;t define it. That&rsquo;s just the way words from a speculative universe are. But it&rsquo;s meaning is instantly clear from the context. It&rsquo;s a riff on the well-known &ldquo;insight&rdquo;, of course, but subtly different, and much more powerful. To have <a id="o8.-" title="insight" href="http://www.google.com/dictionary?aq=f&amp;langpair=en%7Cen&amp;hl=en&amp;q=insight">insight</a> into something means to have a deep and accurate understanding of it, often in ways opaque to most. What could &ldquo;upsight&rdquo; mean? I propose: to have an upsight, one must not just deeply and accurately understand something, but generalize that understanding to a much broader <em>class</em> of things. To understand addition of integers well would give you <em>insight </em>into it, but to understand that it is but a trivial example of a <a id="xsrd" title="group" href="http://en.wikipedia.org/wiki/Group_(mathematics)#First_example:_the_integers">group</a> would give you an <em>upsight.</em></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Medium Shear</title>
      <link>http://vivekhaldar.com/articles/medium-shear/</link>
      <pubDate>Sun, 02 May 2010 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/medium-shear/</guid>
      <description>&lt;p&gt;&lt;a id=&#34;hd7e&#34; title=&#34;Roger Ebert makes a rational, compelling case against 3D cinema&#34; href=&#34;http://www.newsweek.com/id/237110/output/print&#34;&gt;Roger Ebert makes a rational, compelling case against 3D cinema&lt;/a&gt;: &lt;br/&gt;&lt;/p&gt;
&lt;blockquote&gt;3-D is a waste of a perfectly good dimension. Hollywood&amp;rsquo;s current crazy stampede toward it is suicidal. It adds nothing essential to the moviegoing experience. For some, it is an annoying distraction. For others, it creates nausea and headaches. It is driven largely to sell expensive projection equipment and add a $5 to $7.50 surcharge on already expensive movie tickets. Its image is noticeably darker than standard 2-D. It is unsuitable for grown-up films of any seriousness. It limits the freedom of directors to make films as they choose. For moviegoers in the PG-13 and R ranges, it only rarely provides an experience worth paying a premium for.&lt;/blockquote&gt;
History gives us a long list of a new medium displacing an older one. Some of the more prominent ones: books replaced the spoken word, TV replaced radio, the Internet replaced (or will replace) TV.&lt;br/&gt;&lt;br/&gt;&lt;a id=&#34;kk4o&#34; title=&#34;Socrates disdained the written word&#34; href=&#34;http://andreaskluth.org/2009/06/19/the-spoken-and-the-written-word/&#34;&gt;Socrates disdained the written word&lt;/a&gt; as a tool for the mentally weak and for its lack of dialectic. The earliest books were verbatim stores for knowledge and hymns that people had memorized. Fiction came later.&lt;br/&gt;&lt;br/&gt;&lt;a id=&#34;d-13&#34; title=&#34;The earliest TV shows were radio shows pasted onto the new medium&#34; href=&#34;http://www.fiftiesweb.com/tv50.htm&#34;&gt;The earliest TV shows were radio shows pasted onto the new medium&lt;/a&gt;, many consisting of people sitting around and talking, but with the audience now able to see them. It took decades to develop and exercise the full palette of &lt;a id=&#34;dn7n&#34; title=&#34;visual expression&#34; href=&#34;http://books.google.com/books?id=HW100zvghxgC&amp;amp;lpg=PP1&amp;amp;dq=the%20visual%20story&amp;amp;pg=PP1#v=onepage&amp;amp;q&amp;amp;f=false&#34;&gt;visual expression&lt;/a&gt; the new medium allowed.&lt;br/&gt;&lt;br/&gt;A new medium never loses. It might have supporters and naysayers, but once it reaches a point where there is serious debate about it, it&amp;rsquo;s already too late. Can you think of a single example where the tide of a new medium was turned back? This is not to say that the debate is useless. It&amp;rsquo;s true purpose should not be to influence the uptake of the medium, but to point out it&amp;rsquo;s strengths and weaknesses, and in doing so, pave the way for the full range of expression it allows.</description>
      <content:encoded><![CDATA[<p><a id="hd7e" title="Roger Ebert makes a rational, compelling case against 3D cinema" href="http://www.newsweek.com/id/237110/output/print">Roger Ebert makes a rational, compelling case against 3D cinema</a>: <br/></p>
<blockquote>3-D is a waste of a perfectly good dimension. Hollywood&rsquo;s current crazy stampede toward it is suicidal. It adds nothing essential to the moviegoing experience. For some, it is an annoying distraction. For others, it creates nausea and headaches. It is driven largely to sell expensive projection equipment and add a $5 to $7.50 surcharge on already expensive movie tickets. Its image is noticeably darker than standard 2-D. It is unsuitable for grown-up films of any seriousness. It limits the freedom of directors to make films as they choose. For moviegoers in the PG-13 and R ranges, it only rarely provides an experience worth paying a premium for.</blockquote>
History gives us a long list of a new medium displacing an older one. Some of the more prominent ones: books replaced the spoken word, TV replaced radio, the Internet replaced (or will replace) TV.<br/><br/><a id="kk4o" title="Socrates disdained the written word" href="http://andreaskluth.org/2009/06/19/the-spoken-and-the-written-word/">Socrates disdained the written word</a> as a tool for the mentally weak and for its lack of dialectic. The earliest books were verbatim stores for knowledge and hymns that people had memorized. Fiction came later.<br/><br/><a id="d-13" title="The earliest TV shows were radio shows pasted onto the new medium" href="http://www.fiftiesweb.com/tv50.htm">The earliest TV shows were radio shows pasted onto the new medium</a>, many consisting of people sitting around and talking, but with the audience now able to see them. It took decades to develop and exercise the full palette of <a id="dn7n" title="visual expression" href="http://books.google.com/books?id=HW100zvghxgC&amp;lpg=PP1&amp;dq=the%20visual%20story&amp;pg=PP1#v=onepage&amp;q&amp;f=false">visual expression</a> the new medium allowed.<br/><br/>A new medium never loses. It might have supporters and naysayers, but once it reaches a point where there is serious debate about it, it&rsquo;s already too late. Can you think of a single example where the tide of a new medium was turned back? This is not to say that the debate is useless. It&rsquo;s true purpose should not be to influence the uptake of the medium, but to point out it&rsquo;s strengths and weaknesses, and in doing so, pave the way for the full range of expression it allows.
]]></content:encoded>
    </item>
    
    <item>
      <title>English Words Lifted from Hindi</title>
      <link>http://vivekhaldar.com/articles/english-words-lifted-from-hindi/</link>
      <pubDate>Sat, 01 May 2010 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/english-words-lifted-from-hindi/</guid>
      <description>&lt;p&gt;I bet that next to European languages, Hindi is among the those that English has borrowed the most from. I&amp;rsquo;m not talking about English words with Hindi origins, I&amp;rsquo;m talking about Hindi words lifted with little or no modification. Maybe I&amp;rsquo;m biased as a native Hindi speaker. Maybe Hindi words spoken, and sometimes mutilated, in English pop out at me. &lt;br/&gt;&lt;br/&gt;Here are a few examples:&lt;br/&gt;&lt;br/&gt;(Word / Hindi meaning / English meaning)&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;pundit&lt;/strong&gt; / Priest, caretaker of temples, performer of rituals / Self-proclaimed expert&lt;br/&gt;&lt;strong&gt;guru&lt;/strong&gt; / Learned scholar and teacher / An expert on something&lt;br/&gt;&lt;strong&gt;loot&lt;/strong&gt; / Stolen goods / The same. But also used as a verb.&lt;br/&gt;&lt;strong&gt;pyjama&lt;/strong&gt; / &amp;ldquo;pai&amp;rdquo; + &amp;ldquo;jama&amp;rdquo;, literally &amp;ldquo;clothing for legs&amp;rdquo;&lt;br/&gt;&lt;strong&gt;almirah&lt;/strong&gt; / Closet, cupboard / The same. More common in British English.&lt;br/&gt;&lt;strong&gt;khaki&lt;/strong&gt; / The color of ash / Brown. Soldiers&amp;rsquo; pants were brown, hence the association with the clothing item.&lt;br/&gt;&lt;br/&gt;These are just some off the top of my head. Most of these crept into usage during &lt;a id=&#34;iqyp&#34; title=&#34;the Raj&#34; href=&#34;http://en.wikipedia.org/wiki/British_Raj&#34;&gt;the Raj&lt;/a&gt; and came westwards with the Brits. &lt;a id=&#34;a-vd&#34; title=&#34;Wikipedia has a more complete list&#34; href=&#34;http://en.wikipedia.org/wiki/List_of_English_words_of_Hindi_or_Urdu_origin&#34;&gt;Wikipedia has a more complete list&lt;/a&gt;. &lt;a id=&#34;o7n8&#34; title=&#34;UrbanDictionary has a longer list&#34; href=&#34;#http://Most%20of%20these%20crept%20into%20usage%20during%20the%20Raj%20and%20came%20westwards%20with%20the%20Brits.&#34;&gt;UrbanDictionary has a longer list&lt;/a&gt;, though they&amp;rsquo;re mostly expletives, and not in common use.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I bet that next to European languages, Hindi is among the those that English has borrowed the most from. I&rsquo;m not talking about English words with Hindi origins, I&rsquo;m talking about Hindi words lifted with little or no modification. Maybe I&rsquo;m biased as a native Hindi speaker. Maybe Hindi words spoken, and sometimes mutilated, in English pop out at me. <br/><br/>Here are a few examples:<br/><br/>(Word / Hindi meaning / English meaning)<br/><br/><strong>pundit</strong> / Priest, caretaker of temples, performer of rituals / Self-proclaimed expert<br/><strong>guru</strong> / Learned scholar and teacher / An expert on something<br/><strong>loot</strong> / Stolen goods / The same. But also used as a verb.<br/><strong>pyjama</strong> / &ldquo;pai&rdquo; + &ldquo;jama&rdquo;, literally &ldquo;clothing for legs&rdquo;<br/><strong>almirah</strong> / Closet, cupboard / The same. More common in British English.<br/><strong>khaki</strong> / The color of ash / Brown. Soldiers&rsquo; pants were brown, hence the association with the clothing item.<br/><br/>These are just some off the top of my head. Most of these crept into usage during <a id="iqyp" title="the Raj" href="http://en.wikipedia.org/wiki/British_Raj">the Raj</a> and came westwards with the Brits. <a id="a-vd" title="Wikipedia has a more complete list" href="http://en.wikipedia.org/wiki/List_of_English_words_of_Hindi_or_Urdu_origin">Wikipedia has a more complete list</a>. <a id="o7n8" title="UrbanDictionary has a longer list" href="#http://Most%20of%20these%20crept%20into%20usage%20during%20the%20Raj%20and%20came%20westwards%20with%20the%20Brits.">UrbanDictionary has a longer list</a>, though they&rsquo;re mostly expletives, and not in common use.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Dilli</title>
      <link>http://vivekhaldar.com/articles/dilli/</link>
      <pubDate>Sun, 25 Apr 2010 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/dilli/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://thedelhiwalla.blogspot.com/&#34;&gt;The Delhi Walla&amp;rsquo;s pictures&lt;/a&gt; of the city (called &amp;ldquo;Dilli&amp;rdquo; by locals) are honest, unadorned, and heart-wrenchingly beautiful &amp;ndash; like the city itself. I eagerly await each new post.&lt;/p&gt;
&lt;p&gt;Inspired by him, I present some of my own images of good ol&amp;rsquo; Dilli.&lt;/p&gt;
&lt;p&gt;India Gate at 3am:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&#34;tmblr-full&#34; data-orig-height=&#34;473&#34; data-orig-width=&#34;500&#34;&gt;&lt;img src=&#34;https://64.media.tumblr.com/a2eeffbce67fecd2fb09496ca1103403/821782238b4fa2e8-f3/s540x810/705fda185e33002a130d623c35d6ff8aa99ee732.jpg&#34; data-orig-height=&#34;473&#34; data-orig-width=&#34;500&#34;/&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;The City, asleep:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&#34;tmblr-full&#34; data-orig-height=&#34;281&#34; data-orig-width=&#34;500&#34;&gt;&lt;img src=&#34;https://64.media.tumblr.com/cc06784162e045b94d662cbb6a90c8eb/821782238b4fa2e8-e0/s540x810/a068e8d9b97aee8b7b61847cfd82f246290cb62a.jpg&#34; data-orig-height=&#34;281&#34; data-orig-width=&#34;500&#34;/&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Dilli Haat:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&#34;tmblr-full&#34; data-orig-height=&#34;375&#34; data-orig-width=&#34;500&#34;&gt;&lt;img src=&#34;https://64.media.tumblr.com/2b209ca54ed76fb1cf1927aaae8907d9/821782238b4fa2e8-c0/s540x810/350a7c527baee606feba893a219e5ec6bbfa7a80.jpg&#34; data-orig-height=&#34;375&#34; data-orig-width=&#34;500&#34;/&gt;&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;School:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&#34;tmblr-full&#34; data-orig-height=&#34;700&#34; data-orig-width=&#34;467&#34;&gt;&lt;img src=&#34;https://64.media.tumblr.com/ebae37c5cc20d56b7fd00f578982d521/821782238b4fa2e8-f8/s540x810/c4518b660074852f16a1526c3128e977eb327a67.jpg&#34; data-orig-height=&#34;700&#34; data-orig-width=&#34;467&#34;/&gt;&lt;/figure&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://thedelhiwalla.blogspot.com/">The Delhi Walla&rsquo;s pictures</a> of the city (called &ldquo;Dilli&rdquo; by locals) are honest, unadorned, and heart-wrenchingly beautiful &ndash; like the city itself. I eagerly await each new post.</p>
<p>Inspired by him, I present some of my own images of good ol&rsquo; Dilli.</p>
<p>India Gate at 3am:</p>
<p><figure class="tmblr-full" data-orig-height="473" data-orig-width="500"><img src="https://64.media.tumblr.com/a2eeffbce67fecd2fb09496ca1103403/821782238b4fa2e8-f3/s540x810/705fda185e33002a130d623c35d6ff8aa99ee732.jpg" data-orig-height="473" data-orig-width="500"/></figure></p>
<p>The City, asleep:</p>
<p><figure class="tmblr-full" data-orig-height="281" data-orig-width="500"><img src="https://64.media.tumblr.com/cc06784162e045b94d662cbb6a90c8eb/821782238b4fa2e8-e0/s540x810/a068e8d9b97aee8b7b61847cfd82f246290cb62a.jpg" data-orig-height="281" data-orig-width="500"/></figure></p>
<p>Dilli Haat:</p>
<p><figure class="tmblr-full" data-orig-height="375" data-orig-width="500"><img src="https://64.media.tumblr.com/2b209ca54ed76fb1cf1927aaae8907d9/821782238b4fa2e8-c0/s540x810/350a7c527baee606feba893a219e5ec6bbfa7a80.jpg" data-orig-height="375" data-orig-width="500"/></figure></p>
<p>School:</p>
<p><figure class="tmblr-full" data-orig-height="700" data-orig-width="467"><img src="https://64.media.tumblr.com/ebae37c5cc20d56b7fd00f578982d521/821782238b4fa2e8-f8/s540x810/c4518b660074852f16a1526c3128e977eb327a67.jpg" data-orig-height="700" data-orig-width="467"/></figure></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Text to speech in MacOS X - automatically</title>
      <link>http://vivekhaldar.com/articles/text-to-speech-in-macos-x--automatically/</link>
      <pubDate>Sat, 03 Apr 2010 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/text-to-speech-in-macos-x--automatically/</guid>
      <description>&lt;p&gt;MacOS X has a wonderfully crafted &lt;a href=&#34;http://www.tuaw.com/2007/10/26/24-hours-of-leopard-alex-the-new-voice-of-mac-os-x/&#34;&gt;new synthetic voice, Alex&lt;/a&gt;. It sounds remarkably natural and non-Tron-like. Given a text file foo.txt, this is how you would convert it into speech in a sound file foo.aiff:&lt;/p&gt;
&lt;blockquote&gt;say -v alex -o foo.aiff -f foo.txt&lt;/blockquote&gt;
&lt;p&gt;I do a good fraction of my &amp;ldquo;reading&amp;rdquo; (especially long articles on the web) by converting them into speech like this, and dropping them into my iPod.&lt;/p&gt;
&lt;p&gt;You can go a step further to automate this: use &lt;a href=&#34;http://www.apple.com/pro/tips/folderactions.html&#34;&gt;folder actions&lt;/a&gt; with an AppleScript so that text files dropped into a given folder are automatically converted into speech files. The script goes like this:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>MacOS X has a wonderfully crafted <a href="http://www.tuaw.com/2007/10/26/24-hours-of-leopard-alex-the-new-voice-of-mac-os-x/">new synthetic voice, Alex</a>. It sounds remarkably natural and non-Tron-like. Given a text file foo.txt, this is how you would convert it into speech in a sound file foo.aiff:</p>
<blockquote>say -v alex -o foo.aiff -f foo.txt</blockquote>
<p>I do a good fraction of my &ldquo;reading&rdquo; (especially long articles on the web) by converting them into speech like this, and dropping them into my iPod.</p>
<p>You can go a step further to automate this: use <a href="http://www.apple.com/pro/tips/folderactions.html">folder actions</a> with an AppleScript so that text files dropped into a given folder are automatically converted into speech files. The script goes like this:</p>
<pre>(*
add - new item say
<p>This Folder Action handler is triggered whenever items are added to the attached folder.
The script will convert the item added into a .aiff sound file, containing the
contents of the added item spoken out loud, using the &ldquo;Alex&rdquo; voice.
*)</p>
<p>property dialog_timeout : 10 &ndash; set the amount of time before dialogs auto-answer.</p>
<p>on adding folder items to this_folder after receiving added_items
try
repeat with current_item in added_items
(* Get just the name, without the full path, of the current item *)
tell application &ldquo;Finder&rdquo;
set the current_name to the name of current_item
end tell</p>
<pre><code>  (* The sound file is created one level up *)
  set the sound_file to POSIX path of this_folder &amp;amp; &quot;/../&quot; &amp;amp; current_name &amp;amp; &quot;.aiff&quot;

  (* The shell invocation for converting to speech *)
  set the say_script to &quot;cd &quot; &amp;amp; POSIX path of this_folder &amp;amp; &quot;; /usr/bin/say -v alex -o &quot; &amp;amp; sound_file &amp;amp; &quot; -f &quot; &amp;amp; POSIX path of current_item
  do shell script say_script
end repeat

(* One notification when all the conversions are done *)
set the alert_message to &quot;Speaking done!&quot;
display dialog the alert_message buttons {&quot;OK&quot;} default button 1 with icon 1 giving up after dialog_timeout
</code></pre>
<p>end try
end adding folder items to
</pre></p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Collecting Needles</title>
      <link>http://vivekhaldar.com/articles/collecting-needles/</link>
      <pubDate>Tue, 30 Mar 2010 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/collecting-needles/</guid>
      <description>&lt;p&gt;Bugs, wikis, sites, docs, spreadsheets &amp;mdash; these are all great and I couldn&amp;rsquo;t figure out what to do and make it through a day without them. But sometimes the sheer information overload of all these bits destroys their utility. Too much flux, too much data, too much craziness.&lt;/p&gt;
&lt;p&gt;Like a perfect storm, this usually coincides with the onset of the vicious circle of entropy: when there are so many unknowns and moving parts in the task before you that you&amp;rsquo;re afraid making any further investigations will only fork your decision tree further and add to the entropy.&lt;br/&gt;&lt;br/&gt;That&amp;rsquo;s when Saint PostIt comes to my rescue:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Bugs, wikis, sites, docs, spreadsheets &mdash; these are all great and I couldn&rsquo;t figure out what to do and make it through a day without them. But sometimes the sheer information overload of all these bits destroys their utility. Too much flux, too much data, too much craziness.</p>
<p>Like a perfect storm, this usually coincides with the onset of the vicious circle of entropy: when there are so many unknowns and moving parts in the task before you that you&rsquo;re afraid making any further investigations will only fork your decision tree further and add to the entropy.<br/><br/>That&rsquo;s when Saint PostIt comes to my rescue:</p>
<blockquote>When I find myself in times of trouble,<br/>Yellow PostIts come to me,<br/>Speaking words of wisdom,<br/>Let it be.<br/></blockquote>
<p>I write down a small number of items &mdash; usually 3, no more than 5 &mdash; on individual PostIts. These find a home in the triangular clear space on my desk between me and my keyboard. These are not humongous goals. In fact, quite the opposite. They&rsquo;re tiny baby steps. &ldquo;Read Foo Bar design doc.&rdquo; &ldquo;Find class to parse HTML.&rdquo; And then, for the rest of the day, those little yellow stickies are my entire world. That&rsquo;s it. Unless a fire is burning and I am the only one that can put it out, nothing unseats these cute yellow ones.<br/><br/>What really helps me, though, is their <strong>tactility</strong>. I can rearrange them. I can stick them up at different spots in my office. When an item is taken care of, I get the satisfaction of crumpling it up and tossing it.<br/><br/>A repository of electronic data feels infinite, even if it is small. This alone makes one begin to feel overwhelmed. Physical objects convey an innate finiteness, even when they are large. This makes them approachable and inviting.<br/><br/>* * *<br/><br/>What could be more tactile than Lego blocks?<br/><br/>Consider using <a>Legos for bug tracking</a>:<br/><br/></p>
<blockquote>Second is a important thing. Developers tend to deal with bug negatively. However, they enjoy to do bug, because Representation of LEGO bricks are creative task, and Destruction of them and Throwing them into the box are pleasure. What’s more, the sound of building, destruction and throwing make people who are in the room awake to the bugs.<br/><br/>Third is that the plate has limitation of space, so developer must fix bugs. BTS is useful, but veil bugs in the unlimited storage.<br/><br/>Of course, we are using BTS (Trac). And tickets are stored as detailed information. But tickets stored in BTS are less visible and noticable than BUG-LEGO.<img/></blockquote>
<p>Once you start mapping intangibles into tangibles, the fun begins. This person has been using <a>Legos to take the drudgery out of time tracking</a>:<br/><br/></p>
<blockquote>Stacking these hourly rows on top of each other builds up the whole day. I use the different colors for the projects I&rsquo;m involved in (8 are just enough), putting them on the stack whenever I want and have time to do so (but mostly quite instantly).</blockquote>
<p>* * *<br/><br/>The loss of tactility changes the way we access information &ndash; and not always for the better. A recently published article in Science, titled <a>&ldquo;Electronic Publication and the Narrowing of Science and Scholarship&rdquo;,</a> demonstrates that as online availability of scholarly work increases, the range of citations in newer work <strong>decreases:</strong></p>
<blockquote>As deeper backfiles become available, more recent articles were referenced; as more articles become available, fewer were cited and citations become more concentrated within fewer articles&hellip; By enabling scientists to quickly reach and converge with prevailing opinion, electronic journals hasten scientific consensus&hellip; Findings and ideas that do no become consensus quickly will be forgotten quickly.<br/><br/>This research ironically intimates that one of the chief values of print library research is poor indexing&hellip; By drawing researchers through unrelated articles, print browsing and perusal may have facilitated broader comparisons and led researchers into the past.</blockquote>
<p>Electronic searching turns everything into a needle because it is so good at finding them in haystacks. But maybe the surrounding hay is sometimes valuable as well.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Gabriel vs Brooks</title>
      <link>http://vivekhaldar.com/articles/gabriel-vs-brooks/</link>
      <pubDate>Thu, 18 Mar 2010 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/gabriel-vs-brooks/</guid>
      <description>&lt;p&gt;In a &lt;a&gt;recent essay&lt;/a&gt;, Richard Gabriel takes issue with &lt;a&gt;Frederick Brooks&lt;/a&gt;&amp;rsquo; view on conceptual integrity.&lt;br/&gt;&lt;br/&gt;Brooks says:&lt;/p&gt;
&lt;blockquote&gt;&amp;ldquo;The central problem&amp;hellip; is to get conceptual integrity in the design itself&amp;hellip; If we look back then at the 19th century and the things that happened &amp;ndash; the cartwright and the textile machinery, Stephenson (the train), Brunel&#39;s bridges and railway, Edison, Ford, the Wright brothers, etc &amp;ndash; these were very largely the designs of single designers or, in the case of the Wright brothers, pairs.&amp;rdquo;&lt;/blockquote&gt;
&lt;p&gt;Gabriel claims that Brooks gives too much credit to the heroic notion of a single mind creating beautiful designs with conceptual integrity, while underestimating the role played by a cast of &amp;ldquo;sometimes hidden co-authors and the thing designed itself.&amp;rdquo;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>In a <a>recent essay</a>, Richard Gabriel takes issue with <a>Frederick Brooks</a>&rsquo; view on conceptual integrity.<br/><br/>Brooks says:</p>
<blockquote>&ldquo;The central problem&hellip; is to get conceptual integrity in the design itself&hellip; If we look back then at the 19th century and the things that happened &ndash; the cartwright and the textile machinery, Stephenson (the train), Brunel's bridges and railway, Edison, Ford, the Wright brothers, etc &ndash; these were very largely the designs of single designers or, in the case of the Wright brothers, pairs.&rdquo;</blockquote>
<p>Gabriel claims that Brooks gives too much credit to the heroic notion of a single mind creating beautiful designs with conceptual integrity, while underestimating the role played by a cast of &ldquo;sometimes hidden co-authors and the thing designed itself.&rdquo;</p>
<p>In a humorous and affectionate ad-hominem twist to his arguments, Gabriel says of Brooks &ldquo;anything sounds 10 times more true when spoken by someone with a southern accent. As Brooks spoke &ndash; mostly off the cuff &ndash; and paced slowly away from the podium and back, I fell under his spell.&rdquo; This was ironic, because to me, Gabriel&rsquo;s extensive use of evocative classical themes &ndash; from poetic criticism, the life of a famous renaissance Italian architect to Greek mythology &ndash; almost forced me to nod along in agreement throughout the essay. At the end of it, however, I was left with the same feeling I have when I&rsquo;ve just seen a magic trick. I know there&rsquo;s a hole in there somewhere, but I can&rsquo;t for the life of me figure it out. It was too smooth. It was &ldquo;too true to be good&rdquo; &ndash; which, ironically, is another phrase Gabriel uses to describe Brooks&rsquo; arguments.</p>
<p>Gabriel attacks Brooks on two fronts: collective authorship, and intrinsic design constraints.</p>
<p>Authorship, Gabriel explains, is never a solitary activity.</p>
<blockquote>&ldquo;I’ve never published anything in a serious venue without some friend or colleague—and usually several—having read and commented on it. I take the comments seriously, and there are several friends whose recommendations I adopt essentially without question. The typical nonfiction book is full of acknowledgements that indicate a co-author-type relationship, and that’s true for my writings.  And even when an artist seems to be creating something completely new—artists like daVinci, van Gogh, or Beckett— it usually turns out there are hidden, unconscious influences even they can’t recognize.&rdquo;</blockquote>
<p>The idea of authorship or invention being a solitary credit has been widely challenged. One of the chapters in <a>Scott Berkun</a>&rsquo;s &ldquo;<a>The Myths of Innovation</a>&rdquo; is &ldquo;The Myth of the Lone Inventor&rdquo;. Says Berkun:</p>
<blockquote>&ldquo;Despite the myths, innovations rarely involve someone working alone, and never in history has an invention been made without reusing ideas from the past. For all our chronocentric glee, our newest ideas have historic roots&hellip;&rdquo;</blockquote>
<p>I could not agree more, and the argument carries over to code too. The code I write is highly influenced by code I&rsquo;ve read, and the code around it. With code review, the collectiveness of code authorship becomes even more apparent. It does take a village.</p>
<p>The more subtle point has to do with design constraints imposed by the nature of the very thing being designed. Considering two poems about the story of <a>Eurydice</a> from Greek mythology, he finds a common underlying structure.</p>
<blockquote>&ldquo;In both Eurydice poems— written at different times by very different poets—we are witnessing a known structure with different decorations, with different points of view, with different “lessons,” with different aesthetics, but with an underlying—shall we call it—conceptual integrity&hellip;<br/>&hellip;the Eurydice story forms a frame that directs where and how the poet can extend and use it. Builtin understandings and explanations, and already defined moods and images come to mind when the story is retold, and these form surfaces against which the meanings, images, moods, thoughts, and emotions of the new material bounce and reflect. The underlying story imposes a strong sense of what would be in keeping with it. And approaching the Eurydice story from any direction, the story itself does its own refracting.&rdquo;</blockquote>
<p>Indeed, we see this in almost every significant system we use. Using data-parallelism on a large scale forces one to come up with a model similar to <a>MapReduce</a>. Storing huge amounts of data in a distributed system compels a designer to sacrifice ACID and end up with something like <a>BigTable</a>, or <a>Dynamo</a>. There are intrinsic constraints on how any large system can be built (for example, see the <a>CAP theorem</a>).</p>
<p>It looks like I agree with all of Gabriel&rsquo;s arguments refuting Brooks&rsquo; single-mind theory of conceptual integrity. Yet, I still cannot swallow his final conclusion in its entirety.</p>
<p>I&rsquo;ve seen too much code whose conceptual integrity has been destroyed by multiple authors and changes over time. The author of a change often only cares about the narrow aspect of the system he is modifying without grasping its larger architecture. This &ldquo;true architecture&rdquo; is often not even documented, but lives only in the head of those who wrote significant parts of the entire system. Gradually the original integrity corrodes. Entropy takes its toll. Business logic creeps into the presentation layer. A single concept ends up forking code all over the place.</p>
<p>This is when the poem analogy starts breaking down. A poem &mdash; even one where multiple authors collaborate and revise and edit &mdash; is declared &ldquo;done&rdquo; when it&rsquo;s done. It is not subjected to an endless stream of revisions. Code is never &ldquo;done&rdquo;. There might exist discrete points in time when its frozen, but as long as it is in use, it will be fixed and patched and moulded towards slightly different uses. A poem&rsquo;s creation may be a dynamic process, but the end result, the poem itself, is static. The process of creating code shares a lot with the process of writing poetry and literature, but the end product is very different.</p>
<p>Here you do need a single person, or a small committee, for oversight. Most successful open source projects are run this way. Linus delegates the vast majority of real development on the Linux kernel, but still acts as gatekeeper for what makes it in and what doesn&rsquo;t. Guido acts in a similar capacity for Python. Matz for Ruby. Hamano for Git. The list goes on and on. Why do we need this one person? To maintain the integrity of the project. To make sure it is true to its goals. To ensure a certain bar for quality.</p>
<p>Gabriel&rsquo;s argument suffers from two major flaws. He gets carried away by the analogy with poems. And he mashes together two distinct concepts &ndash; authorship and integrity.</p>
<p>Here is what the dictionary says:</p>
<p>authorship  (ô'thər-shĭp&rsquo;) n.The act, fact, or occupation of writing. <br/>Source or origin, as of a book or idea.</p>
<p>integrity  (ĭn-tĕg'rĭ-tē) n.Steadfast adherence to a strict moral or ethical code.<br/>The state of being unimpaired; soundness.<br/>The quality or condition of being whole or undivided; completeness.</p>
<p>Authorship is the process by which something is produced. Integrity is a quality of the thing produced. Gabriel speaks of the two in the same vein, and while the two do have deep interactions, in the end they stand separately. He makes arguments that apply to authorship, but they do not carry over to ensuring the integrity of the piece thus authored.</p>
<p>The nominal &ldquo;author&rdquo; of a piece is the one not hidden by the mists of time, an oversimplified reduction that eases discussion and hides the complex and tangled history of the ideas within &ndash; yes. But for the piece to have integrity, that same author has to break from the stream that has brought him this far, and make a stand all his own.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Software processes are software too</title>
      <link>http://vivekhaldar.com/articles/software-processes-are-software-too/</link>
      <pubDate>Mon, 15 Mar 2010 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/software-processes-are-software-too/</guid>
      <description>&lt;p&gt;An oft-cited paper in software engineering is &amp;ldquo;&lt;a&gt;Software Processes Are Softare Too&lt;/a&gt;&amp;rdquo;, by Leon Osterweil. The central thesis of the paper is:&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Our suggestion is that we describe software processes by &amp;quot;programming&amp;rdquo; them much as we &amp;ldquo;program&amp;rdquo; computer applications. We refer to the activity of expressing software process descriptions with the aid of programming techniques as process programming, and suggest that this activity ought to be at the center of what software engineering is all about.&amp;ldquo;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>An oft-cited paper in software engineering is &ldquo;<a>Software Processes Are Softare Too</a>&rdquo;, by Leon Osterweil. The central thesis of the paper is:</p>
<p>&ldquo;Our suggestion is that we describe software processes by &quot;programming&rdquo; them much as we &ldquo;program&rdquo; computer applications. We refer to the activity of expressing software process descriptions with the aid of programming techniques as process programming, and suggest that this activity ought to be at the center of what software engineering is all about.&ldquo;</p>
<p>Today this seems like a rather banal observation, but remember that this paper was published in 1987. Today, we have source repositories integrated with code review tools, testing rigs, continuous builds, bug databases and the works. Most of the &quot;process&rdquo; of industrial software engineering is automated, and is software itself. A code patch is created by an author, and then is acted upon by a large cast, both human and mechanic. Humans review it. Machines test and analyze it. Finally, the finished &ldquo;product&rdquo;, the reviewed patch, is submitted. To check in a single patch can require a dozen or more systems, running on at least as many machines. Most developers take this completely for <a>granted</a>.</p>
<p>Was this realistic in 1987? Not with the computing power of the day. A deluge of CPU cycles and disk space has made automated processes possible. A continuous build machine. A submit queue machine. And on and on.</p>
<p>(Sidebar: the computer science literature from the 70s and 80s is chock full of ideas that were held back by the expense (at the time) of computing power, storage, and networking. Another big example: just-in-time compilation. No, the Java Virtual Machine was not the first to use JIT techniques &mdash; there are papers going back to the 1980s that describe similar techniques. But back then, a JIT would consume 50% of a CPU, and now its barely a blip.)</p>
<p>What will automated engineering processes look like in another decade? To answer that, lets look at some of the areas where humans are currently needed: system design, actually writing the code, and reviewing the code.</p>
<p>The underlying &ldquo;input&rdquo; that humans provide to the system is understanding. However, over time the domain of what computers have understood has steadily increased. For example, modern IDEs are now so sophisticated that sometimes I think my job title should be &ldquo;Eclipse operator&rdquo;, not software engineer. Our tools are now at the stage where they can compute, store and navigate complex relationships and properties of source code. But today this data is still mostly used by humans, for example, to perform automated refactoring, or to navigate source code. It is not hard to imagine the computer taking over the role of actually manipulating the source code with the relationships it has computed, presenting the proposed modifications to humans, and then humans acting in a purely advisory role.</p>
<p>On the reviewing side as well, computers have been in inexorably marching forward. Many reviewing activities are already automated. Syntax and style checking have been performed by tools for some time now, and now the reach of sophisticated semantic and static analysis is reaching even further to offer programmers suggestions on how to improve their code.</p>
<p>What is the difference between a process and an algorithm? To me, a process is something that relies heavily on human input. On the other hand, an algorithm is fully automated, once started. As human input to a process is reduced, it approaches an algorithm. How far is software engineering from becoming an algorithm?</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Why James Cameron did not win the Academy award for best director for Avatar</title>
      <link>http://vivekhaldar.com/articles/why-james-cameron-did-not-win-the-academy-award-for-best-director-for-avatar/</link>
      <pubDate>Thu, 11 Mar 2010 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/why-james-cameron-did-not-win-the-academy-award-for-best-director-for-avatar/</guid>
      <description>&lt;p&gt;Say you were a runner. But you took a different view of what &amp;ldquo;running&amp;rdquo; is than everyone else. While they drew the line for running enhancements at $200 running shoes and state-of-the-art energy drinks, you went further &amp;ndash; a lot further. You designed and built a running exoskeleton. It let you run faster, better, longer, stronger. &amp;ldquo;But that&amp;rsquo;s not real running!&amp;rdquo;, they said. &amp;ldquo;Why not? Is the goal to run with what you have, or just run?&amp;rdquo; And running with what you have is a fine goal, you thought, but surely everyone doesn&amp;rsquo;t have to stop there? You saw an entire new world, if only you could get some help from these new tools.&lt;br/&gt;&lt;br/&gt;The way Cameron built Avatar was not considered to be &amp;ldquo;real directing&amp;rdquo;. Much of the work, if not most of it, was in building the tools and technology (new cameras, new CG techniques). The builders of animated movies have been snubbed from the best director category for the same reason. They create the final output on the &lt;a title=&#34;screen&#34;&gt;screen&lt;/a&gt; in manner that is more akin to painting than using humans in a set. The process has many similarities to programming, because, to be sure, a lot of it is the output of complex programs, but also because the final output is compiled and rendered like the way program binaries are &amp;mdash; through a chain of manipulations, translations and composition.&lt;br/&gt;&lt;br/&gt;Maybe there should be a category for &amp;ldquo;best creator&amp;rdquo;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Say you were a runner. But you took a different view of what &ldquo;running&rdquo; is than everyone else. While they drew the line for running enhancements at $200 running shoes and state-of-the-art energy drinks, you went further &ndash; a lot further. You designed and built a running exoskeleton. It let you run faster, better, longer, stronger. &ldquo;But that&rsquo;s not real running!&rdquo;, they said. &ldquo;Why not? Is the goal to run with what you have, or just run?&rdquo; And running with what you have is a fine goal, you thought, but surely everyone doesn&rsquo;t have to stop there? You saw an entire new world, if only you could get some help from these new tools.<br/><br/>The way Cameron built Avatar was not considered to be &ldquo;real directing&rdquo;. Much of the work, if not most of it, was in building the tools and technology (new cameras, new CG techniques). The builders of animated movies have been snubbed from the best director category for the same reason. They create the final output on the <a title="screen">screen</a> in manner that is more akin to painting than using humans in a set. The process has many similarities to programming, because, to be sure, a lot of it is the output of complex programs, but also because the final output is compiled and rendered like the way program binaries are &mdash; through a chain of manipulations, translations and composition.<br/><br/>Maybe there should be a category for &ldquo;best creator&rdquo;.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>No ||</title>
      <link>http://vivekhaldar.com/articles/no/</link>
      <pubDate>Tue, 09 Mar 2010 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/no/</guid>
      <description>&lt;p&gt;I was captivated by the performance. The sound was wholesome and three-dimensional. Not echoing. Just full. The actors were wearing dusty trousers and puffs of dirt shot out when they slapped their thighs. Yes, watching a live performance was a sensual treat.&lt;/p&gt;
&lt;p&gt;What part of this could not be reproduced without live humans? Surely, the holodeck is not that far away. It is just a matter of resolution, fidelity, technology &amp;mdash; and time. How long before personal holodecks relegate live human performances to the same status as steam engines in museums?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I was captivated by the performance. The sound was wholesome and three-dimensional. Not echoing. Just full. The actors were wearing dusty trousers and puffs of dirt shot out when they slapped their thighs. Yes, watching a live performance was a sensual treat.</p>
<p>What part of this could not be reproduced without live humans? Surely, the holodeck is not that far away. It is just a matter of resolution, fidelity, technology &mdash; and time. How long before personal holodecks relegate live human performances to the same status as steam engines in museums?</p>
<p>The performance had me engrossed, but I could not shake the question from my mind. The deep dark expanse of the hall was like a meditation chamber &mdash; calm and still and silent. Except, of course, for the flurry of activty on the stage.</p>
<p>Then it struck me. A holodeck will not replace this because it will have one additional control. It will have a pause button. It will be yet another window in our daily juggling list, one alt-tab away from the ignominy of the attention-starved background.</p>
<p>A holodeck might replicate the sights, sounds, smells and feelings of the real world. But it will succumb to my scatter-brainedness. And so will I.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Google Apps Script &#43; Spreadsheets = Mashup Hub</title>
      <link>http://vivekhaldar.com/articles/google-apps-script--spreadsheets--mashup-hub/</link>
      <pubDate>Fri, 05 Mar 2010 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/google-apps-script--spreadsheets--mashup-hub/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been playing around with &lt;a href=&#34;http://www.google.com/google-d-s/scripts/scripts.html&#34;&gt;Google Apps Script&lt;/a&gt;. It has great library support for calling out to restful Web APIs. This makes it a great mashup platform. Also:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;It uses web-native Javascript.&lt;/li&gt;
&lt;li&gt;The &lt;a href=&#34;http://www.google.com/google-d-s/scripts/allservices.html&#34;&gt;documentation&lt;/a&gt; is clear.&lt;/li&gt;
&lt;li&gt;It&amp;rsquo;s ridiculously easy to write a small script and then try it out and continuously refine it by running it in a spreadsheet.&lt;/li&gt;
&lt;li&gt;Spreadsheets are a great hub to pull together data from disparate sources and slice-and-dice it.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;The key is the &lt;a href=&#34;http://www.google.com/google-d-s/scripts/class_urlfetchapp.html&#34;&gt;UrlFetchApp&lt;/a&gt; module, which lets you make HTTP GET and POST calls. For example, this is how you would call out to the &lt;a href=&#34;http://code.google.com/p/bitly-api/wiki/ApiDocumentation#/shorten&#34;&gt;bit.ly API&lt;/a&gt; to shorten a URL:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I&rsquo;ve been playing around with <a href="http://www.google.com/google-d-s/scripts/scripts.html">Google Apps Script</a>. It has great library support for calling out to restful Web APIs. This makes it a great mashup platform. Also:</p>
<ul><li>It uses web-native Javascript.</li>
<li>The <a href="http://www.google.com/google-d-s/scripts/allservices.html">documentation</a> is clear.</li>
<li>It&rsquo;s ridiculously easy to write a small script and then try it out and continuously refine it by running it in a spreadsheet.</li>
<li>Spreadsheets are a great hub to pull together data from disparate sources and slice-and-dice it.</li>
</ul><p>The key is the <a href="http://www.google.com/google-d-s/scripts/class_urlfetchapp.html">UrlFetchApp</a> module, which lets you make HTTP GET and POST calls. For example, this is how you would call out to the <a href="http://code.google.com/p/bitly-api/wiki/ApiDocumentation#/shorten">bit.ly API</a> to shorten a URL:</p>
<pre>function shortenUrl(longUrl) {
  var response = UrlFetchApp.fetch("http://api.bit.ly/shorten?version=2.0.1"
      + "&amp;longUrl=" + longUrl + "&amp;login=&lt;YOUR BIT.LY USERNAME&gt;"
      + "&amp;apiKey=&lt;YOUR BIT.LY API KEY&gt;&amp;format=xml");
  var parsedXml = Xml.parse(response.getContentText());
  var shortUrl = parsedXml.getElement().getElement("results")
      .getElement("nodeKeyVal").getElement("shortUrl").getText();
  return shortUrl;
}
</pre>
<p>Substitute your own bit.ly username and <a href="http://bit.ly/account/your_api_key">API key</a> in there.</p>
<p>You can now use &ldquo;shortenUrl&rdquo; like any other function in a spreadsheet formula:</p>
<p><figure data-orig-height="58" data-orig-width="289"><img src="https://64.media.tumblr.com/1af4b8b9bfe41c38588fccf28c87f88a/3a43928a19bb4389-41/s540x810/dc032437f7af134223ee7177a17e4d4fecae0268.jpg" data-orig-height="58" data-orig-width="289"/></figure></p>
<p>Press &ldquo;Enter&rdquo;, and you get the shortened URL:</p>
<p><figure data-orig-height="60" data-orig-width="289"><img src="https://64.media.tumblr.com/35d095e420137fad5a151dcc39252c0f/3a43928a19bb4389-c6/s540x810/7ec5bdd4a4c255688461826c2fffde871882d17e.jpg" data-orig-height="60" data-orig-width="289"/></figure></p>
<p>Here&rsquo;s another example. This code snippet will tweet its argument. It shows how to issue an HTTP POST. Note the advanced arguments to the fetch method.</p>
<pre>function tweet(status) {
  var advancedArgs = {
      method: "post",
      payload: "status=" + status,
      headers: {"Authorization": "Basic &lt;base64 encoding of your username:passwd"}};
  var response = UrlFetchApp.fetch(
      "http://api.twitter.com/1/statuses/update.xml", advancedArgs);
  var parsedXml = Xml.parse(response.getContentText());
  var createdAt = parsedXml.getElement()
      .getElement("created_at").getText();
  return createdAt;
}
</pre>
<p>With these two functions, you could use a Google spreadsheet as your Twitter client.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Connecting my blog to Buzz</title>
      <link>http://vivekhaldar.com/articles/connecting-my-blog-to-buzz/</link>
      <pubDate>Mon, 01 Mar 2010 00:00:00 +0000</pubDate>
      
      <guid>http://vivekhaldar.com/articles/connecting-my-blog-to-buzz/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been following &lt;a href=&#34;http://www.google.com/buzz/bradfitz/PPjHXDhANAC/Want-to-connect-your-blog-or-some-other-feed-to&#34;&gt;Brad Fitzpatrick&amp;rsquo;s instructions to hook up my blog to update my Buzz&lt;/a&gt;. This post is partly to test that.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I&rsquo;ve been following <a href="http://www.google.com/buzz/bradfitz/PPjHXDhANAC/Want-to-connect-your-blog-or-some-other-feed-to">Brad Fitzpatrick&rsquo;s instructions to hook up my blog to update my Buzz</a>. This post is partly to test that.</p>
]]></content:encoded>
    </item>
    
  </channel>
</rss>
