<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Philip Roberts - Essays</title>
		<description>Musings and essays by Philip Roberts</description>
		<link>http://latentflip.com</link>
		<atom:link href="http://latentflip.com/essays.xml" rel="self" type="application/rss+xml" />
		
			<item>
				<title>Thirty-Two</title>
				<description>&lt;h2 id=&quot;31&quot;&gt;31?&lt;/h2&gt;
&lt;p&gt;First up in case you are wondering what happened to my 31 post, a picture tells a thousand words:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/photos/other/2017-12-31_1.jpg&quot; alt=&quot;Events from Thirty-One&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;32&quot;&gt;32&lt;/h2&gt;
&lt;p&gt;The day after my 31st birthday, my notice period at my previous job ended, and I became officially unemployed. Hilary (who was only a few months in to her maternity leave after the birth of our son) convinced me to take some time off with the both of them, and had some grand ideas of getting away somewhere.&lt;/p&gt;

&lt;p&gt;While I was a little nervous about quitting my job with no plan I was inclined to agree with her: 2 weeks paternity leave (the UK’s default) is frankly bullshit, and spending “maybe a month or two” to enjoy life with our new family sounded like a pretty good idea. Little did I know that “month or two” would soon become 5, and perhaps neither of us would have suggested it if we’d realised that’s what would happen, but anyway.&lt;/p&gt;

&lt;p&gt;I think the best way to wrap up this year is to just do a chronological run-down.&lt;/p&gt;

&lt;h3 id=&quot;warmup-december-2017&quot;&gt;Warmup: December 2017&lt;/h3&gt;

&lt;p&gt;After spending most of January to November with my nose to the grindstone at work, and handling the (early) arrival of our son, December was a welcome respite.&lt;/p&gt;

&lt;p&gt;Looking back at photos, it appears the main activities were cooking and parenting. (And I suspect lots of planning for our impending road trip, though that doesn’t instagram so well).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/photos/other/2017-12-07_1.jpg&quot; alt=&quot;Wellington&quot; /&gt;
&lt;img src=&quot;/assets/photos/other/2017-12-15_1.jpg&quot; alt=&quot;Ashley&quot; /&gt;
&lt;img src=&quot;/assets/photos/other/2017-12-25_2.jpg&quot; alt=&quot;Cinnamon Rolls&quot; /&gt;
&lt;img src=&quot;/assets/photos/other/2017-12-25_1.jpg&quot; alt=&quot;Pud&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;france-january-2018-march-2018&quot;&gt;France: January 2018-March 2018&lt;/h3&gt;

&lt;p&gt;For the first couple of months of 2018, we all (including the dog!) bundled into our old Skoda Fabia and drove down to and around France.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/photos/other/roadmap.png&quot; alt=&quot;Roadmap&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I will treasure the memories of that trip for a very long time. We didn’t &lt;em&gt;do&lt;/em&gt; a whole lot - no exciting activities, no great sightseeing - just visiting many corners of the country in the middle of the off season. But what we did get to do was to &lt;em&gt;spend time&lt;/em&gt; together, which is exactly what we needed as we were adjusting to what life means with a child.&lt;/p&gt;

&lt;p&gt;Here are a few highlights:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/photos/other/france-1.jpg&quot; alt=&quot;Proposal&quot; /&gt;
Revisiting where we got engaged 7 years ago on the banks of the Seine (the exact spot was underwater due to high water levels!)&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/photos/other/france-2.jpg&quot; alt=&quot;Souffle&quot; /&gt;
Eating the biggest, most delicious souffle in Chalons-en-Champagne&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/photos/other/france-3.jpg&quot; alt=&quot;La Clusaz&quot; /&gt;
Finding loads of snow in La Clusaz&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/photos/other/france-4.jpg&quot; alt=&quot;Praline Buns&quot; /&gt;
Praline Buns in Lyon&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/photos/other/france-5.jpg&quot; alt=&quot;Winter walks&quot; /&gt;
Walking the wilderness somewhere in the middle of France&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/photos/other/france-6.jpg&quot; alt=&quot;Picturesque Countryside&quot; /&gt;
Wine and countryside in the Loire valley&lt;/p&gt;

&lt;h3 id=&quot;github-april-2018&quot;&gt;GitHub: April 2018&lt;/h3&gt;

&lt;p&gt;After talking to a bunch of companies in Edinburgh and remotely, I eventually got the good news from GitHub that I was hired! Sadly this necessitated a short trip to sunny San-Francisco for onboarding (sorry Hilary!).&lt;/p&gt;

&lt;p&gt;Reports suggested that I would both love and hate everything about SF, and they were not wrong.&lt;/p&gt;

&lt;p&gt;Highlight: walking the ~10 miles from the city across the Golden Gate Bridge to Sausalito and getting the ferry back. Everyone else does this on a bike - but I really enjoyed the slog.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/photos/other/sf-1.jpg&quot; alt=&quot;GGB&quot; /&gt;
&lt;img src=&quot;/assets/photos/other/sf-2.jpg&quot; alt=&quot;Tram&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;albany-ny-august-2018&quot;&gt;Albany, NY: August 2018&lt;/h3&gt;

&lt;p&gt;By this point it’s probably clear the theme of this year is “anywhere but home”. August took us to Albany to visit family, and Hilary &amp;amp; I took a (solo!) side-trip to DC.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/photos/other/albany-1.jpg&quot; alt=&quot;Albany&quot; /&gt;
&lt;img src=&quot;/assets/photos/other/albany-2.jpg&quot; alt=&quot;DC&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;amsterdam-october-2018&quot;&gt;Amsterdam: October 2018&lt;/h3&gt;

&lt;p&gt;By this point you’re probably thinking: “that’s probably enough change/excitement for one year”, or, “time to spend some time in Scotland buddy”. Life (aka Hilary) had other plans. The lure of a new (head of product) position was too much, and so on the 31st of September we packed up the car and the dog (again) and drove to Amsterdam to begin immigrant life (at this point Hilary is a double-immigrant).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/photos/other/ams-1.jpg&quot; alt=&quot;Arrival&quot; /&gt;
Jasper sighting his new homeland from the ferry.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/photos/other/ams-2.jpg&quot; alt=&quot;Bikes&quot; /&gt;
Becoming native&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/photos/other/ams-3.jpg&quot; alt=&quot;Bridges&quot; /&gt;
Bridges&lt;/p&gt;

&lt;h2 id=&quot;reflections&quot;&gt;Reflections&lt;/h2&gt;
&lt;p&gt;Looking back, a few things become clear.&lt;/p&gt;

&lt;p&gt;Everytime I think “that’s good, things are settled now, time to relax for a bit”, something comes along that completely changes everything again. New house, new job, baby, new job again, new country.&lt;/p&gt;

&lt;p&gt;Thanks to my slightly (sometimes very) anxious nature, the thought of impending change always brings with it a bundle of stress. Even booking a holiday is pretty damn stressful for me. But from the other side I can see how much richer life has been because of it.&lt;/p&gt;

&lt;p&gt;I only really have one person to thank for all of this, and that’s Hilary. As much as those moments of anxiety stress me out, it’s clear that life would be a heck of a lot more boring without her pushing me to the edge of my comfort zone. 😍&lt;/p&gt;

&lt;p&gt;That said, maybe 33 can take it a &lt;em&gt;little&lt;/em&gt; easy?&lt;/p&gt;
</description>
				<pubDate>Tue, 27 Nov 2018 00:00:00 +0000</pubDate>
        <link>http://latentflip.com//thirty-two</link>
        <guid isPermaLink="true">http://latentflip.com//thirty-two</guid>
			</item>
		
			<item>
				<title>Thirty</title>
				<description>&lt;p&gt;It is with slight apprehension that I must admit that yes, I am now thirty. But I’m not sure exactly where that apprehension comes from?&lt;/p&gt;

&lt;p&gt;Is it that round numbers encourage us to reflect on our entire lives up until this point, and make us hyper-aware of the unstoppable march of time?&lt;/p&gt;

&lt;p&gt;Is it that while still “in my twenties” I could grasp onto the last vestiges of childhood and adolescence, but at 30 I have to finally admit that I’m truly an adult, even if I don’t feel like one?&lt;/p&gt;

&lt;p&gt;Or is it simply that I’m turning 30 amidst: Brexit, an impending Trump presidency, the rise of nationalism and the far-right, Theresa May as prime minister, and the imminent implementation of the Snooper’s Charter?&lt;/p&gt;

&lt;h2 id=&quot;growing-up&quot;&gt;“Growing Up”&lt;/h2&gt;

&lt;p&gt;As a child, a picture of adulthood developed in my head. That picture was of someone going to work in a big office in a suit and smart shoes, of someone who had all their shit together, of someone serious who was interested in serious things like the stock market and mortgages. Based on this picture, I’ve barely made it a day past adolescence - and over the last few years I’ve chided myself for that again and again.&lt;/p&gt;

&lt;p&gt;It’s only in the last year, or maybe even the last few days, that I’ve realised how wrong that picture is.&lt;/p&gt;

&lt;p&gt;Growing up isn’t about overcoming and getting rid of a childlike wonder of the world. It’s not about dressing seriously, and only caring about grown up things. It’s not about jobs, or money, or houses, or ticking off some list of checkboxes that we decide marks “adulthood”.&lt;/p&gt;

&lt;p&gt;Growing up is about finding, and nurturing, and giving confidence to the scared, emotional and vulnerable child that is at the center of our emotions. It’s challenging how we feel about ourselves, and how we deal with our emotions. It’s about owning our confidence, our happiness, our anger, our pain, our love - and not relying on someone else to do that for us - so that we can then be a positive and caring influence on the other people in our lives who need &lt;em&gt;us&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;If anything, learning this, and slowly beginning to live it, has only &lt;em&gt;increased&lt;/em&gt; my child-like wonder. You can be a fascinated, goofy, and wonder-ful person, at the same time as being “grown up”. These are not mutually exclusive states of being.&lt;/p&gt;

&lt;h2 id=&quot;events&quot;&gt;Events&lt;/h2&gt;

&lt;p&gt;Ignoring 2016-at-large, and a couple of sad events, 29 has been pretty good. In reverse order…&lt;/p&gt;

&lt;h3 id=&quot;moving-on-from-yet&quot;&gt;Moving on from &amp;amp;yet&lt;/h3&gt;

&lt;p&gt;I sit here on my birthday, imminently unemployed: as I have only a couple of weeks left at &amp;amp;yet, and as yet, have no new job lined up to walk in to.&lt;/p&gt;

&lt;p&gt;This is a bittersweet situation to be in. &amp;amp;yet and the team there have been an absolute dream to work for over the last 3 years, but being quite so remote is hard, and I feel like it’s time for a new challenge for me. I’ll forever be grateful for what &amp;amp;yet has taught me about what it means to &lt;em&gt;truly&lt;/em&gt; care for your teammates, and put people above all else. Not to mention the space that &amp;amp;yet has given me to grow as a developer and a person. In my time at &amp;amp;yet I’ve grown from someone fighting depression and anxiety, with a real lack of confidence in my abilities; to being much stronger, centered, and confident in myself.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/photos/instagram/2016-11-01_1373811028780952826.jpg&quot; alt=&quot;&amp;amp;yet pumpkin&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;hilary&quot;&gt;Hilary&lt;/h3&gt;

&lt;p&gt;I’ve of course, had a great time with the love of my life this year. But on top of that, it’s been an privilege to see her continue to grow and excel in her work. The icing on the cake was watching her present at Canvas Conference in Birmingham, and totally own a huge stage in front of a big and receptive crowd.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/photos/instagram/2016-10-21_1365547854537500654.jpg&quot; alt=&quot;Hilary at Canvas Conference 2016&quot; /&gt;&lt;/p&gt;

&lt;p&gt;### Madeira&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/photos/instagram/2016-10-07_1355717708653778452.jpg&quot; alt=&quot;Madeira&quot; /&gt;
&lt;img src=&quot;/assets/photos/instagram/2016-10-07_1355669937074672818.jpg&quot; alt=&quot;Madeira&quot; /&gt;
&lt;img src=&quot;/assets/photos/instagram/2016-10-01_1351538015863997043.jpg&quot; alt=&quot;Madeira&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;eilean-shona&quot;&gt;Eilean Shona&lt;/h3&gt;

&lt;video data-playonscroll=&quot;&quot; src=&quot;/assets/photos/instagram/2016-07-02_1285684357062789825.mp4&quot; loop=&quot;&quot; style=&quot;display: block; width: 90%; margin: 30px auto&quot;&gt;&lt;/video&gt;

&lt;p&gt;&lt;img src=&quot;/assets/photos/instagram/2016-07-02_1285679254759275744.jpg&quot; alt=&quot;Eilean Shona&quot; /&gt;
&lt;img src=&quot;/assets/photos/instagram/2016-06-27_1281978712186729988.jpg&quot; alt=&quot;Eilean Shona&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;touch&quot;&gt;Touch&lt;/h3&gt;

&lt;p&gt;Touch Rugby has been a total blast this year. I’m glad to say my creaking knees made it through a whole season without major upset.&lt;/p&gt;

&lt;p&gt;As someone who’d never really played team sport until joining a touch rugby team, I’ve been totally surprised how much I’ve enjoyed it - not to mention you get like 30 free friends on day 1!&lt;/p&gt;

&lt;p&gt;It was also a real privilege to play for Edinburgh at the national championships. And to get to try out for the Scotland squad for 2017.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/photos/instagram/2016-06-04_1265223490800302551.jpg&quot; alt=&quot;Touch Boots&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;anchorage&quot;&gt;Anchorage&lt;/h3&gt;

&lt;p&gt;&lt;img src=&quot;/assets/photos/instagram/2016-01-30_1174123043486808601.jpg&quot; alt=&quot;Moose&quot; /&gt;
&lt;img src=&quot;/assets/photos/instagram/2016-02-04_1177767759185033758.jpg&quot; alt=&quot;Hilary Snowboarding&quot; /&gt;
&lt;img src=&quot;/assets/photos/instagram/2016-02-07_1180005637910804627.jpg&quot; alt=&quot;Superbowl Snacks&quot; /&gt;&lt;/p&gt;

&lt;script&gt;
  var video = document.querySelector('[data-playonscroll]');
  window.addEventListener('scroll', function () {
    if (document.body.scrollTop + document.body.clientHeight &gt; video.scrollTop) {
      video.play();
    }
  });
&lt;/script&gt;

&lt;style&gt;
.post h3 {
    margin-top: 3em;
}
&lt;/style&gt;

</description>
				<pubDate>Sun, 27 Nov 2016 00:00:00 +0000</pubDate>
        <link>http://latentflip.com//thirty</link>
        <guid isPermaLink="true">http://latentflip.com//thirty</guid>
			</item>
		
			<item>
				<title>Hire me</title>
				<description>&lt;p class=&quot;image&quot; style=&quot;float:right; width: 40%; height: auto; margin-top: 0&quot;&gt;&lt;img src=&quot;/assets/images/me.png&quot; style=&quot;margin-top:0; margin-right: 0&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I build javascript web applications, and I’m good at it.&lt;/p&gt;

&lt;p&gt;If you’re looking for someone to lead; to help you build quality frontend applications, and to be just darn &lt;em&gt;nice&lt;/em&gt; while doing it, you should get in touch: &lt;a href=&quot;mailto:phil@latentflip.com&quot;&gt;phil@latentflip.com&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;what-im-good-at&quot;&gt;What I’m good at&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;I’ve been building complex javascript web applications like &lt;a href=&quot;http://floatapp.com&quot;&gt;float&lt;/a&gt; and &lt;a href=&quot;https://talky.io&quot;&gt;talky.io&lt;/a&gt; for 7 years.&lt;/li&gt;
  &lt;li&gt;For the last 18 months I’ve been frontend lead at &lt;a href=&quot;https://andyet.com&quot;&gt;&amp;amp;yet&lt;/a&gt; - directing frontend strategy for us and our clients; and coaching and mentoring other developers.&lt;/li&gt;
  &lt;li&gt;I have considerable experience with &lt;a href=&quot;http://backbonejs.org/&quot;&gt;backbone&lt;/a&gt;, &lt;a href=&quot;https://ampersandjs.com&quot;&gt;ampersand&lt;/a&gt; (I was a core contributor) and &lt;a href=&quot;https://facebook.github.io/react/&quot;&gt;react&lt;/a&gt; &amp;amp; &lt;a href=&quot;http://redux.js.org/&quot;&gt;redux&lt;/a&gt; (which I love working with). I have written large apis and backends for applications in both rails and node.js.&lt;/li&gt;
  &lt;li&gt;I am an excellent communicator and educator. I &lt;a href=&quot;http://latentflip.com&quot;&gt;write&lt;/a&gt; and speak well on a range of topics: my &lt;a href=&quot;https://www.youtube.com/watch?v=8aGhZQkoFbQ&quot;&gt;event loop&lt;/a&gt; talk has been watched over 200,000 times. In my time at &amp;amp;yet I have made &lt;em&gt;many&lt;/em&gt; of our clients very happy both with the quality of my work as well as my ability to communicate clearly with them and anticipate and understand their needs.&lt;/li&gt;
  &lt;li&gt;I co-founded and built &lt;a href=&quot;http://floatapp.com&quot;&gt;float&lt;/a&gt; for 3 years. As the sole developer I built the entirety of the initial platform - taking it from the first line of code to revenue; as well as working with my co-founder to do customer &amp;amp; product development, design, ux, customer support &amp;amp; sales.&lt;/li&gt;
  &lt;li&gt;I’ve built a number of realtime applications using webrtc and xmpp, including talky, and client applications for &amp;amp;yet.&lt;/li&gt;
  &lt;li&gt;I am not a &lt;em&gt;designer&lt;/em&gt;, but I care deeply about UI, UX and design, and the impact they have on products and customers. I’ve worked closely with &amp;amp;yet’s design team over many projects to implement, question, stress-test, break and improve designs.&lt;/li&gt;
  &lt;li&gt;I am an exceptionally fast learner and &lt;em&gt;great&lt;/em&gt; at tracking down bugs (seriously, try me). Which means I’m very comfortable jumping into existing codebases and becoming productive quickly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can also check my &lt;a href=&quot;https://github.com/latentflip&quot;&gt;github&lt;/a&gt; and full &lt;a href=&quot;http://latentflip.com/cv&quot;&gt;cv&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;what-im-looking-for&quot;&gt;What I’m looking for&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;A permanent position either in Edinburgh, or remotely where there are a good number of people in UK/European timezones&lt;/li&gt;
  &lt;li&gt;A senior frontend javascript position, or something a bit different that might fit my skill-set&lt;/li&gt;
  &lt;li&gt;A team who care about each other as well as the work they do&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;why-now&quot;&gt;Why now?&lt;/h3&gt;

&lt;p&gt;After 3 years at the wonderful &lt;a href=&quot;https://andyet.com&quot;&gt;&amp;amp;yet&lt;/a&gt;, I’ve decided to move on.&lt;/p&gt;

&lt;p&gt;I love everyone on the team to bits, but over time the distribution of our remote team has shifted significantly to the West Coast - and working 8 timezones away from a team I love is hard work.&lt;/p&gt;

&lt;p&gt;I don’t have anything lined up yet, and I’d love to hear from teams who think I would be a good fit.&lt;/p&gt;

&lt;h3 id=&quot;contact-me&quot;&gt;Contact Me&lt;/h3&gt;

&lt;p&gt;If you think I might be a good fit, please get in touch, either on &lt;a href=&quot;https://twitter.com/philip_roberts&quot;&gt;twitter&lt;/a&gt; or &lt;a href=&quot;mailto:phil@latentflip.com&quot;&gt;email phil@latentflip.com&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;some-nice-tweets-about-me&quot;&gt;Some nice tweets about me&lt;/h2&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; data-lang=&quot;en&quot; data-cards=&quot;hidden&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;The person who held the most successful talk of any JSConf is looking for a job. Your move: &lt;a href=&quot;https://t.co/Or9KRf33Ey&quot;&gt;https://t.co/Or9KRf33Ey&lt;/a&gt;&lt;a href=&quot;https://t.co/kNpJt2fJpO&quot;&gt;https://t.co/kNpJt2fJpO&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jan Lehnardt (@janl) &lt;a href=&quot;https://twitter.com/janl/status/796090266952278016&quot;&gt;November 8, 2016&lt;/a&gt;&lt;/blockquote&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; data-lang=&quot;en&quot; data-conversation=&quot;none&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;We love &lt;a href=&quot;https://twitter.com/philip_roberts&quot;&gt;@philip_roberts&lt;/a&gt;! If you’re in Europe and have a team who puts people first who needs a truly amazing human, you should hire him ASAP &lt;a href=&quot;https://t.co/kaBS0rSWhw&quot;&gt;https://t.co/kaBS0rSWhw&lt;/a&gt;&lt;/p&gt;&amp;mdash; &amp;amp;yet (@andyet) &lt;a href=&quot;https://twitter.com/andyet/status/796054731068014593&quot;&gt;November 8, 2016&lt;/a&gt;&lt;/blockquote&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; data-lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;If I could, I would hire Phil to write *all* the JavaScripts. Don&amp;#39;t miss out. &lt;a href=&quot;https://t.co/QWsgq0fuUF&quot;&gt;https://t.co/QWsgq0fuUF&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jim Newbery (@froots101) &lt;a href=&quot;https://twitter.com/froots101/status/796330145707474944&quot;&gt;November 9, 2016&lt;/a&gt;&lt;/blockquote&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; data-lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;you should extremely hire phil whom is ace &lt;a href=&quot;https://t.co/dfzbIyXwfb&quot;&gt;https://t.co/dfzbIyXwfb&lt;/a&gt;&lt;/p&gt;&amp;mdash; no (@mountain_ghosts) &lt;a href=&quot;https://twitter.com/mountain_ghosts/status/796092149628538880&quot;&gt;November 8, 2016&lt;/a&gt;&lt;/blockquote&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; data-lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;I can&amp;#39;t stress enough how amazing &lt;a href=&quot;https://twitter.com/philip_roberts&quot;&gt;@philip_roberts&lt;/a&gt; is. He&amp;#39;s part of the reason I&amp;#39;m a JS dev today, and continue to be one. Hire him quick! &lt;a href=&quot;https://t.co/7u0vhFge2x&quot;&gt;https://t.co/7u0vhFge2x&lt;/a&gt;&lt;/p&gt;&amp;mdash; Loodlewoodles 👻 (@LewisCowper) &lt;a href=&quot;https://twitter.com/LewisCowper/status/796100462730743808&quot;&gt;November 8, 2016&lt;/a&gt;&lt;/blockquote&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; data-lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Quite literally the most brilliant dev I know. &lt;a href=&quot;https://t.co/2JgIMbdGXr&quot;&gt;https://t.co/2JgIMbdGXr&lt;/a&gt;&lt;/p&gt;&amp;mdash; Gar ☭ (@wraithgar) &lt;a href=&quot;https://twitter.com/wraithgar/status/796116793001537537&quot;&gt;November 8, 2016&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;//platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

</description>
				<pubDate>Wed, 09 Nov 2016 00:00:00 +0000</pubDate>
        <link>http://latentflip.com//hire-me</link>
        <guid isPermaLink="true">http://latentflip.com//hire-me</guid>
			</item>
		
			<item>
				<title>mathie</title>
				<description>&lt;p&gt;&lt;em&gt;Trigger warning: discussion of suicide, depression&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Graeme was a gentle, but ubiquitous, force in Scotland’s development community.&lt;/p&gt;

&lt;p&gt;For a long time, I didn’t really know him very well. I knew of him, of course, and our circles overlapped so much that I really should have known him better. He was a key Ruby developer at &lt;a href=&quot;http://engineering.freeagent.com/2016/08/22/rest-in-peace-@mathie/&quot;&gt;FreeAgent&lt;/a&gt; at the same time as I was co-founding Float, which integrated directly with FreeAgent. He started ScotRUG and the Scottish Ruby Conference, both of which I’ve spoken at. A lot of my friends in the industry, were friends with him.&lt;/p&gt;

&lt;p&gt;And yet, somehow, for a long time I didn’t really know him. I think I was simply daunted by him. Clearly smart, experienced and influential, but quiet. What time would he have for a newbie like me? Did he even recognise me this time? Do I have anything interesting to add to his life?&lt;/p&gt;

&lt;p&gt;As a rubyist writing accounting software, Graeme was probably &lt;em&gt;the&lt;/em&gt; best person to help me, and by all accounts he would have been beyond happy to do so. But my fear of rejection; my belief that he had plenty of friends, and wouldn’t really be interested in chatting to me; kept him at a distance.&lt;/p&gt;

&lt;p&gt;Over time, we did interact, mostly via twitter, and at the odd ScotRUG meetup. But in my head, I was still an acquaintance of his, in a sea of closer friends.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Over time, I became somewhat aware of his struggles. We sat next to each other in a coworking space, but he wasn’t there very often, just an empty desk of &lt;em&gt;stuff&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;And then I helped his wife move his stuff out to her car.&lt;/p&gt;

&lt;p&gt;Graeme was in hospital.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Not long after that I saw this tweet from Graeme in my timeline.&lt;/p&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; data-lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;This morning’s art class turned into a mind map of “depression: a personal perspective”: &lt;a href=&quot;http://t.co/DUuFNUQEbs&quot;&gt;pic.twitter.com/DUuFNUQEbs&lt;/a&gt;&lt;/p&gt;&amp;mdash; Graeme Mathieson (@mathie) &lt;a href=&quot;https://twitter.com/mathie/status/431398231558619136&quot;&gt;February 6, 2014&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;//platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;p&gt;One phrase stood out: “no friends”.&lt;/p&gt;

&lt;p&gt;This was a phrase I was saying to my therapist almost every week at that time.&lt;/p&gt;

&lt;p&gt;This was a phrase that I would never have applied to Graeme.&lt;/p&gt;

&lt;p&gt;And so, I guess, our true friendship began.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://s3.amazonaws.com/static.latentflip.com/friends.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;When Graeme was in “hospital” (the nicest way I can describe any of the mental health wards I’ve visited), I brought him his aeropress and a fresh bag of coffee - we talked about coffee, and software, and depression.&lt;/p&gt;

&lt;p&gt;When he was out, we met up for a coffee. We talked about the fact that I was going to be hosting my first family christmas that year. He taught me about brining turkey, and told me that Nigella Lawson’s Christmas recipes were the best, which genuinely helped make that Christmas dinner one of the best my family’s had.&lt;/p&gt;

&lt;p&gt;He sent me a long detailed description of his depression, his alcoholism, his attempted suicide. Not in search of pity, but because he wanted to share, and to help other people. In the end, we decided it was just a little to much to share. But it showed me just how much he had to fight, just to survive, and gave me the strength to fight for myself, and for others.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Graeme’s death is a tragedy. There is some solace in knowing that he is finally free of his demons, but as someone with experience with depression, it’s foundation shaking - “he didn’t make it, will I make it?”, “who else is fighting?”.&lt;/p&gt;

&lt;p&gt;Graeme may not have made it, but he sure as hell fought, and from that I take strength.&lt;/p&gt;

&lt;p&gt;To end up in a drab and depressing mental health ward on more than one occasion, and to make your way out of there takes fight.&lt;/p&gt;

&lt;p&gt;To be fighting so hard against your demons, and still find love and friendship and the joyful intrigue that Graeme seemed to constantly find in software takes so much strength.&lt;/p&gt;

&lt;p&gt;To suffer, and still want to help others as you do, is an inspiration.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;But the biggest lesson that I’ll take from Graeme comes from his proclamation of having “no friends”. Two words that I think about almost daily.&lt;/p&gt;

&lt;p&gt;Two words that are a reminder that what our brains tell us about our self-worth, and how many friends we have, may ultimately not be true, and how hard some people have to fight to overcome that.&lt;/p&gt;

&lt;p&gt;But also, two words that demonstrate how hard we &lt;em&gt;must&lt;/em&gt; fight, especially as adults (and especially as men), to show our love, and to work for our friendships. Friendships don’t just happen, and friendships don’t just last - they must be fought for. As without that fight, we are all alone.&lt;/p&gt;

&lt;p&gt;That is the greatest lesson Graeme taught me. I still can’t believe he’s gone, but I intend to fight harder for every friendship I have thanks to him.&lt;/p&gt;
</description>
				<pubDate>Wed, 24 Aug 2016 00:00:00 +0000</pubDate>
        <link>http://latentflip.com//mathie</link>
        <guid isPermaLink="true">http://latentflip.com//mathie</guid>
			</item>
		
			<item>
				<title>Twenty-Nine</title>
				<description>&lt;p&gt;So I guess that’s the end of &lt;sub&gt;28&lt;/sub&gt;Ni and the start of &lt;sub&gt;29&lt;/sub&gt;Cu.&lt;/p&gt;

&lt;p&gt;I neglected to do a write up covering 27-28, but that was a year of firsts: first year at &amp;amp;yet, buying our first home together, the first major addition to the family 👋🐕. Twenty-eight feels like it’s been a year of contrasts - adventure and recovery, expansion and consolidation.&lt;/p&gt;

&lt;h2 id=&quot;yet&quot;&gt;&amp;amp;yet&lt;/h2&gt;

&lt;p&gt;It’s been a fun/scary/hard/exhausting/invigorating/everything year at &amp;amp;yet. We’ve had some real highs: some great projects; &amp;amp;yetconf was a huge success in every dimension that we as a company could care about; despite financial challenges we managed to get most of the team together in one place. But, there have been some lows too: consulting is a wax and wane kinda business, and if the waning happens at the wrong time, it hurts - bad, which means we had to say goodbye to some really great folks 😢. On the other hand it’s forced us to recalibrate, refocus, and band together as a team which feels hugely positive.&lt;/p&gt;

&lt;p&gt;Personally, it’s been, well, &lt;em&gt;hard&lt;/em&gt;. Remote work is hard, doubly so when you love your team who are all thousands of miles away. Remote work + timezones make it even harder. I’ve had to grow my confidence and belief in myself, learn to work well within a team, and latterly to help lead and trust in one. If anything, this year, and the team at &amp;amp;yet as a whole have taught me one thing: I am good at what I do. And pretending I am not is not constructive. It’s still very hard to remember every day, but it’s getting easier.&lt;/p&gt;

&lt;h2 id=&quot;conferences&quot;&gt;Conferences&lt;/h2&gt;

&lt;p&gt;As of now I’m on a decided hiatus from conference speaking, but the last year has been fun.&lt;/p&gt;

&lt;p&gt;I actually gave my JSConfEU talk &lt;em&gt;last&lt;/em&gt; year, but it’s been unbelievable to watch it’s view count climb and climb this year. As of right now, it’s passed 88,000 views, and is the third most &lt;a href=&quot;https://www.youtube.com/user/jsconfeu/videos?flow=grid&amp;amp;view=0&amp;amp;sort=p&quot;&gt;watched video from &lt;em&gt;any&lt;/em&gt; JSConf conference&lt;/a&gt; which blows my mind.&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/8aGhZQkoFbQ&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;It was also a &lt;em&gt;huge&lt;/em&gt; honour to keynote ScotlandJS this year (thanks Pete!) My mum even informed me she took some things I said with her to work!&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/43BdvIDdZA4&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;h2 id=&quot;mental-health&quot;&gt;Mental Health&lt;/h2&gt;

&lt;p&gt;It’s hard to write this and believe it in the dead of winter (winter messes with my brain, big time), but this year has been a consistent slog forwards for my mental health. I tapered off my counselling appointments, and haven’t been for ~6 months now. I’m probably due another booster set soon; but the efforts and effects of the time I spent in counselling continue to pay off for me daily. It’s still a battle (depression is a persistent fucker), but I feel like I can at least bring my sword to battle it most days.&lt;/p&gt;

&lt;p&gt;Looking out, I’ve seen a lot of people I know and love fight their own mental health battles. Some real lows which scare the bejeesus out of me, and some massive improvements too, which make me want to cry with happiness and scream from the rooftops how proud I am of them. To everyone who has fought their own fight, confided in me, and helped me this year: 💛Thank You 💜. And to anyone fighting battles I don’t know about it, keep fighting, and if you need an ear, I have two (and Jasper has two very large ones).&lt;/p&gt;

&lt;h2 id=&quot;japan&quot;&gt;Japan&lt;/h2&gt;

&lt;p&gt;I couldn’t be more thankful for my parents for encouraging us to actually book a holiday this year, and to Hilary for planning and booking most of it &amp;lt;3 &amp;lt;3 &amp;lt;3. It was a relief and a privilege and a blessing to step away from a computer for more than a couple of days (I honestly can’t remember the last time that happened), and explore the cities and countryside of such an incredible country.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/photos/instagram/2015-09-12_1442099976.jpg&quot; alt=&quot;Gundam&quot; /&gt;
&lt;img src=&quot;/assets/photos/instagram/2015-09-15_1442297154.jpg&quot; alt=&quot;Ramen&quot; /&gt;
&lt;img src=&quot;/assets/photos/instagram/2015-09-19_1442704086.jpg&quot; alt=&quot;At an inn on the kumano kodo&quot; /&gt;
&lt;img src=&quot;/assets/photos/instagram/2015-09-22_1442923625.jpg&quot; alt=&quot;On the kumano kodo&quot; /&gt;
&lt;img src=&quot;/assets/photos/instagram/2015-09-25_1443178196.jpg&quot; alt=&quot;Sumo!&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;hilary&quot;&gt;Hilary&lt;/h2&gt;

&lt;p&gt;We made it to three! 😍 (word count here is inversely proportional to my appreciation for H).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/photos/instagram/2015-05-26_1432634363.jpg&quot; alt=&quot;3rd anniversary&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;jasper&quot;&gt;Jasper&lt;/h2&gt;

&lt;p&gt;I don’t have the words for how much one little dog with tiny legs, and giant ears, has changed my life. Only pictures. Lots and lots of pictures.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/photos/instagram/2014-10-15_1413359060.jpg&quot; alt=&quot;Jasper closeup&quot; /&gt;
&lt;img src=&quot;/assets/photos/instagram/2015-06-25_1435260113.jpg&quot; alt=&quot;Jasper in a baseball hat&quot; /&gt;
&lt;img src=&quot;/assets/photos/instagram/2015-08-29_1440846223.jpg&quot; alt=&quot;Jasper being wierd &quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;everyone-else&quot;&gt;Everyone else&lt;/h2&gt;

&lt;p&gt;Thanks! I don’t tell &lt;em&gt;you&lt;/em&gt; enough, but thanks for making life better 🎉.&lt;/p&gt;

&lt;p&gt;-&lt;/p&gt;
</description>
				<pubDate>Fri, 27 Nov 2015 00:00:00 +0000</pubDate>
        <link>http://latentflip.com//twenty-nine</link>
        <guid isPermaLink="true">http://latentflip.com//twenty-nine</guid>
			</item>
		
			<item>
				<title>Manhattan</title>
				<description>&lt;blockquote&gt;
  &lt;p&gt;During &lt;a href=&quot;http://andyetconf.com/&quot;&gt;andyetconf.com&lt;/a&gt; we were taken on a visit to the &lt;a href=&quot;https://en.wikipedia.org/wiki/Hanford_Site&quot;&gt;hanford site&lt;/a&gt;, and given a tour of the &lt;a href=&quot;https://en.wikipedia.org/wiki/B_Reactor&quot;&gt;B reactor&lt;/a&gt;, the worlds first nuclear reactor, which was used to derive plutonium; plutonium used in the &lt;a href=&quot;https://en.wikipedia.org/wiki/Fat_Man&quot;&gt;Fat Man&lt;/a&gt; bomb, dropped on Nagasaki at the end of World War II.&lt;/p&gt;

  &lt;p&gt;As a part of the trip, and the conference, we were invited to consider the technical achievements of the Hanford site, but also their ultimate impact on real human’s lives, and the world.&lt;/p&gt;

  &lt;p&gt;After the tour, &lt;a href=&quot;http://twitter.com/adambrault&quot;&gt;@adambrault&lt;/a&gt; asked if I would share some of my thoughts about the Hanford site, and lead a discussion of other attendees thoughts. Here’s the full text of the short talk I wrote and gave. (It was last minute, so excuse the roughness).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Last month, my wife, and I visited Japan on vacation. Before we left, when we were trying to figure out where we should visit with the two weeks we had in the country, one of the places that came up was Hiroshima. In discussion it came up for one reason: Hilary (who is an american) felt like she had a duty to visit the city. In the end we unfortunately couldn’t fit a trip to Hiroshima and its peace garden into our schedule; but the “final impact” of the second world war was something we discussed while we were there.&lt;/p&gt;

&lt;p&gt;Much like Germany, Japan’s political, and emotional psyche has been shaped by the events of the second world war. In fact while we were there, there was a vote in the Japanese parliament on whether Japan could legally become involved in military action that was not solely required for self-defense. I believe that the vote passed, but it was not a popular result by any stretch. As a nation, after 70 years of peace, Japan are very wary of being involved in military action. After the vote passed, video was broadcast on the news of a brawl in parliament, as opposition politicans erupted in disgust at the passing of the vote.&lt;/p&gt;

&lt;p&gt;As a nation, the American psyche however, could perhaps use some introspection on how the war was ended. Even if Germany and its allies were on the edge of producing their own nuclear bombs (which is a fact that is in question); and even if dropping the bombs on Hiroshima and Nagasaki were absolutely required and definitive in ending the horrors of the second world war; the terrifying impact of those two bombs can not be overstated. Perhaps the great curse of winning in war, is that it becomes impossible to reflect on whether the means justified the ends.&lt;/p&gt;

&lt;p&gt;At the reactor today, we heard of the “great science”, the “great engineering”, and the “great technology” that the Hanford and Manhattan projects represented. The Hanford website describes  “Hanford’s ultimate triumph came with the nuclear explosion above Japan in August 1945, effectively ending World War II.”&lt;/p&gt;

&lt;p&gt;“Hanford’s ultimate triumph.”&lt;/p&gt;

&lt;p&gt;I cannot discard the technical impressiveness of the hanford project. The scale and speed of it’s construction, particularly when it is the &lt;em&gt;very first&lt;/em&gt; nuclear reactor ever made. Even the design, the handlettered signs, the tools and instruments that had to be created alongside the reactors themselves. It was certainly one of the most enormous technical undertakings and achievements of its time.&lt;/p&gt;

&lt;p&gt;But what of the giant elephant in the reactor. The invisible asterisk. The questioning of whether any amount of technical achievement can be considered worth the deaths of over 200,000 civilians. Surely that must make some mark in the mind not only of America, but of every nation in the world.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;The Manhattan project may have been the most impressive scientific and technical achievement of it’s time. It was certainly the most “impactful”, for good or bad. But I’m not so sure it can still hold the mantle, purely in terms of technical achievement. The internet, is surely vying for that position.&lt;/p&gt;

&lt;p&gt;Fortunately I don’t think the internet has had its Hiroshima. But I don’t think it is impossible.&lt;/p&gt;

&lt;p&gt;If we can’t even question and contrast the technology with the horrifying impact of the Manhattan project AFTER THE FACT. How are we going to question the impact and dangers that the technologies &lt;em&gt;which we are creating now&lt;/em&gt; will have on our lives?&lt;/p&gt;
</description>
				<pubDate>Fri, 09 Oct 2015 00:00:00 +0000</pubDate>
        <link>http://latentflip.com//manhattan</link>
        <guid isPermaLink="true">http://latentflip.com//manhattan</guid>
			</item>
		
			<item>
				<title>Twenty-Seven</title>
				<description>&lt;p&gt;Welp, there we have it, I am undeniably in my late twenties.&lt;/p&gt;

&lt;p&gt;Twenty-six was apparently destined to be a year of flux, the shortlist of things that happened include:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Float moved into our first “proper office” in TechCube.&lt;/li&gt;
  &lt;li&gt;We lost Tilly to cancer :(.&lt;/li&gt;
  &lt;li&gt;We found a new (grumpy) friend in Hogs Boson.&lt;/li&gt;
  &lt;li&gt;I took over the role as organiser for TechMeetup Edinburgh.&lt;/li&gt;
  &lt;li&gt;First wedding anniversary!&lt;/li&gt;
  &lt;li&gt;I spoke at RealtimeConf EU, my first international conference.&lt;/li&gt;
  &lt;li&gt;I was diagnosed with depression, started (and finished) a 6-month course of antidepressants, and started attending therapy.&lt;/li&gt;
  &lt;li&gt;I spoke at the Scottish Ruby Conference, and Scotland JS.&lt;/li&gt;
  &lt;li&gt;I flew to Richland, WA to meet the &amp;amp;yet crew, and gave a closing keynote at TriConf.&lt;/li&gt;
  &lt;li&gt;Hilary and I had an awesome family trip to Alaska and Washington State.&lt;/li&gt;
  &lt;li&gt;I flew back to the states (again) to help run RealtimeConf.&lt;/li&gt;
  &lt;li&gt;I became a Silver Medallion flyer on Delta, for spending so much time in the air. (Clearly an important achievement).&lt;/li&gt;
  &lt;li&gt;Float closed a £110k round of funding, and made it’s first hires.&lt;/li&gt;
  &lt;li&gt;I resigned from Float to join my heroes at &amp;amp;yet.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;learnings&quot;&gt;Learnings&lt;/h2&gt;

&lt;h3 id=&quot;fear&quot;&gt;Fear&lt;/h3&gt;

&lt;p&gt;Fear still drives a lot of my life, and decisions. Fear of failure. Fear of rejection. Fear of the unknown. Fear of what people will think of me. Fear of what I will think of me.&lt;/p&gt;

&lt;p&gt;With therapy, and practice, I am getting better at handling that fear. I suspect I will never get rid of it, but I can get better at managing it, and not letting it control my life. Looking back on it now, this year has involved some huge decisions, many of which almost went the other way for fear of what would happen if I made the “hard” choice. But despite the fear I had at the time, I am pleased and proud of every decision I have made, and they have all worked out far better than I expected them to at the time.&lt;/p&gt;

&lt;h3 id=&quot;just-keep-swimming&quot;&gt;Just keep swimming&lt;/h3&gt;

&lt;p&gt;I have lost count of the number of times I had an overwhelming desire to quit everything this year. Partly due to the fear, partly due to depression, partly due to the shit that life throws at us every day.&lt;/p&gt;

&lt;p&gt;Looking back over the last year, and where I am now, I am so grateful that I didn’t, and I just kept going. Being able to keep going was helped immensely by the people around me who have supported me and kept dragging me along, even when all I’ve wanted to do is give up. To those people, I have so much thanks, as I know I haven’t always been an easy person to drag along!&lt;/p&gt;

&lt;h3 id=&quot;the-world-is-equal-parts-awful-and-awesome&quot;&gt;The world is equal parts awful and awesome.&lt;/h3&gt;

&lt;p&gt;I am patently not the first person to realise this, but it’s a relatively new revelation to me.&lt;/p&gt;

&lt;p&gt;There is so much horror in this world. Natural disasters, human created horrors, awful acts of government, prejudice, racism, sexism, slavery, the list goes on.&lt;/p&gt;

&lt;p&gt;At times, those feelings are cripplingly depressing. How can one person even make a dent on any of those things? And if I can’t, how am I supposed to be happy with all of those things happening in the world.&lt;/p&gt;

&lt;p&gt;Fortunately, earlier this year, I had a hugely enlightening conversation with Adam Brault in a completely deserted (seriously, the staff even left) Figaro’s pizza, Pasco. The gist being that realistically there is so little that one person can do on the global scale to fix all these horrors. But if we focus more locally in the communities where we do have influence, we can make a real difference in people’s lives.&lt;/p&gt;

&lt;p&gt;This is something I took to heart this year. Sharing the stories of my depression openly, speaking at conferences, teaching as much as I can to new developers. All these little acts have reopened my eyes to some of the joy and beauty that can be found in individual people, as well as the true impact one person can make, even if the world, on the whole, is a disaster.&lt;/p&gt;

&lt;h3 id=&quot;people&quot;&gt;People&lt;/h3&gt;

&lt;p&gt;I’ve never considered myself a “people person”. I am introverted. I am a technologist. I like being on my own, and solving problems.&lt;/p&gt;

&lt;p&gt;Through therapy I have come to terms with the fact that a lot of my preference for being alone stems from assuming people don’t really like me, and have no good reason to. My therapist has challenged this assumption, and help me realize that I both have value in this world, and that there are many reasons for people to enjoy my company.&lt;/p&gt;

&lt;p&gt;This is still the start of a long road of recovery, but it’s a shift that feels so great. It’s a relief to be able to think “hey, I like people”. And in being open to that, I have realized how much joy and friendship there is in the people around me that I have been too blinded by fear to see for so many years.&lt;/p&gt;

&lt;h2 id=&quot;thanks&quot;&gt;Thanks&lt;/h2&gt;

&lt;p&gt;A lot of people have made this year a real journey of growth. I won’t name names as if I do I’ll miss somebody’s name out, but in short, if I have had more than a brief conversation with you in some form in the last 12 months, thank you.&lt;/p&gt;
</description>
				<pubDate>Wed, 27 Nov 2013 00:00:00 +0000</pubDate>
        <link>http://latentflip.com//twenty-seven</link>
        <guid isPermaLink="true">http://latentflip.com//twenty-seven</guid>
			</item>
		
			<item>
				<title>Moving On</title>
				<description>&lt;p&gt;Three weeks ago I shut down my computer at &lt;a href=&quot;http://floatapp.com&quot;&gt;Float&lt;/a&gt; for the last time, headed to a fab party organised by my, now ex, colleagues, and ended my tenure as “CTO” of the company I co-founded over 3 and half years ago.&lt;/p&gt;

&lt;p&gt;In the same meeting that I resigned, our company raised £110k from a private investor and I dissolved the majority of my shares.&lt;/p&gt;

&lt;p&gt;Many of the people I know were, perhaps rightly-so, a little confused. Why did I leave when it seemed we were doing pretty well? Had I been pushed out? Definitely not. Had I fallen out with my co-founder? Nope, we’re great friends. Did I dislike the investor? Nope, I think he’s pretty great actually.&lt;/p&gt;

&lt;p&gt;So, wtf was I doing?&lt;/p&gt;

&lt;h2 id=&quot;motivation-and-investment&quot;&gt;Motivation and Investment&lt;/h2&gt;

&lt;p&gt;In the startup community, you’d be forgiven for thinking that raising money is basically the &lt;em&gt;most important thing&lt;/em&gt;. I won’t go out and say that raising money is necessarily wrong, and I think in our case it was the right thing to do, but it definitely changes the game and the stakes. The success criteria for a startup that’s raised significant funding are somewhat different from one that hasn’t, and that didn’t fit for me personally. As much as I love Float, and what it’s trying to do,   the strength of my conviction and motivation was probably not such that I would be prepared to create a return on investment &lt;em&gt;at all costs&lt;/em&gt;. As such, it didn’t seem fair for me to sit as the CTO of a company which was promising to do all it could to increase the value of somebody’s &lt;em&gt;actual, real&lt;/em&gt; money.&lt;/p&gt;

&lt;h2 id=&quot;mental-health&quot;&gt;Mental Health&lt;/h2&gt;

&lt;p&gt;Over the last three and a half years I have grown more as a person than I have doing anything else in my life, but I have also struggled. No matter how easy you try to take it, founding a company takes a lot out of you, and couple that with being the only technical person on a team which has real, paying customers, and you’ve a recipe for pain. The thought of feeling locked in by my commitment to an investor, given my known struggles with mental health didn’t seem like a good idea.&lt;/p&gt;

&lt;h2 id=&quot;plateaus&quot;&gt;Plateaus&lt;/h2&gt;

&lt;p&gt;As the sole developer at Float, I learnt a &lt;em&gt;lot&lt;/em&gt;. All my Rails knowledge, all my JavaScript and Backbone knowledge, and a lot more besides was learnt, the hard way, at Float. But I could feel it beginning to plateau. I had nobody pushing me to improve, only myself. I felt I needed some different kinds of projects to force me to learn new things, some people around me to push me to be better, and some time to focus by not having to do &lt;em&gt;everything&lt;/em&gt; on a big project.&lt;/p&gt;

&lt;h2 id=&quot;yet&quot;&gt;&amp;amp;yet&lt;/h2&gt;

&lt;p&gt;By far the biggest reason for leaving, was meeting Adam, and Henrik from &amp;amp;yet. &amp;amp;yet was a company I came across back when we’d just started Float, and I remember thinking to myself: “if I learn enough doing this that they would even talk to me about giving me a job, that’d be enough for this to feel like a success”. Within two days of hanging out with Henrik in person he said something like “well, if you’re ever looking for a job, we’d totally hire you”.&lt;/p&gt;

&lt;p&gt;Over time, it became clear that &amp;amp;yet was the perfect company for me. They care about people above all else. They are completely bootstrapped and self directed. They care about the future of the web, and are actively working to drive it. They are all &lt;em&gt;really&lt;/em&gt; smart, but none of them really know what they are doing (in a good way!). Within a day of meeting the whole team I had never felt as comfortable, happy, or like I “fit in”, as much as I did with them, and that held for every single one of them.&lt;/p&gt;

&lt;h2 id=&quot;moving-on&quot;&gt;Moving on&lt;/h2&gt;

&lt;p&gt;Moving on was one of the hardest decisions of my life. Float is my baby, I have a huge amount of respect for my co-founder there, &lt;a href=&quot;http://twitter.com/colinhewitt&quot;&gt;Colin Hewitt&lt;/a&gt;, and he has helped me grow an enormous amount as a person. The decision was like coming to a fork in a road, and down one path led piles of delicious donuts, and the other, all the steaks I could eat; and when it came to it, Float and I had to choose a different path.&lt;/p&gt;

&lt;h2 id=&quot;thanks&quot;&gt;Thanks&lt;/h2&gt;

&lt;p&gt;Thank you to everyone who has supported Float, and me personally over the last few years. Each and every one of you deserves more thanks than I’ve possibly ever shown you in person.&lt;/p&gt;

&lt;p&gt;&amp;lt;3 Phil&lt;/p&gt;
</description>
				<pubDate>Thu, 21 Nov 2013 00:00:00 +0000</pubDate>
        <link>http://latentflip.com//moving-on</link>
        <guid isPermaLink="true">http://latentflip.com//moving-on</guid>
			</item>
		
			<item>
				<title>My brain on SSRIs</title>
				<description>&lt;p&gt;Nearly four months ago, I started taking antidepressants, 20mg of Citalopram to be precise.&lt;/p&gt;

&lt;p&gt;Citalopram is an &lt;a href=&quot;http://en.wikipedia.org/wiki/Selective_serotonin_reuptake_inhibitor&quot;&gt;SSRI&lt;/a&gt; which is a common type of antidepressant medication (Prozac is also an SSRI). They are believed to work by modifying how your brain reacts to the neurotransmitter serotonin, effectively increasing it’s potency in the brain, a shortage of which we &lt;em&gt;think&lt;/em&gt; may be the cause of major depression. Now the jury still seems to be out as to &lt;em&gt;how&lt;/em&gt; effective SSRIs are for treating depression, and I am not a doctor, but I can share my experiences with medication.&lt;/p&gt;

&lt;p&gt;The first time I went to my doctor about my depression, the idea of taking medication was terrifying. First there was the shame. Then the fear of taking something that would alter my brain, which is absolutely essential to my career: “what if the bit of my brain which makes me depressed is the bit that makes me intelligent?”&lt;/p&gt;

&lt;p&gt;After over a year of battling depression without medication, I was in an even worse place, and went back to my doctor. I had recently watched &lt;a href=&quot;http://programme2013.scottishrubyconference.com/proposals/86/video&quot;&gt;Greg Bauges’ excellent talk at Scottish Ruby Conference&lt;/a&gt; and was more prepared for the idea of medication. The doctor and I agreed that it was worth a try, as well as starting counselling.&lt;/p&gt;

&lt;p&gt;Here are some of the things I have experienced, good and bad, over the last four months.&lt;/p&gt;

&lt;h3 id=&quot;nausea-and-tiredness&quot;&gt;Nausea and tiredness&lt;/h3&gt;

&lt;p&gt;Serotonin affects a lot more than just your mood (90% of the serotonin in your body is found in the gut where it regulates intestinal movements), so changing the serotonin levels in your system can have a lot of &lt;a href=&quot;http://en.wikipedia.org/wiki/Selective_serotonin_reuptake_inhibitor#Adverse_effects&quot;&gt;side effects&lt;/a&gt; but thankfully for most people these only last as long as it takes for your body to readjust to the serotonin changes (about 2 to 4 weeks).&lt;/p&gt;

&lt;p&gt;Within 6 hours of taking my first pill, I felt noticeably nauseous. I was never sick, but I felt like I could be at any moment. It wasn’t crippling (I could still go to work) but I definitely felt grim.&lt;/p&gt;

&lt;p&gt;By the second day I was also yawning, a lot. The biggest, longest yawns I’ve ever had. According to my doctor, this is an often reported, if slightly odd, side-effect. I was a little tired, but nowhere near as tired as my huge yawns might have implied. (I seriously worried my jaw would dislocate sometimes).&lt;/p&gt;

&lt;p&gt;The nausea and yawning continued throughout the first week and a half, but got better over time - coming and going in waves, until it was unnoticeable after about two to three weeks.&lt;/p&gt;

&lt;h3 id=&quot;in-the-bedroom&quot;&gt;In the bedroom&lt;/h3&gt;

&lt;p&gt;If you read anything about SSRIs, you will probably notice discussion about their effect on libido and general sexual function. I definitely felt the effects of this for the first few weeks, however, I suspect that my reading things about it and worrying about how much of an issue it would be probably had a more detrimental effect than the medication actually did.&lt;/p&gt;

&lt;p&gt;Whatever the cause, it definitely sucked for the first month or so, but I feel back to normal now, which is a relief.&lt;/p&gt;

&lt;h3 id=&quot;dreams&quot;&gt;Dreams&lt;/h3&gt;

&lt;p&gt;I often have vivid dreams - particularly if I’m stressed - but they were nothing compared to some of the dreams I had in the first few weeks of medication.&lt;/p&gt;

&lt;p&gt;Fortunately the dreams weren’t particularly disturbing in and of themselves, but there’s something a little unnerving about having a very vivid memory of having done something, and then finding out you are remembering a dream. More than once I found myself looking for some food (cereal, crackers) that I was convinced I had bought the day before.&lt;/p&gt;

&lt;p&gt;It was a little disorienting a feeling at times, but the dreams seem to have settled down recently - at least I don’t remember them particularly.&lt;/p&gt;

&lt;h3 id=&quot;radio-silence&quot;&gt;Radio Silence&lt;/h3&gt;

&lt;p&gt;About 3 weeks in, I noticed short periods of total silence. Even when I am relaxed, my brain has always had a buzz to it. A sort of nagging feeling that there’s something I have to do, but have forgotten about. But these periods were different.&lt;/p&gt;

&lt;p&gt;If you want a sense of it, find a quiet room, put some headphones on and listen to some low volume &lt;a href=&quot;http://simplynoise.com/&quot;&gt;white noise&lt;/a&gt; for about 20 minutes - long enough for your brain to have become accustomed to it, so you’ve almost forgotten it’s on. Then mute your headphones. It feels like you’ve found something quieter than quiet. Like you have re-found true silence.&lt;/p&gt;

&lt;p&gt;For someone who’s spent his whole life with a brain buzzing away, those periods were refreshing and exciting - if frustratingly short lived.&lt;/p&gt;

&lt;h3 id=&quot;time-and-space&quot;&gt;Time and Space&lt;/h3&gt;

&lt;p&gt;Probably the biggest positive effect medication has had, is it feels like I have been given a little more time and space inside my head to work with. In depressive periods, I was never far off from being in a total funk.It would only take something small - a slightly bad day, seeing or hearing something upsetting, being low on energy for not having eaten enough - to end up feeling really down. These reactions were unavoidable.&lt;/p&gt;

&lt;p&gt;But the medication gives me a little time and space when things happen to consider how I want to react. It’s not always enough, sometimes a funk is unavoidable, but it feels like I now have a bit of a choice, just enough capacity to say - “you know what, I am not going to let this affect me” - and move on.&lt;/p&gt;

&lt;p&gt;This has been really helpful alongside counselling. Cognitive therapy is &lt;em&gt;hard work&lt;/em&gt;. Between sessions I typically have homework: to try and notice certain thinking patterns, or to change the way I respond or behave in certain situations to challenge how I approach the world. I don’t think I could be as effective at this as I am with the space that the medication provides in my head.&lt;/p&gt;

&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;

&lt;p&gt;This is not advice, just my story so far. I am a sufferer, not a doctor, so please go talk to a professional if you feel like you may be suffering from depression or any mental health problem. I just hope that sharing these stories helps take the fear and stigma out of mental health problems.&lt;/p&gt;

&lt;p&gt;Good luck! And if you ever want to talk, &lt;a href=&quot;mailto:phil@latentflip.com&quot;&gt;email me&lt;/a&gt;.&lt;/p&gt;

</description>
				<pubDate>Fri, 06 Sep 2013 00:00:00 +0000</pubDate>
        <link>http://latentflip.com//meds</link>
        <guid isPermaLink="true">http://latentflip.com//meds</guid>
			</item>
		
			<item>
				<title>Tropes and Narratives</title>
				<description>&lt;p&gt;Tropes are an essential part of storytelling. An author uses tropes as a starting point for story and character development. Defining what a trope is difficult in the abstract, so let’s just look at some examples.&lt;/p&gt;

&lt;p&gt;Some classic tropes are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;The damsel in distress&lt;/em&gt;: There is a damsel, she has been captured by some evil character, and the hero must rescue her to save the day (this is an often overused trope in video games in particular).&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;The superhero&lt;/em&gt;: A seemingly normal human character has been bestowed superhuman powers, and must save mankind from some evil force, who often has their own superpowers. Mankind is initially distrustful of the superhero, but comes to appreciate them once they save the day.&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;The superhero fight scene at the end of the movie&lt;/em&gt;: our superhero movie always ends with a final battle between good and evil. The fight goes back and forth, with it looking like a close call, but good wins in the end (see happy ending trope).&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;The kiss between superhero and love interest at the end of the superhero movie after the fight scene&lt;/em&gt;: tropes can cover just a single encounter.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While they may sound formulaic or cliched, tropes are very useful literary devices. By relying on concepts and narratives the viewer already knows they help the viewer settle in to a story. The viewer can feel comfortable with the story as they understand the basic storyline already - for we all know roughly how a rom-com plays out. This allows the reader to focus on the events elements and characters which make this story unique.&lt;/p&gt;

&lt;p&gt;A writer can also twist tropes - making an unexpected departure from the typical storyline to catch the reader off guard, or may avoid tropes altogether, particularly powerful for the main storyline. Consider a movie like Memento, where a character with short term memory loss must figure out what he’s doing, and the movie is played to us effectively backward, which is not a classic, or formulaic trope.&lt;/p&gt;

&lt;p&gt;Tropes and narratives are undoubtedly as old as stories themselves, and for storytelling they seem very effective and useful.&lt;/p&gt;

&lt;p&gt;I have been thinking a lot though, about narratives and tropes in “real life” and whether they are useful, or harmful.&lt;/p&gt;

&lt;p&gt;Each of us is undoubtedly unique - but we see tropes around us every day.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The strict father&lt;/li&gt;
  &lt;li&gt;The know it all&lt;/li&gt;
  &lt;li&gt;The high school drop out&lt;/li&gt;
  &lt;li&gt;The layabout.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are tropes from real-life that we all understand, and have either experienced, seen, or are at least aware of. Like in storytelling, these tropes can be helpful. We can infer how the quiet loner that we see at the office is likely to act at home, socialising, at the pub. We can surmise that a harsh father is perhaps not the best husband, or the kindest of souls.&lt;/p&gt;

&lt;p&gt;But there are a lot of downsides to labelling people, and seeing these tropes everywhere. They don’t allow for nuance - we assume the lazy layabout will be late with everything - even though they may just really enjoy taking it easy at the weekend and are otherwise well put together and punctual.&lt;/p&gt;

&lt;p&gt;The trope in reality also doesn’t account for our uniqueness. The power of a trope in storytelling is it allows the writer to more easily convey the uniqueness of the story and the characters. But I’m not so sure tropes for the real world do the same. Life is messy, we make snap judgements of people and situations. There is no master storyteller weaving a well put together over the course of 2 hours or 500 pages - with the time and space to convert that nuance. We spot laziness, we assume lazy in about 30 seconds.&lt;/p&gt;

&lt;p&gt;Breaking free from tropes is hard. During university I frequently broke things: I am tall with long clumsy limbs, and I am not particularly mindful. This became known as my “range of damage” - anything in that range was at danger from my flailing.&lt;/p&gt;

&lt;p&gt;At first it was an amusing narrative, I suppose. Whenever anything broke in a 10 foot radius of me it was attributed to my “range of damage” even if it was in no way my fault.&lt;/p&gt;

&lt;p&gt;Once a narrative is in place, we can’t help but fit things into that narrative. People love patterns, we can create them from randomness, so we want to fit things into a narrative. That mug broke when Phil picked it up - well it makes more sense that it’s was Phil’s fault as it fits his “range of damage” narrative pretty well.&lt;/p&gt;

&lt;p&gt;Eight years later, I have grown up, I have more control of my limbs, but the narrative stands. I still hear that phrase from time to time when things go awry (or nearly do), and perhaps will never escape it.&lt;/p&gt;

&lt;p&gt;The really stifling thing about tropes though, is when we start to believe them ourselves, and live our lives as if there is some path, some narrative that we are supposed to follow.&lt;/p&gt;

&lt;p&gt;This is especially insidious when the stories we believe to be true about ourselves are imposed on us by other people.&lt;/p&gt;

&lt;p&gt;As children growing up we absorb expectations, stories, tropes, about the way we are and the way we should be. When we are forming the meaning of “who we are” it is easy for us to believe these stories and take them to be our own.&lt;/p&gt;

&lt;p&gt;Growing up I built a story of &lt;em&gt;who I am&lt;/em&gt; based not on my own “plan” but on the stories and expectations other people held about me. The introvert. The high achiever. The potential doctor or high flying finance person. Only recently did I realise that my identity and “plan” was almost entirely constructed by other people, and that every experience decision and mistake I’ve made was compared to and squeezed into that narrative - rather than just being a part of my own story.&lt;/p&gt;

&lt;p&gt;Maybe it’s time to discard narratives. Do we need a story or a plan for our lives? Sure we can have goals, and values, and things we care about - but doesn’t having a predefined story restrict what we can be? The only story that really matters is the one that we live, and you can only know what it is once you’ve lived it.&lt;/p&gt;

&lt;p&gt;I’ll leave you with a really relevant quote from &lt;em&gt;Zen and the Art of Motorcycle Maintenance&lt;/em&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“Mountains like these and travelers in the mountains and events that happen to them here are found not only in Zen literature but in the tales of every major religion.&lt;/p&gt;

  &lt;p&gt;The allegory of a physical mountain for the spiritual one that stands between each soul and its goal is an easy and natural one to make.&lt;/p&gt;

  &lt;p&gt;Like those in the valley behind us, most people stand in sight of the spiritual mountains all their lives and never enter them, being content to listen to others who have been there and thus avoid the hardships.&lt;/p&gt;

  &lt;p&gt;Some travel into the mountains accompanied by experienced guides who know the best and least dangerous routes by which they arrive at their destination.&lt;/p&gt;

  &lt;p&gt;Still others, inexperienced and untrusting, attempt to make their own routes.&lt;/p&gt;

  &lt;p&gt;Few of these are successful, but occasionally some, by sheer will and luck and grace, do make it.&lt;/p&gt;

  &lt;p&gt;Once there they become more aware than any of the others that there’s no single or fixed number of routes.&lt;/p&gt;

  &lt;p&gt;There are as many routes as there are individual souls.”&lt;/p&gt;
&lt;/blockquote&gt;
</description>
				<pubDate>Mon, 22 Jul 2013 00:00:00 +0000</pubDate>
        <link>http://latentflip.com//tropes-and-narratives</link>
        <guid isPermaLink="true">http://latentflip.com//tropes-and-narratives</guid>
			</item>
		
			<item>
				<title>Bully</title>
				<description>&lt;p&gt;I am on a long haul flight, and for the first time in a long time, I cried while watching a movie. I’m not sure that there is a worst place you could watch a movie which makes you cry than a crowded, flying, aluminium tube.&lt;/p&gt;

&lt;p&gt;My memory of my school years is not great. I have an idea of the gist of what happened, but specific memories are sparse and hazy. But I do know that it hurt. I remember in primary school, about age 10, figuring out that there was a small space under some steps that I could hide and cry during lunch when I wasn’t having a good day. I remember frequently getting home and going straight to my room to hide under my covers and cry, so confused and sad and frustrated after a rough day. I remember questioning why the fuck I was on this earth, and seriously wondering if everyone wouldn’t be better off if I wasn’t.&lt;/p&gt;

&lt;p&gt;I was hardly ever hurt physically, but I was constantly either receiving, or afraid of, emotional abuse. I was a smart kid - straight A’s, top of the school in my final year and I was kinda goofy (at least I thought so). This gave plenty of ammunition for bullying. If I did well in a test, then I was obviously a swat, a nerd, and had been up all night studying instead of being cool. If I didn’t do the best in the class on a test then I was poked fun at for that. I was introverted and shy too which didn’t help my “popularity” as it were.&lt;/p&gt;

&lt;p&gt;During that time I came to believe that who I am is not okay. That I am faulty, a reject, destined to never fit in. I was absolutely convinced nobody but my parents would ever love me. Until recently I hadn’t appreciated how much that time still plays a part in how I view myself and the world and how I interact with other people. In almost every interaction with people my default assumption is that they dislike me, or are angry with me - even when there is no evidence to suggest that whatsoever - which means I have never got as close to friends as I wish I could.&lt;/p&gt;

&lt;p&gt;For a long time I’ve even been ashamed of the bullying I got. I’m not sure I ever got punched, certainly no blood was drawn that I can remember. If I mention to people that I was bullied, they will inevitably ask what happened, and I’ll say things like, “well, you know, I wasn’t hit or anything”. As if having a distorted view of the world and myself, having had a pretty crappy time at school, and being held back emotionally ever since isn’t “real pain”.&lt;/p&gt;

&lt;p&gt;I think that’s the tragedy of “emotional’ bullying. Trying to explain it, or give examples of what happened, doesn’t work. It sounds trite or silly. It sounds like a normal person would be able to brush it off. It’s very personal too, what one person can brush off can lead another kid to suicide. If you have never been seriously bullied, think of it like this:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Imagine going to work, every day, and being criticised. Every day. I know a lot of adults, and I know that we all struggle with receiving criticism of our work. It hurts, maybe only for a short while, but even very constructive criticism is hard to take.&lt;/p&gt;

  &lt;p&gt;Imagine that, every day. And then imagine that it’s not your work being criticised, but it’s you, just for being who you are. For being smart, for being fat, for being goofy, for being &lt;em&gt;you&lt;/em&gt;.&lt;/p&gt;

  &lt;p&gt;Now imagine that rather than being an adult, with a sense of self, and some core beliefs about yourself, and some self esteem - you are a kid. A kid who it still learning how the world works, trying to make friends in a weird place, trying to understand what they believe to be true about themselves.&lt;/p&gt;

  &lt;p&gt;And you are helpless. You don’t want to upset your parents, so you maybe hold back from telling them too much. You can’t fight back or you’ll get in trouble. The teachers maybe notice, but don’t seem to do much about it, and it hardly seems like getting your bullies in trouble is going to solve anything. You can’t just change school or stop going.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Only through my recent experiences with depression, and through seeking counselling, have I started to realise how much of an effect bullying has had on my life. I knew it had hurt me, but I don’t feel that stinging pain anymore, so I figured it must be “over”. I am now learning that while the pain may be over, I still view the world through a very dirty lens. My core beliefs about the world were forged at exactly the time when I was under a lot of negative emotional pressure. And once you are an adult those core beliefs are hard to budge, they certainly don’t move without a lot of retraining and willpower.&lt;/p&gt;

&lt;p&gt;The movie that just sent me into floods of tears on an Airbus A330 over Canada was Bully. It is a documentary that follows the stories of five children, and their families, who are dealing with bullying. It is a tragic reminder of the grip that bullying has on so many young people’s lives, and how inadequately adult society deals with it.&lt;/p&gt;

&lt;p&gt;Two of the stories covered were of children who had committed suicide, one aged eleven. The school board and police decided there was no evidence to suggest that bullying was a factor in his suicide - despite the fact that we are talking about an eleven year old committing suicide, and his best friend said he had been struggling with bullying, and on the day he killed himself was “really sad” about it.&lt;/p&gt;

&lt;p&gt;Another girl, an academically and athletically successful honors student, was so helpless in the face of bullying she resorted to taking her mother’s gun with her on the bus and threatening the entire schoolbus. I am certainly not going to condone violence, but the interviewed police officers response: “if she was getting beaten up then I could understand, but taking a gun is never, ever, a valid response to someone saying nasty things” was telling for me in showing just how misunderstood the mind still is, and how flippantly we often regard emotional abuse and mental health issues.&lt;/p&gt;

&lt;p&gt;Beyond the tragedy of the situations portrayed, Bully was particularly emotional for me as it helped me reflect on my experiences with bullying. Looking back on my own experiences is hard, and mixed up with poor memory, and my own prejudices - it’s easy to end up blaming myself. But hearing the stories of the children in Bully was a good reminder of just how vulnerable we are while our minds are still forming, and how the last person who should ever take blame for bullying is the victim.&lt;/p&gt;
</description>
				<pubDate>Fri, 12 Jul 2013 00:00:00 +0000</pubDate>
        <link>http://latentflip.com//bully</link>
        <guid isPermaLink="true">http://latentflip.com//bully</guid>
			</item>
		
			<item>
				<title>Farewell</title>
				<description>&lt;p&gt;There are few certainties in life except death.&lt;/p&gt;

&lt;p&gt;I was fortunate enough to not come face to face with death until I was
“grownup”, but the last few years have seen the unstoppable march of time
reclaim two grandparents.&lt;/p&gt;

&lt;p&gt;Two people who with joy welcomed me into their world and into their families.
Two people who both directly, and through my parents, undoubtedly shaped me
into the person I am today. Two people who cared for me and loved me probably
more than I will ever realise.&lt;/p&gt;

&lt;p&gt;Their passing came with an avalanche of emotions: helplessness, sadness,
memories, relief that their suffering was over, guilt that I hadn’t got to
know them as well as I could have. Dealing with their deaths took time, and
learning. Should I grieve for their deaths or reflect on their lives with joy?
Am I sad for them, or sad for me? Is that selfish, or normal, or expected?&lt;/p&gt;

&lt;p&gt;The grieving process showed me that death is the course, and curse, of life. That while
death is incredibly sad, it is also inevitable. It encouraged me to embrace my
new roles in this world as an adult and a husband, and to try and make the
most of the seemingly unending yet incredibly short time we are given as a
citizen of life.&lt;/p&gt;

&lt;p&gt;Today brought a new experience with death. The death of a friend who relied on
us for her survival. A friend who we cared for and loved more than she knew,
and possibly more than we knew. A friend who’s life, and death, was placed in
our hands, and to whom I hope we made the right decisions. A friend who never
said a word, yet brought joy to our lives. A friend who will leave a hole in
my heart far bigger than I would ever have realised.&lt;/p&gt;

&lt;p&gt;Farewell Tilly, you were the spikiest, grumpiest, cutest, stinkiest,
friendliest, and most unusual friend I’ve ever had. You will be missed, but I
am so glad to have known you, it was an honour.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://distilleryimage11.s3.amazonaws.com/9ac0ea2ca3fc11e19dc71231380fe523_7.jpg&quot; alt=&quot;Tilly&quot; /&gt;&lt;/p&gt;
</description>
				<pubDate>Fri, 12 Apr 2013 00:00:00 +0000</pubDate>
        <link>http://latentflip.com//farewell</link>
        <guid isPermaLink="true">http://latentflip.com//farewell</guid>
			</item>
		
			<item>
				<title>Imperative vs Declarative</title>
				<description>&lt;p&gt;Let’s generalize and say that there are two ways in which we can write code: imperative and declarative.&lt;/p&gt;

&lt;p&gt;We could define the difference as follows:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Imperative programming&lt;/strong&gt;: telling the “machine” &lt;em&gt;how&lt;/em&gt; to do something, and as a result &lt;em&gt;what&lt;/em&gt; you want to happen will happen.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Declarative programming&lt;/strong&gt;: telling the “machine”&lt;sup&gt;1&lt;/sup&gt; &lt;em&gt;what&lt;/em&gt; you would like to happen, and let the computer figure out &lt;em&gt;how&lt;/em&gt; to do it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;sup&gt;1&lt;/sup&gt; Computer/database/programming language/etc&lt;/p&gt;

&lt;h2 id=&quot;examples-of-imperative-and-declarative-code&quot;&gt;Examples of imperative and declarative code&lt;/h2&gt;

&lt;p&gt;Taking a simple example, let’s say we wish to double all the numbers in an array.&lt;/p&gt;

&lt;p&gt;We could do this in an imperative style like so:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;numbers&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;doubled&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;numbers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;length&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;newNumber&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;numbers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;doubled&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;newNumber&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;doubled&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;//=&amp;gt; [2,4,6,8,10]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We explicitly iterate over the length of the array, pull each element out of the array, double it, and add the doubled value to the new array, mutating the &lt;code class=&quot;highlighter-rouge&quot;&gt;doubled&lt;/code&gt; array at each step until we are done.&lt;/p&gt;

&lt;p&gt;A more declarative approach might use the &lt;code class=&quot;highlighter-rouge&quot;&gt;Array.map&lt;/code&gt; function and look like:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;numbers&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
 
&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;doubled&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;numbers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;n&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;doubled&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;//=&amp;gt; [2,4,6,8,10]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;map&lt;/code&gt; creates a new array from an existing array, where each element in the new array is created by passing the elements of the original array into the function passed to &lt;code class=&quot;highlighter-rouge&quot;&gt;map&lt;/code&gt; (&lt;code class=&quot;highlighter-rouge&quot;&gt;function(n) { return n*2 }&lt;/code&gt; in this case).&lt;/p&gt;

&lt;p&gt;What the &lt;code class=&quot;highlighter-rouge&quot;&gt;map&lt;/code&gt; function does is abstract away the process of explicitly iterating over the array, and lets us focus on &lt;em&gt;what&lt;/em&gt; we want to happen. Note that the function we pass to map is pure; it doesn’t have any side effects (change any external state), it just takes in a number and returns the number doubled.&lt;/p&gt;

&lt;p&gt;There are other common declarative abstractions for lists that are available in languages with a functional bent. For example, to add up all the items in a list imperatively we could do this:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;numbers&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;total&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;numbers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;length&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;total&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;numbers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;total&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;//=&amp;gt; 15&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Or we could do it declaratively, using the &lt;code class=&quot;highlighter-rouge&quot;&gt;reduce&lt;/code&gt; function:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;numbers&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;total&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;numbers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;reduce&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;sum&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;n&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;total&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;//=&amp;gt; 15&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;reduce&lt;/code&gt; boils a list down into a single value using the given function. It takes the function and applies it to all the items in the array. On each invocation, the first argument (&lt;code class=&quot;highlighter-rouge&quot;&gt;sum&lt;/code&gt; in this case) is the result of calling the function on the previous element, and the second (&lt;code class=&quot;highlighter-rouge&quot;&gt;n&lt;/code&gt;) is the current element. So in this case, for each element we add &lt;code class=&quot;highlighter-rouge&quot;&gt;n&lt;/code&gt; to &lt;code class=&quot;highlighter-rouge&quot;&gt;sum&lt;/code&gt; and return that on each step, leaving us with the sum of the entire array at the end.&lt;/p&gt;

&lt;p&gt;Again, &lt;code class=&quot;highlighter-rouge&quot;&gt;reduce&lt;/code&gt; abstracts over the &lt;em&gt;how&lt;/em&gt; and deals with the iteration and state management side of things for us, giving us a generic way of collapsing a list to a single value. All we have to do is specify &lt;em&gt;what&lt;/em&gt; we are looking for.&lt;/p&gt;

&lt;h2 id=&quot;strange&quot;&gt;Strange?&lt;/h2&gt;

&lt;p&gt;If you have not seen &lt;code class=&quot;highlighter-rouge&quot;&gt;map&lt;/code&gt; or &lt;code class=&quot;highlighter-rouge&quot;&gt;reduce&lt;/code&gt; before, this &lt;em&gt;will&lt;/em&gt; feel and look strange at first, I guarantee it. As programmers we are very used to specifying &lt;em&gt;how&lt;/em&gt; things should happen. “Iterate over this list”, “if this then that”, “update this variable with this new value”. Why should you have to learn this slightly bizarre looking abstraction when you already know how to tell the machine how to do things?&lt;/p&gt;

&lt;p&gt;In many situations imperative code is fine. When we write business logic we usually have to write mostly imperative code, as there will not exist a more generic abstraction over our business domain.&lt;/p&gt;

&lt;p&gt;But if we take the time to learn (or build!) declarative abstractions we can take dramatic and powerful shortcuts when we write code. Firstly, we can usually write less of it, which is a quick win. But we also get to think and operate at a higher level, up in the clouds of &lt;em&gt;what&lt;/em&gt; we want to happen, and not down in the dirty of &lt;code class=&quot;highlighter-rouge&quot;&gt;how&lt;/code&gt; it should happen.&lt;/p&gt;

&lt;h2 id=&quot;sql&quot;&gt;SQL&lt;/h2&gt;

&lt;p&gt;You may not realise it, but one place where you have already used declarative abstractions effectively is in SQL.&lt;/p&gt;

&lt;p&gt;You can think of SQL as a declarative query language for working with sets of data. Would you write an entire application in SQL? Probably not. But for working with sets of related data it is incredibly powerful.&lt;/p&gt;

&lt;p&gt;Take a query like:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;dogs&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;INNER&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;JOIN&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;owners&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;WHERE&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;dogs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;owner_id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;owners&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;id&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Imagine trying to write the logic for this yourself imperatively:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;//dogs = [{name: 'Fido', owner_id: 1}, {...}, ... ]&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;//owners = [{id: 1, name: 'Bob'}, {...}, ...]&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;dogsWithOwners&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;dog&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;owner&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;di&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;di&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;dogs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;length&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;di&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;dog&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;dogs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;di&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;oi&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;oi&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;owners&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;length&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;oi&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;owner&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;owners&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;oi&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;owner&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;dog&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;owner_id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;owner&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;nx&quot;&gt;dogsWithOwners&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;dog&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;dog&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;owner&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;owner&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Yuck! Now, I’m not saying that SQL is always easy to understand, or necessarily obvious when you first see it, but it’s a lot clearer than that mess.&lt;/p&gt;

&lt;p&gt;But it’s not just shorter and easier to read, SQL gives us plenty of other benefits. Because we have abstracted over the &lt;em&gt;how&lt;/em&gt; we can focus on the &lt;em&gt;what&lt;/em&gt; and let the database optimise the &lt;em&gt;how&lt;/em&gt; for us.&lt;/p&gt;

&lt;p&gt;If we were to use it, our imperative example would be slow because we would have to iterate over the full list of owners for every dog in the list.&lt;/p&gt;

&lt;p&gt;But in the SQL example we can let the database deal with &lt;em&gt;how&lt;/em&gt; to get the correct results. If it makes sense to use an index (providing we’ve set one up) the database can do so, resulting in a large performance gain. If it’s just done the same query a second ago it might serve it from a cache almost instantly. By letting go of &lt;em&gt;how&lt;/em&gt; we can get a whole host of benefits by letting computers do the hardwork, with little cognitive overhead.&lt;/p&gt;

&lt;h2 id=&quot;d3js&quot;&gt;d3.js&lt;/h2&gt;

&lt;p&gt;Another place where declarative approaches are really powerful is in user interfaces, graphics and animations.&lt;/p&gt;

&lt;p&gt;Coding user interfaces is hard work. Because we have user interaction and we want to make nice dynamic user interactions, we typically end up with a lot of state management, and generic &lt;em&gt;how&lt;/em&gt; code that could be abstracted away, but frequently isn’t.&lt;/p&gt;

&lt;p&gt;A great example of a declarative abstraction is &lt;a href=&quot;http://d3js.org/&quot;&gt;d3.js&lt;/a&gt;. D3 is a library that helps you build interactive and animated visualisations of data using JavaScript and (typically) SVG.&lt;/p&gt;

&lt;p&gt;The first time (and fifth time, and possibly even the tenth time) you see or try and write d3 code your head will hurt. Like SQL, d3 is an incredibly powerful abstraction over visualising data that deals with almost all of the &lt;em&gt;how&lt;/em&gt; for you, and lets you just say what you want to happen.&lt;/p&gt;

&lt;p&gt;Here’s an example (I recommend &lt;a href=&quot;http://bl.ocks.org/latentflip/5285027&quot;&gt;viewing the demo&lt;/a&gt; for some context). This is a d3 visualization that draws a circles for each object in the &lt;code class=&quot;highlighter-rouge&quot;&gt;data&lt;/code&gt; array. To demonstrate what’s going on we add a circle every second.&lt;/p&gt;

&lt;p&gt;The interesting bit of code is:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;//var data = [{x: 5, y: 10}, {x: 20, y: 5}]&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;circles&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;svg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;selectAll&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'circle'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;circles&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;enter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'circle'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
           &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;attr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'cx'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
           &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;attr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'cy'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;y&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
           &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;attr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'r'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;transition&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;duration&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;500&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
          &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;attr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'r'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;It’s not essential to understand exactly what’s going on here (it will take a while to get your head around regardless), but the gist of it is this:&lt;/p&gt;

&lt;p&gt;First we make a selection object of all the svg &lt;code class=&quot;highlighter-rouge&quot;&gt;circle&lt;/code&gt;s in the visualisation (initially there will be none). Then we bind some data to the selection (our data array).&lt;/p&gt;

&lt;p&gt;D3 keeps track of which data point is bound to which circle in the diagram. So initially we have two datapoints, but no circles; we can then use the &lt;code class=&quot;highlighter-rouge&quot;&gt;.enter()&lt;/code&gt; method to get the datapoints which have “entered”. For those points, we say we would like a circle added to the diagram, centered on the &lt;code class=&quot;highlighter-rouge&quot;&gt;x&lt;/code&gt; and &lt;code class=&quot;highlighter-rouge&quot;&gt;y&lt;/code&gt; values of the datapoint, with an initial radius of &lt;code class=&quot;highlighter-rouge&quot;&gt;0&lt;/code&gt; but transitioned over half a second to a radius of &lt;code class=&quot;highlighter-rouge&quot;&gt;5&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&quot;so-why-is-this-interesting&quot;&gt;So why is this interesting?&lt;/h3&gt;

&lt;p&gt;Look through the code again and think about whether we are describing &lt;em&gt;what&lt;/em&gt; we want our visualisation to look like, or &lt;em&gt;how&lt;/em&gt; to draw it? You’ll see that there is almost no &lt;em&gt;how&lt;/em&gt; code at all. We are just describing at quite a high level &lt;em&gt;what&lt;/em&gt; we want:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I want this data drawn as circles, centered on the point specified in the data, and if there are any new circles you should add them and animate their radius.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is awesome, we haven’t written a single loop, there is no state management here. Coding graphics is often hard, confusing and ugly, but here d3 has abstracted away most of the crap and left us to just specify &lt;em&gt;what&lt;/em&gt; we want.&lt;/p&gt;

&lt;p&gt;Now, is d3.js easy to understand? Nope, it definitely takes a while to learn. And most of that learning is in giving up your desire to specify &lt;em&gt;how&lt;/em&gt; things should happen and instead learning how to specify &lt;em&gt;what&lt;/em&gt; you want.&lt;/p&gt;

&lt;p&gt;Initially this is hard work, but after a few hours something magical happens - you become really, really productive. By abstracting away the how d3.js really lets you focus on &lt;em&gt;what&lt;/em&gt; you want to see, which frankly is the only thing you should care about when designing something like a visualisation. It frees you from the fiddly details of the &lt;em&gt;how&lt;/em&gt; and lets you interact with the problem at a much higher level, opening up the possibilities for creativity.&lt;/p&gt;

&lt;h2 id=&quot;finally&quot;&gt;Finally&lt;/h2&gt;

&lt;p&gt;Declarative programming allows us to describe &lt;em&gt;what&lt;/em&gt; we want, and let the underlying software/computer/etc deal with &lt;em&gt;how&lt;/em&gt; it should happen.&lt;/p&gt;

&lt;p&gt;In many areas, as we have seen, this can lead to some real improvements in how we write code, not just in terms of fewer lines of code, or (potentially) performance, but by writing code at a higher level of abstraction we can focus much more on &lt;em&gt;what&lt;/em&gt; we want, which ultimately is all we should really care about as problem solvers.&lt;/p&gt;

&lt;p&gt;The problem is, as programmers we are very used to describing the &lt;em&gt;how&lt;/em&gt;. It makes us feel good and comfortable - powerful, even - to be able to control what is happening, and not leave it to some magic process we can’t see or understand.&lt;/p&gt;

&lt;p&gt;Sometimes it’s okay to hold on to the &lt;em&gt;how&lt;/em&gt;. If we need to fine tune code for high performance we might need to specify the &lt;em&gt;what&lt;/em&gt; in more detail. Or for business logic, where there isn’t anything that a generic declarative library could abstract over, we’re left writing imperative code.&lt;/p&gt;

&lt;p&gt;But frequently we can, and I’d argue should, look for declarative approaches to writing code, and if we can’t find them, we should be building them. Will it be hard at first? Yes, almost certainly! But as we’ve seen with SQL and D3.js the long term benefits can be huge!&lt;/p&gt;

&lt;p class=&quot;acknowledgements&quot;&gt;
Huge thanks to &lt;a href=&quot;http://twitter.com/srbaker&quot;&gt;@srbaker&lt;/a&gt;, &lt;a href=&quot;http://twitter.com/maniacyak&quot;&gt;@maniacyak&lt;/a&gt; and &lt;a href=&quot;http://twitter.com/jcoglan&quot;&gt;@jcoglan&lt;/a&gt; for their thoughts, encouragement and editing of this post.
&lt;/p&gt;
</description>
				<pubDate>Tue, 02 Apr 2013 00:00:00 +0000</pubDate>
        <link>http://latentflip.com//imperative-vs-declarative</link>
        <guid isPermaLink="true">http://latentflip.com//imperative-vs-declarative</guid>
			</item>
		
			<item>
				<title>Learning To Learn</title>
				<description>&lt;p&gt;Last September I started learning to dive (as in at a swimming pool off of a diving board). Since then I have been at the pool for an hour every week in a coached lesson, and for another hour without a coach most weeks. My previous experience was basically nil, although I am very comfortable in the water.&lt;/p&gt;

&lt;p&gt;Since January I have been learning to play the piano. This has been without formal teaching, but my wife has been on hand to guide me through my learning. I had a small amount of prior experience, but I couldn’t read music when I started.&lt;/p&gt;

&lt;p&gt;As an (almost) adult, learning two new skills from scratch has been hugely rewarding, but also very frustrating at times. It’s also made me think a lot about learning, and how we learn.&lt;/p&gt;

&lt;h2 id=&quot;10000-hours-is-a-red-herring&quot;&gt;10,000 hours is a red herring&lt;/h2&gt;

&lt;p&gt;There’s a fairly well known belief that mastering something takes around 10,000 hours. This was popularised by Malcolm Gladwell in his book &lt;a href=&quot;http://en.wikipedia.org/wiki/Outliers_(book\)&quot;&gt;Outliers&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I am not going to refute this claim, but I don’t think that it’s a particularly useful metric. The first time I heard this claim, I immediately found a calculator and determined that racking up 10,000 hours would take about 30 years at an hour a day; or 7 years if you could average four hours a day. That is an incredibly daunting thought (particularly to a perfectionist like myself), but in reality we don’t need to &lt;em&gt;master&lt;/em&gt; a task to benefit from learning it.&lt;/p&gt;

&lt;p&gt;As an absolute upper bound, I have spent 56 hours in total learning to dive (it’s probably more like 40), and about 80 hours learning to read music and play the piano. And while I am a quick learner generally, I certainly haven’t been the fastest learner in my diving class!&lt;/p&gt;

&lt;p&gt;Am I a master? No. Will I ever be? Probably not. But has it been incredibly rewarding? Yes. Has my life improved as a result of learning these skills? Absolutely.&lt;/p&gt;

&lt;p&gt;I wonder if a much better metric is something like: less than a 100 hours to be a competent beginner, and having fun!&lt;/p&gt;

&lt;h2 id=&quot;feedback&quot;&gt;Feedback&lt;/h2&gt;

&lt;p&gt;Undoubtedly feedback is a big part of learning a new skill, for how can we learn if we don’t know that we haven’t done it right? Some skills have better implicit feedback loops than others (I would argue programming for example has a fairly poor feedback loop for beginners).&lt;/p&gt;

&lt;p&gt;Diving has a very interesting feedback loop. Some parts are obvious (and painful), for if you hit the water at the wrong angle you &lt;em&gt;will&lt;/em&gt; know about it. However, other parts are much less obvious: it takes a lot of practice to understand what your body is doing in the air, as it is all over very quickly, and you can’t see your body as you are diving. This makes learning new dives, and improving existing ones quite difficult.&lt;/p&gt;

&lt;p&gt;There are two things that help improve the feedback loop in diving: the first is a good coach, who can help explain where you went wrong, and how you should correct. The second is instant replay: on the higher diving boards at my pool there is a camera and tv which record your dive and play it back with a 30 second delay. This is incredibly useful for learning where you’ve gone wrong!&lt;/p&gt;

&lt;p&gt;There is a pretty tight feedback loop when playing the piano. If you know what the song should sound like, it’s fairly obvious if you’ve hit the wrong key (although as a very beginner I found even that to be less obvious than I would have expected at times). Knowing how to diagnose what’s causing you to make mistakes, and correcting for them is much harder though. Sometimes it’s as simple as my wife saying “if you play that note with your ring finger instead of your middle finger, it will be much easier” and the problem is instantly fixed.&lt;/p&gt;

&lt;h2 id=&quot;knowing-when-to-think&quot;&gt;Knowing when to think&lt;/h2&gt;

&lt;p&gt;For me diving is a constant battle between thinking very hard, and not thinking at all. Even with the simplest of dives, there are a lot of things to think about and remember if you want to do a good dive.&lt;/p&gt;

&lt;p&gt;But here’s the rub: as a beginner almost nothing about diving makes sense. The motions are all quite unnatural and intuitive, and I still don’t really understand how I can jump up, do a tuck, and enter the water head first within about a foot of the diving board and all in less than half a second. The moment I think about how impossible that sounds, is the moment my brain says “nope, can’t do this, this is ridiculous”. Add in a good dose of fear of heights and sometimes my brain won’t let me dive, no matter how much I want to.&lt;/p&gt;

&lt;p&gt;As such a lot of my diving practice is a tension between thinking about new elements of a dive, or the parts I want to improve, and not thinking at all about the rest of the dive and trusting that my body will just do the right thing.&lt;/p&gt;

&lt;p&gt;I have had similar experiences with the piano. Initially when learning to read music, and hit the right notes, it was incredibly difficult, and required a lot of thinking. But as I have improved I have noticed that some of my best playing is when I don’t think too much, and let my fingers just do what they need to do.&lt;/p&gt;

&lt;h2 id=&quot;joy&quot;&gt;Joy&lt;/h2&gt;

&lt;p&gt;But for me, the biggest factor in my learning has been how much I am enjoying myself.&lt;/p&gt;

&lt;p&gt;Some days I put way to much pressure on myself, and my focus is on getting better, rather than having fun. It’s generally on those days that I’ll over-think, get frustrated, and make no improvements at all. But on the days where I go in, possibly with something new I want to try, but a big smile on my face, that is when I truly learn.&lt;/p&gt;

&lt;p&gt;Go learn, smile, grow, and enjoy yourself. It’s worth it!&lt;/p&gt;

</description>
				<pubDate>Fri, 29 Mar 2013 00:00:00 +0000</pubDate>
        <link>http://latentflip.com//learning-to-learn</link>
        <guid isPermaLink="true">http://latentflip.com//learning-to-learn</guid>
			</item>
		
			<item>
				<title>Cutting Code</title>
				<description>&lt;h2 id=&quot;woodwork&quot;&gt;Woodwork&lt;/h2&gt;
&lt;p&gt;Sometimes I craft. Embracing the experience and process of breaking a problem down into code that can be committed to “paper”. When I am crafting code I care about how the code reads, how the pieces fit together, whether the pieces are rigorous and tested well. When I am crafting code I think, analyse, think, analyse, think, take two steps forward and three steps back.&lt;/p&gt;

&lt;p&gt;It’s slow progress initially, but over time things get easier. My understanding of the problem improves. The pieces I have already built tend to stay working. It can be deeply satisfying, but that satisfaction is mostly in the code, not in the result itself.&lt;/p&gt;

&lt;h2 id=&quot;whittling&quot;&gt;Whittling&lt;/h2&gt;
&lt;p&gt;Sometimes I create. To say it’s an art perhaps doesn’t give real artists enough credit, but it is &lt;em&gt;my&lt;/em&gt; art. Often I don’t know why I am creating. Some thread of thought, or new piece of technology, or something has come to my attention and I have to play with it, to see how it can be bent and forced and shaped into something creative.&lt;/p&gt;

&lt;p&gt;From the outside the process probably appears chaotic, and that’s because I don’t care about the process, I don’t even think about it. When I am creating I have no goals, no endpoint, no desire, just a drive to experiment. I don’t think about the code I am writing. I don’t care if it’s “good” or “bad” or “ugly”, I almost don’t consider it &lt;em&gt;my&lt;/em&gt; code. It’s like I am taking a random walk through a scrapheap of code fragments, picking up the interesting pieces and smushing them together until the result interests me in someway.&lt;/p&gt;

&lt;p&gt;For me, creation is a fast process. An hour, an evening, maybe the best part of a day. Not fast in terms of “how long does it take to get to a specific goal”, but fast in terms of change. New code is written quickly, without thought, code is thrown away just as quickly, the direction I am pointing changes constantly. It has to be a fast process, because if it is slow, or interrupted, all the pieces I have collected fall apart and get lost amongst the scrapheap, and I have to start over.&lt;/p&gt;

&lt;h2 id=&quot;felling&quot;&gt;Felling&lt;/h2&gt;
&lt;p&gt;Sometimes I hack. I hack when I have a very specific goal, and I just need to get there quickly. It’s like I am standing in front of a tree in a quiet forest, with a sharp axe, and my only goal is to get the tree to the forest floor as quickly as possible so I can head home again.&lt;/p&gt;

&lt;p&gt;This desire to be fast, rather than to take my time and craft a good solution, can be caused by different factors. How much do I care about this problem? How much energy do I have? Is somebody waiting on it? How likely is it that this hacking is going to come back and bite me? Am I going to need to look at this again in the future?&lt;/p&gt;

&lt;p&gt;Hacking is generally fast, but very linear. I know exactly where I need to get to, and I’ll hack and hack and hack until I get there. Sometimes there will be a big boulder that I have to work around, but I’ll immediately head back to the shortest possible path to the goal line.&lt;/p&gt;

&lt;h2 id=&quot;mending&quot;&gt;Mending&lt;/h2&gt;
&lt;p&gt;Sometimes I fix. Debugging software is simultaneously the most frustrating and deeply satisfying part of cutting code for me. Knowing that there is a bug somewhere in a huge amount of code that I am the owner of is deeply unsettling to a perfectionist, but the process of hunting and finding that bug requires understanding, insight, and surprising leaps of ingenuity–which is very satisfying.&lt;/p&gt;

&lt;p&gt;On the face of it, debugging is an incredibly slow process. One hour, two hours, half a day, two days. To write what? One line of code? One character even? But that doesn’t do justice at all to the act of debugging. For me debugging goes in bursts. From long slow periods of reading and thinking about a piece of code. To bursts of activity: lots of tweaks, and small changes, adding lines that will be removed later, to help prove or disprove assumptions and theories. It’s like trying to find your way out of a forest, where some paths are more obvious than others, and the right one might be the least obvious of all.&lt;/p&gt;

&lt;h2 id=&quot;the-right-choice&quot;&gt;The right choice&lt;/h2&gt;

&lt;p&gt;So which is right? How should we cut code? For me there is no &lt;em&gt;best&lt;/em&gt; way. But what is important is to think about what we are giving up when we write code in a certain way, or follow a certain process. And also what we gain.&lt;/p&gt;
</description>
				<pubDate>Wed, 13 Mar 2013 00:00:00 +0000</pubDate>
        <link>http://latentflip.com//cutting-code</link>
        <guid isPermaLink="true">http://latentflip.com//cutting-code</guid>
			</item>
		
			<item>
				<title>Leadership and Communities</title>
				<description>&lt;blockquote&gt;
  &lt;p&gt;&lt;em&gt;I was honoured to be invited by &lt;a href=&quot;http://twitter.com/mr_urf&quot;&gt;Alan Gardner&lt;/a&gt; to speak at &lt;a href=&quot;http://www.northernlightsconf.co.uk/&quot;&gt;Northern Lights, an amazing little conference he organised&lt;/a&gt; in Aberdeen last week.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;em&gt;This is a rough transcript from the (unrecorded) talk I gave about leadership and communities.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;##~&lt;/p&gt;

&lt;p&gt;I want to talk about leadership. And I want to talk about you.&lt;/p&gt;

&lt;p&gt;For things to happen we often need a leader. Not necessarily an omnipotent dictator, but even for good things to happen, someone needs to take a chance and say “hey, things should be different around here, and I think it should look like &lt;em&gt;this&lt;/em&gt;”.&lt;/p&gt;

&lt;p&gt;The trouble is that we often think of leaders the way that hollywood likes to present them, and that is that they are the heroes, the chosen ones.&lt;/p&gt;

&lt;p&gt;Take the matrix. Fate has come together and decided that Neo is the chosen one, the one who has the power to make a difference.&lt;/p&gt;

&lt;p&gt;He has a few mere mortals to help him along, but anyone else in this universe is destined to live a life that &lt;em&gt;depends&lt;/em&gt; on his leadership. &lt;em&gt;We&lt;/em&gt; don’t have the power to change things, that’s up to the chosen few.&lt;/p&gt;

&lt;p&gt;We can see the same thing in our culture of celebrity and of hero worship. We take such interest in our heroes for two reasons.&lt;/p&gt;

&lt;p&gt;Firstly they are aspirational. Which is a good thing. Tom Preston-Werner, who spoke here last year, is clearly incredible. He started Github, which is not only making a bunch of money, and helping every developer I know, but they are also creating an amazing team and culture around building great software.&lt;/p&gt;

&lt;p&gt;As the founder of a startup I look up to people like Tom in awe.&lt;/p&gt;

&lt;p&gt;But the second reason that we take such interest in our heroes, is that we think they are special, that like Neo, they are the chosen ones.&lt;/p&gt;

&lt;p&gt;It’s not that Tom was a normal John Smith like us, who took a chance, worked hard, and with a bit of good luck made it to where he is today. Tom must be special in some way, the stars have aligned for him in a way that could never happen for us. His position is unattainable. And that too leaves us in awe.&lt;/p&gt;

&lt;p&gt;But this is patently wrong, right? Tom was not chosen by the universe as the founder of Github. Tom chose himself. In the nicest possible way, 5 years ago, Tom was a nobody. But along with a couple of his friends, he saw something that interested him and that he thought could be better, and ran with it.&lt;/p&gt;

&lt;p&gt;So what are &lt;em&gt;you&lt;/em&gt; interested in? What can you be the leader of? It doesn’t have to be a startup like Github. Starting things within your community is a great place to start, as you can immediately make a positive impact on yourself, the people around you, and the wider tech community in which you sit.&lt;/p&gt;

&lt;p&gt;Edinburgh’s tech scene has been growing and changing a lot over the last few years, and we have some great examples of leaders who have grown community projects from nothing.&lt;/p&gt;

&lt;p&gt;One of the earliest, and most successful, has been TechMeetup. TechMeetup was started by Sam Collins along with his co-founder at the time Arnav Khare. Sam felt lonely as one of the few startups in Edinburgh back in 2008 so started tech meetup so that he could connect with other techies in the city.&lt;/p&gt;

&lt;p&gt;At the first TechMeetup, Sam persuaded a couple of people to talk, convinced the uni to give him a space, and found a little cash to pay for some beer and pizza. That was it. And it has now expanded to Aberdeen and Glasgow, and in Edinburgh we get between 50 and a hundred people attending every month.&lt;/p&gt;

&lt;p&gt;At the slightly more ambitious end of the scale we have TechCube. TechCube is an incubation space for startups, which literally opened this week.&lt;/p&gt;

&lt;p&gt;Now TechCube’s foundation and history, is a little complex. But without one man, Olly Treadway, who was ballsy enough to look at the empty shell of a building and say “this would be a great space for startups” it would not be open this week.&lt;/p&gt;

&lt;p&gt;For my own part, I am currently trying to start TechSupport. TechSupport is an emotional support network for developers and founders to help them deal with the non-technical aspects of life in the startup world: stress, depression, burnout, and personal growth.&lt;/p&gt;

&lt;p&gt;And there are many other groups in Edinburgh. Most of the popular programming languages have their own meetups; there is StartupCafe a blog covering edinburgh’s tech scene and startups. All started by people who saw a need in the community, and decided to fill it.&lt;/p&gt;

&lt;p&gt;Ultimately things don’t just happen in a community. No matter how many good people you have around, it still takes someone to stick there head up and say “you know what, there should be an x for y, and maybe nobody else cares, but I’m going to try and start it”.&lt;/p&gt;

&lt;p&gt;So what’s holding &lt;em&gt;you&lt;/em&gt; back?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Maybe you don’t know what to start?&lt;/strong&gt; That’s okay, just kick around and be a good member of the community until you feel like “hey, I wish I could learn from other people about this”.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fear.&lt;/strong&gt; This is undoubtedly a big one. “What if people don’t like my idea?”, “What if it’s a boring meetup?”, “What if it doesn’t work out?”.&lt;/p&gt;

&lt;p&gt;The nice thing about communities, is that if you go about it in a constructive and positive manner, people will want you to succeed.&lt;/p&gt;

&lt;p&gt;And even if you fail, they really won’t hate you for it, I promise. We’ve had a number of failed new meetups in Edinburgh. We tried night owls for a while, where people would hack together on side projects late into the night, but it didn’t really work out. and I’ve been a part of numerous “let’s work through this book and we’ll chat about it every week” and never got more than halfway through the book.&lt;/p&gt;

&lt;p&gt;Sure they were ultimately &lt;em&gt;“failures”&lt;/em&gt; but really they were successes. We tried something. We got to know each other a little better. We all learned some stuff. But we certainly didn’t hate people for having the idea, even if it didn’t work out.&lt;/p&gt;

&lt;p&gt;This fear thing is really hitting home with me at the moment with TechSupport.&lt;/p&gt;

&lt;p&gt;I have been really slow about getting the group started, even though I know I have supporters. And that’s ultimately because I am scared.&lt;/p&gt;

&lt;p&gt;I am trying to tackle a really important issue in our community, which is people people coming to terms with burnout, and depression, and stress - and that’s not an easy topic to talk about.&lt;/p&gt;

&lt;p&gt;I have had to open up and be really honest about who I am. I have had to stand up and say, “Hey, I struggle with this stuff, and I am sure other people do to, so who wants to do something about it?”&lt;/p&gt;

&lt;p&gt;I am scared that it won’t be helpful for people. I am scared of getting it wrong, of making things worse instead of better.&lt;/p&gt;

&lt;p&gt;I certainly haven’t done that for direct career advancement, or for direct personal gain, but because I care about it, I care about other people in my community and I want to help them, and I am prepared to put myself on the line to try and do that.&lt;/p&gt;

&lt;p&gt;But I feel the biggest blocker in the tech world for people starting anything, whether it’s companies, or community projects, or even side projects, is that they think they aren’t good enough.&lt;/p&gt;

&lt;p&gt;With things like hacker news, we are constantly exposed to what everyone else is doing online, that it’s easy to feel like everyone is smarter than you. That everyone has cooler side projects, and more successful businesses than you do.&lt;/p&gt;

&lt;p&gt;When you feel that way about the world, it’s hard to start things. You can feel like somehow you don’t have the right to start something, because you aren’t the best or the smartest person to do it.&lt;/p&gt;

&lt;p&gt;But here’s the kicker. You are the best you that there is in this world. Nobody else has your weird combination of knowledge, and experience, and background, and interests as you do. Nobody.&lt;/p&gt;

&lt;p&gt;You are the best you that there is in the world, so please share that with the rest of us in some way. I guarantee that people will be glad that you did.&lt;/p&gt;

&lt;p&gt;Thank you.&lt;/p&gt;
</description>
				<pubDate>Fri, 30 Nov 2012 00:00:00 +0000</pubDate>
        <link>http://latentflip.com//leadership-and-communities</link>
        <guid isPermaLink="true">http://latentflip.com//leadership-and-communities</guid>
			</item>
		
			<item>
				<title>Startup lessons learned after two and a half years</title>
				<description>&lt;ul&gt;
  &lt;li&gt;Two and a half years ago I wrote my first line of code.&lt;/li&gt;
  &lt;li&gt;Two years ago we incorporated “The Float Yard Ltd”&lt;/li&gt;
  &lt;li&gt;20 months ago I quit my job&lt;/li&gt;
  &lt;li&gt;13 months ago we had our first paying customer&lt;/li&gt;
  &lt;li&gt;Last month we hit 100 paying customers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Regardless of it’s future successes or failures, starting &lt;a href=&quot;http://floatapp.com&quot;&gt;Float&lt;/a&gt; has been one of the best decisions I have ever made. The last two and a half years have pushed me to the limit emotionally (both positively and negatively) but there are few paths I could have taken in that time that would have taught me as much about life, myself, software development and business as this one has.&lt;/p&gt;

&lt;p&gt;If you are thinking about founding a startup yourself, I am afraid I don’t have much concrete advice. My best is this. Nobody wants you to take that leap: your parents probably won’t understand, and will be scared; your friends won’t understand why you would wish to do &lt;em&gt;more&lt;/em&gt; work for &lt;em&gt;less&lt;/em&gt; money; and you yourself probably won’t have a clue what you’re thinking. So: don’t overanalyze, but be smart about it; start small; know what plan B is; and listen to your heart/gut/gods - the right time will make itself apparent.&lt;/p&gt;

&lt;p&gt;It’s somewhat easier to give you advice once you have made the initial leap, although as a first time founder myself, consider these as lessons learned, and things to think about, rather than a concrete guide to success, riches and fame (heck I am not even there yet myself!).&lt;/p&gt;

&lt;h2 id=&quot;team&quot;&gt;Team&lt;/h2&gt;

&lt;p&gt;It’s a total cliché in the startup world, but it’s all about people (although what in life isn’t?).&lt;/p&gt;

&lt;p&gt;I am hugely fortunate to have a great cofounder in Colin. We weren’t best friends when we started, but we had worked together on some projects, it was clear that our skill sets were complementary to each other, and we got on pretty well. I still think that despite that basic due diligence we got lucky.&lt;/p&gt;

&lt;p&gt;Starting a company is &lt;em&gt;really&lt;/em&gt; hard work. So it’s not just a case of finding someone who can pick up the stuff you can’t do, and splitting the work between you. There is an enormous amount of uncertainty in early stage businesses, which is really hard to battle through and find the right path. You &lt;em&gt;will&lt;/em&gt; fight, fall out, disagree, get frustrated, have bad days - it’s the nature of smart people working together to solve hard problems.&lt;/p&gt;

&lt;p&gt;Fortunately our relationship is now at the point where we can discuss openly how we are feeling, what’s pissing us off about the other, and we can work together to resolve our frustrations and move on. I wouldn’t say we are &lt;em&gt;best friends&lt;/em&gt; but Colin’s arguably the person in the world who I would most comfortable having just about any conversation with. It’s taken time to get to that point, and in many ways I think we are lucky to be here now, but it makes us a very strong and open team who can work to solve really hard problems.&lt;/p&gt;

&lt;h2 id=&quot;dont-sweat-the-big-stuff&quot;&gt;Don’t sweat the big stuff&lt;/h2&gt;

&lt;p&gt;What seems big and important often turns out to be not very important at all. New startup just raised $1 million in your space, all over TechCrunch: I bet your potential customers have no idea.  Launching: big and scary right? Probably nobody will notice. Different product just launched with the same name as you: It’s happened to us, twice; total impact so far: none.&lt;/p&gt;

&lt;p&gt;The point is, these big things seem big and important - but they will happen over and over and most of the time they will fizzle out to nothing . Try and avoid expending huge amounts of emotional energy freaking out. Be aware, note what’s happened, make changes if necessary, move on. Far more important to you, little startup, is whether your potential customers &lt;em&gt;actually&lt;/em&gt; care about what you are doing - which is a much easier thing to ignore, but vastly more important.&lt;/p&gt;

&lt;h2 id=&quot;get-to-know-your-customers&quot;&gt;Get to know your customers&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Really&lt;/em&gt; get to know them. We know the first names of most of the people paying for Float. We have exchanged emails with almost all of them, skyped/phoned a good number, and have met quite a few in person.&lt;/p&gt;

&lt;p&gt;This is important for a number of reasons.&lt;/p&gt;

&lt;p&gt;Firstly it’s just damn good customer service. Can your customers speak to someone at Google on the phone? Not likely. There you go, instant win for your scrappy little startup.&lt;/p&gt;

&lt;p&gt;There have been a number of occasions where I have offered to phone a customer who’s trying out Float but is having difficulties. Within 5 minutes, I have solved their problem, got to know them a little, and as soon as I put the phone down they sign up for a paid account - citing our great customer service. It’s not easy in a small team, and it can be frustrating, but it works.&lt;/p&gt;

&lt;p&gt;Getting inside your customers’ heads also really helps you build great products. I now have 5 or 6 customers in my head who I know inside out - what they do, how big their team is, what they worry about, what makes them happy. This really helps when we are thinking about how to improve Float. I can run a quick test in my head: “How would Bob feel about this new feature? Would he care? Would it work for him?”&lt;/p&gt;

&lt;p&gt;As an early stage startup, one of the key questions you should be solving for is “do potential customers care about what I am building?” and by extension “do they care about it enough for them to actually take the effort to integrate it into their lives and pay me for it?”. It’s &lt;em&gt;really&lt;/em&gt; hard to answer this if you don’t get to know your customers.&lt;/p&gt;

&lt;p&gt;One trap we’ve fallen into is asking for feedback as a replacement for getting to know our customers. Asking for feedback feels like you are developing a relationship, it feels like useful information. And it’s useful to some extent, but people are really bad at telling you what they would do/have done - they may tell you it’s &lt;em&gt;critical&lt;/em&gt; that you add feature X to your app - and then never actually use it once you have done so.&lt;/p&gt;

&lt;p&gt;It’s also important that you get to know the right customers: those who will actually pay! When we started building Float, we let companies use it for free for a long time while we improved the product. Eventually we started charging people, even though we still weren’t very happy with the product. Our main reason for deciding to charge people was less to make some money, but more to ensure we were listening to the right people, not just people who would say they wanted features X, Y and Z but would never actually pay for the product.&lt;/p&gt;

&lt;h2 id=&quot;omg-metrics&quot;&gt;OMG Metrics&lt;/h2&gt;

&lt;p&gt;Once you get beyond a certain size, it’s impossible to deeply understand how every customer feels about your product. And often you will have people try your product who never tell you at all how they felt about it.&lt;/p&gt;

&lt;p&gt;To solve this you need metrics - measurements of what people do in your product. The trouble with metrics is that it’s &lt;em&gt;really&lt;/em&gt; easy to start gathering a &lt;em&gt;lot&lt;/em&gt; of data. Cut and paste the Google Analytics tracking code, and Mixpanel, and Clicky, and Kissmetrics, and some others for good measure and you’d be forgiven for thinking “well that was easy, metrics: check!”.&lt;/p&gt;

&lt;p&gt;The trouble is, as a team of two or three, and no statisticians in sight, it’s hard to take that data and make much sense of it. It’s much more useful to analyze your business first, and think about the key indicators for how well you are doing, the key things you want to improve, and figure out how to measure those.&lt;/p&gt;

&lt;p&gt;For Float at the moment, we care about:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;How many people come to our homepage?&lt;/li&gt;
  &lt;li&gt;How many of those click through to our “Signup for your free trial” page?&lt;/li&gt;
  &lt;li&gt;How many of those actually fill in the signup form and get their account setup?&lt;/li&gt;
  &lt;li&gt;How many of those come back and check in on their Float account in the future?&lt;/li&gt;
  &lt;li&gt;How many of those actually pay us?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Five things&lt;/em&gt;, just those 5 things are a great start for us. We can immediately see where we are losing people in the process from hearing about us to giving us money. We can make guesses about how to improve those numbers: “let’s put the signup form on the homepage to remove a barrier” and see what difference it makes.&lt;/p&gt;

&lt;p&gt;Currently I get these numbers emailed to me every day, and I can paste it into a spreadsheet that does some simple analysis. Sexy? No! Smart dynamic live-updating websockety real-time live customer dashboard? No! Useful? Hell yeah.&lt;/p&gt;

&lt;h2 id=&quot;start-marketing-now&quot;&gt;Start marketing now&lt;/h2&gt;

&lt;p&gt;When you’re working on your product, you’ve got some beta testers, it looks shit but you’re making progress, and you’ve a huge list of things you want to do, it’s easy to put off marketing.&lt;/p&gt;

&lt;p&gt;“We’re not ready for loads of customers yet”&lt;/p&gt;

&lt;p&gt;“We’ve too much to do to be marketing”&lt;/p&gt;

&lt;p&gt;“Let’s wait till the product is great, then marketing will be easier”&lt;/p&gt;

&lt;p&gt;The truth is, marketing is really hard. It takes time to work, it can be hard to know when it is working, and you don’t see instant results so it doesn’t &lt;em&gt;feel&lt;/em&gt; very productive.&lt;/p&gt;

&lt;p&gt;Getting started earlier, and doing a little as you go along is, I think, a much better strategy than waiting till you launch. It gives you time to learn about what works and what doesn’t, it let’s you learn about the process and get better at it, and it gives your marketing time to work.&lt;/p&gt;

&lt;h2 id=&quot;thats-all-folks&quot;&gt;That’s all folks&lt;/h2&gt;

&lt;p&gt;Those are my burning “lessons learned” from two and a half years as cofounder of a startup. I &lt;em&gt;certainly&lt;/em&gt; have a lot more to learn, and any thoughts, suggestions or criticisms are more than welcome.&lt;/p&gt;

&lt;p&gt;And finally, I can be a bit rubbish at networking, but I love talking to people who are interested in just about anything. If you want to chat about any of this stuff, just grab me on &lt;a href=&quot;http://twitter.com/floatapp&quot;&gt;twitter&lt;/a&gt;, or drop me an &lt;a href=&quot;mailto:phil@latentflip.com&quot;&gt;email&lt;/a&gt;.&lt;/p&gt;
</description>
				<pubDate>Fri, 19 Oct 2012 00:00:00 +0000</pubDate>
        <link>http://latentflip.com//startup-lessons-learned</link>
        <guid isPermaLink="true">http://latentflip.com//startup-lessons-learned</guid>
			</item>
		
			<item>
				<title>Rejection</title>
				<description>&lt;p&gt;I was at the pool, waiting to dive, behind maybe 6 or 7 others, all younger than me, mostly female.&lt;/p&gt;

&lt;p&gt;A young guy, maybe 16, steps up to the diving board. In my mind his name is Alex. Alex is a cool looking kid; slim, slightly tanned, trendy white boardshorts, scruffy blond surfer hair. Slightly goofy maybe, as most 16 year olds are, but cool.&lt;/p&gt;

&lt;p&gt;Alex shuffles to the end of the diving board. He glances nervously to the poolside at an older lady, presumably his mother, who is willing him on.&lt;/p&gt;

&lt;p&gt;At this point it becomes clear Alex has never dived off a diving board before. As he looks down at the water, just a meter below, fear manifests throughout his body. His feet turn inwards, his knees buckle, his back curls forwards. Will he jump?&lt;/p&gt;

&lt;p&gt;Everyone is watching, and just as it looks like he’s about to go, he chickens out and turns away from the water. “Go on, you’ll be fine” his mother calls, the girls giggle, the young boy who is next inline grows impatient.&lt;/p&gt;

&lt;p&gt;It is at this moment that I can see myself, as a younger man, in Alex’s “shoes”. I know that it’s not the fear of the water that’s putting him off. It is the fear of the unknown, the fear of failure, of acceptance or rejection that irks him. Will he make a fool of himself in front of these girls, the children, and his mother? That is what he is scared of, not the water. Sure the water, and the height, has triggered his fear, but it’s not what’s stopping him now, what’s stopping him is internal.&lt;/p&gt;

&lt;p&gt;Alex turns back and walks to the end of the diving board, leans forward, and readopts his pose of fear.&lt;/p&gt;

&lt;p&gt;I know what his mind is saying. It’s wishing that the world would melt away. That me, his mum, the girls, the children would just vanish, leaving just him, the board and the water. So that he could be free to finish this dirty, horrible deed in peace, any way he wants to, and in his own time.&lt;/p&gt;

&lt;p&gt;But it is not to be. We are all still here: his mother willing, the girls giggling, the children growing impatient, me psychoanalysing.&lt;/p&gt;

&lt;p&gt;Alex goes quiet. He seems to have accepted his fate. The fear of rejection at performing a “bad” dive is less than the fear of rejection from giving up and walking away in front of us all.&lt;/p&gt;

&lt;p&gt;He tips forward, performs an awkward jump and splashes inelegantly into the water. Inelegant, but he’s done it! His mother and I smile; the girls laugh a little, but not in a mean way, and quickly get back to their own chatter; the children hardly register, so impatient for their own turns.&lt;/p&gt;

&lt;p&gt;Alex resurfaces, his first words are not “awesome!” or even “yes!” but “I failed!”, and with half a smile he punches the water. Again, “I failed!”.&lt;/p&gt;

&lt;p&gt;Alex’s mind has almost completely bifurcated at this point. One half is silently pleased, glad that he jumped at all, even if it sucked, and feeling a surge of adrenaline from the stunt. But the vocal half of his mind, that has been shaped by his 16 years in this world, and millions of years of evolution, has kicked into “rejection protection” mode. It has anticipated that his mother, the girls, the children, and I, would all be laughing at him uncontrollably, and shunning him from our lives forever more - kicking him out of the tribe. In a last ditch effort for acceptance, and to protect himself, he cries “I failed!”, as if the rejection is justified.&lt;/p&gt;

&lt;p&gt;His cry of failure cuts me deeper than I expect. In it I see my cries of failure, my tears of frustration in years gone by at my inability to just achieve things on the first, second, tenth try and to be accepted. As if we are all born perfect divers, skateboarders, mathematicians, lovers. As if the fact that we tried at all, even if we failed, is unimportant. How ridiculous a life to lead. To think that we should be perfect on our first, second even hundredth try. What a world this would be if we perfected everything instantly. How trivial, how easy, how boring!&lt;/p&gt;

&lt;p&gt;I know now what I should have done. What would have made Alex, myself and possibly everyone else feel much better about the world at that point. I should have congratulated him in his attempt. I should have walked over to him as he got out of the pool, stuck up my hand for a high-five, and said “good job! now go do it again”, with a big sincere smile on my face.&lt;/p&gt;

&lt;p&gt;But I didn’t. I didn’t even think about it, but next time, I will.&lt;/p&gt;

&lt;p&gt;Good job Alex, good job.&lt;/p&gt;

</description>
				<pubDate>Mon, 20 Aug 2012 00:00:00 +0000</pubDate>
        <link>http://latentflip.com//rejection</link>
        <guid isPermaLink="true">http://latentflip.com//rejection</guid>
			</item>
		
			<item>
				<title>Lightning</title>
				<description>&lt;p&gt;I researched and talked about lightning today, here is what I learned. Caveat, &lt;a href=&quot;http://en.wikipedia.org/wiki/Lightning&quot;&gt;I am not a meteorologist&lt;/a&gt;. I have embedded the slides, and I’ve roughly transcribed some notes to go along with them.&lt;/p&gt;

&lt;script async=&quot;&quot; class=&quot;speakerdeck-embed&quot; data-id=&quot;4ff0b5550b4f3b001f015a55&quot; data-ratio=&quot;1.3333333333333333&quot; src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;

&lt;h3 id=&quot;negative-lightning&quot;&gt;Negative Lightning&lt;/h3&gt;

&lt;p&gt;The most common kind of lightning is negative lightning, here’s how it forms. A cloud is a big floating heap of ice or water particles that are constantly bashing into each other. There is some debate about this, but it seems that when two particles bump into each other, electrical charge is transferred from one to the other, leaving positively and negatively charged particles in the clouds.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;Typically the larger particles end up negatively charged, and smaller, lighter particles end up positively charged. The larger particles tend to sit lower in the cloud than the smaller ones, so the cloud ends up being negatively charged closer to the ground.&lt;/p&gt;

&lt;p&gt;Over time, this charge builds up, and even starts to cause the ground to become positively charged, as more positive charge is attracted towards the negatively charged cloud.&lt;/p&gt;

&lt;p&gt;Sometimes, the electric field between the cloud and the ground will be high enough, such that streams of negative charge will head towards the ground, this is called a stepped ladder. If the eletric field is strong enough, streams of positive charge will even start to head up from the ground towards the clouds (typically from high, well earthed structures, like buildings/trees).&lt;/p&gt;

&lt;p&gt;When these two streams meet, an electrical pathway is suddenly created between the ground and the cloud which can transfer all the excess charge. Because there is such a huge amount of charge, which gets transferred very quickly, a huge current flows between the ground and the clouds. This energy superheats a channel of air, which effectively explodes with light and heat - hence the lightning. This explosion also creates thunder.&lt;/p&gt;

&lt;h3 id=&quot;restrike&quot;&gt;Restrike&lt;/h3&gt;

&lt;p&gt;When lightning strikes, the channel of air that exploded, becomes ionised - meaning it remains a good conductor of electricity - so if there is a lot of charge built up in the cloud, it encourages further lightning strikes in almost the same place. Thus proving that “lightning never strikes the same place twice” is nonsense, as it frequently does, in very quick succession, and sometimes more than twice!&lt;/p&gt;

&lt;h3 id=&quot;1-centimetre&quot;&gt;1 Centimetre&lt;/h3&gt;

&lt;p&gt;The “diameter” of a lightning rod is about 1 centimetre - about the thickness of your finger. It looks so big because it is so bright!&lt;/p&gt;

&lt;h3 id=&quot;speed&quot;&gt;Speed&lt;/h3&gt;

&lt;p&gt;A lightning strike happens at about 140,000 miles per hour, which is 3,255 times faster than an Edinburgh tram’s top speed. And infinitely faster than any Edinburgh trams’ current speed!&lt;/p&gt;

&lt;h3 id=&quot;energy&quot;&gt;Energy&lt;/h3&gt;

&lt;p&gt;A lightning strike releases 500 Megajoules, the equivalent of 260 Big Macs, or enough energy to power a 100 watt (technically now illegal in Europe) for 2 months!&lt;/p&gt;

&lt;h3 id=&quot;temperature&quot;&gt;Temperature&lt;/h3&gt;

&lt;p&gt;An average lightning strike is about 30,000°C - which is 3 times hotter than the sun, or 750 times hotter than your armpits!&lt;/p&gt;

&lt;h3 id=&quot;fulgurites&quot;&gt;Fulgurites&lt;/h3&gt;

&lt;p&gt;When lightning strikes sand or soil, it is so hot, that it fuses the silica (a big component of sand) into glass rods in the ground called fulgurites. These can extend several metres into the ground!&lt;/p&gt;

&lt;h3 id=&quot;positive-lightning&quot;&gt;Positive Lightning&lt;/h3&gt;

&lt;p&gt;A much less common type of lightning is “positive” lightning. Sometimes in particular cloud formations (anvil clouds for instance) a large amount of positive charge will build up high in the cloud. These charges can sometimes stream down to the ground in a huge arc to create lightning.&lt;/p&gt;

&lt;p&gt;These arcs can sometimes touch down miles away from the cloud formation, meaning they can appear “out of the blue”. Because they also have so far to travel, they typically end up being much more powerful too. An average positive lightning strike could power our 100 watt lightbulb for 95 years!&lt;/p&gt;

&lt;p&gt;Positive lightning strikes can be much more dangerous than negative ones, because they are so much more powerful. When the specifications for airplane safety were created, we didn’t really even know about positive lightning, so most planes aren’t designed such that they would withstand a positive lightning strike :(. Indeed a number of planes are believed to have been brought down by being struck by positive lightning.&lt;/p&gt;

&lt;h3 id=&quot;dry-lightning&quot;&gt;Dry Lightning&lt;/h3&gt;

&lt;p&gt;There are many other kinds of lightning, but one of the most dramatic (although it has a terribly undramatic name) is dry lightning. This occurs in clouds of dry particles - such as volcano or wildfire ash - creating some dramatic photograph opportunities.&lt;/p&gt;

&lt;p&gt;Wildfire dry lightning is a cool example of positive feedback in nature. If a wildfire is big enough it may cause a dry lightning strike, which can set fire to more of the forest, which can create more lightning strikes and so on - scary stuff!&lt;/p&gt;

&lt;h3 id=&quot;dangerous&quot;&gt;Dangerous?&lt;/h3&gt;

&lt;p&gt;Getting struck by lightning, in the UK at least, is not very likely, so don’t worry! In 2009, only one person died of being struck by lightning, meanwhile four people died from bee stings! So bees are way more dangerous than lightning, right?&lt;/p&gt;

&lt;h3 id=&quot;free-energy&quot;&gt;Free Energy?&lt;/h3&gt;

&lt;p&gt;Some people have even experimented with harnessing the energy of lightning strikes as a “green” energy source - although I don’t think they have been very successful. It is ironic, however, that Amazon’s North Virginia datacenter was down for many hours yesterday due to a power cut - caused by a lightning strike!&lt;/p&gt;

&lt;h3 id=&quot;thats-it&quot;&gt;That’s it&lt;/h3&gt;

&lt;p&gt;I gave this text as a talk on lightning as a lightning talk at the Scottish Ruby Conference fringe. It was fun to research and fun to give - and I think that’s because the natural world is really pretty cool when you think about it.&lt;/p&gt;
</description>
				<pubDate>Sun, 01 Jul 2012 00:00:00 +0000</pubDate>
        <link>http://latentflip.com//lightning</link>
        <guid isPermaLink="true">http://latentflip.com//lightning</guid>
			</item>
		
			<item>
				<title>Vows</title>
				<description>&lt;p&gt;In case you missed it, Hilary and I got married recently, on what was easily the best day of my life.&lt;/p&gt;

&lt;p&gt;As it was a non-religious ceremony in Scotland, we had a lot of freedom about what we could say during the ceremony, so we both chose to write some personal vows to each other.&lt;/p&gt;

&lt;p&gt;Given that quite a number of the audience got a little teary when the vows started, and since I have been told a few times I should post them here for posterity, here they are:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Hilary,&lt;/p&gt;

  &lt;p&gt;I promise to feed you when you are hungry, and give you warmth when you are cold.&lt;/p&gt;

  &lt;p&gt;I promise to be the best husband and father that I can be, and learn from my mistakes when I am not.&lt;/p&gt;

  &lt;p&gt;I promise to stand by you when you take on the world, and protect you when you’d rather hide.&lt;/p&gt;

  &lt;p&gt;I promise to push you to be your best, and to act with dignity when you challenge me.&lt;/p&gt;

  &lt;p&gt;I promise to live and love and learn and laugh with you for the rest of our lives.&lt;/p&gt;

  &lt;p&gt;Thank you for marrying me, it is an honour.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I hope I can look back on this post in 50 years, and feel that I’ve made a pretty good shot at fulfilling them.&lt;/p&gt;
</description>
				<pubDate>Tue, 12 Jun 2012 00:00:00 +0000</pubDate>
        <link>http://latentflip.com//vows</link>
        <guid isPermaLink="true">http://latentflip.com//vows</guid>
			</item>
		
			<item>
				<title>The making of Shakey&#58; a Realtime, Massively Multiplayer, Shakespearean parlour game</title>
				<description>&lt;p&gt;At Culture Hack Scotland (#chscot) last weekend, we won &lt;em&gt;most playful&lt;/em&gt; and &lt;em&gt;the grand prize&lt;/em&gt; for a real-time game we made using Rails, JavaScript and Pusher. For a bit of background &lt;a href=&quot;http://blog.latentflip.com/post/22047287999/chscot2012&quot;&gt;read this post&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I thought it might be interesting to break down the technical details of how it was developed and worked. Bear in mind that apart from a tiny bit of prep work, all the code in this project was coded in 16 hours - so the architecture/code will not be optimal.&lt;/p&gt;

&lt;p&gt;Credit where it’s due, the code and architecture I am talking about here was created by &lt;a href=&quot;http://twitter.com/philip_roberts&quot;&gt;myself&lt;/a&gt;, &lt;a href=&quot;http://twitter.com/roryf&quot;&gt;Rory Fitzpatrick&lt;/a&gt; and &lt;a href=&quot;http://twitter.com/froots101&quot;&gt;Jim Newbery&lt;/a&gt;, with a little help from &lt;a href=&quot;http://twitter.com/leggetter&quot;&gt;Phil Leggetter of Pusher&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;the-premise&quot;&gt;The Premise&lt;/h2&gt;

&lt;p&gt;The idea of the game was thus:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;On a big projector screen would be an image of a theatre stage complete with actors and audience.&lt;/li&gt;
  &lt;li&gt;Players register by visiting a url on their phones.&lt;/li&gt;
  &lt;li&gt;Players are assigned to be in the cast, or in the audience, and appear on the big screen using their twitter avatars.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;The game starts&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;The actors then recite a short piece of Macbeth, reading the lines from their phones as they are prompted to do so.&lt;/li&gt;
  &lt;li&gt;The audience have the option to throw tomatoes/flowers depending on how well they think the cast members are doing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;getting-started-midnight-friday&quot;&gt;Getting Started [Midnight friday]&lt;/h2&gt;

&lt;p&gt;Since we wanted a game that worked in real-time, with multiple devices communicating with each other, we quickly settled on using WebSockets, which allows JavaScript on the browsers of two devices to talk to each other. We quickly settled on using &lt;a href=&quot;http://pusher.com/&quot;&gt;Pusher&lt;/a&gt; which is a hosted solution for implementing websockets easily. We were pretty pleased with that decision as it was easy to use - the only drawback being no fallback support for the default Android browser (unless Flash lite is installed).&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;The rest of the app (serving assets etc) was served from a rails app running on heroku. Here’s a very rough diagram detailing the architecture.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/shakeyarch.jpg&quot; alt=&quot;Shakey Architecture&quot; /&gt; &lt;a href=&quot;/images/shakeyarch.jpg&quot;&gt;see bigger&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’ll explain what’s going on a bit better below.&lt;/p&gt;

&lt;h2 id=&quot;getting-up-and-running-with-pusher-1am-saturday&quot;&gt;Getting up and running with Pusher [1am Saturday]&lt;/h2&gt;

&lt;p&gt;I quickly spiked out some JavaScript code to demonstrate two browsers talking to each other with pusher.&lt;/p&gt;

&lt;p&gt;Pusher is essentially a PubSub implementation on top of WebSockets. Pusher’s normal operating mode is that you would have your server sitting on the internet somewhere &lt;em&gt;Publishing&lt;/em&gt; messages to a channel, and browsers (the clients) &lt;em&gt;Subscribe&lt;/em&gt; to those messages.&lt;/p&gt;

&lt;p&gt;In Shakey however, we wanted the game server to be running in a browser (the left hand side of the image above), so as far as Pusher is concerned, even our game-server is a client. (Yup, it is confusing, try figuring this out at 2am, after cocktails!)&lt;/p&gt;

&lt;p&gt;This requires setting up pusher to enable client to client messages. The process for this is:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;When setting up your pusher channel, make it a &lt;a href=&quot;http://pusher.com/docs/client_api_guide/client_presence_channels&quot;&gt;“presence” or “private” channel&lt;/a&gt;. A presence channel allows for client-client messages, and is suitable for games where you need to know “who” is speaking/listening.&lt;/li&gt;
  &lt;li&gt;Presence channels require your users to be authenticated (you don’t want any old Joe Bloggs sending messages to your other users. To do this Pusher hits an endpoint in your app (/pusher/auth), where you must check the logged in user, and tell Pusher about them (using the Pusher gem makes this easy, more info &lt;a href=&quot;http://pusher.com/docs/authenticating_users&quot;&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once you have setup your presence channel and authentication, you can now talk to each other, as an example:&lt;/p&gt;

&lt;div class=&quot;gist&quot; data-gist=&quot;2571207&quot;&gt;&lt;/div&gt;

&lt;p&gt;Open game_server.html in one browser, and game_client.html on another, and an alert will appear on the server’s window with the message “Hello, world!”.&lt;/p&gt;

&lt;h2 id=&quot;baby-steps&quot;&gt;Baby Steps&lt;/h2&gt;

&lt;p&gt;Now that we had very basic communication between a server and a client working, we could comfortably split into two teams. To keep ourselves straight, we wrote down all the messages we would need to run the game, they were.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sent from the clients&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;// register a new user
&quot;player:register&quot;, &quot;&amp;lt;username&amp;gt;&quot; 
  
// audience member wants to throw flowers
&quot;player:hurl&quot;, &quot;&amp;lt;username&amp;gt;&quot;, &quot;flowers&quot; 
  
// a cast member has finished reading their lines
&quot;player:exuent&quot; 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Sent from the game-server&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;// starts the game
&quot;scene:start&quot; 

// announces which role the user is going to play
&quot;player:assignRole&quot;, &quot;&amp;lt;username&amp;gt;&quot;, &quot;audience/cast&quot; 

// player should start reading lines
&quot;player:deliver&quot;, &quot;&amp;lt;username&amp;gt;&quot;, {lines: '---'} 

// ends the game
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The beauty of having a nicely event-driven architecture like this was that Rory and I could develop the game-server, completely oblivious of what Jim was doing with the messages, and vice-versa.&lt;/p&gt;

&lt;p&gt;Indeed, Jim wrote his game-clients in JavaScript, and we wrote the game-server in CoffeeScript and it didn’t matter a bit.&lt;/p&gt;

&lt;h2 id=&quot;building-out-the-server&quot;&gt;Building out the server&lt;/h2&gt;

&lt;p&gt;Now that we had the messaging setup, and the protocol designed, Rory and I focused on building out the game-server. It’s responsibilities (roughly in order) were:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Grab the current scene we were going to act out, along with the characters in it.&lt;/li&gt;
  &lt;li&gt;Listen for “player:register” events, and when one was heard, assign the new player to be in the audience or cast, and announce it to them by triggering a “player:assignRole” event”.&lt;/li&gt;
  &lt;li&gt;Wait for someone to click the “start” button, and when it was pressed, trigger a “scene:start” event to everyone, followed by a “player:deliver” event to the first cast member, who needed to speak, with their lines.&lt;/li&gt;
  &lt;li&gt;While someone was speaking, listen for “player:hurl” events, and trigger the appropriate fart-noise and animation on the screen to indicate something had been thrown at the current speaker.&lt;/li&gt;
  &lt;li&gt;Wait for “player:exuent” events, and when one was heard, send a “player:deliver” event to the next speaker.&lt;/li&gt;
  &lt;li&gt;And so on.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We built the server using &lt;a href=&quot;http://documentcloud.github.com/backbone/&quot;&gt;Backbone.js&lt;/a&gt;, as it makes breaking up the code into Models (for us Player and Game), Collections (of Players) and Views (the animated Player avatars on the screen) easy.&lt;/p&gt;

&lt;p&gt;The event driven architecture was really useful again on the game-server. We wanted to add a “news-feed” down the side of the display, with things like “@philip_roberts threw a tomato”. This was in the end trivial, as we just had another little bit of JavaScript, completely independent from the rest of the game, listening for “player:hurl” events only, and updating a list when it did so.&lt;/p&gt;

&lt;h2 id=&quot;building-out-the-clients&quot;&gt;Building out the clients&lt;/h2&gt;

&lt;p&gt;We left Jim to build out the game-clients that would be running on people’s phones. It’s role was pretty much the inverse of the server:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Register a user by sending “player:register” events&lt;/li&gt;
  &lt;li&gt;Wait to find out which (“player:assignRole”) role it had been assigned&lt;/li&gt;
  &lt;li&gt;If it was a cast member, wait till it received “player:deliver” events and display the lines to the player, and wait for the player to press “done”, thus triggering “player:exuent”&lt;/li&gt;
  &lt;li&gt;If it was an audience member, display “throw flowers”, “throw a tomato” buttons, and trigger “player:hurl” events when clicked.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The game-clients were also built in Backbone.&lt;/p&gt;

&lt;h2 id=&quot;done-4pm-saturday&quot;&gt;Done [4pm Saturday]&lt;/h2&gt;

&lt;p&gt;Apart from some awesome visual polish, that was pretty much it. I’ve neglected to show much real code here, as it’s pretty hideous, but you can &lt;a href=&quot;https://github.com/froots/scottish-play/tree/master/app/assets/javascripts&quot;&gt;dig into the repo&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;caveats-lessons-learned&quot;&gt;Caveats, lessons learned&lt;/h2&gt;

&lt;p&gt;A few things tripped us up using Pusher that are good to know if you are doing something similar.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;First, the presence channel and client setup isn’t that hard, but takes a minute to get your head around.&lt;/li&gt;
  &lt;li&gt;When using a presence channel, all clients receive all events. You can’t just send an event directly to a single client. In our case that meant we always sent the “username” of the intended client along with the data, and the client on the other end filtered out messages that weren’t intended for them. We could have set up separate channels for each player, but decided this was simpler to manage.&lt;/li&gt;
  &lt;li&gt;The exception to the above is that the client that sends a pusher event, doesn’t receive the event itself. We tried to listen to events published by the game-server (which is a client remember!) within a different part of the game-server, and it doesn’t work. It’s easy fixed by using non-pusher events, but confusing when you bump into it.&lt;/li&gt;
  &lt;li&gt;Because Pusher is hosted in the cloud, all your development/testing/production servers will be using the same pusher account (unless you setup different pusher accounts (we didn’t)). This gets pretty mind boggling when 3 people are testing code on three separate machines, but they are still all interacting. We could have fixed this by setting up different channel names on each machine, but we didn’t figure that out at the time.&lt;/li&gt;
  &lt;li&gt;3G providers really like to screw with your internet. Before the demos everyone was asked to not use WiFi on their phones - which was less than ideal as companies like O2 like to smush websocket traffic not sent over encrypted connections. Pusher will fallback to an encrypted connection if unsecured doesn’t work, but to ensure that it worked first time, Phil Leggetter from Pusher suggested we force encrypted connections: First &lt;a href=&quot;http://blog.pusher.com/2010/11/5/end-to-end-encryption&quot;&gt;encrypt the Pusher socket&lt;/a&gt; and then serve all the assets over ssl (easy done with heroku, just stick https in front of the urls).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;and-finally&quot;&gt;And finally&lt;/h2&gt;

&lt;p&gt;If you have any questions about what we did, (or if you want the four of us to make you an ace multiplayer game!), just get in touch &lt;a href=&quot;https://twitter.com/philip_roberts&quot;&gt;on twitter&lt;/a&gt;.&lt;/p&gt;
</description>
				<pubDate>Tue, 01 May 2012 00:00:00 +0000</pubDate>
        <link>http://latentflip.com//shakey-technical</link>
        <guid isPermaLink="true">http://latentflip.com//shakey-technical</guid>
			</item>
		
			<item>
				<title>A Shakey Victory&#58; Culture Hack Scotland 2012</title>
				<description>&lt;p&gt;Having just returned home from Culture Hack Scotland 2012, I can safely say that it is one of my favourite tech events of the year. Since anyone who wasn’t there will have seen all my tweets without knowing what I was up to, I thought I should give a run down of what I’ve been up to for the last 24 hours.&lt;/p&gt;

&lt;h3 id=&quot;culture-hack-what&quot;&gt;Culture Hack what?&lt;/h3&gt;

&lt;p&gt;Culture Hack is a 24 hour long hackathon. This year it was held at SocietyM in Glasgow - a beautiful coworking space under the equally cool CitizenM hotel.&lt;/p&gt;

&lt;p&gt;The basic premise is thus: lots of cultural organisations (festivals, museums, libraries, universities) generate a crap load of interesting data that they don’t do anything with or share. Meanwhile there are lots of developers and designers who would love to build useful/interesting/cool things using this data, but they don’t get the chance. Culture Hack is an event that encourages these organisations to share their data, and see what cool stuff developers and designers can do with it in under 24 hours.&lt;/p&gt;

&lt;p&gt;This years data included things like:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;full event listings from numerous festivals in Scotland (Glasgow International, the Edinburgh Festivals, Arika)&lt;/li&gt;
  &lt;li&gt;electricity, water, gas usage data for some of Edinburgh Universities buildings recorded every half hour for the last year&lt;/li&gt;
  &lt;li&gt;data and images of the National and Glasgow museums&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;our-hack-shakey-a-massively-multiplayer-realtime-macbeth-parlour-game&quot;&gt;Our hack: Shakey, a Massively Multiplayer, RealTime, Macbeth Parlour game&lt;/h3&gt;

&lt;p&gt;This year I teamed up with the hugely talented &lt;a href=&quot;http://twitter.com/#!/froots101&quot;&gt;Jim Newbery (@froots101)&lt;/a&gt;, &lt;a href=&quot;http://twitter.com/#!/roryf&quot;&gt;Rory Fitzpatrick (@roryf)&lt;/a&gt; and &lt;a href=&quot;http://twitter.com/#!/praymurray&quot;&gt;Padmini Murray (@praymurray)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Jim, Rory and I had met up in the pub the night before, and discussed using one of the datasets: a fully digitised, annotated and computer friendly copy of Macbeth, to create a massively multiplayer, realtime parlour game. We met Padmini on the night who came on board as producer, Shakespeare expert and all-round great gal.&lt;/p&gt;

&lt;p&gt;The idea of our game was to merge Shakespeare’s Macbeth, with modern technology (computers, projectors, mobile phones and realtime tech). Here’s a photo of the game in action during our live demo:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://farm8.staticflickr.com/7062/7123158567_95ff376ef4_c.jpg&quot; alt=&quot;Shakey Live&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It works something like this:&lt;/p&gt;

&lt;!-- more --&gt;

&lt;ul&gt;
  &lt;li&gt;On the big screen there is a picture of an empty theatre stage&lt;/li&gt;
  &lt;li&gt;Everyone in the room can join the game by visiting a link on their smartphones/computers, and entering their twitter handles&lt;/li&gt;
  &lt;li&gt;The game puts most people into the audience, and a few people are selected to be in the cast. Everyone’s twitter avatar’s appear in the proper place on the screen&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;The game begins&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;The cast are now prompted when it’s their turn to recite lines from Macbeth, with the lines appearing on the screen.&lt;/li&gt;
  &lt;li&gt;Meanwhile everyone in the audience has the option to “throw a tomato” or “throw flowers” which are animated on the screen behind the cast with appropriate fart/splat noises (of course)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here’s a clearer screenshot of the projected image halfway through another game, along with what an audience member sees on their phone:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://img.skitch.com/20120429-ckukqquy99r7jhh179t7gqdchg.jpg&quot; alt=&quot;Shakey App Screenshot&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Note in particular:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The awesome stage design, by &lt;a href=&quot;https://twitter.com/#!/duichmckay&quot;&gt;Duich McKay&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;The wicked Macbeth, Lennox, Porter and Macduff characters by &lt;a href=&quot;http://twitter.com/#!/suchprettyeyes&quot;&gt;NIcola Osborne&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;The tomato/flower splats on Macduff as animated and sonified by &lt;a href=&quot;http://twitter.com/#!/roryf&quot;&gt;Rory&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Terrible grammar&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;the-tech&quot;&gt;The Tech&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Jim wrote a little Ruby on Rails app that imported the Macbeth script and characters into a database&lt;/li&gt;
  &lt;li&gt;Pretty much everything else was written in JavaScript/HTML/CSS. The computer hooked up to the projector acted as the game server: animating the screen, keeping score, sending lines to phones, and listening for hurled tomatoes/flowers.&lt;/li&gt;
  &lt;li&gt;Communication between all the phones and the game server was done over websockets using &lt;a href=&quot;http://pusher.com/&quot;&gt;Pusher&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Building something so real-time was fairly new to us all, and mind-meltingly confusing, but I think we were all pretty chuffed with what we achieved in such a short space of time. Once I’ve recovered I’ll try and write the tech stuff up in a little more detail&lt;/p&gt;

&lt;h3 id=&quot;the-demo&quot;&gt;The demo&lt;/h3&gt;

&lt;p&gt;At the end of the day, everyone demos their hacks, and prizes are awarded. Our demo went pretty well, until 100 people in the room tried to throw tomatoes - promptly crashing Google Chrome on my computer. Apparently 1400 tomatoes/minute were being thrown!&lt;/p&gt;

&lt;p&gt;Our hack was awarded most playful &lt;em&gt;and&lt;/em&gt; the overall grand prize winner. Not bad for 24 hours work! Look out for a video of our demo soon - I can’t wait to see it myself.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://img.skitch.com/20120429-8qt7edhfhycjxuenpd2q2stxau.jpg&quot; alt=&quot;Porter&quot; /&gt;&lt;/p&gt;

</description>
				<pubDate>Sun, 29 Apr 2012 00:00:00 +0000</pubDate>
        <link>http://latentflip.com//chscot2012</link>
        <guid isPermaLink="true">http://latentflip.com//chscot2012</guid>
			</item>
		
			<item>
				<title>Upper Bounds</title>
				<description>&lt;p&gt;One of my favorite lecturers from university was Dr Iain Lindsay, who taught 4th year Digital System Design.&lt;/p&gt;

&lt;p&gt;Judged against most of the other lecturers, who droned along to a set of dry powerpoint slides, his teaching style must have seemed “eccentric”. Instead of a projector he scrawled across the blackboard, full academic gown flowing behind him. Where others would stick to a script defined by their slides, Iain’s discussions would flow, and loop, and shoot off at seemingly irrelevant tangents, which later turned out to be deeply insightful.&lt;/p&gt;

&lt;p&gt;But to me, the real gems were the course notes. Each week he would hand out what is best described as a non-fiction novella: pages and pages of witty prose complete with hand-drawn diagrams. Every point he made or figure he quoted would be referenced in the footnotes, such that on some pages the footnotes made up half the content of the page.&lt;/p&gt;

&lt;p&gt;Typically these footnotes would be references to ancient books or datasheets, but not always. Lewis Carroll’s &lt;em&gt;Alice In Wonderland&lt;/em&gt; was invoked to debate whether any two events can be truly synchronous; &lt;em&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Buridan's_ass&quot;&gt;Buridan’s Ass&lt;/a&gt;&lt;/em&gt; and WWII trench warfare were used to illustrate metastability and there were countless poems and other delighters.&lt;/p&gt;

&lt;p&gt;One footnote that has stuck with me, and I keep stumbling across examples of, discussed the concept of &lt;a href=&quot;http://en.wikipedia.org/wiki/Zero_One_Infinity&quot;&gt;Zero One Infinity&lt;/a&gt; in system and software design. I forget the original footnote now, but it went something like this:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Systems should be built to handle exactly one instance of an entity, an infinite number, or none at all. Setting an arbitrary limit is foolish and will inevitably be wrong.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It is easy to underestimate how often we ignore the infinity part of this concept. This is because very few things in daily life would actually require an &lt;em&gt;infinite&lt;/em&gt; limit, but that is somewhat missing the point. The problem is not that we need an infinite limit, but that whatever finite limit we choose, will inevitably not be large enough at some point. This will require either an inordinate amount of code &amp;amp; effort to deal with a mostly unusued case, or we can ignore the code and get mischeivous errors popping up.&lt;/p&gt;

&lt;p&gt;Some classic examples:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;Storing people’s names in a database&lt;/em&gt;: Easy right? You probably need 30 characters, maybe 40 at a push? Then you had better hope that famous painter &lt;em&gt;Pablo Diego José Francisco de Paula Juan Nepomuceno María de los Remedios Cipriano de la Santísima Trinidad Clito Ruiz y Picasso&lt;/em&gt; never wants to use your application.&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Hard drive space&lt;/em&gt;: Supposedly Bill Gates once said “640K of memory should be enough for anybody”. Sadly it seems to be a mis-quote, but I am sure others have made this mistake in the past, and will in the future.&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Tennis Scores&lt;/em&gt;: When the scoreboards were designed at Wimbledon they (arguably sensibly) only left two placeholders to represent the number of games played in the set, placing an upper bound of 99 games. During the 3-day marathon game between Isner and Mahut the number of games in the final set reached a stunning 70 to 68. &lt;br /&gt;&lt;strike&gt;Sadly they didn't quite break the upper limit of the scoreboard, but it was much closer than I imagined the designers ever thought it would get.&lt;/strike&gt;&lt;br /&gt;As pointed out by Simon in the comments the scoreboard did indeed break and had to be reprogrammed, as it was only programmed to go up to 47!&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;
&lt;p&gt;I will end with a final footnote from the course notes. It is the start of a Monty Python song that was used to illustrate some chicken-egg problem with sequence design:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Horace ate himself one day. He didn’t stop to say his grace. He just sat down and ate his face…&lt;/em&gt;&lt;/p&gt;

</description>
				<pubDate>Wed, 04 Aug 2010 00:00:00 +0000</pubDate>
        <link>http://latentflip.com//upper-bounds</link>
        <guid isPermaLink="true">http://latentflip.com//upper-bounds</guid>
			</item>
		
	</channel>
</rss>
