<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://lindsaar.net/feed.xml" rel="self" type="application/atom+xml" /><link href="https://lindsaar.net/" rel="alternate" type="text/html" /><updated>2026-06-08T01:44:42+00:00</updated><id>https://lindsaar.net/feed.xml</id><title type="html">Mikel Lindsaar</title><subtitle>The musings of Mikel Lindsaar
</subtitle><author><name>Mikel Lindsaar</name></author><entry><title type="html">You feed your agent that!?</title><link href="https://lindsaar.net/posts/2026-02-19-you-feed-your-agent-that" rel="alternate" type="text/html" title="You feed your agent that!?" /><published>2026-02-19T00:00:00+00:00</published><updated>2026-02-19T00:00:00+00:00</updated><id>https://lindsaar.net/posts/you-feed-your-agent-that</id><content type="html" xml:base="https://lindsaar.net/posts/2026-02-19-you-feed-your-agent-that"><![CDATA[<p>Here’s a question worth asking: what is your AI agent actually reading when it fetches a web page?</p>

<p>Not the content you care about. The content. All of it. The nav bar. The cookie banner. The JavaScript that populates the dropdown menus. The ads. The footer links. The analytics scripts. The tracking pixels. Every byte of HTML markup wrapping the 800 words of actual information you needed.</p>

<p>A typical documentation page, fetched raw, costs your agent somewhere between 12,000 and 20,000 tokens. The useful information inside it is usually 800 to 1,500 tokens. The rest is noise, and your LLM is billing you to read every character of it.</p>

<p>I ran the numbers. Across the agents I’ve been building, raw HTML fetch is burning between 57% and 92% of tokens on content that contributes nothing to the output. That’s not a rounding error. That’s the majority of your API bill going to pay for nav bars.</p>

<hr />

<h2 id="what-the-garbage-actually-looks-like">What the garbage actually looks like</h2>

<p>To be concrete about it, here’s what a fetch to the Python docs looks like without any processing:</p>

<ul>
  <li>Raw HTML response: approximately 18,400 tokens</li>
  <li>Useful content (the actual documentation): approximately 1,200 tokens</li>
  <li>Token waste: 93%</li>
</ul>

<p>That 18,400-token call to Claude 3.5 Sonnet costs roughly $0.055. The same call through a proxy that strips the HTML and returns clean markdown costs around $0.004. If your agent is fetching 100 pages per day, that’s the difference between a $5.50/day bill and a $0.40/day bill. At scale, this is not a small number.</p>

<p>The reason this happens is straightforward. HTML was designed for browsers, not language models. Browsers ignore the markup and render the content. LLMs read everything, tokenize everything, and charge you for everything. Your agent is essentially paying to read assembly code when it could be reading a book.</p>

<hr />

<h2 id="the-fix-is-one-line-of-curl">The fix is one line of curl</h2>

<p>The solution is to route fetches through a proxy that converts HTML to markdown before the content hits your LLM. That proxy is <a href="https://distil.net">Distil, Inc.</a>.</p>

<p>Here’s what that looks like:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl <span class="nt">-H</span> <span class="s2">"X-Distil-Key: YOUR_KEY"</span> <span class="se">\</span>
 https://proxy.distil.net/https://docs.python.org/3/library/json.html
</code></pre></div></div>

<p>You get back clean markdown. Headings, code blocks, paragraphs. No scripts, no nav, no cookie banners. The same documentation content, ready for an LLM to actually use, at a fraction of the token count.</p>

<p>The response includes an <code class="language-plaintext highlighter-rouge">X-Distil-Savings</code> header that tells you exactly how many tokens were saved on that call. First time I saw it on a real fetch I thought it was miscalculated. It wasn’t.</p>

<hr />

<h2 id="the-part-thats-actually-interesting-shared-cache">The part that’s actually interesting: shared cache</h2>

<p>Here’s where it gets worth thinking about.</p>

<p>Distil maintains a shared cache across all agents using the service. When any agent fetches a URL, the converted markdown is cached and available to every other agent. Not cached per-account; cached across the network.</p>

<p>This matters because AI agents, at the aggregate level, are reading a lot of the same content. The Python docs. The OpenAI API reference. The GitHub README for every major library. When one agent converts that content, every subsequent agent gets it in under 50ms, preconverted, at no additional processing cost.</p>

<p>The distil dashboard publishes network-wide stats in real time, including cache hit rate, pages fetched, and total tokens saved across all agents.</p>

<p>This is the thing you cannot build for yourself. You could run your own HTML-to-markdown converter, and several exist. But your private cache only benefits your agents. The shared cache means every agent on the network is, collectively, doing the pre-processing work for everyone else. The more agents use it, the higher the hit rate, the cheaper and faster it gets for everyone.</p>

<hr />

<h2 id="mcp-drop-it-into-claude-desktop-or-cursor-in-30-seconds">MCP: drop it into Claude Desktop or Cursor in 30 seconds</h2>

<p>If you’re using Claude Desktop, Cursor, Windsurf, or any MCP-compatible tool, there’s a first-party MCP server:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>https://proxy.distil.net/mcp
</code></pre></div></div>

<p>Use it as a remote MCP endpoint with a bearer token (<code class="language-plaintext highlighter-rouge">dk_...</code>). You get tools including <code class="language-plaintext highlighter-rouge">fetch</code>, <code class="language-plaintext highlighter-rouge">search</code>, <code class="language-plaintext highlighter-rouge">screenshot</code>, <code class="language-plaintext highlighter-rouge">render</code>, <code class="language-plaintext highlighter-rouge">raw</code>, and <code class="language-plaintext highlighter-rouge">nocache</code>. Every web fetch goes through the proxy automatically. No code changes.</p>

<p>No npm wrapper is required.</p>

<hr />

<h2 id="compared-to-the-obvious-alternatives">Compared to the obvious alternatives</h2>

<p>Jina Reader does something similar, and they’ve been doing it since April 2024. If you know about them, you’re probably wondering what the difference is.</p>

<p>A few things:</p>

<p>First, the shared cache. Jina caches per-user. Distil caches across the network. For AI agents reading common documentation, the hit rates are materially different.</p>

<p>Second, the MCP server. Jina has API endpoints; Distil has a first-party remote MCP endpoint at <code class="language-plaintext highlighter-rouge">https://proxy.distil.net/mcp</code>. For Claude Desktop users, that’s a real UX difference.</p>

<p>Third, proxy mode. You can set <code class="language-plaintext highlighter-rouge">HTTPS_PROXY</code> to point at distil, and every HTTP call in your agent framework routes through it without any code changes. I’m not aware of another service in this space that offers that.</p>

<p>Fourth, fallback behavior. If distil can’t deliver markdown, it can return raw HTML passthrough rather than an error. Your agent keeps working; it just pays more for that call. No dropped requests.</p>

<hr />

<h2 id="whats-available-today">What’s available today</h2>

<ul>
  <li>HTTP proxy: works with curl, any HTTP client, any framework</li>
  <li>Converts HTML, PDFs, SPAs, and screenshots to markdown</li>
  <li>Web search that returns markdown results instead of raw HTML</li>
  <li>Site change monitoring with markdown fetch on update</li>
  <li>MCP server: <code class="language-plaintext highlighter-rouge">https://proxy.distil.net/mcp</code> (Claude Desktop, Cursor, Windsurf, anything MCP-compatible)</li>
  <li>OpenClaw skill: <code class="language-plaintext highlighter-rouge">npx clawhub@latest install distil</code></li>
  <li>ROI calculator at <a href="https://distil.net/#roi">distil.net</a> so you can estimate your own savings before committing to anything</li>
</ul>

<hr />

<h2 id="pricing">Pricing</h2>

<p>50 free credits per month to start. Add a card to unlock Hobby (100 credits/month + screenshots), then scale with paid plans and top-ups as needed.</p>

<p>The first thing I’d suggest: sign up, make one fetch through the proxy, and look at the <code class="language-plaintext highlighter-rouge">X-Distil-Savings</code> header. That number will either be interesting to you or it won’t. If your agents are reading the web at any scale, it will be interesting.</p>

<hr />

<h2 id="try-it">Try it</h2>

<p><a href="https://distil.net/signup">https://distil.net/signup</a></p>

<p>No pressure. 50 free credits, no card, one curl command to see if the numbers make sense for your use case. If they do, great. If not, you’ve spent five minutes and learned something about where your token budget is actually going.</p>]]></content><author><name>Mikel Lindsaar</name></author><summary type="html"><![CDATA[Here’s a question worth asking: what is your AI agent actually reading when it fetches a web page?]]></summary></entry><entry><title type="html">Intellectual Purée</title><link href="https://lindsaar.net/posts/2025-07-19-intellectual-puree" rel="alternate" type="text/html" title="Intellectual Purée" /><published>2025-07-19T00:00:00+00:00</published><updated>2025-07-19T00:00:00+00:00</updated><id>https://lindsaar.net/posts/intellectual-puree</id><content type="html" xml:base="https://lindsaar.net/posts/2025-07-19-intellectual-puree"><![CDATA[<p>I’ve started writing again.</p>

<p>This is the first. The goal is to write one considered piece each week and publish it here.</p>

<p>The topics will vary, the style may change, but the purpose won’t.</p>

<p>Purpose?</p>

<p>Such a powerful word. But in this case, maybe not so.</p>

<p>I don’t want to lose my ability to critically think, form words and communicate them.</p>

<p>In this modern world of AI we are moving away from having to think. “Explain it like I’m 5” is spoon feeding our minds with intellectual purée. A carefully blended mix of concepts warmed to the perfect temperature to not burn on the way down.</p>

<p>Unfortunately it also usually ends up all over the bowl, table, bib and floor as we don’t go deep enough to find a true understanding and instead skim the surface enjoying our mental endorphins.</p>

<p>I’m loving the utility of AI, I use it almost every day, and I know it will (has?) already changed the world.</p>

<p>But humans do. We learn through action. We hone our skills through hard fought repetition.</p>

<p>And as much as I live the Matrix movies, we can’t call Tank to download how to fly a helicopter.</p>

<p>So I am writing. I’ll explore some ideas I have, I’ll share some thoughts and see where this takes me. It might be fun, but it will be educational, especially for me.</p>

<p>Because I like steak.</p>]]></content><author><name>Mikel Lindsaar</name></author><summary type="html"><![CDATA[I’ve started writing again.]]></summary></entry><entry><title type="html">The Axioms of Software Development</title><link href="https://lindsaar.net/posts/2021-03-06-The-Axioms-of-Software-Development" rel="alternate" type="text/html" title="The Axioms of Software Development" /><published>2021-03-06T00:00:00+00:00</published><updated>2021-03-06T00:00:00+00:00</updated><id>https://lindsaar.net/posts/The-Axioms-of-Software-Development</id><content type="html" xml:base="https://lindsaar.net/posts/2021-03-06-The-Axioms-of-Software-Development"><![CDATA[<p>Even though we have been developing software as an industry for the last 50 or so years, it still seems difficult to predict the outcome of a software project. That was obvious to me as I built my software company.</p>

<p>But I have more than two and a half decade’s experience in both writing software and also managing software projects and teams of developers. I have <a href="https://rubygems.org/gems/mail">authored open-source software</a> that’s been downloaded a few hundred million times. Surly by now I should be able to accurately predict a project?</p>

<p>Truth be told, I’m pretty good at it now, but I had to learn it the hard way, with lots of mistakes.</p>

<p>So how do you learn how to co-ordinate clients, developers, investors with time and resources, and ensure your project will be successful and provide a suitable return on investment?</p>

<p>And how I could I teach what I had learned, expensively?</p>

<p>The first step was realising that there are axioms in software development which seem largely unknown and the failure to know them meant we kept making the same mistakes.</p>

<p>Axioms are statements that are accepted to be true. They serve as a premise or starting point for further reasoning and arguments. The word comes from the Greek axíōma ‘that which is thought worthy or fit’ or ‘that which commends itself as evident.’</p>

<p>From my perspective, axioms are laws that you can’t really break if you want to stay sane and survive in this environment. Knowing them can ensure you adequately plan and set yourself up for success.</p>

<p>Second step was the realisation that software developers are not the builders of software, they are the architects. I wrote another article about this: What does a software developer do?</p>

<p>Properly understanding the role of a developer gave a solid foundation upon which I could begin to codify the axioms of software development. Understanding these will really help you to control development projects:</p>

<p>The axioms are:</p>

<ol>
  <li>Desired features will ALWAYS exceed available budget</li>
  <li>Communication is king</li>
  <li>Always consider the return</li>
  <li>Design - Validate - Build</li>
  <li>Be ready to go live</li>
  <li>Ownership &amp; Accountability</li>
  <li>Prefer Stability Over Features</li>
  <li>Stick to your knitting</li>
  <li>Test adequately</li>
  <li>Automation builds productivity</li>
  <li>Maintenance is cheap</li>
</ol>

<p>I originally thought there was 10, but I was wrong and caught by one of the two hardest things in computing; naming things, cache optimisation, and off by one errors.</p>

<p>So let’s get into this with the Axiom 1.</p>

<h2 id="1-desired-features-will-always-exceed-available-budget">1. Desired features will ALWAYS exceed available budget.</h2>

<p>Anyone that has worked in software development will have experienced this. It doesn’t matter what your budget is. The features you want will always exceed your budget and quite often the available time you have. If anyone doubts this, then go have a look at what the annual expense is for software developers/development at Facebook, LinkedIn or UBER or any large software company.</p>

<p>It doesn’t matter how big you go or how many features you develop, you will always have more features to build than your budget allows. This is a critical thing to understand. Because if you don’t get this, you will often be implementing the wrong thing.</p>

<p>That means, for a product owner, is you will not get every feature you want in the application.</p>

<p>You see, software attempts to mirror the real world in some manner. For example, an on-line store is an attempt to mirror a physical store. In a physical store, you are always rearranging your stock and displays, putting a new sign up or re-decorating. You’re changing your marketing, your staff and a myriad of other items. It’s a constantly changing scene.</p>

<p>The only things that stay the same in this world are things that are dying. If you are not constantly improving then you are dying. There is no third option. There is no such thing as ‘staying the same’. If you stay the same, the world around you is changing and improving. So, in effect, you are going backwards in relation to the world around you. Improving and changing gradually over time can give the appearance of something staying the same, but it is also improving.</p>

<p>Software will always be in this constant state of change as it mimics the physical world.</p>

<p>I sell software development as a service to clients. I also have three or four software applications which I maintain with my staff and I have full-time developers on those applications. I spend a considerable amount of money to keep them updated and relevant. I just keep finding more features to add and our users keep requesting new features.</p>

<p>So, how do we use this axiom of desired features ALWAYS exceeding available budget?</p>

<p>We use this to focus the project and to keep it on-track. The key thing is making a list of the critical features needed for your application? What is critical to make this a successful project?</p>

<p>I’m not necessarily talking about a minimum viable product here. A minimum viable product for many projects can be a sketch on a piece of paper that you can show to someone and say, ‘Hey, if I built this will you buy it?’ That could be a minimum viable product. A sign-up form could even be a minimum viable product.</p>

<h3 id="decide-on-features">Decide on features</h3>

<p>What I am talking about is deciding on the features to develop and deliver with the software to make it a success? Success could be getting more sign-ups. It could be getting the business off the ground. It could be any factor that determines success for the business.</p>

<p>But you need to be very critical when setting out the critical feature list. It needs thorough evaluation.</p>

<p>For example, client to developer:</p>

<p><strong>Client:</strong> Okay, so there’s this feature where if I click on this line-item, it should pop up a window and allow me to edit it. Okay, so that’s a feature, I should be able to edit the line-item.</p>

<p><strong>Developer:</strong> But do you really need it to pop-up? Yes, or no?</p>

<p><strong>Client:</strong> Well, no. It would be nice if it popped up.</p>

<p><strong>Developer:</strong> But is the pop up a critical feature?</p>

<p><strong>Client:</strong> No, it’s not. Maybe it’s easier if we just click on the line-item, the page changes and I just edit that form and click save and it goes back to the original page.</p>

<p><strong>Developer:</strong> What we are going to do is make this “click, edit a form and then go back to the original page” so that it works as a feature. And, if there’s more money and more time at the end of the project that we have time for we will turn that into a pop-up form for you. We can easily do that once we have the other critical features developed.</p>

<p>You might consider this is not the best possible design, and it doesn’t feel like Facebook or LinkedIn. (Yes, that’s because Facebook and LinkedIn spend untold millions on software development.)</p>

<p>You might say that example is a bit of an overkill, developing a pop-up only takes about 3-4 hours.</p>

<h3 id="blowing-out-project-time-and-costs">Blowing out project time and costs</h3>

<p>Sure it only takes 3-4 hours to develop a pop-up, but when you add 2-3 hours twenty times you’ve added 3-4 weeks of development to the project.</p>

<p>That’s the sort of thing that derails any attempt to set proper project estimates and stick to them.</p>

<p>In any estimate a developer looks at the problem from a broad view based on earlier projects they have done and come up with some reasonably accurate guesses on how long it will take to implement the given feature set. They will see ‘be able to edit line-item’ and they can work out it will be about half a day’s work.</p>

<p>But then the developer could be met with the following additional needs:</p>

<ul>
  <li>It turns out that it needs to be a modal, so then it needs to be a pop-up form on the page. What if the form is larger than one screen? Now we need a pop-up form that scrolls.</li>
  <li>What if it’s too wide? Well, then it needs to be different widths.</li>
  <li>What if I’m viewing on mobile? Well, now the modal needs to be mobile responsive. So, I’d better fix that.</li>
  <li>Oh, but what if they are viewing in Internet Explorer, not Chrome and it doesn’t necessarily support grids at this time. Now we have to create custom CSS.</li>
</ul>

<p>And on it goes. Suddenly that “simple” modal project went from taking three hours to three days.</p>

<p>These are the sort of things that you encounter as problems.</p>

<p>The most important aspect of the project manager’s job is to whittle down that critical features list to be as bare bones and simple as possible. You can always add features later. There is no limit to when you can add more features.</p>

<p>But you have got to get the thing launched. You have to get it live and you have to get it earning you money.</p>

<p>So this is one of the things we go over with our clients at the start of a project. And it’s the number one thing we look out for.</p>

<h3 id="features-budget-quality">Features, Budget, Quality</h3>

<p>There is a triangle of features, budget and quality. The more money you have, the more of each of those you can have. But if you reduce budget, it’s going to also reduce features and/or reduce quality. So these three items are related in every software build.</p>

<p>They work hand in hand. And really, pick any two. That’s how we describe it to a client and how you can describe its relationships.</p>

<p>But any team is doomed to fail unless it can communicate effectively and efficiently, which gives us Axiom 2.</p>

<h2 id="2-communication-is-king">2. Communication is King</h2>

<p>This seems simple, but it’s true and often overlooked. Because features will always exceed available budget, you have to make sure you are communicating enough to overcome that challenge, and thus, the next axiom is “Communication is King”.</p>

<p>Too often I see software projects sending the developer off on their own to build something. The developer comes back two weeks later, and the client says, “Um, that’s not what I wanted.” This shows there is a lack of communication between the developer and product owner for that two weeks.</p>

<p>You must keep communication very, very high between the stakeholders of a software application and the developer. That means lots of deployments and demonstrations while the software is being built. Lots of updates in chat rooms or screen shots of designs and progress.</p>

<h3 id="whatever-works-in-keeping-communication-as-high-as-possible">Whatever works in keeping communication as high as possible</h3>

<p>Communication is the most important thing that will derail a project. (Outside of the client expecting all the features for no money.)</p>

<p>If communication drops out, the client starts to feel ignored. They don’t have any reality of what’s going on anymore and because they don’t have any reality of what’s going on, their love of the project will start to drop. In a month or two the whole thing blows up in your face.</p>

<p>We have rules in reinteractive where our developers need to be updating the client two or three times each day on what they are doing and where they are going with the project. This usually is done as follows:</p>

<ul>
  <li>A morning text update as the developer is starting work “I plan to work on points A and B today”.</li>
  <li>A stand up call with the client (preferably with the video on) to go over any issues or blockers or to clarify things with screen sharing.</li>
  <li>A mid-day update “A is done, I’m now working on B”.</li>
  <li>An end of day update “OK, B is taking longer than expected will continue tomorrow and will get onto C as well. I’m heading off in 15 minutes if you need to ask me anything”.</li>
</ul>

<p>That level of communication keeps our client engaged and up to date. Some of you might think, “why bother with a morning update if it’s basically the same as the evening?” Well, it turns out that quite often, that overnight, after the developer has stepped away from the task and woken refreshed the next morning, a new way to tackle said problem has materialised. Also, the morning update reassures the client that we are working and active.</p>

<p>We put all of the work we are doing into stories in our task tracking system so that the client sees what’s happening. Clients are constantly reviewing and accepting the various stories through the various changes.</p>

<h3 id="working-out-key-performance-indicators">Working out Key Performance Indicators</h3>

<p>After finding this axiom on communication, it helped me resolve another problem I had, which was trying to work out the key performance indicator (or statistic) of a developer. I had spent quite some time trying to work this out.</p>

<p>When you go out to the market and ask people what the KPI of a software developer is, you get back answers like ‘hours of coding delivered’ or ‘lines of code’, or something of that nature. None of that really worked for me. Because if it’s lines of code, the way you achieve a better KPI is to just hit return on your keyboard more often and make the lines shorter. “Hours spent coding”, well that’s obviously not the right thing either because one way to increase such a KPI is to get worse at coding so it takes you longer. So, neither was right.</p>

<p>The KPI I settled on is “features delivered and accepted as done”, with no regard to how big or small the feature is. It’s just the number of times a software developer delivers an item of work that is then accepted as done by the client of that project.</p>

<p>This creates a very interesting game dynamic between the client and the developer. The developer will want that KPI to go up as high as possible.</p>

<p>When creating a sign-up form, it will be broken into 10 different stories, 10 sub-features. That’s totally fine. Because that forces the developer and the client to have a higher rate of communication. The client now has 10 features to review and accept on the various aspects of that form and it gives the client more opportunity to say, “Oh - we forgot number nine”. As opposed to ‘Oh, yeah, the sign-up form kind of looks like it works so I’ll hit accept”.</p>

<p>So, it actually increases the communication level between the client and the developer, which is something we very much want, and the client is saying “Yes this is good”, many, many more times during the development process.</p>

<p>The KPI of our developers: “number of features delivered and accepted as done by the customer of the project without regard to the size of the feature”.</p>

<p>What I mean by “without regard to size” is you might have something like, ”implement the dashboard”. The developer might say, “Well, that’s a feature worth 20 points”.</p>

<p>Don’t do that. Don’t assign a different value to different features. Just make every feature worth one point on their KPI. And if you do it that way, the developer will drive the size of the feature down, because they want more points. And that will drive the communication level up with the client who must review and accept each one. It is a great way to keep that communication high.</p>

<p>And keeping communication high is something your clients love. The feedback we receive says they feel they are always in control and know what is going on with their software build.</p>

<p>In a team that has high communication, you are then able to decide on what to build effectively, which leads us to Axiom 3.</p>

<h2 id="3-always-consider-the-return">3. Always Consider the Return</h2>

<p>This axiom is key when working out which features should you develop and in what sequence. This is closely related to the first axiom: required features will ALWAYS exceed available budget. A return can be considered a profit from an investment, be that time, money or goodwill.</p>

<p>In our earlier example, if the feature is created to allow a customer to edit the line-item, then that’s a feature that brings a return. We then have to ask what the return will be for each feature: how much better is the application if it’s a pop-up or an inline edit, thus avoiding a page reload? 50% better or only 1% better?</p>

<p>Just say it works out to only be a 10th of 1% better. Is that worth spending two days building it? The answer is obviously “no”. So, let’s move on and pick the next feature and examine the return it will bring.</p>

<p>As you do this, you’ll find you will start concentrating on the things that really matter in your application. For example, an ecommerce solution is useless without a way to checkout. It’s even more useless if you can’t see a list of products for sale and below that it’s basically worthless if you can not even display a product! So prioritising a smooth checkout flow before you have delivered viewing a product on the site would be out of sequence and detrimental to the project’s success.</p>

<p>While it is an extreme example, ending up with an ecommerce application with the world’s most intuitive, mobile friendly, super fast, high conversion checkout flow, but no way to view and add a product to a cart because you ran out of time or budget, would be a pretty useless ecommerce solution.</p>

<p>As your application becomes more and more feature complete, the incremental return on each new feature will reduce to the point where you are looking at building features that might only make the app one 10th of 1% better. But this is fine, because over time more and more people should be using the application and this 10th of 1% would represent quite a large return from an expanded user base.</p>

<h3 id="deciding-what-feature-to-develop-next">Deciding what feature to develop next</h3>

<p>In deciding which feature to develop next, you should keep this formula in mind: The Return Value (R) is equal to the Benefit Gained (B) multiplied by the Volume of Use (V) with the Cost to Implement (C) subtracted, or:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Return = (Benefit x Volume) - Cost
</code></pre></div></div>

<p>While it might be possible to plug in actual numbers and rank a feature backlog precisely, usually there is no need. Just look at your list of features and scan down them and assign each of them a Return Value (tiny, small, medium, large, huge). Then rank these by their return value and you will instantly have the key features you need to deliver first.</p>

<p>This “correct sequence” thinking in terms of return on investment is critical to how you get a project delivered on time and on budget.</p>

<p>Sometimes though, you really want this special feature. It’s going to add some pizzazz to your application, setting it apart from the competition and you are heavily invested in it.</p>

<p>Even in this case, it is still best to put it off until after all the critical features are done first. You don’t have to launch immediately once all the critical features are done. But you CAN.</p>

<p>This is an important distinction.</p>

<p>Being in a situation where your app is ready to launch and you are polishing it with any remaining budget of time and money is a much better space to be in than the budget running out with key features barely started.</p>

<p>Every feature of your minimum viable product must be evaluated based on its return and development must be prioritised on those features that deliver the highest return first.</p>

<p>This may seem pretty obvious but you would be surprised how often it doesn’t happen and you end up with zombie projects that are draining everyone’s will to live.</p>

<p>So once you have decided on what it is you are going to build, how do you go about building it? This is answered in the Axiom 4.</p>

<h2 id="4-design---validate---build">4. Design - Validate - Build</h2>

<p>The success of your project depends on validating the plan or idea for your software application BEFORE you invest time and money into building it.</p>

<p>The last thing you want is to find that you have spent buckets of money on something that wasn’t what your users wanted anyway.</p>

<p>When building software, work toward getting some version of the idea or application in front of someone as soon as possible for feedback. Creating this quick mock-up, wireframe, sketch or ideation of what you want to build first and showing it to the end-user is an important initial step.</p>

<p>How fast you can get something in front of the end user and show them the goal of what you are building is proportionate to the potential success of the project.</p>

<p>If the end user can see the final product they will be able to give feedback earlier. Based on end-user feedback, the plans can be easily and quickly altered at the design stage and for a much lower cost.</p>

<p>If you are waiting to get feedback after tens of thousands of dollars of development, you are likely going to end up spending a lot more money because to change anything, first the developer has to undo what they have already built before they can start to do what you want.</p>

<p>Changes cost less the earlier they are made. This is a fundamental truth of design and development.</p>

<p>So Design - Validate - Build is the right sequence, and it is a continuing sequence of constant iteration. The stronger the development team, the faster you can tighten this loop. If you currently only do one of these every month or so, one of your top priorities as a manager should be getting this loop tighter and tighter until it is really flying at a high whirl.</p>

<p>Now that you have your design, and you have validated it, you are now ready to build it, but how long do you wait until you release it to the world? This is answered in Axiom 5.</p>

<h2 id="5-be-ready-to-go-live">5. Be ready to go live</h2>

<p>In the first four axioms, I covered principles that outline how to approach software development. Now it’s time to get dirty and start coding.</p>

<p>Where do you start and what gets first priority for your development hours?</p>

<p>I decide what gets done first by looking at it this way: In the first 2 or 3 weeks of a project, it should be possible for me to push the application live at pretty much any moment.</p>

<p>That’s right, after a few weeks, be in a state where you can deploy the code to the internet and let users have at it, so both you and they gain some benefit from the software you are developing.</p>

<p>Does that mean the system is DONE in 2-3 weeks? No. But it should have enough features to be live—not necessarily to DO anything useful—but perhaps it has something in place allowing the users of the system to sign in and play with it.</p>

<p>The goal is to start the process of constantly delivering a product, thus allowing the people paying the development bills to “call it” at any time and go live with what they have.</p>

<p>This goes right back to the first axiom – features required will always exceed available budget.</p>

<p>This is why you need to build critical features first.</p>

<p>The goal when you start any software project should be simply: “How fast can we get this thing live?” Even if it doesn’t have enough features to make it really worthwhile, you should have enough features to enable the basic use case to go live as soon as possible.</p>

<p>You need to achieve that as fast as you can.</p>

<p>Because the truth is, your budget could run out at any point, and you don’t want to be left with an application that doesn’t do anything because there are a lot of half-done features with nothing really talking to anything else. You get more benefit from focusing on one key aspect and getting it functioning than you do trying to do everything at once.</p>

<h3 id="benefits">Benefits</h3>

<p>For instance, my company (<a href="https://reinteractive.com/">reinteractive</a>) built a wonderful site for the State Library New South Wales. We deployed an online platform allowing crowd sourced audio transcriptions of historic audio recordings and <a href="https://reinteractive.com/case-study/state-library-nsw">published a case study</a> on the process. Their budget was tight. We had only a few weeks to create a transcription platform, load recordings into it and make sure users could contribute.</p>

<p>Four weeks to accomplish something of this magnitude is practically unheard of. But the State Library had chosen the New York Public Library’s Transcript Editor platform as the model. It was an existing open-source project we could fork on GitHub. We figured that an MVP was possible, and we threw one of our best developers at it. Four weeks later, he got the platform live.</p>

<p>And by ‘live’ I mean it was accessible on the internet by users. It was by no means perfect. The first release had the audio recordings practically ‘hard coded’ into the platform — there was no ability for the library staff to add new recordings. But volunteer transcribers could contribute to the historical archives and the first few hundred transcriptions were able to be digitally corrected.</p>

<p>The site was live, and it was in the hands of the users. And it was LOVED! The application in its initial form won an innovation award and based on the initial success, the project gained further financial backing.</p>

<p>In the years since the project launched, we expanded on it and have created new features like the ability of the staff to add recordings to the library without needing a developer. It was a fundamental desired feature but was not required to launch the platform and thus was initially omitted. We have improved the look and feel of the site and the functionality for crowd sourced transcriptions.</p>

<p>But and it needs to be said again, without that initial release on that initial (very limited) budget, the project would never have won the innovation awards it did, nor is it likely to have been considered for further funding of features.</p>

<p>This is a very good example of the benefits of being ready to go live rapidly.</p>

<p>Being ready to go live as soon as possible forces things to get done in a more efficient manner and is a crucial axiom to successful software development.</p>

<p>Getting your project live and in-front of users also helps you demonstrate to your end users and stakeholders that the project is viable. It helps your project gain momentum or keep momentum and interest, so the project does in-fact get completed.</p>

<p>After commencing development, the speed of getting your application ready to go live is directly proportional to the success of the endeavour.</p>

<p>But how do you make sure that the features you develop actually work as intended? This s a key point to ensure you have under control and so our Axiom 6.</p>

<h2 id="6-ownership--accountability">6. Ownership &amp; Accountability</h2>

<p>Any software project can bog down if the person writing the software is not accountable for the functionality of that software in production.</p>

<p>This is a key factor in getting projects delivered in a timely and economic manner.</p>

<p>It is not in your best interests to have one person write the code and then throw it over the fence to a quality team to see if it works and then over to the operations team who then work out how to get it live. Each step will just report back bugs and incompatibilities and then eventually the first developer gets it back to fix and so on. It’s a highly inefficient use of time for both teams.</p>

<p>The main reason it is inefficient is because of context switching. The developer who wrote it has moved onto the next bug or feature and by the time something comes back, a week or two later, has largely forgotten about all the small little things that had to be taken into consideration to make that feature work.</p>

<p>Tests and documentation can mitigate this, but they are never perfect.</p>

<p>The project flow and assignment of responsibilities by project managers and product owners needs to include that the person writing the code is responsible for running that code in a development or production environment as a fully integrated part of the whole system.</p>

<p>It becomes easier to visualise when we relate this view back to the analogy of building a house in my earlier blog where I outlined the role of a Software Developer. It was there, we realised the software developer role is better associated as the architect and the computer is the builder.</p>

<p>The architect is responsible for all actions to ensure any unforeseen complications are integrated into the project and that the original intended design is achieved. This is not left to the builder or any other parties. The architect is a skilled individual who is experienced at most levels of construction and coordinates the efforts to ensure the original vision becomes a final product that works as an integrated whole.</p>

<p>You want the software developer to own the code they have written, all the way into production.</p>

<p>This creates a huge increase in efficiency.</p>

<p>You are not having to describe things and go back and forth with others.</p>

<p>You are empowering that one developer to take it all the way through to a done and carry that feature all the way through the line.</p>

<p>It also is a great benefit for the developer.</p>

<p>They feel trusted. They feel empowered to fix things. They will originate more if they see something that isn’t right and it just treats everyone in a better state.</p>

<p>The responsibility for the functionality of written software is a pillar of effective software development and, done well, enables faster and more economical development of required features.</p>

<p>With this axiom in place, your speed of delivery will increase, but you have to be careful not to jump on the feature gravy train and just keep pumping out those sweet, sweet features, it’s important to not let your technical debt get out of hand which is why we need Axiom 7.</p>

<h2 id="7-prefer-stability-over-features">7. Prefer Stability Over Features</h2>

<p>The theme here is that you need an application that performs the core features well, not an application that does a multitude of functions in a really buggy way.</p>

<p>Nothing will turn off end-users more than an application that can’t do what it says it can.</p>

<p>This comes back to that first axiom – desired features will always exceed available budget.</p>

<p>So, you really want to identify: what are the key aspects of this app that absolutely need to work? This is sort of a Minimum Viable Product. And then focus on the points that make up that MVP. Really it comes to the desired features exceeding budget idea and getting those critical items out first.</p>

<p>But it also comes into play when you launch. Just because you’ve built a feature doesn’t make it stable and usable, and it doesn’t mean it will perform under load.</p>

<p>You need to build in some time to go and do some bug fixing because it doesn’t matter how well you develop, you will always find some bugs in any software application, it’s just inevitable.</p>

<p>In many cases, bugs are just unimplemented features.</p>

<p>An example I ran into of this was relating to recording a value over set periods, and changing the frequency of the report.</p>

<p>When first building it out - you enter a value every Friday and the application takes that value and saves it. On a weekly basis you could look at a graph and you would see the average value increase or decrease week-on-week. It would look correct.</p>

<p>But, then you realise there is a benefit to viewing this information with monthly totals. So, you filter the values and take the sum of values recorded in April as one data point and the values from June as the next data point and so on. But wait, every second month, it seems like there is five times the average weekly value instead of four times. You realise that it doesn’t look right because in April there was less activity, but the value is higher.</p>

<p>You ask the developer why this anomaly, and they say “Oh, that’s because we are only recording the value every week and in April, there are five Fridays but in February there are only four. And the extra Friday that is in April is just the first day in April, so all the values of the other 6 days that make up that week are being counted in April, when they really belong in March.”</p>

<p>Immediately you think – that’s a BUG! This is unusable. We must fix it! It is stupid.</p>

<p>Actually, no, it isn’t a bug, it is just an unimplemented feature. The unimplemented feature is when you are entering a weekly value, if that week spans two months, the system needs to be smart enough to recognise that and ask the user if they want to split the value over two months.</p>

<p>This is where you might start to look at bugs and features in a new light.</p>

<p>Sometimes there are genuine bugs, the system is simply doing the wrong thing.</p>

<p>Usually it is because the feature has not been developed enough to handle the edge cases of the real world. Software is generally an attempt to replicate the real world and the real world is not black and white. There are lots of grey areas in the real world.</p>

<p>So, software has to have ways to handle that. A computer can’t intelligently figure it out on its own, because a computer is not intelligent. All computers get any apparent intelligence from their Human creators.</p>

<p>So, it is ideal to prefer stability over features wherever possible.</p>

<p>This isn’t to say that everything should be perfect before exposing customers to your platform. There is definite value in the idea that: “We need to get something running so that we can get some traction.” But, just be aware if you do a push to rapidly get some features out, you need to include in your plan going back to pay down that stability or technical debt on the project and make the features more stable.</p>

<p>On my own software-as-a-service projects, I regularly tell my developers that I need them to spend three days fixing whatever they know needs fixing. Go to the bug tracker and close off some bugs, do some re-factoring for performance or stability.</p>

<p>If your developer knows their stuff they will know the bottle-necks in the system that need the architecture tweaked a little, or code that can be cleaned up to be more efficient and stable. I tell them to go for it.</p>

<p>Every bug to a developer is also a stability issue and something that they don’t like and want to fix.</p>

<p>But sometimes you and your development team see a bug, or a piece of dependent software that just NEEDS to be fixed, this can then cause you to run down all sorts of rabit holes and loose focus on what is important, delivering your product, and so we have Axiom 8.</p>

<h2 id="8-stick-to-your-knitting">8. Stick to Your Knitting</h2>

<p>“Stick to your knitting”, is an idiom. It loosely means; Do what you’re good at and what you know. Don’t dive into fields that aren’t your expertise.</p>

<p>For example, If you are building an eCommerce solution, don’t try and build an entire payment provider hooking into the credit card network as part of your eCommerce solution. It just doesn’t make sense to try and handle this complexity. Not at least until you are doing billions of dollars in transactions! Just stick to building what is special to you and what you need to go live.</p>

<p>This can also happen at the smaller scale. Need some marketing automation? Well, hook it into a marketing automation solution and use the tools provided there, don’t try and build it yourself.</p>

<p>Out-source as much as you can to other proven software platforms. If you need to upload files into the system, use Amazon S3 or Google Cloud Storage – don’t try and build an entire file hosting service, even if file hosting is core to your business. A great example of this is Dropbox. They built their entire business on top of S3 and only started building their own solution when they had 500 peta bytes (500,000,000 gigabytes) of data being hosted.</p>

<p>These are obvious examples, but it is easy to fall into the “I’ll just build it” trap.</p>

<p>The problem with “I’ll just build it” is that you under estimate the complexity of the edge cases that exist in the problem domain. Sure, building a file server for a bunch of files might seem easy, or a simple marketing workflow email system might be ok, but as soon as you start wanting more features, the complexity grows and you are stuck now with a home built solution.</p>

<p>Bluntly, there is a reason these established companies have spent millions of dollars in developing their platforms and solutions and you don’t have the development budget to build features that duplicate their functionality.</p>

<p>Spend that money on YOUR features that make you unique.</p>

<p>Stick to building what is important for your app and use existing proven software for the added functions you need. Develop with software that allows use of external libraries so you’re not having to re-do work that someone else has already done.</p>

<p>We have found we can integrate almost any system into your app.</p>

<p>I have focused on Ruby on Rails for the past 14 years for this reason. With a couple of hundred thousand gems (code libraries) that you can use to add functionality to your application.</p>

<p>With such a widely used and supported community of support, it allows you to code only what is needed for your specific application and 95% of code to support common functions are available to rapidly implement, this is one of the reasons <a href="https://reinteractive.com/enquiries/new?code=free_download">I prefer Ruby on Rails</a>.</p>

<p>So stick to your own knitting and make sure that your core code works as intended. How do you make sure it works? Axiom 9.</p>

<h2 id="9-test-adequately">9. Test Adequately</h2>

<p>Arguably, the ‘best’ way to test a modern web application would be to have a person sit down in front of a computer with a list of features that the web application should be able to do, and to click around the application and try to complete the tasks required while using each of those features, while inspecting the result to see that it was done correctly.</p>

<p>However, as the number of features rise, this rapidly becomes impractical. For a tiny application, someone might be able to test all the features in a day or so of work, but any large application would take months (or years!) to click or type through every feature.</p>

<p>This would also be extremely tedious, repetitive, boring, high precision work as the vast majority of the time everything would just work correctly, and humans are really not very good at tedious, repetitive, boring, high precision work.</p>

<p>Computers, however, are really good at tedious, repetitive, boring, high precision work. A modern computer will calculate 2+2 and make sure it equals 4 probably a billion times a second if you asked it to. It would do this without complaint. If 2+2 didn’t equal 4 for some reason one time out of that billion, it would tell you that it happened without fail.</p>

<p>So, in order to test a web application, we build a second piece of software (called a ‘test’ or a ‘specification’) which confirms the feature they just wrote works as intended. This is quite often achieved by simulating a user clicking and typing around on the website, inspecting the results shown on the screen and checking what is saved in the database.</p>

<p>As you can imagine, with thousands of features, you would need to (and do) write thousands of tests. But for every single feature, there may be one or fifty ways to use that feature. Should we write tests for just one method? Ten of the methods? Or all fifty?</p>

<p>Obviously writing more tests results in more stable code. But there are other drawbacks, not the least of which is the expense of paying someone to write them!</p>

<p>So this then raises our next question…</p>

<h3 id="what-is-the-goal-of-testing">What is the Goal of Testing?</h3>

<p>Software will have bugs as it’s being created. This is a known fact. The amount of money spent to make bug free software for critical systems like aircraft or spacecraft or medical equipment, is not a viable option for your average web application.</p>

<p>To make a web application to be near 100% bug free at all times would inflate the price perhaps thousands of times over. At that point, you wouldn’t be able to afford to build it.</p>

<p>This is especially true when you realise that what one person might be calling a software bug can sometimes be described by another as an unimplemented feature or even an actual bona fide feature!</p>

<p>You can complicate this further by considering all the bugs that could possibly arise due to the end user operating system being out of date, or browser errors, or their internet connection being flakey, or if a third party API your application depends on fails, or even bugs arising from your software being so popular that it runs into scaling issues.</p>

<p>So ‘bug free’ can not be the goal. At least not in the real world.</p>

<p>Therefore, if ‘bug free’ is not the goal, what should the goal be?</p>

<p>This is hard to quantify. I have always promoted the idea that we should strive to make sure the common paths travelled by the end user through the application are as bug free as practically possible.</p>

<p>If there is a bug that arises sporadically in 1 in about 100 requests, this might be able to be lived with if that feature is only used once per month by each user. Most users would then never even encounter the bug.</p>

<p>So this gives us the idea of “testing adequately”. You want to test for what we call “the happy path”. If everything is going right, this is what the software system should do. You don’t want to test every individual line item of the code, that would be ridiculous, and no one has the money to do that.</p>

<p>Adequate tests allow developers to look forward, not back when they build out new features for your application. Any incompatibility between old and new features is immediately visible and the exact incompatibility can be rapidly pinpointed by either fixing the test to include the new functionality, or fixing the new functionality to make the existing test pass.
What to Test?</p>

<p>Modern software developers do not write every line of code in the software they develop. They use frameworks like Ruby on Rails with tens or hundreds of software libraries (gems) they call on to perform specific functions. This speeds development. It means a developer only has to write the code to achieve your individual needs. Pre-existing libraries can handle routine functions like user authentication, reading and writing from databases, correctly forming emails or integrating with payment providers.</p>

<p>So this gives you the first clue on what to test, and that is “test the code you write”. If a developer includes a whole software library that correctly formats an email, then they should not be writing tests to make sure the email was formatted correctly. What they should test is the contents of the email, that it is being sent to the correct person, that the subject is correct and so on.</p>

<p>OK, now you know that you only write tests for the code you write, we are faced with the problem of WHICH code deserves a test?</p>

<p>Testing every piece and possible combination of the code would be impractical if not impossible. We need to select the best code to test.</p>

<p>I recommend breaking this down into two broad categories.</p>

<p>First, test any complex algorithms or calculations with valid and invalid inputs checking their outputs. If you wrote a complex set of code around calculating the correct taxes and tariffs, then multiple combinations of this (including negative values) would be very smart to test thoroughly. These tests are cheap to write and run both from a computational and developer time expenditure and so you should be thorough.</p>

<p>For the more complex features, like API integrations to external providers, or the usability of the site (clicking around and doing things) it is best to first test what we call the “Happy Path.” This is the path that most users are going to take if nothing strange is going on. With the Happy Path and complex calculations tested, you give your developers (and any other developer who might encounter the code-base in the future) great confidence they are not creating new problems when adding new features.</p>

<h3 id="when-website-requirements-evolve">When Website Requirements Evolve</h3>

<p>Let’s say we write a piece of software that dictates: before a user can sign up to this service, we have to check that they live within a specific area.</p>

<p>And later, you implement a change in the system that allows people from another area to sign up. So, with the revised condition, your developer implements the change allowing people from a second area to sign up. In the intervening months/years since the initial requirement, you have taken on a new developer who wasn’t around when the original code was written. He might not be aware that there was a requirement that sign-ups be only allowed in certain areas.</p>

<p>The new developer thinks that this isn’t a problem and goes ahead and tries to implement the new feature. Once the new requirements are implemented, if there was a test written around the original requirement, the system will return an error saying: “warning, this new requirement violates the previous requirement”.</p>

<p>At that point the developer can go “Oh, I know why that is” and can go and fix it, or they can come back to you as a stakeholder and say, “hang on a sec, there is a requirement here about only allowing users from this location to sign up. Is the requirement no longer valid? Or is that earlier requirement only valid if another condition is met?”</p>

<p>You, as the software stakeholder, will be able to clarify: “The location requirement is only if they want to purchase these products. Add an additional check on the location requirement to check what product they are buying.”</p>

<p>The developer then easily adds an additional check and the matter is resolved. If you didn’t have tests, your developer likely wouldn’t know there was an incompatibility with the function he implemented. The new change would go into production and no one would know that the location requirement has been broken. You would then end up (in this fictitious example) with products going to the wrong customers.</p>

<h3 id="as-your-website-grows-complexity-grows">As your Website Grows, Complexity Grows</h3>

<p>The above example covers one requirement. But when you view modern software applications you quickly discover there are tens if not hundreds of requirements that the software must do to reach the intended result. For example, when a user clicks a critical button, it should achieve a specified result. Or, if a user loads a page, tests could confirm the correct content is loaded. Or, when a user logs into their account, they see their account information and they can achieve the purpose of their visit.</p>

<p>With the complexity of modern software, a comprehensive set of tests will ensure that any change made alerts users to any unintended effects on other parts of the code base.</p>

<h3 id="when-things-go-wrong">When Things Go Wrong</h3>

<p>The other scenario that comes up often is a user ends up doing a certain sequence of things that results in the system crashing because they have managed to get the system into an unknown, untested and undeveloped state.</p>

<p>In this situation, the developer would reproduce this error, write a test around that error and then fix the code to do the right thing in that specific state.</p>

<p>This way, as the system grows, you get a more complete set of tests that makes sure everything is working as intended.</p>

<h3 id="adequate-testing-delivers-speed">Adequate Testing Delivers Speed</h3>

<p>With the above in place you end up developing at a more consistent pace. Development teams that do not test, generally have a large spike of features delivered early, but the features delivered over time drop off rapidly as each new feature ends up breaking something else without them knowing and they are constantly fighting fires of broken production systems due to unintended changes.</p>

<p class="">
  <img src="/assets/images/features-spike.png" alt="Showing a peaking graph early in the engagement that then dies off rapidly" title="Spiking feature development graph" width="75%" />
</p>

<p>Teams that test adequately are initially slower off the mark, but their delivery over time stays more constant providing with a greater number of features delivered over the life of the project.</p>

<p class="">
  <img src="/assets/images/features-steady.png" alt="Showing a slower starting graph that then peaks later and stays steady for longer" title="Steady feature development graph" width="75%" />
</p>

<p>This speed over a long term really compounds allowing you to continue to ship at a rapid pace over many years. So how else can you increase your speed if you are doing this correctly, automation!</p>

<h2 id="10-automation-builds-productivity">10. Automation Builds Productivity</h2>

<p>While I’ve listed this as an axiom of software development, really, this is true of all industries. Anything you can properly automate will result in less errors and higher productivity.</p>

<p>In order to do this, you first need to understand a fundamental of automation. You can not automate something that has not been standardised to be done the same way each time or done in accordance with a strict set of rules.</p>

<p>A mistake I have seen made many times is attempting to automate a process that still has numerous edge cases, hours are spent on getting the automation done just to realise that there are occasions where the process needs to be different requiring decisions to be made in order to proceed.</p>

<p>But once you have a process that happens the same way every time according to a set of rules, then this is ripe for automation and you should automate it as soon as practically possible.</p>

<p>In a software development world, automation can be achieved in many places, from task management, building, testing, deployment, and even to monitoring and scaling. We’ll go over a few of these here to give you some ideas on where you can automate your processes.</p>

<h3 id="automate-your-tests">Automate your Tests</h3>

<p>Picture what happens when your developer creates a new feature. It makes total sense to you.</p>

<p>You look at the feature on staging and it looks good. So you approve it to go to production.</p>

<p>But, when you go to deploy it, your automated test process comes back with an alert saying, ‘We just found an error on the 6 ft requirement for the basketball team members.’ Your automated testing process stops the deployment process. You are very lucky that the automation process caught that error before it went live. You are left with a choice of either fixing the error or fixing the test to push the code live.</p>

<h3 id="automate-your-deployments">Automate your deployments</h3>

<p>When you deploy code to your production environment on an application that is going to have continuing work, you don’t want someone manually copying files onto a server. You equally don’t want someone running a 10-step manual process.</p>

<p>You want to automate that as much as you can.</p>

<p>A big reason to automate is that it makes deployments easier. And it creates the functionality to roll back deployments, if you happen to push an error into production.</p>

<h3 id="rolling-back-your-production-environment">Rolling back your production environment</h3>

<p>Another scenario you might encounter is having a feature pushed to production that everyone is happy with. But later finding one subset of users report that the new feature breaks the part of the system they use - and now they are blocked. With automation, you can just roll that back and put the old version live, quickly and easily.</p>

<p>I unknowingly created this exact issue. Because I’m both a software developer and the project manager of my own software projects, it’s pretty easy for me to write what’s called “founder’s code.” Essentially, that’s sub-par code which I think is good enough to just push live. (I don’t do it as much now as I used to.)</p>

<p>One day I did an update, and believe it or not, I was updating the copyright year in the footer so it shows the current year. That is pretty obvious. But of course, I was being smart! I didn’t want to just edit the year in the text, I wanted it to automatically update so I wouldn’t have to fix it every year. So, I wrote some “founder’s code” that automatically sets the current year as the copyright year and I pushed it live. And I promptly went out for dinner around 7pm, without taking my mobile phone.</p>

<p>I got home a couple hours later and I had at least 10 messages from different clients, complaining about the application. My email inbox was flooded. All sorts of things.</p>

<p>As it turned out, I had pushed a syntax error into production that only came up in a certain way and it caused the application to crash.</p>

<p>Luckily, our entire process was automated using the <a href="https://reinteractive.com/opscare">OpsCare Service</a>, which monitors all our applications 24/7. When my OpsCare team saw that I had pushed something into production right before the site went down, they first tried to contact me and, after failing to reach me, they just pressed a button and the whole thing rolled back to a previous version and the whole system came back up again.</p>

<p>The total downtime was perhaps 10 minutes, instead of 3-4 hours, which was the time I was out at dinner.</p>

<p>With your systems automated, it will allow you to continue to deliver and grow your product, but invariably I have found that clients continue to deliver features, without continuing to maintain the underlying systems, this leads us to the final Axiom 11.</p>

<h2 id="11-maintenance-is-cheap">11. Maintenance is Cheap</h2>

<p>What do I mean by maintenance is cheap? I mean that the money you spend on maintenance is like an early payment on a loan, those payments earn interest and return much bigger dividends into the future than the initial investment.</p>

<p>Lets have a look at two extreme examples to clarify this.</p>

<p>The first project has no maintenance done. No upgrades. No security patches. No updates to the infrastructure running it. Nothing. While this will run quite happily, maybe for years, one day something will have to be done to keep the system running, and at this point, any developer starting on it will have a massive uphill battle even to get the application in a state they can even start developing on it. Not to mention as each month without maintenance goes by, the security risk of a data breach or other problem just exponentially increases. I have seen applications like this where it was cheaper to completely restart the application in the latest versions of the underlying system and porting over the business logic resulting in spending more than the initial investment of writing it in the first place.</p>

<p>The second project has regular maintenance done on it. Every month a little bit is done, a bug fix here, a security upgrade there, an operating system update over there. Over the years this system is kept broadly in sync with the movement and changes to the software development landscape. When the time comes to add a new feature, any developer can rapidly get the system up and running and make the needful changes in a short period of time.</p>

<p>Obviously maintenance does not come for free, but there are many companies out there (including reinteractive :) that provide maintenance services for all sorts of applications where you do something like purchase a block hours each month to keep your app up to date and functional.</p>

<h3 id="what-are-the-risks-of-no-maintenance">What are the risks of no maintenance?</h3>

<p>The risks of not maintaining your system include:</p>

<p><strong>Data Breach</strong> - your system might have a security vulnerability from the code in your application or one of the dependent software libraries it uses that results in some or all of your users data being exposed and then sold to the highest bidder. I don’t think a week has gone by recently without a major data breach, and a majority of these are caused from out of date and unmaintained software.</p>

<p><strong>Data Loss</strong> - your system could end up having a bug that just deletes data. Or has a flaw that allows an attacker to delete that data, causing your users and your company data loss requiring expensive restore processes (both in time and money).</p>

<p><strong>Performance Degradation</strong> - an unmaintained system will eventually slow down as the database it is using grows in size and no performance work is done to handle this additional data.</p>

<p><strong>Integration Failures</strong> - even if your system is perfect, it probably interfaces with other systems in some way or another, these other systems will be constantly improving over time and updating their APIs and processes. Without performing regular updates, your system will be left behind and eventually be unable to integrate with the systems it needs to.</p>

<p><strong>Hijacking</strong> - This is where an attacker finds a flaw in your system that allows them to impersonate your users, or use your system in unintended ways that results in your site becoming a source of SPAM. One of our clients had a WordPress site that was not maintained (and it is now!). They used a compromised plug-in which was hacked. The compromised plugin sent out an email to their entire contact list with links to hard core pornographic sites. The breach, while not being particularly expensive to fix, cost them greatly in damage to their reputation, brand management and trust. Something that just wouldn’t have happened if they had a maintenance plan in place taking care of the points above.</p>

<p><strong>Environment Rotting</strong> - Software itself doesn’t rot, but modern software is built on a stack of other products, all of which get updates and get improved over time. Without maintenance, it can become almost impossible to even start the application for a new developer as all the tooling that was used to build the application in the first place has changed drastically or become unsupported altogether. In addition to this, the ecosystem of blog posts, help articles and the like have all moved on to newer versions making finding the cause of some weird bug even harder to find for your development team.</p>

<p><strong>Morale</strong> - Finally, the morale of your team is impacted. They see this system that they worked hard on, get neglected and left behind. Then when they are inevitably asked to fix something that’s broken, everything has to be done under a time crunch with them trying to get this application running that hasn’t been developed on in years with all the team members that built it originally long gone and no one left to know how the thing even starts.</p>

<p>Imagine you are the driver for some car company, and the car your are assigned has no maintenance budgeted to it? You do your best to wipe down the dash and make sure you leave it out in the rain for a wash, but after years of driving, the oil would be fouled with contaminants and possibly have caused damage to the engine. If one spark plug had failed, that would have fouled that cylinder. The brakes would probably need replacing, in addition to major maintenance probably being required on the overall car. Aside from the fact it would probably be a death trap to drive, getting it fixed would be a very expensive nightmare.</p>

<blockquote>
  <p>Software projects often cost many times the cost of a new car, yet the idea that you would leave a new car without maintenance for years would be considered ludicrous.</p>
</blockquote>

<p>Getting your software system maintained regularly is very much cheaper than leaving it to rot and break over time, even without the developer costs factored in, it can be seen as a cheap form of insurance to avoid expensive settlements, suits, blackmail costs etc due to negligence caused from criminals trying to attack your system for their profit.</p>

<h3 id="what-needs-to-be-maintained">What needs to be maintained?</h3>

<p>The key points to maintain are:</p>

<p>Security Vulnerabilities Found Software Patches Database Maintenance (ie. vacuuming, health checks, and log management) Updating dependencies, plugins, libraries and language Updating underlying software versions to ensure continued support. Updating the infrastructure (operating system, servers etc) Updating the documentation on how to use it Adding more tests around core functions Improving how a new developer can get up to speed</p>

<p>Every modern software system contains dozens to hundreds (sometimes thousands) of dependent libraries in addition to the code that was written in the application itself. No matter how big or small your application is, maintenance is required to keep it healthy and functioning and safe.</p>

<p>As in life, in software there is no such thing as a static, steady, always the same, existence.</p>

<p>If something is not being improved and kept up, it will decay and eventually cease to operate if only because everything around it will continue to be improved and grow leaving your system behind.</p>

<p>Time and money spent on maintenance to keep your software up-to-date will ensure you don’t encounter a nasty surprise later when it ceases to perform the functions it was designed to do.</p>

<h2 id="in-closing">In Closing</h2>

<p>The above axioms were learned through years of running a software consulting company, and hard won through many expensive mistakes.</p>

<p>I hope they help you with your next project.</p>]]></content><author><name>Mikel Lindsaar</name></author><summary type="html"><![CDATA[Even though we have been developing software as an industry for the last 50 or so years, it still seems difficult to predict the outcome of a software project. That was obvious to me as I built my software company.]]></summary></entry><entry><title type="html">Remote Work — the 21st Century Business Model</title><link href="https://lindsaar.net/posts/2018-06-11-remote-work" rel="alternate" type="text/html" title="Remote Work — the 21st Century Business Model" /><published>2018-06-11T00:00:00+00:00</published><updated>2018-06-11T00:00:00+00:00</updated><id>https://lindsaar.net/posts/remote-work</id><content type="html" xml:base="https://lindsaar.net/posts/2018-06-11-remote-work"><![CDATA[<p>The challenges of running an entirely remote work company are relatively few compared to the many benefits in competitive advantage, employee happiness and overall productivity. Over the past 8 years, I feel I have learned great lessons and put excellent systems put in place that can be replicated.</p>

<p>Our ability to communicate over many different channels and distances has changed the landscape of how we work and socialise. When I was a kid we were unreachable until we got home near a landline phone. Now we have a myriad of ways of staying in touch. While this has annoying, distracting downsides, it opens up a new world for companies to engage in remote work solutions.</p>

<p>I started reinteractive as a 100% remote company. While not all businesses are suited to this model, I found that many software developers, including myself, enjoy remote work and creating a company that fully embraced this would create a competitive advantage.</p>

<p>Constant distractions that come from working in an office environment are the enemy of a developer or anyone who needs to be engaged in concentrated, detailed work. So I decided to build the type of company that I would want to work for.</p>

<p>At the time this was very new — there were no models, articles or books to guide me. Some companies had a number of staff working remotely a few days a week, but not what I envisioned. So, with some previous management training and experience under my belt, I got to it, addressed the various pros and cons, ironed out the problems and I feel we have achieved the right mix.</p>

<p>We are flourishing and a recent internal survey of staff showed that they also love remote working and the flexibility that it offers them and their family. Happy people are more productive. No one misses being stuck in traffic or being jostled on an overcrowded train for 40-plus minutes. If you have to put in some extra time on the job, the 2 hours saved on travel is a great option and you can still eat with the family, tuck your kids into bed and go the bed refreshed, not frazzled.</p>

<p>Australia’s workforce is changing and the Australian Bureau of Statistics most recent study showed there are now 1.3 million people working from home to save costs, take advantage of flexible workplace arrangements, for childcare reasons, and to spend more time with family.</p>

<p>I wanted to share some tips of how I have navigated the remote work downsides and the firm policies put in place to maximise the benefits of remote work.</p>

<h2 id="varying-degrees-of-trust">Varying Degrees of Trust:</h2>

<p>The first thing to note is that remote work is not an all-or-nothing activity. There are levels of “remoteness” and each comes with a different level of trust that is required to make it successful.</p>

<p>I came up with 5 broad categories for remote work tolerance in a company:</p>

<h3 id="remote-work-prohibited">Remote work prohibited</h3>

<p>This is where all staff are onsite. Sometimes this is necessary if you are dealing with highly sensitive data, or you need access to specific equipment and the like.</p>

<h3 id="remote-work-tolerated">Remote work tolerated</h3>

<p>This is where staff are permitted to work from home on occasion, such as when they (or a dependent) are sick.</p>

<h3 id="remote-work-encouraged">Remote work encouraged</h3>

<p>This is a common scenario, where staff work 2–3 days per week in the office and the remainder at home.</p>

<h3 id="remote-work-first">Remote work first</h3>

<p>This is where a company maintains an office, but many people work from home.</p>

<h3 id="remote-work-only">Remote work only</h3>

<p>This is where a company does not have a formal office setup at all and all staff work from home with the option to work together in an office space as needed.</p>

<p>In this gradient scale of remote work, there is an increasing level of two-way trust required:</p>

<p>Increasing two-way trust with remote work</p>

<h2 id="trusting-your-staff">Trusting Your Staff</h2>

<p>I have complete trust in all my staff. I choose the best there is and then I let them get on with it. I expect them to be responsible and to do their best work. If you have to constantly check up on someone, then you likely haven’t chosen the right person to work for you. There is no micro-managing (which capable staff enjoy) and they are a brilliant team who control their own workflows and are responsible for producing really high-level products. If someone needs help then they ask for it and we have a buddy system for new staff so they always have someone helping navigate through being new.</p>

<p>Having a strong care factor and pride in one’s work is an essential element to look for when choosing a new member of the team and getting everyone up to a high level of production is very important.</p>

<p>That strong trust extends out to our client’s faith in us. They pay good amounts of money to build business-critical software and they want to know that we have their back and will continue to provide top level service and be available to answer all their queries, no matter how small.</p>

<h2 id="establishment-and-quality">Establishment and Quality</h2>

<p>We also have two important divisions in the company. The first is the Establishment Division and the other is the Quality Division.</p>

<p>The Establishment Division is responsible for many traditional “HR” functions of hiring, firing, staff leave, benefits and the like, but is also responsible to make sure that procedures are followed in the company, that communication occurs and is responsible for ensuring the team are producing and any ethics situations are resolved rapidly.</p>

<p>The Quality Division is responsible for doing technical quality reviews and monitoring staff training.</p>

<h1 id="remote-work-benefits">REMOTE WORK BENEFITS:</h1>

<h2 id="accessing-the-best-talent">Accessing the best talent</h2>

<p>At reinteractive, we require top level developers in the Ruby on Rails language, the primary language used in our custom-built applications. While our land mass in Australia is large, we have a small population and Sydney simply doesn’t have the quantity of available and ready-to-hire senior developers that we need.</p>

<p>A remote work set-up allows us to hire top-level developers and designers, no matter where they are located. If a client is in Melbourne, I don’t need a senior developer in the same area. The developer can be in Sydney, or Auckland or Los Angeles and provide superlative service to that client.</p>

<p>Our team is in all parts of Australia, New Zealand, North and South America and we just hired our first developer in Western Europe. This enables us to provide dedicated follow-the-sun operations support for managed hosting for clients, without our staff needing to work the night-shift. This level of support is often an requirement for clients who have made a large investment in their business-critical applications.</p>

<h2 id="distraction-free-work">Distraction free work</h2>

<p>While being remote means you can’t meet around the coffee machine for a chat with your co-workers, the advantages of uninterrupted, concentrated work far outweigh any negatives. It encourages focused work without the large distractions of an office environment. The amount of time saved by eliminating noise and distraction means projects get finished faster, with less frustration. And that spreads out beyond the workplace. The less stress at work, the better human relations can be all round.</p>

<h2 id="decreased-costs">Decreased costs</h2>

<p>fFurniture, fit out and rent expenses are reduced, or eliminated, in a remote work situation.</p>

<p>We travel to visit clients as needed and provide staff with travel allowances to fly in for our regular Team Days.</p>

<h2 id="team-spirit">Team spirit</h2>

<p>We have a firm policy to follow the “Golden Rule” of treating each other as we would like to be treated ourselves — with tolerance, consideration and compassion.</p>

<p>Mistakes and errors usually result from a misunderstanding or lack of training, not malice. We hire our staff not only for their skills, but also their personality.</p>

<p>Remote work tends to nullify cliques, office dramas, incidents of harassment/bullying and personality clashes that can poison an office environment and result in work-related stress. If someone is having a bad day or a developer is completely stuck on something, then they are encouraged to take a break, go for a walk, chill out and come back refreshed. It is hard to take a bad mood out on fellow workers in a remote work situation. We have a results-oriented team who will go out of their way to help another team member on the job. They are professionals in what they do, they are respected, trusted and appreciated. And clients enjoy working with them.</p>

<h2 id="flexibility">Flexibility</h2>

<p>A recent survey of our staff showed high levels of satisfaction with remote working. What do they like the most? Flexibility in schedule topped the list. Many are raising a young family and they can pick-up their kids from school or code with their 6-month-old next to them, without disturbing anyone. They work just as hard and do all the needed hours, but it simply allows for greater life flexibility. Again, not all companies could support this model, but it is especially workable for software developers.</p>

<h1 id="remote-work-teams-the-people-side">REMOTE WORK TEAMS: THE PEOPLE SIDE</h1>

<h2 id="communication-is-king">Communication is king</h2>

<p>The number one thing to focus on is communication! Strong communication helps effectively manage the challenges of working remotely.</p>

<p>The more remote the team, the more deliberate and formalised the communication needs to be.</p>

<p>Here are some recommendations:</p>

<ul>
  <li>
    <p>Set-up a chat application — Flowdock / Slack / IRC / Whatever.
Dedicate one chat room for all general communication. There should be no talk about work. This room is reserved for announcing your comings and goings, and general “water cooler” chat.</p>
  </li>
  <li>One chat room per project for project specific communication.</li>
  <li>One chat room for the various divisions — marketing, HR, etc.</li>
  <li>Ability to have one-on-one private chats within the team.</li>
  <li>Make sure you announce all wins and successes loudly and often. This boosts team morale.</li>
  <li>All team members must announce their comings and goings:</li>
</ul>

<p>Make sure arriving at “work” and leaving “work” is announced and include lunch breaks and other random breaks. Team members become frustrated if they can’t find who they need. It helps if everyone knows what the other team members are thinking and doing.</p>

<h2 id="disagreements-are-not-settled-via-email-or-in-writing">Disagreements are not settled via email or in writing</h2>

<p>This is an extremely important point. The bigger the disagreement between people, the closer you need to bring the parties in order to solve it.</p>

<p>Disagreements defuse in person or with verbal communication if you cannot be in the same space. They explode on long distance communication lines, e.g. “Is that a sarcastic emoji? Or a happy one?” Too many misunderstandings can result from arguments over text or email. Your team are humans. Meet in person or, at the very least, via video or phone call to settle misunderstandings or disputes.</p>

<h2 id="daily-meetings">Daily meetings</h2>

<p>In a traditional office environment, we would speak to our colleagues daily. A remote office should be no different.</p>

<p>Waiting a week to make sure that everyone is heading in the same direction is not enough. Each project team should have a daily meeting to coordinate their activities. These meetings should be kept brief and focus on deliverables planned for today, any blockers being faced, and deliverables completed from the day before.</p>

<p>Make sure everyone comes to the meeting with their information ready to go. One-on-one detailed coordination within the meeting should be banned beyond “I’ll talk to you after”.</p>

<p>How you hold these meetings is entirely up to you — each company has its own style. All that matters is keeping communication high between the team.</p>

<p>Remember: Meetings cost serious dollars — make them as short as possible, without cutting back on sharing needed information, so people can get back to work.</p>

<h2 id="weekly-meetings">Weekly meetings</h2>

<p>A weekly meeting with all staff is critical. They need to know what is going on, where we are strong, what needs improvement. It is amazing how many bright ideas various team members come up with that can be useful. Their pay packet requires the company to be prospering, so keeping them in the loop is essential. Here are some recommendations:</p>

<ul>
  <li>The CEO or general manager gives an overview of progress and new upcoming projects or actions.</li>
  <li>Hold it at the same time every week, with little or no variation</li>
  <li>Go over what was achieved the previous week, with divisional heads also reporting to the team</li>
  <li>Go over what will be achieved in the new week by area</li>
  <li>Minimal discussion in the meeting, just focus on goals and targets</li>
  <li>Provide an opportunity for everyone to share their wins and for good news to be shared and work well done acknowledged.</li>
  <li>Additionally, all meetings should be recorded so that absent team members can listen in and stay up-to-date.</li>
</ul>

<h2 id="remote-work-culture">Remote work culture:</h2>

<p>Unlike an office environment, you don’t have birthday cakes, office parties, Melbourne Cup hats, etc. You have to work harder to build a company culture, but it is well worth your while to do so.</p>

<p>Encourage people to be creative: make themed days in your chat rooms, for example. reinteractive has Kitty Tuesdays, Corgi Thursdays, KFC Fridays. Be inventive and just play.</p>

<p>To learn more about the team culture at reinteractive, read this blog post on the topic.</p>

<h2 id="remote-work-get-together">Remote work get-together:</h2>

<p>Make sure you get together often!</p>

<p>We do this every second month in Sydney and for small teams that are nearby you can do this. The team flies in and we meet at a hotel and hold our weekly team meeting. After lunch we socialise, hold tech talks, and/or pair program.</p>

<ul>
  <li>Take the opportunity for team activities, such as WHS training.</li>
  <li>Take the opportunity for more thorough briefings.</li>
  <li>Encourage people to get to know each other and chat.</li>
  <li>Encourage individuals from the team to talk.</li>
  <li>Focus on the social aspect on this day, not the work aspect.</li>
</ul>

<p>Obviously as teams grow globally and distances increase, this is more and more difficult, but working out how to physically see each other yearly is important.</p>

<h2 id="remote-work-teams-the-management-side">REMOTE WORK TEAMS: THE MANAGEMENT SIDE</h2>

<h3 id="hiring-the-right-staff-for-remote-work">Hiring the right staff for remote work</h3>

<p>We are very exact about who works for us. We have a specific hiring formula which includes testing a developer’s coding skills. A resume is one thing, but the interview and skills testing are more important. An interview determines communication skills and whether they will be the right fit for our team. Someone may be a brilliant developer but may lack the needed skills to directly talk with clients, under all conditions.</p>

<h3 id="strong-client-communication">Strong client communication</h3>

<p>We meet face-to-face with the client as often as possible and will fly to where they are located for various stages of the work they need done, including the UX design of their application. Developers are on a project from start to finish, creating a strong relationship with the customer. Our developers and project managers attend daily stand-ups allowing clients a high level of control throughout the build of their application.</p>

<p>Not everything always goes exactly to plan, but if the communication is strong and fast, it can be resolved easily. It’s our high level of communication that is most commonly praised by clients, while contributing to the high levels of project success.</p>

<h3 id="provide-clear-expectations-with-key-performance-indicators-kpis">Provide clear expectations with Key Performance Indicators (KPIs):</h3>

<p>When the team is remote, there is no way to drop past and ask for a progress report. Remote team members need clear KPIs or statistics to work towards. I developed the MetaPulse application specifically for this purpose. It is the world’s first Growth Management System. You can find it at <a href="https://metapulse.com/">https://metapulse.com/</a>.</p>

<p>These agreed-upon metrics allow you to monitor the production of your team, providing an agreement between management and the team so that everyone understands what is expected of them.</p>

<p>It removes any uncertainty or office politics: people are either producing or they are not. However, remember that a KPI is exactly that: an indicator. If someone is not performing, there might be an underlying issue that is preventing them for achieving the desired numbers. Always give them the benefit of the doubt when opening a dialogue about performance.</p>

<h3 id="management-needs-to-be-approachable">Management needs to be approachable:</h3>

<p>I also don’t hold with certain hierarchical management structures where a junior doesn’t feel they can approach management with a valid proposal or sharing new ideas and solutions to better our operations. I want to hear bright ideas. How to run this sanely is with the use of the “Completed Staff Work” principle of management. It originated in the military in the early 1940s (see <a href="http://govleaders.org/completed-staff-work.htm">http://govleaders.org/completed-staff-work.htm</a>).</p>

<p>The aim is for subordinates to be responsible for submitting written proposals and recommendations outlying the issues and solutions, completed in such a manner as to require no further work on the part of the superior. The senior then simply has to approve or disapprove it.</p>

<p>I stay informed on all things related to reinteractive on a daily basis and talk to my managers each morning and throughout the day as needed and they know they can ask me anything.</p>

<h3 id="security">Security</h3>

<p>This is a whole topic unto itself, but it is a primary factor in ensuring a secure work environment for our client’s intellectual property. We employ top-level security arrangements.</p>

<h1 id="in-closing">In Closing</h1>

<p>Remote work can be challenging, but also very rewarding allowing teams to be more focused and able to produce without interruption.</p>

<p>I would love to hear any feedback or input you have into the remote work issue, so drop me a line.</p>

<p>It’s been a journey to make everything work right. Sometimes we made mistakes. Sometimes we smashed it out of the park… but we always kept working towards making something that achieves the work / life balance nirvana. Are we there yet? No. But we are much closer than what we were and are striving to get even better.</p>]]></content><author><name>Mikel Lindsaar</name></author><summary type="html"><![CDATA[The challenges of running an entirely remote work company are relatively few compared to the many benefits in competitive advantage, employee happiness and overall productivity. Over the past 8 years, I feel I have learned great lessons and put excellent systems put in place that can be replicated.]]></summary></entry><entry><title type="html">A new protocol for social interaction</title><link href="https://lindsaar.net/posts/2010-09-18-a-new-protocol-for-social-interaction" rel="alternate" type="text/html" title="A new protocol for social interaction" /><published>2010-09-18T00:00:00+00:00</published><updated>2010-09-18T00:00:00+00:00</updated><id>https://lindsaar.net/posts/a-new-protocol-for-social-interaction</id><content type="html" xml:base="https://lindsaar.net/posts/2010-09-18-a-new-protocol-for-social-interaction"><![CDATA[<p>In <a href="/posts/2010-09-17-what-is-a-distributed-social-network">What is a Distributed Social Network</a>
I discussed the bubbling horrors of having our online identity
controlled by faceless mega-corporations. But it didn’t really provide
any useful direction. This is my attempt to fill that gap. Specifically,
how should we go about sharing our thoughts and emotions online, without
having to give up the ownership of our data to a centralised body? These
are my thoughts.</p>

<p>I think there are four central tenants which any information sharing
protocol should subscribe to.</p>

<p>These are;</p>

<ol>
  <li>Ownership of data should belong to those the data is of.</li>
  <li>Authenticity of data should be ascribed by the owners of data.</li>
  <li>Durability of data should be as long as the owners please.</li>
  <li>Sharing of data should not circumvent the first three principles.</li>
</ol>

<p>When a protocol for information sharing be developed that guarantees the
above four rules, then we will have social networks without an ever
present demon of profitability and balance sheets hovering over us.</p>

<p>But let me take a moment to explain what the above four rules would
mean.</p>

<h3 id="1-ownership-of-data">1. Ownership of Data</h3>

<p>Your information is yours. This is where Diaspora are generally on
target, despite any other failings. You should be able to post
information to some location, somewhere in the world, and have complete
control over that data. At no time should it be possible for someone (or
something) else to claim rights to your data.</p>

<p>This flies in the face of the <a href="http://www.facebook.com/policy.php">Facebook privacy
agreement</a>. Go read it if you
haven’t yet. At least skim through it. The only place where they mention
ownership of your data is the last paragraph of section 6, specifically
that they reserve the right to sell your data to whom ever buys them.</p>

<p>Awesome.</p>

<p><a href="http://www.google.com/privacypolicy.html">Google’s privacy policy</a> also
has very little to say about ownership. In fact, it has nothing to say
about how much of your data you own. Which means you have nothing to say
about it using your data in whatever way it pleases.</p>

<p>The Apple’s <a href="http://www.apple.com/legal/itunes/us/terms.html">iTunes privacy
policy</a>, that’s right,
the one you click through every time there is an update to iTunes, also
has a glaring, sun-flare type lack of information ownership.</p>

<p>The crazy thing is, we all don’t care. Or at least we have been
conditioned to not care.</p>

<p>With the seemingly endless stream of platitudes coming from the
mega-corporations murmuring that they will look after us, our
information is safe, they will only use it to help us; it is no wonder
that all of us don’t care. But go back and have a look at all of those
“privacy policies”. None of them say they will look after your data. In
fact ALL of them explicitly state that if they screw up and release all
your data, that you waive them of any liability.</p>

<p>So Ownership of data is king. And the only way to ensure ownership is,
well, have possession of it! There is a great old legal saying, harking
back to the early 1700s that states “Possession is nine points of the
law”. Over the centuries since this has become “Ownership is nine tenths
of the law” and it is true!</p>

<p>So for you and me, the key would be for us is ownership data. Have
control of our own micro information nodes that store, backup but most
importantly, own our data.</p>

<p>Achieving this would be relatively simple, at least in the scale of the
other three items in my proposal. We would all own a micro server which
had our information crown jewels locked up some how. Each one of these
little islands of personal information would then hand out tidbits of
information to those that came, offering as much or as little as we
wanted, while at the same time stamping each byte of data with it’s
stamp of authenticity.</p>

<h3 id="2-authenticity-of-data">2. Authenticity of Data</h3>

<p>The next key point would be the owner’s ability to say “Yes, this data
about me is correct”. Maybe the second most important thing would be
preventing any one else from saying “This bit of data about that person
is authentic” without the owner agreeing.</p>

<p>Being able to authenticate that data belongs to you, grants you the
ability to revoke that authentication, but why is this important?</p>

<p>I touched on it in my last post, the ability (and natural right) of a
human to reinvent themselves, to start over, to become more than they
ever were. Without the ability to say “That is what I did before, sure,
but that is not me now. Now I am this.” then I am not quite sure what
you or I are bothering to live for? As human beings we all have the
intrinsic ability to start a new life, turn over a new leaf and spin up
any number of clichés that allow us to change our demeanour.</p>

<p>But the current social networks don’t allow that. USA President Obama
stated to a group of kids that they should <a href="http://www.huffingtonpost.com/2009/09/08/obama-on-facebook-be-care_n_279482.html">be careful what you post on
Facebook</a>.
And he couldn’t be more correct. Because once you post that, then
Facebook are the ones who are stating that information is true about
you. Not you.</p>

<p>Is it really fair to say that taking a video of someone being stupid at
age 17, and then posting this on Youtube, should then define that person
for the rest of their lives? No. Of course not. But you and I can see
it. It is there. In video. So it MUST be TRUE!</p>

<p>Says who?</p>

<p>Have you seen a hollywood movie lately? Avatar anyone? Can you seriously
tell me that if I took a clip from Avatar and decreased the resolution
to Internet standards, that you would be able to prove to me that it was
not live footage of an actual planet? No. Of course you couldn’t. And
that is the point.</p>

<p>If we are to live in a sane and free world, then you and I should be
able to stamp information about ourselves as true. And other information
not. Then the viewer of that information could then (at their
discretion) validate that data with your server, getting a confirmation.</p>

<p>Now before you go off at me about the possible legal consequences of
people covering up their crimes by “deauthenticating data”. Remember
people, we are talking about social networks. If the police want to
collect a file about your actions and prove that it was you who robbed
the bank, then fine, they can do that and the whole beyond reasonable
doubt thing.</p>

<p>But remember in the old days, if you really screwed up your life, you
could get up and move town and START AGAIN. This is the whole point. You
should be able to revoke information and start over. Information about
yourself should only exist for as long as you allow it to.</p>

<h3 id="3-durability-of-data">3. Durability of Data.</h3>

<p>Go do a google search of your name. Don’t do it as an ego trip, just do
it to be shocked (like I was). You will find information about you
posting to mailing lists that have stopped sending mail almost a decade
ago. You will find all sorts of information that you never thought would
be there. And maybe you find something that you don’t want to be there.</p>

<p>This data exists as long as Google feels like persisting it. Not a
minute more. And more importantly, not a minute less.</p>

<p>Sure, you MIGHT be able to get hold of them and delete information from
caches and data stores. But they have no legal obligation to do as you
ask. And even if they wanted to, what profit is there in doing so? None.
Without keeping information about you and your actions, they have
nothing to offer any customer, period. Their whole business model is
defined by who did what when and allowing you to find out about it.</p>

<p>Now, don’t get me wrong. Google has a place. It provides an incredible
research tool for our generation. When I was at school you actually had
to go to the library and lookup encyclopaedia if you wanted to see
information about a famous discovery. Now you can just google it. It is
incredible and provides us with unparalleled expansion of knowledge.</p>

<p>However, research data, and what you had for lunch, are two very
opposite ends of the information super highway. An information sharing
protocol should allow the owner of data to decide when data is no long
deemed necessary to be kept, and so allow it to be destroyed. Not made
“anonymous”. Not “archived”. Simply nuked.</p>

<p>If you want to keep some information around for the future generations,
print it out and store it in a air tight safe. If you want to start a
new life, format your information node, and start a new one.</p>

<p>Or, if you are happy with your life and what you are doing, keep it
online, and share it with your friends.</p>

<h3 id="4-sharing-of-data">4. Sharing of Data.</h3>

<p>The last point is probably the hardest to get right. Ownership can be
handled by having your own private server. Authenticity could be
resolved with todays public/private key authentication. Durability can
be handled with a combination of ownership and invalidating the
authenticity of data. But sharing, now that is tough.</p>

<p>Because the problem presents itself, whom do you share data with? And
why?</p>

<p>Does Facebook really need to know how old you are? I mean, sure, they
need to know you are of legal age to prostitute your personal life to
the Facebook gods, but do they need to know that in March I will be
celebrating yet another year of being on the far wrong side of 30? No.
Don’t think so.</p>

<p>What about iTunes? Asking your date of birth “For security reasons”…
O.o</p>

<p>Right.</p>

<p>Being able to share your data would take concepts like OAuth to their
logical conclusion. Instead of allowing Google et al to be our
authentication “proxy”, we would delegate this to our information nodes,
each allowing anyone to say “Hey Joe, this character is claiming to be
you, is he?” and get a definitive “yes” or “no”.</p>

<p>The same information node could provide things like “Yes, my owner is
over 18” or “You want his postal address? One sec, I’ll check.”</p>

<p>There is little to no need for Facebook, iTunes or many other companies
to know where I personally live. They already have my credit card data,
what more do they need? They might need my postal address to send me an
invoice, sure. But anything else? Nope.</p>

<p>Providing a smart way to share data would provide us with the
opportunity to be so granular with our information sharing that the
existing corporate efforts would just be a proverbial bull in a china
shop.</p>

<p>And it would scare the life out of them.</p>

<p>Imagine if you will, Facebook trying to drum up more business when it
could not sell targeted ads, down to a suburb, for goods and services?
Imagine google only being able to shoot gun advertise? Imagine the
empowerment we would gain as a human collective, together, breaking free
of the psycho targeted marketing campaigns that assault us daily?</p>

<p>Nice thoughts aren’t they?</p>

<p>So being able to share data in a controlled and defined manner is just
as important as the other three combined.</p>

<h3 id="summary">Summary</h3>

<p>So these are my thoughts and my views of a future social information
sharing protocol. What do you think?</p>

<p>I hope I have delineated them sufficiently.</p>

<p>If you feel strongly about it, please spread the word. This sort of
discussion needs more voices than mine. I intend to work on such a
protocol, I have no idea how or where such work will take me, but I
really think that personal information needs to be under the above four
tenets; Ownership, Authentication, Durability and Sharing.</p>

<p>Simple really.</p>

<p>blogLater</p>

<p>Mikel Lindsaar</p>]]></content><author><name>Mikel Lindsaar</name></author><summary type="html"><![CDATA[In What is a Distributed Social Network I discussed the bubbling horrors of having our online identity controlled by faceless mega-corporations. But it didn’t really provide any useful direction. This is my attempt to fill that gap. Specifically, how should we go about sharing our thoughts and emotions online, without having to give up the ownership of our data to a centralised body? These are my thoughts.]]></summary></entry><entry><title type="html">What is a distributed social network?</title><link href="https://lindsaar.net/posts/2010-09-17-what-is-a-distributed-social-network" rel="alternate" type="text/html" title="What is a distributed social network?" /><published>2010-09-17T00:00:00+00:00</published><updated>2010-09-17T00:00:00+00:00</updated><id>https://lindsaar.net/posts/what-is-a-distributed-social-network</id><content type="html" xml:base="https://lindsaar.net/posts/2010-09-17-what-is-a-distributed-social-network"><![CDATA[<p>I’ve been reflecting on the future of the “social networks” and
contemplating on how modern solutions have gotten it wrong. These are my
musings.</p>

<p>Corporatization of our social interactions will become the swan song of
our current society. It’s not a matter of <em>if</em> some big centralised body
is going to screw you over with regards to the information you hold with
them, but just a matter of when.</p>

<p>The problem is that we live in an age where the balance sheet is king.
I’m by no means the first person to illuminate this well known fact,
many have come before me. But it is true that unless we as a society
act, and fast, then there will be no privacy, no where to run and
definitely no where to hide.</p>

<p>Harking back just a short 6 years ago, before Facebook decided to open
its online doors to the world, you and I could still share photos with
each other, we could send an email asking one another out to dinner,
and, we could even stoop as low as calling someone on the phone, or,
heavens forbid, drop in unannounced on a friend “just to say hi”.</p>

<p>But now the world has changed. I talk to friends who tell me that not
being active on Facebook is social suicide, that not tweeting your
innermost thoughts relegates you to the digital backwater and that
refusing to post your most intimate family pics on Flickr means you must
be a pervert. But really, where is our world going?</p>

<p>In the last year I have seen Google buzz fizz and while it is too early
to call, Ping is probably just another bad smell floating around. While
Facebook continues to grow and generate profits and revenue at the
expense of your privacy. Why is that?</p>

<p>Why is it that we spend our lives trying to amass “friends” in our
social network, yet, look around our room, alone, and wonder where they
all are?</p>

<p>Daily we are bombarded with tweets and photos of all the “cool kids”
doing this, or commenting on that, and wonder why we can’t be like them.
We yearn for someone to retweet a post or follow our thoughts. We are
conditioned to gaze in wonder at someone’s friend or follower count and
wonder how it is.</p>

<p>And then we wonder where is the social interaction in all this?</p>

<p>Who own’s your information on Facebook?</p>

<p>Who own’s the information you post on Twitter?</p>

<p>Who own’s the comment you may be compelled to leave at the bottom of
this post?</p>

<p>And in the end, who cares?</p>

<p>It’s an interesting question. Who does care? Or more importantly, should
you?</p>

<p>It can be argued that you willingly put information online, therefore
you are willing for other people to use that information. To a degree,
this is true. I post on this blog, you can learn an awful lot about me
from this blog. But there is a difference. I can decide that this blog
no longer represents who I am, or who I want to be, and thus change or
remove it all together.</p>

<p>Sure, there would be ghosts of the content hanging around the internet
in caches and my tweets online, but after a few months or a year or so,
the Google juice would run out and in the end, become irrelevant. Why?
Because this blog is controlled by no one other than myself.</p>

<p>Not by Mark. Not by Larry or Sergey. Not by Biz or Evan. Not even by
Steve or Bill. This blog is mine and I’ll do what I like with it thank
you very much.</p>

<p>And that is a key point. Unlike other social mediums out there, I can
choose to exercise my right as an individual human being and redefine
whom I am.</p>

<p>Start afresh and step out into the world yelling “G’Day!”</p>

<p>However, your digital finger print is actually doing to you what many
corporate bodies and government institutions have been trying to do to
you throughout the ages, categorise and segregate you into an powerless
individual defined by your past actions and held back from the future.</p>

<p>It could be said that an individuals sanity can be measured by how far
into the future they can base their decisions on. An insane person would
be someone who could only think about the past and what has happened to
them, a relatively sane person could look around in the present and make
some rational decisions about their actions and how they would impact on
the now. A very sane person can look into the future and see how their
actions will impact all of society.</p>

<p>Our current online social systems are turning us into past living
neurotics. We are worried about what is online about what we did. We
want to make sure the historical record of who we are accurately depicts
what we are. In short, we are getting trapped by the very social
framework that was meant to free us.</p>

<p>Fine.</p>

<p>But what is the solution?</p>

<p>Not sure.</p>

<p>I have taken a look at Diaspora. Diaspora was born through four self
proclaimed geeks who thought “information should be distributed and
private”. Nobel goals (pun intended). But in looking at the “open
source” code released, there was a really major flaw. There was a
licensing model, and even a contributors agreement that one had to
digitally sign in order to be part of the movement.</p>

<p>Excuse me?</p>

<p>Not only that, but looking through the posts, there is one major
Achilles heel. One, gigantic, insurmountable flaw in their structure.
The business model.</p>

<p>You see, that’s the point.</p>

<p>We can’t have our social networks dictated by a business model.</p>

<p>As soon as you dictate a business model, then any humanity is lost to
the balance sheet. Any right to privacy is balanced against the
profitability of maintaining that privacy. And in that battle, we all
know what wins.</p>

<p>It is not a matter of Mark and the gang being “good” or “evil”. It is
not a matter of them developing a bullet proof privacy policy or 101
ways to click your way to not sharing anything. It is the matter of, we
are a race of individuals who gain their strength and meaning from our
social interactions, and unless we are willing to stand up for those
interactions, someone, somewhere is going to put a dollar figure on
those interactions and suddenly they become as hollow as the “cha-ching”
of a cash register.</p>

<p>It matters that you have friends.</p>

<p>It matters that you have someone to talk to.</p>

<p>And, damn it, it matters that the mega companies of the world don’t
profit off the fact that I call you my friend.</p>

<p>blogLater</p>

<p>Mikel</p>]]></content><author><name>Mikel Lindsaar</name></author><summary type="html"><![CDATA[I’ve been reflecting on the future of the “social networks” and contemplating on how modern solutions have gotten it wrong. These are my musings.]]></summary></entry><entry><title type="html">This Relationship is Worth Nothing</title><link href="https://lindsaar.net/posts/2010-06-13-this-relationship-is-worth-nothing" rel="alternate" type="text/html" title="This Relationship is Worth Nothing" /><published>2010-06-13T00:00:00+00:00</published><updated>2010-06-13T00:00:00+00:00</updated><id>https://lindsaar.net/posts/this-relationship-is-worth-nothing</id><content type="html" xml:base="https://lindsaar.net/posts/2010-06-13-this-relationship-is-worth-nothing"><![CDATA[<p>Today was the last day I had booked in my hotel room. I had won this
room through an Internet bidding service at a heavy discount of $85 per
night. However, I needed to extend my stay in the hotel another two days
and that is where this relationship went to hell.</p>

<p>I called the front desk of this hotel and asked “I’d like to extend my
stay another couple of nights, how much would that be?”</p>

<p>“Well, we can not give you the same rate you are on now, so it will be
$200 a night to extend”.</p>

<p>“K, thanks, bye”.</p>

<p>So, what did I do? Tried Priceline again, and what should happen? We win
another bid for two nights for $85 AT THE SAME HOTEL.</p>

<p>Calling the front desk resulted in “Oh, ok, come down to reception and
change your key then, all good”…</p>

<p>O.o</p>

<p>So what is the difference between me calling up to extend, and me
calling up with a winning bid?</p>

<p>Nothing, except one teeny tiny thing… I am an existing customer. I
have already chosen this hotel (sure based on price, but I am here none
the less) and so, they have an opportunity to create a strong
relationship.</p>

<p>Which they shot in the foot.</p>

<p>This attitude just pushes the idea that my custom, is worth nothing,
zero, squat and that my relationship with the hotel is worth nothing.</p>

<p>What did it gain the hotel? Well, the only thing it gained them is that
now I know that I can “cheat” their “system” which just means contempt.</p>

<p>If the hotel was booked out, extending my stay at a low rate would not
be good business sense. Sure. But it wasn’t. The hotel is half empty,
and they are still offering the same price I paid through the internet.</p>

<p>Your existing customers are your most valuable resource. That is not to
say you can’t entice new customers with “special offers”, that is fine,
but remember that it is your existing customers who are paying your
bills and feeding your cat.</p>

<p>This hotel in San Francisco would have won my stay for several more
nights, but now I know that I can get a similar or cheaper price on the
internet, which means my custom at this hotel is purely up to the gods.</p>

<p>And that is not good business sense.</p>

<p>blogLater</p>

<p>Mikel</p>]]></content><author><name>Mikel Lindsaar</name></author><summary type="html"><![CDATA[Today was the last day I had booked in my hotel room. I had won this room through an Internet bidding service at a heavy discount of $85 per night. However, I needed to extend my stay in the hotel another two days and that is where this relationship went to hell.]]></summary></entry><entry><title type="html">Thank YOU…</title><link href="https://lindsaar.net/posts/2010-06-11-thank-YOU" rel="alternate" type="text/html" title="Thank YOU…" /><published>2010-06-11T00:00:00+00:00</published><updated>2010-06-11T00:00:00+00:00</updated><id>https://lindsaar.net/posts/thank-YOU</id><content type="html" xml:base="https://lindsaar.net/posts/2010-06-11-thank-YOU"><![CDATA[<p>In his recent keynote to RailsConf 2010, <a href="https://twitter.com/garyvee">Gary
Vaynerchuk</a> gave a wonderful talk about the
power of “thank you”. Something we all intrinsically understand, yet not
enough of us practice.</p>

<p>“Say Thank You” was drummed into me from a very early age, my parents
always encouraged me to respect those around me, from the lowest
socialite I met to the highest janitor I had the pleasure of talking
shop with, I always learnt that the opportunity to create a relationship
with those around me was something to be cherished and grasped tightly.</p>

<p>After Gary’s Keynote, he asked for questions, I posed the question of
what his experience was with big corporates trying to “manage” customer
complaints instead of treating them as the true gift of solid gold that
they are. Gary mentioned that he has not seen much change, and this
makes me sad, but reaffirmed what I already knew from my own
experiences.</p>

<p>But some might be wondering what I am referring to. Surely customer
complaints are something that should be managed; less complaints equates
to better customer service - surely?!</p>

<p>No.</p>

<p>If you are running a business of more than one or two people, and you
are not receiving any complaints, I would argue that you are doing
something terribly, terribly wrong.</p>

<p>But you might need to broaden your idea of what a complaint is.</p>

<p>A complaint does not have to generate from bad service. A complaint per
the dictionary is “a statement that a situation is unsatisfactory or
unacceptable”. But there lies the rub. A complaint is a statement, and a
statement by definition is something voiced. Your client has to gather
the courage to contact you, go to the effort to find an avenue, and say
or type “hey, what you just did wasn’t what I was expecting, and that’s
not cool”.</p>

<p>“What?” you say. “Courage? Effort? I told my web design team to make
sure there is a ‘contact us’ menu item in the footer of every web page
on our site”.</p>

<p>Yeah, awesome. You mean that 10pt link right next to the “Terms of
Service” which unsimply says “We legally don’t give a shit?”, that
rocks, awesome positioning.</p>

<p>How many times have you called a company to complain and been turned
away? How many times have you sent an email and been told “The system
says… and I can’t change it”? How many times have you picked up the
phone to complain, stopped mid dial and just hung up again in the
knowing frustration that your voice is going to be cheerily greeted by
some autonomous string of 1’s and 0’s for 10 minutes before you get told
that the customer service desk is closed and that you can’t leave a
message, doofus.</p>

<p>Well, your client is the same. If you don’t make it insanely simple for
them to contact you, if you don’t encourage that call; 9 times out of
10, they just won’t do it. Then you my friend have lost an awesome
opportunity. Because that single call could make or break your
organisation.</p>

<p>Let me give you a personal example. I purchased a service from a domain
name hosting company. This company claimed that their system would
provide a “comprehensive” tool to edit and update domain names. It cost
$12 for the year. I decided to purchase it as an option for one of my
domain names. On getting this service, I found that it did nothing like
what I expected, it was a simple interface with minimal functionality.
After 5 minutes of purchasing the service, I decided that it wasn’t what
I needed and immediately sent a very polite email off to their support
staff asking to please cancel and refund the $12.</p>

<p>Simple request. I mentioned politely that the advertising had promised
an advanced service, and pointed out the features it did not support. I
felt very justified in my complaint and believed that shortly there
after I would receive an email saying “very sorry sir, we have refunded
your card, thank you very much for your custom and we trust we can
assist you in the future.”</p>

<p>Instead I received a blunt email saying asking for a refund was outside
the terms of service, that the money had already been charged and that
if I wanted, I could receive a $12 credit towards other services they
offered.</p>

<p>Not only that, but the reply to email address on the support email was a
“do-not-reply@company”!</p>

<p>Long story short, I found the support email address, also mentioned
their reply address was broken, asserted my right to the refund and
spent another 8 emails back and forth trying to get my point across.</p>

<p>All for $12!</p>

<p>I didn’t give a toss about the $12. But this was just wrong.</p>

<p>Finally contacting the head of accounting (O.o), I got my refund of $12
and a somewhat guarded apology. The very next thing I did was move 15
domain names off that company to another, went and spoke to three
friends of mine that used them and they are all migrating as well.</p>

<p>All in all, customer service fail.</p>

<p>In an alternate universe the same scenario might have gone a little like
this:</p>

<p>“Hi, it seems the service I just bought doesn’t do feature X which your
marketing pages say it should do, I would like a refund please”.</p>

<p>“Thank you very much Mr Lindsaar for contacting us about this problem. I
have alerted marketing to get this issue resolved and have already
passed your details to our accounting department to credit your card,
your refund should appear within 3-4 working days. As you took the time
to alert us to this problem, I am also pleased to pass on a $10 credit
for any other service we can provide you and have already applied this
to your account. Thank you for using our company.”</p>

<p>I tell you, if they did that, they would have won me as a customer for
life. And being a web application developer, that would be a not
insignificant amount of business.</p>

<p>And how much would have that token of gratitude cost them?</p>

<p>Zero.</p>

<p>That’s right. Nada.</p>

<p>In fact, it would have cost them LESS than it cost to go the other way.
Remember, they had to pay that “support” person to sit there writing me
those invalidative emails, they had to pay his senior to review each
email, they had to pay (I assume) the head of accounting to take the
time to read and refund my card.</p>

<p>And they also lost all my future business.</p>

<p>Stupid. Stupid. Stupid.</p>

<p>So what do we have to do to bring about this alternate universe? One
where relationships take precedence over the bottom line. Remember, the
relationships will generate for you more bottom line than any discount
or “loyalty program” will.</p>

<p>Get into communication with your clients.</p>

<p>Call them. Send them an email. Do a random survey. Make sure that every
time a customer interacts with your organisation your staff are drilled
on finding out if the client has had an unsatisfactory experience with
your work. Get to know your clients, establish those relationships.</p>

<p>Because if you establish those relationships, then the client (just like
your best friend) won’t be afraid to tell you that your fly is unzipped
before you walk out in front of a packed audience and make a total fool
of yourself.</p>

<p>And thank YOU for taking the time to read this. I appreciate it.</p>

<p>Mikel</p>]]></content><author><name>Mikel Lindsaar</name></author><summary type="html"><![CDATA[In his recent keynote to RailsConf 2010, Gary Vaynerchuk gave a wonderful talk about the power of “thank you”. Something we all intrinsically understand, yet not enough of us practice.]]></summary></entry></feed>