<?xml version="1.0" encoding="utf-8"?> <rss version="2.0"> <channel> <title>thomaswilson.xyz</title> <link>undefined</link> <description>I write about software and how I should have built it, and sometimes other things.</description> <lastBuildDate>Mon, 03 Feb 2025 10:43:11 GMT</lastBuildDate> <docs>https://validator.w3.org/feed/docs/rss2.html</docs> <generator>https://github.com/jpmonette/feed</generator> <copyright>All Rights Reserved Thomas Wilson 2023</copyright> <item> <title><![CDATA[My eating disorder was dangerous because it was powerful (feat. hip hop lyrics.)]]></title> <link>https://thomaswilson.xyz/blog/2016-eating-disorder-awareness-week</link> <guid>https://thomaswilson.xyz/blog/2016-eating-disorder-awareness-week</guid> <pubDate>Thu, 28 Feb 2019 00:00:00 GMT</pubDate> <description><![CDATA[<aside class="medium-note"> I originally published this article in 2017 on my Medium blog. As of this update (late 2019), the reading experience on Medium has become increasingly dominated with banners, footers, and modals which ask you to sign in. I have republished it on my own site, where I will never track you, ask you to sign in, or show you adverts. </aside> <p>This post is published right at the tail-end of Eating Disorder Awareness Week 2016. It has been inspired by a lot of people's choices to share their experiences with EDs. I'm trying to do the same: just share my experiences, and how my personal relationship with food and mental health have impacted my life. I've also been unsure if I should publish this on my personal Medium blog (and therefore associate it with me and my professional work and personal identity). Ultimately I think it's important to see how mental health and ED can affect anyone. It simply wouldn't be the same if I published this anonymously. Within reason, experience with mental health or ED doesn't put any limits on the kind or quality of work you can pursue – this is something I want to showcase with actions, not just sentiments. I also think it's important to represent the male corner of this conversation (not that I in any way feel under – represented or pushed into submission). With that in mind I hope any future employers or professionals can see this for what it's intended to be.</p> <p>Me and food have had a funny relationship since I was little and terrified of choking (still can't swallow pills). Like all things it changed with me in life. Depression hasn't left since aged around 19, and at 24 now anxiety's joining the party a bit too often for my liking, but I guess I'm too much of a polite host to ask it to leave. These are important because, for me at least, my relationship with food was never the problem, it's just been a coping mechanism. Feel sad? Don't eat. Feel stressed? Maybe eat less? Uncomfortable with the fact you're 24 and still get the same acne you did when you were 16? Yeah, definitely eat less. I only really came to terms with the fact that this isn't what everyone does when I was about 21. That's one of the dangers with mental health, that it's not possible to simply be someone else, so you don't know what's unusual, or what you should watch out for. An interesting point, and one that highlights heavily the importance but difficulty of empathy, but not the one I'm trying to make. As with any social or human problem, the range of possible factors and causes in eating disorders is huge. This doesn't detract from anyone's pain, that's not even an argument worth having. If someone is homeless because of substance abuse, immigration, or complete lack of financial resource - none of these detract from the problem of homelessness, or suggest that we shouldn't help someone. I've spoken to people who have eating disorders they attribute to the need for control, feelings of security, anxiety-coping mechanisms, guilt, and body dysmorphia. This is not an extensive list. You ain't worth more cause you got more stuff. I don't care what the colour of your skin is. I don't care 'bout your fortune and fame. I just want for us to have more perspective. And understand that everybody's pain is the same. (Perspective, Blueprint) Because I never wanted to be super skinny, because I never strictly restricted my calorie intake, because I never went through binge-purge-restrict cycles, I did not believe myself to have any kind of eating disorder. But I do not have a healthy relationship with food, and the absence of all these factors does nothing to argue against that. The past 6 months of my life have undoubtedly been some of the most turbulent. I left (not by choice) a relationship, and with that I lost one of my most valued supports for dealing with my ED. I lost someone who understood better than most what it's like, but also knew exactly how little tolerance to have for it (spoiler: it was none). Even though starving myself was never a thing in its own right, I had a lot to cope with and very little to stop me. Quite predictably I spiralled, and for some reason my urge to simply not eat changed into a need to over exercise. In retrospect it's not a surprise things didn't go so well. Going to the gym 3 times a day and eating 20% below the RDA (probably about 30-40% what I should be eating) is bad for your health. But this wasn't about calories for me, this wasn't about losing weight, or gaining muscles, these were just side effects. I did it because I couldn't not. I was like a toddler in an increasingly small doctor's waiting room - I had too much energy and started bouncing off the walls (bedroom, office, bus, any wall really). The danger of my situation that it made me incredibly powerful. It put me at the top of my game. It's like drug use. People talk about the longterm health effects, but if it wasn't for the short-term incredibly desirable effects, we wouldn't see the problem with substance abuse that we do today. At the most simple level: if you're running 10k every day, you get better at running 10k. If you're lifting weights every evening, you can start to lift heavier things. This is how I justified my behaviours to myself. How can I be unhealthy when I am physically, unquestionably, demonstrably, the most fit I have ever been in my life? I'm getting complements from friends about my body, people are noticing an improvement in my strength and performance. I was hitting personal best 5k and 10k literally every week. Have you ever heard athletes talk about their training schedule? It's crazy, but they're good and they're proud, and no one's telling them to stop. Have you ever heard anyone successful talk about how they got there, about the sacrifice, devotion, and difficulties? If you want to be good at something you put in hard work, and sacrifice comfort and security. If you're getting good at something, you're not supposed to be comfortable. Is what I told myself. Long hours, lack of sleep, writing paragraphs for weeks… Trading my social life to writing bars with preciseness (Understand, Rashad & Confidence) This started bleeding over into other areas of my life. I dance. I started attending workshops for professional and graduate dancers (I am neither of those things). I started choreographing my own work, and corresponding with producers who work with graduate and emerging artists. I started attending as many classes as I could, looking obsessively to find workshops I could wing myself into. I was travelling to the theatre to watch live dance at least every other week. The results? I was in the best place with dance I've ever been in my life. I was the most creatively fulfilled and challenged I've ever been, and I was simply happy proud of the quality of my movement. With my Ph.D. and work in web-development I would sit down and just work for hours. I had exhausted my body to the point of physical damage, I had no choice but to sit very still and do a lot of work. The quiet introverted kind of work where you can't be distracted. I started taking risks and setting ambitions much higher than I had done before. And I met them. I was producing new software, reading a great deal of literature, and subsequently conducting my most planned research I had ever done in my life. I felt on top of my Ph.D., and I was achieving the things I wanted to do. All of these things were fuelled almost solely by the thing that underlies my relationship with food, and so I suppose my eating disorder (whatever that is). The voice inside my head that told me I simply couldn't do anything until it physically hurt to move, and kind of ached when you sat still. This is obviously physically dangerous, but the real danger was that the voice followed up on its promise: I was incredibly focused and by literally everything I valued in my life (fitness, dance, and my studies) I was doing well. I was doing really well. There is no explanation or solution. I can't tell you how I started to realise I was making ultimately bad decisions. In truth I still don't fully think I was - I'm a stronger, more experienced, and focused person because of it. But at the same time, I know that if I had carried on down that road with my head down it would have gone badly. I was falling into bed every night, and would role out in the morning. I am not joking or exaggerating, I was taking every resource my body could find, and exhausting it every day. I was praying and meditating every day that this will end, that I wouldn't wake up tomorrow feeling like I have to physically defeat myself just to function. Nothing hit me until I started seeing concern in my friends. I have 4 people in my life who I see as my true friends. These are people I trust and respect more than myself. They are all people I love at a very deep level. All of them became obviously distressed when I would talk about my life or wellbeing during this phase. Two of them asked me to consider going to counselling or seeking professional help. This is when I realised I have not made a sustainable choice. This cannot go on forever. This is unhealthy and bad for me, even if it's doing me so much good. It's only been about a month since I made a conscious decision to get out of that place. In that time I've realised that i) I have to start being selfish, and ii) Wherever I am, or anyone else is, in life, it's temporary, and it's where we're supposed to be. Living with an unusual mental health landscape isn't something that changes with any urgency, and seeing myself lose fitness, and skill in dance is hard. But my outlook is changing. I feel myself wanting to forcibly start controlling my life agin, and this is the danger of eating disorders in my life. Then I think back to when I was 22 and breaking up with the first girl I ever truly deeply loved in a mother-of-my-children kind of way. And I think back to the year that came after that, and how all I wanted it to do was end. I thought back to desperately searching for my purpose in my final year of my master's degree. I look back on when I really started pushing contemporary dance as part of my life, and wanted desperately to improve. Whenever we look at things in retrospect we lose the immediacy or urgency that are all we think about in the moment. In 3 years I'll be 27. I know that 27 year old me will tell 24 year old me exactly the same as what 24 year old me tells 22 year old me: be patient. Whatever needs to happen will happen. I am demonstrably not the most trustworthy person to be making decisions about how I should live my life. I should stop trying to make those decisions. Simz talk to the younger Simz what would you tell her? Try make a mil 'fore you get a deal. See nothing's impossible long as you keep your head up. And when it comes to the points where you're fed up. Take a step back. What would you say To the younger you? Would you tell you to be patient? Would you say to be true? (Time Capsule, Little Simz & Caitlyn Scarlett)</p>]]></description> </item> <item> <title><![CDATA[Loss and my ED (ED awareness week 2017)]]></title> <link>https://thomaswilson.xyz/blog/loss-and-ed-2017</link> <guid>https://thomaswilson.xyz/blog/loss-and-ed-2017</guid> <pubDate>Fri, 03 Mar 2017 00:00:00 GMT</pubDate> <description><![CDATA[<aside class="medium-note"> I originally published this article in 2017 on my Medium blog. As of this update (late 2019), the reading experience on Medium has become increasingly dominated with banners, footers, and modals which ask you to sign in. I have republished it on my own site, where I will never track you, ask you to sign in, or show you adverts. </aside> <p>Last year I wrote a piece for Eating Disorder Awareness Week 2016. Twelve months of living later and things aren't the same as they were.</p> <p>To recap, twelve months ago I was several months out of an abrupt breakup, which saw me lose a big part of my support network. It turns out that when I'm left to my own devices I'll try and wear my body town until most or all of it hurts as I lay in bed at night, asking why I keep making bad decisions. I did this because it brought me to some extreme levels of focus in my personal and professional life. An accidental outcome of that was an unhealthy calorie deficit. I'm not sure if what I have is strictly an eating disorder. I think at that point we're arguing semantics, though, because it's probably not normal.</p> <h2>Losing it</h2> <p>Some time around March-April last year, I slipped after a few weeks of progress (more food and sleep, less running). I have vivid memories of sitting, in tears, in my room, on Skype to a dear friend.</p> <p>I very rarely get angry. Frustration or impatience are well known, but to be truly deeply angry at a person, for a very distinct and obvious action-that was a very unwelcome and new feeling for me. I felt angry that someone could do something, and then appear to just not acknowledge it and move on. If you're mean you say you're sorry. If you've taken my mental and physical stability from me then you've been (perhaps unintentionally) really quite rude.</p> <p>What struck me is that nothing seems to stop me from feeling these pains. That is: when I'm in a bad place, I always feel the same kind of bad. It's like I said last year-my brain is a toddler in a waiting room, I have to get out. As far as I can tell, this will be the pain I feel for the rest of my life (that section of it where I'm in pain, at least). Acknowledging that was hard. Very hard.</p> <h2>Losing dance</h2> <p>Until the last nine months, contemporary dance made up an exceptional part of my life. I was dancing four-five days a week, most weeks. This involved open and professional classes and workshops (in the case of the latter, it involved a bit of creative lying).</p> <p>For me, dance has always required a monastic devotion: ultimate focus on my current actions, while lining up the next 10, 30, or 60 seconds of movement in my head. Picking out moments and extensions I could sink into. A sense that my body existed to move this way, and for a very short period of time my body was not my own. That's pretty appealing when you're seemingly trying to erode your body.</p> <p>Around the time I wrote the last article I began to realise that being in a dance studio wasn't making me happy. Attending classes with your recently ex-girlfriend while you're simultaneously excelling and nose-diving isn't something I can describe. It guess it was like trying to fly a plane through a thunderstorm. I don't know where I was or if I was going forwards or downwards. Sometimes I would just have to leave the space at a minute's notice, because I couldn't be in there any more.</p> <p>So I stopped attending classes at my university. So now I'm dancing at most three times a week. I stop seeing progress and start plateauing. I'm frustrated that I can't pick up choreography quickly, I'm lagging in routines, my technique isn't as sharp as it was. And there's nothing I can do about it. I have ideas, I'm trying to work on choreographic pieces, pieces that I feel really passionate about-but what's the point when you can't even do your own ideas justice?</p> <p>So I made the decision to stop dancing. Beyond a shadow of a doubt, dance saved my life. Knowing I had a class to attend, or an upcoming workshop, or that there's a weekly choreography course starting 40 minutes away and that you could definitely make it back in time if you got the last train… When these 60–90 minute periods are your islands, you become very concerned when the sea level rises. But they were putting me in a worse place, so I had to stop.</p> <p>This has freed up time for me to focus on acroyoga (or sports acro)-a mixture between partner acrobatics and yoga. Twelve months later and I am paid (a symbolic amount) to teach every week, I get to introduce people to something I love on a weekly basis, I train with people who treat me better than I deserve, and I can find moments of complete peace and calm. These moments are no longer mid-pirouette, but in some other equally obscure position, often on some else's feet.</p> <p>I've recently started seeing dance again. I'm realising that a dance studio is different when it's full of people. Dancers who are driven by their selves or by competition act very differently to artists in a studio with an idea. I'm realising it wasn't dance that meant I had to leave, but the culture. Dance was always a tool for me, but for a lot of people I danced alongside it was an end goal. This produces some truly exceptional performers but I couldn't handle the heat, and nor did I really like the kitchen's decor so for now at least I'm staying out.</p> <h2>Losing fitness</h2> <p>Demonstrably and repeatedly I am less fit than I was 12 months ago. I cut my PB 10k time by 20–25% over the course of a few months. I was fast, by my standards. Putting that 20–25% back on to my 10k time was hard. It makes me feel inadequate. If I could do it before, I should be able to do it now.</p> <p>It's not just that: I can't get up at 7am to work out, then go to work, go to a fitness or dance class at 7pm, then go back to the gym at 9pm. I have all these other things I have to do. Like work a job that excites me and gives me meaning. Like read these excellent books, or spend time with badass humans. This doesn't mean I don't catch myself in the mirror when I'm getting changed and notice a loss of definition. It doesn't stop me watching other people run or cycle, and constantly compare myself to them. It doesn't mean I don't want to count calories before I go to bed every night to double check I'm doing 'okay'. But it does mean that my life is enriched in other areas.</p> <h2>The overwhelming gains</h2> <p>I spoke about the people I met through acroyoga. One of whom I now live with. These are people I respect a great deal, with who I meet 2–4 times a week to share, learn, and play. People who are kind to me, who accept my neurotic sense of what a movement should look like, and who (in the best way) strengthen me physically and mentally. This is a place I can use my physical strength and passion for teaching.</p> <p>I've recently been involved in a number of creative projects, and I've got several more on the horizon. No it's not choreography as I know it. But it's taking what I loved from dance, and helping me explore it in an environment where I feel I belong.</p> <p>Some time in June-July I entered a relationship, with a girl I call Angel because I don't know what else you call someone who accepts and understands that sometimes I want to starve myself or make unfair quick judgements of a person or that I have a compulsive need to go to new places, be in bed by 9.30pm, and work too many hours at a job that I value too much.</p> <p>I have realised that I can damn well do whatever I want for my job. If I want to be a web developer then I can probably just go and do that. So what if I've got a Master's in Environmental Science-a department of chemistry happily pays me for work when I stopped studying their subject at 16. If I want someone to pay me money to keep improving some software I made when I was told explicitly by my supervisor to "not spend too much time on it"-then I should start asking a lot of people very nicely. These people do not care that I specialised in quantitative models of poverty, they care that I can show my current project has value and potential.</p> <p>I realised that we're living in a world that is literally the best it has ever been. No really, we are doing just fine. Not perfect, could still improve, and perhaps we should stop trusting the general public with internationally consequential votes, but there's like no polio, fewer women are dying in childbirth, and more of these children are living and then learning to read (even the girl ones). I've started giving 5–10% of my salary to the issues I care about (you're welcome, forest elephants), and 25% of the money I earn from teaching goes to other charities.</p> <p>I am constantly aware that nothing is permanent, which includes my feelings and life (obligatory reminder that you're going to die). I'm working on being humble. I'm working on being openly thankful. I'm grateful to all the people that made me feel unwelcome and unaccepted, because I was never going to fit in. I'm grateful to the excellent group of humans I have around me very often. I'm grateful to all the artists around me who have a vision and have to see it realised. I'm grateful to the hip-hop artists who reminded me what's important. I'm grateful to the authors who helped me explore these ideas in greater depth. I am grateful to my to my parents and to the universe for just being pretty cool.</p> <p>Managing a brain that advises you poorly on proper fitness routines, and which overly values an obscure art form you discovered 12 years too late to be any real good at it isn't easy. But nothing's really easy. I don't expect it to be, and I expect my situation to look different in another 12 months.</p> <p>I strongly agree we should be bringing discussion of mental health to the forefront of people's awareness. But you need to show continuity and narrative. I don't think a mental health story can ever truly be retrospective, because you're always living it. I want this piece to show that mental health is still there, always there, and a part of who I am-and just because it's no longer influencing my life to any great extent, does not mean this isn't an important discussion and it doesn't mean I don't think about it often.</p> <p>I hope more people who have opened up about their mental health continue these narratives to help themselves and others understand how it affects them day-to-day, but also year-to-year, and event-to-event.</p> <h2>Wilson's tip-top hip-hop recommendations</h2> <p>Last year I was pretty clear that hip-hop played a massive part in my self-exploration. Below are a couple of the songs that constantly resonate with me, that I keep going back to, and that I think help to explain me a little better.</p> <blockquote class="hip-hop-lyric"> I ain't got the time to be your enemy That shit is draining, they're taking up too much energy I'd rather invest in something that's worth it, the time is precious So for Simz to waste it is something you'll never see, hold me to it Wings -Little Simz. </blockquote> <blockquote class="hip-hop-lyric"> From the view of an atom the human body's a universe How impossibly big it be, this symmetry This brutality, and beauty and synergy And beyond what we'll live to see, I know nothing can limit me Just take everything ever and we are that times infinity <cite>Tiny Glowing Screens pt. 3-Watsky</cite> </blockquote> <blockquote class="hip-hop-lyric"> This is your life, you can't escape this bitch when it's hard Just know that it passes, but you'll collect scars They never go away, but they will make you who you are This is a beautiful struggle, I share it in song cause I can't control this, remember: the moment's beyond us <cite>Hold Your Head Up-Macklemore</cite> </blockquote> <blockquote class="hip-hop-lyric"> I feel the waves getting far too big to handle Fail to turn this shit the other way Sail back to the harbor like your average Joe and play it safe But that's not life it's not what I chose <cite>Reflection-ATO X EDEN</cite> </blockquote>]]></description> </item> <item> <title><![CDATA[Back to Bear, Goodbye Notion]]></title> <link>https://thomaswilson.xyz/blog/back-to-bear</link> <guid>https://thomaswilson.xyz/blog/back-to-bear</guid> <pubDate>Thu, 15 Aug 2019 00:00:00 GMT</pubDate> <description><![CDATA[<p>This piece turned out a little long than expected because I really want to clarify that this is not a "Why Bear is better than Notion" article. It is a "Why Bear suits my needs right now better than Notion" discussion. So there's a little more nuance in my explanation. The crux of my point it is this: I am a scatter brained person who develops software, makes dance, and exercises semi-seriously - and I need a digital tool to help me manage my thoughts, writing, documentation, and general projects. I previously used Bear, a beautiful and simple markdown-esque note keeping app, but forgot about it when I moved cities and jobs pretty much all at once. In my new life I started using Notion, a cross-platform feature-rich editor, but I've gone back to Bear. I went back to Bear because I like the simplicity - it let me categorise, expand, delete, and move things around in a way which is much closer to how I think about my life and work. Also, as a developer, if I want complexity I'll roll my own: between Google Docs and serverless providers I can achieve a lot.</p> <h2>A brief love letter to Apps</h2> <p>I live my life in a couple of lanes: I'm a front-end software engineer in a small team at a rapidly growing scale-up, and also a dancer/producer for a small contemporary dance company, and someone who likes to write and journal for their own personal development. I am asking a lot from any app, I want it to collate my thinking of software architecture; document specific practices across a range of projects; and keep track of myriad side projects, restaurants I want to visit, narrative structures and scene ideas; document research material and my evaluation of it; and outline workflows for funding applications. I want to do these things with as little context switching as possible. I want a killer app that doesn't exist: not only are these a contrived set of requirements, but how I think about each of them, my mental models for them, are different. But I really love the search. I love apps. I love the promise that a new App brings - it's like buying a new blank notebook, non-blank regular book. It's the promise of a new you, a new way of thinking, doing, producing - one step closer to the way you work now, and a more productive, happier, wealthier, and skinnier version of yourself. I think this is the feeling which fuelled first decade after the iPhone was released, when everyone wanted to talk, read, write about the killer app for iOs (and now iPadOS) or OSX (and now OSX). It definitely feels now like this conversation has slowed down, the conversation is less around specific apps. However, every now and again, hype rises out of Product Hunt or Hacker News to offer up some crafter, artisanal interfaces. Bear and Notion have been two such apps: I've seen them on twitter, in online publications, and other developers mention them.</p> <h2>Bear</h2> <p><a href="https://bear.app">Bear</a> is a beautiful note-taking App built for the Apple ecosystem (iOS, iPadOS, MacOS) by Shiny Frog. The premise is simple: you write in a markdown (or markdown-esque) syntax, which gives you access to a limited set of features: body text, headings, lists, links, images, inline code, bold, italics. Notes themselves are organised by any number of tags ( anything starting with ‘#' ) which can be nested, e.g. <code>post/post</code> versus <code>blog/portfolio</code>. It's been <a href="https://blog.bear.app/2017/06/thank-you-yes-you-for-our-2017-apple-design-award/">recognised</a> by Apple number of times for their fantastic visual design. Which makes sense: it does one thing well, feels simple, but can be integrated into very powerful workflows (e.g. exporting to markdown and plain html). This is Apple's philosophy, surely.</p> <h3>In Praise of Bear</h3> <p>There are a couple of things I really liked about using Bear:</p> <ul> <li>Creating notes comes with much lower entry requirements, I just hit ⌘N and I get a new note, it doesn't need to be anyway, I can just dump whatever I need into it and then organise it later.</li> <li>Both apps are visually beautiful, but that doesn't mean I shouldn't mention it twice: the UI is very nicely designed.</li> <li>It specialises in one kind of content: slightly-enhanced text, and executes on that one idea well.</li> <li>Easy to export: I can get from a note to sanitised HTML, markdown, pdf, docx is two clicks and 5 seconds - which makes it so easy to integrate into any workflow.</li> </ul> <h3>My time with Bear (2017-2018)</h3> <p>After graduating my Ph.D. into my first software development job I was looking around for note taking apps, so I could keep track of what was happening in meetings, product development ideas, and my own personal learnings. My first job came with a lot of context switching - I was on a number of different projects, so flexibility was important. I came across Bear, probably from an App Store feature, and loved it. But around 6 months after starting the job, I relocated from Southampton to London, and not soon after I started actively looking for new job opportunities. The job I was in was okay, but not what I imagined it would be, or what I needed at that time in my professional journey. this is important because I was going through a lot of personal change and turbulence - I didn't have a system in place for anything, and it would have been pointless to develop one because things were changing so rapidly. So I left bear behind accidentally, I simply stopped using it and it never occurred to me to start using it again around the time I moved to London in early 2018.</p> <h2>Notion</h2> <p>Describing <a href="https://www.notion.so">Notion</a> is much less simple than Bear, they describe themselves as an ‘all-in-one workspace'. It offers an astonishing amount of functionality: Kanban boards, structured tables with filters, embedded web pages, todo lists… honestly I do a disservice in trying to list them all. I started using Notion in early 2018 after moving cities and jobs - two big changes which broke a lot of my old habits and tools. I think I first saw it in a coding livestream by MPJ on his YouTube channel <a href="https://www.youtube.com/channel/UCO1cgjhGzsSYb1rsB4bFe4Q">funfunfunction</a> , and then finding this <a href="https://www.invisionapp.com/inside-design/ivan-zhou-notion-interview/">profile by invision</a> on Ivan Zhao, the co-founder and CEO. He seems like a cool guy, really product focused, and making something productive and beautiful. So I started using Notion personally, and at work. I used it to help me organise my first ever cycle tour across France in 2019 (I got half way through and then rained off - 3/10, would not recommend), to track my route and AirBNBs. I used it to write documentation for projects at work. I kept a track of my personal and seasonal goals (shoutout to <a href="https://www.relay.fm/cortex/79">Cortex</a> for introducing me to the idea of yearly and seasonal themes.)</p> <h3>In praise of notion</h3> <p>I initially got on really well with Notion, it had a number of really nice features:</p> <ul> <li>It is beautifully designed by people who care deeply about visual and software design.It is very obviously a well-considered piece of software.</li> <li>It's cross platform, and even has a fully functional web-app, meaning I could access it from anywhere, at any time.</li> <li>The number of ways it lets you store and present data, statically and dynamically, make it a very versatile tool. I used it to write long-form opinion pieces, plan cycle tours, and document software projects.</li> <li>It provides an opinionated way to store information: systems for categorising are very personal and it's very easy to over-architect or make inconsistent. By enforcing a hierarchical structure, it's harder to let things sprawl</li> <li>The structured content, and collaborative team sharing features built in, make it very obviously an excellent tool for organisations - so it's a nice future-proofing tool.</li> </ul> <h3>Moving away from Notion</h3> <p>After 4-5 months, I started to notice some noteworthy drawbacks to using Notion in practice:</p> <ul> <li>Sporadic offline support. I would get semi-randomly logged out of my machine, and I the data would often not be available locally. To get deep work done, I like to take myself to wifi free areas and focus, and a number of times, Notion put a spanner in that plan.</li> <li>I rarely reached for the vast array of functionality available to me. I largely stuck with headings, web page embedding, and some tables, sometimes.</li> <li>When I write, I like to be hyper-focused (I am writing this on a plane, in full screen mode, with noise cancelling headphones) - my brain will get distracted by anything I can tweak (colours, spacing, organisation). Notion gave me a lot of options to get distracted by.</li> <li>Poor iPad smart keyboard support. Even something as simple as pressing the down arrow to go to the new paragraph wasn't supported. This is my one feature-related complaint. Underneath all of these was a really nebulous feeling that reaching for Notion felt like work. I had a couple of more systemic, underlying problems with using it which are harder to look past than UI or features. Fundamentally, I felt a growing gap between how I thought of myself and my work, and how Notion made me present it. Notion organises each file as if it were a page on a website - in a tree-structure, with siblings, parents, children. This meant that everything had to belong somewhere, which is fine for fully formed ideas, organisations, or processes - but I found it didn't support the growth or development of concepts so well. Sometimes this is fine, because you know the content will mature - e.g. when you are documenting the architecture of software: you know the moving parts, their function, and their relationships. It becomes easy to add new parts and modify existing ones. Sometimes, however, I found this limiting, and I had to force my ideas or notes to fit a structure that I hadn't defined and didn't want to define. I had a number of pages in Notion which were essentially lists of half-formed ideas, or were links to pages for half-formed ideas. This structural organisation felt so final, and high-cost. Like changing anything would require a lot of boilerplate and formulated thinking, when for me the note making and moving <em>is</em> the thinking. When does something move to its own page versus sitting in bullet list of other whacky ideas? Where does this new page live? In my mind, it belongs with other half-formed ideas, because it's in progress, but it also belongs with its thematic brethren: if it's a software idea it doesn't belong next to a meal plan, cycle route database, or fitness training regime. This is at the route of my move away from Notion: I learn best through experimenting and demonstrating to myself - and for this to be accessible, I need to have no investment in the results of experimentation. If I need to set up five different routes on Strava before I find the right one, I will happily just discard the old ones - it's 2019 and data has never been cheaper. I could not learn a language, framework, or library by reading the docs or a blog post. Notion is about creating a product., a well formed artefact. My process is about creating a lot of mess at very low cost. I felt guilty about deleting things or moving them within Notion, which is strictly a personal feeling, and not a design intention by the team behind the product (it might be, but I really don't think it is.)</li> </ul> <h2>Returning To Bear</h2> <p>Since moving back to Bear, I've found writing a lot more pleasant and less intimidating. I actually managed to start <em>and then finish</em> this piece, for example. Migrating all of my information from one to the other has been a little bit of a pain, but it's now so easy for me to get started creating something, without worrying about where it belongs or how I should categorise it at the moment of creation. I have my beautiful, overflowing dumping ground, and in six months I look forward to coming back to Notion begging for their opinionated organisational structure. Until then, <em>vive l'ors</em>.</p>]]></description> </item> <item> <title><![CDATA[What is CSS-in-JS and why do people keep using it?]]></title> <link>https://thomaswilson.xyz/blog/what-and-why-use-css-in-js</link> <guid>https://thomaswilson.xyz/blog/what-and-why-use-css-in-js</guid> <pubDate>Fri, 20 Sep 2019 00:00:00 GMT</pubDate> <description><![CDATA[<p>The elders tell us of a time where you would build websites by literally writing your <code>.html</code> files. If you wanted to add some styles, you'd write them in a <code>.css</code> file and then <code><link rel="stylesheet"></code> the two together. So you'd write your entire site in semantic HTML, about whatever it is people did back then (like mammoth hunting or pyramid building) and then you would <code>ftp</code> that onto your server, and other people could view it. At least as long as they could fight off polio or resist rebelling against the bourgeoisie. Maybe you'd go out and celebrate at the tavern afterwards, but actually that one sounds pretty relevant today.</p> <h2>Component-orientated architectures arrive</h2> <p>In the modern (but still terrifying) world of 2019 - HTML, CSS, and JS remain three central tenants of the internet: HTML providing content, CSS styling it, and JS adding functionality on top of everything. The way we get the result of these technologies, HTTP, has remained pretty constant too. However, at some point people started to realise that writing <em>just</em> HTML could make it difficult to edit parts of their website. Say you have a navigation header, and you want to add a new page to your website. Well now you need to go through every <code>.html</code> file, find the navigation header, and add an item. And what happens if you miss one file by accident? This is the problem which facilitated the evolution of component-centred architecture: a component being some pre-defined visual element, simply a "thing" on a website: a tweet in a list of tweets, a list of currently trending articles on BBC News, a user's avatar image.<br> This lead to building websites as a set of components which you compose together, as opposed to single monolithic pages. This practice evolved, and more responsibility was handed over to JS and other technologies. People started writing Single Page Applications (SPAs), and static-site generators increased in popularity - where we could define and update components in a single place, and see them updated across our site without having to delve into the nested HTML ourselves. It doesn't matter if the site is actually just a single JS function or runtime which hooks into the browser's URL (e.g. a SPA written in React or Vue) or if it generates a set of HTML files (a static site generator). Component-based architecture is the practice of breaking out our visual element by their role, not their location. Pairing components with external data sources, like in a CMS or a databases, means that a website does not need to be rebuilt or re-made whenever a new product is added to a store, or the price of an item changes. It has given a lot of power to people in the business, but who weren't developers. And it's freed up developer time to focus on more developer-y things, like complaining about meetings and fixing their parents' wi-fi.</p> <h2>Where does CSS come into this?</h2> <p>Look, the point I'm making is that modern web development considers a web page as composed of many components, which can be shared across pages (and even sites). But the way we do styling with CSS didn't immediately go through a similar revolution. In a lot of cases we were still left with one global CSS file, which we would simply <code><style ref="stylesheet></code> into our application. This isn't to say it was still 1998 - we developed build chains and pre-processors - tools which would generate CSS, but gave us more advanced features - like inheritance and extension, and functions and variables. This made it much easier to update CSS, and quicker to write in general. Despite this, these processes often output a single global stylesheet. In the past couple of years, some web developers have created technologies which remove this separation between components and styling - allowing developers to declare styles in the same way they declare components.</p> <h2>Why not CSS-in-CSS?</h2> <p>(First off, let's acknowledge the fact that it's now completely valid to specify that I'm talking about CSS as in a <code>.css</code> file - how weird is web development?) CSS is incredibly powerful, with a lot of nuance. It's a great technology and some people really love it - it can make websites beautiful and fast and just joyful. Despite what I'm about to say, I really like CSS, and I'll use it by default where it makes sense. Despite this, there are very legitimate criticisms being levelled at CSS. Principally, these criticisms are due to the way that CSS is authored, managed, and generated - and the sprawling, dynamic, and unpredictable HTML content tree which is tightly coupled to it. There are a couple of problems which emerge from these large, single, often append-only stylesheets. These problems become more apparent, and costly, as an application reaches a certain size, and exists in the real world, where maybe several developers are authoring styles and creating different bits of the website. Even as a solo dev on side projects, I've felt some of these negatives:</p> <ul> <li><strong>Name collision:</strong> Different parts of you application share the same logical name, like <code>.navigation-item</code> - but is that the nav item in your footer, side bar, or header ? All of a sudden, css is vying to apply the same styles to three three separate navigation items, which you might not necessarily want to look the same. This can lead to…</li> <li><strong>Over-specific selectors:</strong> To combat the above, you might start chaining your selectors (e.g. <code>header > .navigation-item</code>) which is fine, until you have to chain 2, 3, 4 selectors - at which point re-structuring your HTML introduces visual regression and style changes, because your css nesting no-longer matches your HTML.</li> <li><strong>Keeping styles in just-in-case:</strong> It can be surprisingly hard to know which styles in css you are using, especially when paired with the above: it's easy to see if a single class name is being used, but much harder to know, reliably, at a glance, if you have <code>header > .navigation > .navigation-item > .navigation-icon</code>. Imagine the complexity you add in when you start dynamically rendering elements with a JS library, or just using JS to add or remove classes from elements. This can lead to bloated CSS files which no one wants to touch or modify, for fear of introducing unforeseen regressions. Which is basically…</li> <li><strong>Unpredictable side effects from modifying or deleting code</strong>: This affects the developer experience and process - well-architected software presents a clear process for change, refactoring, or extension. When you cannot make changes with the knowledge of what you're going to affect, or at least <em>where</em> you're going to affect - it is hard to maintain and extend software into the future. You end up with long, append-only style sheets, and worse, the cursed <code>!important</code> tag.</li> <li><strong>Source order specificity</strong>: With more of our client-side applications being rendered, loaded, and managed by JS frameworks or libraries - we cannot reliably predict the order which CSS styles will be loaded into the DOM, because it may be loaded only for a specific page - either intentionally, or from automated code-splitting. Files which load later have higher <em>source order specificity</em> and can override styles declared earlier. So styles can be unpredictably overridden by the way our users use the application.</li> </ul> <h2>CSS-in-JS as a solution ?</h2> <p>As the name suggests, CSS-in-JS is the process of using JS to generate valid CSS style syntax. This is opposed to managing their styles by creating separate <code>.css</code> files (or <code>.less</code> and <code>.scss</code> for that matter). It is typically defined alongside a component, e.g. the JSX in a React component, or the template in VueJS. This is strongly related to the component-first architecture of modern web development - an extension of the idea that everything about the View of the application (capital V as in MVC) should be defined in one place - not two (a .js file and a .css) It's briefly worth mentioning here that CSS <a href="https://medium.com/@pioul/modular-css-with-react-61638ae9ea3e">can be scoped</a> to single files - meaning that not all of this functionality is specific to JS. However, the ability to generate and modify styles with the JS language offers a lot of the power of CSS to the hands of those without intimate knowledge of the CSS syntax. Dangerous indeed. CSS-in-JS is <em>not</em> a singly library or package, and it is not an agreed syntax. A number of approaches have emerged from the community to address this problem. Some example libraries include:</p> <ul> <li><a href="https://www.styled-components.com">styled-components</a></li> <li><a href="https://cssinjs.org/?v=v10.0.0-alpha.25">JSS</a></li> <li><a href="https://emotion.sh/docs/introduction">Emotion</a></li> <li><a href="https://styled-system.com">Styled-System</a></li> </ul> <h2>Why do people keep using CSS-in-JS ?</h2> <p>Fundamentally: <strong>It's a component-first way of thinking</strong>. it takes the way modern web development thinks about web pages, and the widgets on them - and applies that philosophy to way we write our styles. It gives us a one-to-one relationship between our components, and their styling declaration (as opposed to one global stylesheet and many components.) This means your selectors aren't traversing the DOM to find the <code>.navigation-item</code> that they <em>really</em> mean. This makes it easy and familiar to think about, and it <strong>centralises our visual code into one place</strong>. This is a nice philosophical benefit, but it pragmatically helps us by constraining where a set of styles are used. This means <strong>they could be edited or deleted with more certainty that we aren't about to accidentally change styles across the DOM</strong>. For me, the strongest advantage of CSS-in-JS is the addition of functionality from a programming language, like JS. <strong>This allows you to set styles based on global variables (e.g. a theme) or local state and props, and use functions and conditional statements.</strong> This adds a huge range of flexibility and functionality, without having to manually add or remove class names from a DOM element. This drastically reduces the cost of creating complex or delightful user experiences (e.g. having cards hover when they're under the cursor, or a button glow if it's toggled on) without tightly coupling it to specific css classes or selectors. UI libraries and frameworks should abstract the author from the implementation details (i.e. managing the DOM), and CSS-in-JS fits this philosophy. When we declare styles at author time, our library of choice (e.g. styled-components) handles the transformation into valid CSS, and inserts it into the DOM. As part of this, the library will likely generate a unique (hashed) classname, this means <strong>developers don't have to worry about creating unique, or strictly-structured class names for their css</strong> - they can just declare styles, and assume they will be correctly scoped. What's more, <strong>the build chain which does all of these is integrated into the existing build process for the website</strong>. We can keep our JS project as purely JS, and don't have to worry about building and bundling <code>.scss</code> or <code>.less</code> files.</p> <h2>Articles I found useful</h2> <p>I came across a couple of really nicely written articles when I was researching this piece. I'd recommend them if you're curious:</p> <ul> <li><a href="https://mxstbr.com/thoughts/css-in-js/">Why I Write CSS in JavaScript</a></li> <li><a href="https://medium.com/dailyjs/what-is-actually-css-in-js-f2f529a2757">What actually is CSS in JS?</a></li> <li><a href="https://2019.stateofcss.com/technologies/css-in-js/">The State of CSS 2019: CSS-in-JS</a> - Just pretty cool</li> </ul>]]></description> </item> <item> <title><![CDATA[Culture I devoured in Autumn 2019]]></title> <link>https://thomaswilson.xyz/blog/culture-i-devoured-autumn-2019</link> <guid>https://thomaswilson.xyz/blog/culture-i-devoured-autumn-2019</guid> <pubDate>Wed, 30 Oct 2019 00:00:00 GMT</pubDate> <description><![CDATA[<p>This season turned out to be surprisingly busy with culture. I started the month by talking at two tech events in London, meaning I arrived into the full body of the month having produced some very technical, thoughtful output. I needed some really well-considered and curated culture to put everything back in the right places. Kind of like an internal tidy-up after I'd rummaged through all of my draws to produce someone who was definitely more knowledgeable than I am, and probably a lot funnier and more extroverted.</p> <h2>Historic Centre of Florence</h2> <p>Italy, UNESCO World Heritage Site</p> <p>Hard as it is to believe now, a stonking four weeks later, but I started off this month in the centre of Florence, Italy. It's a city I've visited every year since 2014, sometimes alone, sometimes with romantic partners, other times with friends. It is a place unlike anywhere else I have been on earth. The city is old and sprawling, the centuries-old city wall no longer even resembles an outer limit. It is one of the centres of the European renaissance, a hub of craftspeople, artisans, religion, philosophy, and hot blooded commitment to creating something beautiful. I don't care that it's full of tourists (myself included). I don't care that I was only there for three full days, and that my Italian really has plummeted. I don't care that it's a romanticised ideal that I've created of a city in a country with some very real economic and political problems, and a culture which I don't think would fit me very well at all. The city reminds me of the wonder and joy of travelling to new places, and to the higher ideals of art and craftspersonship which I value, but can be pulled away from by the urgency of the day-to-day. It is a city which speaks volumes to me, in a quiet, old language that I have to be very still and quiet to hear. The historic centre <a href="https://whc.unesco.org/en/list/174/">is a UNESCO World Heritage site</a>, and I make the rules so I say it counts as culture, and boy am I glad to have had the chance to visit to visit there again.</p> <h2>House of MinaLima</h2> <p>Soho, London</p> <p><a href="https://minalima.com/about/">MinaLima are a design studio</a> founded in 2002 to create the entire visual language and style of the Harry Potter universe as it was being brought from page to screen. They contributed hugely to the visual props in the franchise. If you've seen the films, you have seen their work: The Daily Prophet (the wizarding newspaper), the most-wanted posters for Sirius Black and Bellatrix Lestrange, the Black family tree tapestry, the penmanship in Molly Weasley's howler that she sends to Ron after he flies a Ford Anglier into a magical tree. The whole thing is situated across four floors in a historic london terrace, with charmingly wonky floors, windows, and ceilings. The walls are full of all of the attention to detail that you could so easily miss by "just" watching the films. I grew up with Harry Potter, the books and the films, and that house felt so wholesome and warm - it is a really wonderful example of an intersection between visual design and world-building. If you are in north-ish London and want to kill 20-40 minutes, go and take a look. It's most wonderful.</p> <h2>Faith Hope and Charity</h2> <p>The National Theatre, London</p> <p>This piece makes up the final in a trilogy of new work by Alexander Zeldin. I haven't seen either of the previous pieces, though I rather wish I had. <em>Faith Hope and Charity</em> takes place in a community centre in London across a couple of months, seeing a host of believably-guarded and warey characters, as they come for a free lunch and choir practice. While I was watching it, I felt the pacing to be unbearably slow at times - but on reflection, the whole thing was staged and timed exactly as it needed to be. You were never force-fed any ideas, and the eight-or-so principle characters tore you between a number of simultaneous plots or points of interest. Certain people and events became more of a centre-piece later on, but for most of it I got such a real sense of London: disjointed conversations hindered by people not wanting to share or give too much - because they either don't know things about themselves or are scared to let other people see them as weak or frightened. Of people deflecting questions and awkwards conversations by busying themselves, or talking about anything (the biscuits, the leaky ceiling, anything) other than the things which very much needed to be talked about. <a href="https://www.nationaltheatre.org.uk/shows/faith-hope-and-charity">Susan Lynch, one of the actresses</a> put it perfectly when she said that the piece is "about moments between people, and it's about small acts of human kindness… the audience is as vulnerable as the players". It's also the second time I've seen Cecilia Noble on stage, and the second time I've watched her command my attention - the woman is fantastic to watch.</p> <h2>Akram Khan's Giselle</h2> <p>Sadlers Wells, London</p> <p>I feel lucky that I got a chance to see <a href="https://www.ballet.org.uk/production/akram-khan-giselle/">this piece</a>. Based on the classical ballet, in its characters and broad plot points, but has been adapted into contemporary movement and narrative by Khan's choreography and vision. There is always a risk when you see contemporary movement given to classically trained dancers. They could hold back from the rawer moments or the unclean lines. Ballet dancers like to look good, it's understandable. For the most part, if you weren't looking at them thinking about this - I don't think you would worry so much about it. Tamara Rojo's performance as Giselle was, appropriately, otherworldly. From innocence and smitten to fear-driven anger, she mixed vulnerability and strength in a way which I can't imagine ever being able to replicate. The first act was bullish, raucous, misplaced energy. Some wonderful folk dancing, animalistic movement, and very physical violence. The second act, all forty minutes of it, were heartbreaking, and I was furious when the curtain came down without letting me know what I need to do with these new emotions. It was wonderful to see the piece reimagined in this way, and set to a powerfully composed original score and soundscape, which pleased the contemporary dancer in me to no end.</p>]]></description> </item> <item> <title><![CDATA[Moving my personal site to Gatsby]]></title> <link>https://thomaswilson.xyz/blog/moving-from-nuxt-to-gatsbyjs</link> <guid>https://thomaswilson.xyz/blog/moving-from-nuxt-to-gatsbyjs</guid> <pubDate>Tue, 31 Dec 2019 00:00:00 GMT</pubDate> <description><![CDATA[<p>A few weeks ago I was having a conversation with someone about modern web design, and we spoke about web fonts and variable fonts. In my experience, people who work in software development have a couple of hills that they will die on, if so required. For this person - the idea of not using system fonts (i.e. typefaces which are already installed on a user's device) was completely baffling. Why are we increasing the time-to-load and packet size required to display a web page - just for a typeface. What about that horrible (re)appearing text, or worse, shifting text which happens when the browser finally loads the typeface.</p> <p>System fonts, I had argued to me, are designed and considered specifically for the device viewing the page. They're curated in a way that we, as site authors, cannot easily curate.</p> <p>Ever since they introduced that tiny bit of doubt into my mind, I couldn't help thinking that maybe I should just be using system fonts. Long story short, I rewrote my entire personal site (<a href="https://thomaswilson.xyz">https://thomaswilson.xyz</a>) from <a href="https://nuxtjs.org">Nuxt</a> (a Vue.JS application framework) into <a href="https://www.gatsbyjs.org">Gatsby</a> (a React.JS static site generator). It took me like to evenings and I'm happy with my decision.</p> <p>Look, there were a couple of other factors in this. Like, I had just taken the jump to go freelance so I needed to move my increasing portfolio over to my professional site. I wanted to move some of my older pieces of writing from Medium onto pages on this site. I was creating a beautiful list of my favourite albums of 2019 (note from 2023 Wilson: This page of 2019's hottest records didn't make the move between sites). There was a lot going on, and I was finding a lot of friction in the process of writing blog posts for this site.</p> <h2>Why React, not Vue ?</h2> <p>Fundamentally, I have more personal and professional experience with React. I have created a lot of static sites and dynamic apps with React, I've used a lot of styling solutions, state management libraries, application architectures, and third-party packages. I know my way around the ecosystem, around React-ive thinking. We should be careful of using tech <em>just</em> because we're comfortable with it, but when it's your personal website which no one else will see or touch - familiarity is a major benefit.</p> <p>It definitely didn't help that I was having <em>big</em> problems getting my codebase to build on a new Laptop (a 2019 MacBook Pro, not even something obscure). It couldn't get the Nuxt -> TypeScript build chain to work, despite hours of debugging. I'm not a dev-ops or build-chain kind of developer, but really this shouldn't have happened, and should not have been so obscure to solve.</p> <p>Additionally, at the time of writing, the proposed <a href="https://medium.com/the-vue-point/plans-for-the-next-iteration-of-vue-js-777ffea6fabf?ref=madewithvuejs.com">V3 of Vue.JS</a> will contain a lot of changes to the library and recommended practices. I am excited to see these changes, and I think Vue.JS is a better web application framework out-of-the-box than React and Angular - I believe V3 will bring a lot of hard-learned lessons about web apps into the framework. However, right now I didn't fancy re-writing most of a failing Vue app to have to re-write it again in a few months. <em>A la</em> AngularJS vibes.</p> <h2>Why Gatsby?</h2> <p>I've used Gatsby a few times to build quick/simple sites for friends. It's very fast, both in development process, build process, and then loading times. I was looking for something I could be productive in quickly, at Gatsby was that.</p> <p>I want to give a special shoutout here to the <code>gastby-image</code> package for lazy-loading images (alongside the GraphQL support and <code>image-sharp</code> library for image processing. This kind of support for blur-up images, and an easy ability to control image size at build time are incredible, and a great step forward for the modern web.</p> <p>Speaking of GraphQL (smooth, I know) - I think GraphQL is going to play a big part in web development in the next 3-5 years. No, not everything is going to be re-written to be GraphQL endpoints, obviously. That would be a bad idea, obviously. Yet, as a front-leaning full-stack developer, GraphQL is powerful and expressive enough to make me take notice. Gatsby gives you a GraphQL layer to query for all your data (local files, site metadata) - the chance to get familiar with this tech is something I am appreciative of.</p> <p>Recently the core-team has been pushing <a href="https://www.gatsbyjs.org/docs/themes/what-are-gatsby-themes/">Gatsby Themes</a> (as I heard about on <a href="http://www.fullstackradio.com/115">here</a>, <a href="https://syntax.fm/show/150/gatsby-themes">here</a>, and <a href="https://syntax.fm/show/150/gatsby-themes">here</a>). I love web design (have I mentioned that yet?) - and I love seeing the core-team take such an interesting, systematic approach to design as a core part of their framework's architecture. It looks like I'll be able to learn a lot about systemised design through Gatsby.</p> <p>Lastly, I wanted to quickly/easily deploy my personal site on <a href="https://www.netlify.com">Netflify</a> - a service which can build, deploy, and host static sites incredibly easy. It took, and I am not exaggerating, about 120 seconds to go from creating a git repo to having this website available on the World Wide Web.</p>]]></description> </item> <item> <title><![CDATA[Hereabouts devblog #1]]></title> <link>https://thomaswilson.xyz/blog/2020-02-24-hereabouts-devblog-1</link> <guid>https://thomaswilson.xyz/blog/2020-02-24-hereabouts-devblog-1</guid> <pubDate>Mon, 24 Feb 2020 00:00:00 GMT</pubDate> <description><![CDATA[<p>Hi, my name's Thomas Wilson but I often go by my just my surname. I'm 28 years old, currently based in London, England, and I design and build software for a living through my small independent studio <a href="https://www.tinyfox.studio">tinyfox studio</a>. At the beginning of 2020 I quit my job to do this independently, and now I'm building <em>hereabouts</em> - an app that provides self-paced walks, tours, hunts, and races for travel adventurers In this devblog series I want to record to the process of building something modern and beautiful from the ground up.</p> <h2>My problem/frustration</h2> <p>I love being in places. I love walking around the streets of London, and especially love how London feels like 30-40 little villages that you can find yourself in at any moment. I love learning things about the people who lived and made this place what it is today. It's my favourite part about travelling solo - is that I can walk around a new city at my own pace.</p> <p>The Pre-Raphaelites had studios in Bloomsbury, Virginia Woolf lived and wrote some of her work just south of King's Cross, Sherlock Holmes got coked up just east of Regent's Park. You could maybe walk between all of these locations in 60 minutes, and comfortably within an afternoon. Maybe you'd notice something things if you read the <a href="https://www.english-heritage.org.uk/visit/blue-plaques/">blue plaques</a> but really what's a sentence to describe a life's work?</p> <p>When someone visits London from somewhere else, or when they move here, or even if they just need a good idea for a fourth date - I want them to feel connected to the place and idea of London. Not caught up in frustration at the man who get on the tube before letting other people off, or the blind panic when you misjudge the timing of the turnstiles coming into the tube station. But these are both very real experiences of London, everyone who visits should have them. But there's so much more in a place.</p> <h2>Hereabouts: self-paced walks, tours, hunts, and races for travel adventurers</h2> <p>Hereabouts is the name of the app I am building to address this problem. I want to create an app that lets people explore a new or old city by giving them guided tours, stories, puzzles, and races. I want to reach adventurous travellers and sate their appetite to learn more about what makes a place beautiful.</p> <p>I don't know what exactly it will look like or do. That's part of the development process.</p> <h2>What I want to achieve</h2> <p>By building this idea out there are two things I want to achieve, neither of which are overtly technical:</p> <ol> <li>I want people to experience joy and connection form the place they're in or connected to</li> <li>I want to provide high quality story telling and information resources</li> </ol> <p>For a while I've wanted to build an app that helps people discover a place by being in it. I want to help people discover the same feeling I have when I'm somewhere and I learn something about it. I want people to have fun in the real world, in real spaces without being tied to their screen, or a paper guide, or part of a pack of tourists.</p> <p>I love storytelling, and humans keep re-inventing how the do it. Oral stories, pictures, words, theatre, tv, movies, podcasts. Storytelling is probably the least talked about oldest profession. So I want to share the stories of the people who frequented, built, ruined, or just passed the streets.</p> <p>I hate that when I go to learn about a certain place, or person, or idea - the information is scattered and made distant. It is made boring - because it is hard work, very skilled and professional work to weave together narratives of people, places, movements, and ideas. But you create value by providing high quality, unique resources that appeal to <em>humans</em> (not <em>users</em>.)</p> <h2>Why build an app?</h2> <p>Something I keep re-learning about myself is that I have this drive to build and create things for me any myself. I first learned this about myself during my Ph.D. where I taught myself software development so I could make a web app for my education research. In the three years since I finished that, I have worked for a large company and a growth-stage VC-backed startup. I happily sacrificed a lot of myself into these jobs because I learned a lot from other people. Being self-taught is a good start but it's a terrible middle.</p> <p>And to be honest, I think the things I want to achieve can <em>only</em> be done on modern handheld technology (i.e. phones) because I want to bring multimedia (picture, audio, text) to someone based on the place they're in. I think it <em>could</em> be done by being walked/shown around by a professional. However that's not an idea that excited me, and I also think it's too much like forced fun. Part of being an explorer or adventurer is being able to go down side streets, get surprise ice cream, or spend twice as long somewhere you find interesting. There should be guidelines, not fences/rails.</p> <p>This is also overlooking the fact that I am a software developer by trade/craft. It influences to way I see the world, solve problems, and build solutions. I enjoy designing and building software, and I'm sure that's affecting my decisions.</p> <p>I also want to call out a couple of very influential sources to me when thinking about if this is something that I <em>can</em> or <em>should</em> even be doing:</p> <ul> <li><a href="https://basecamp.com/books">Basecamp's books</a> - specifically "Rework" and "It doesn't have to be crazy at work" have shown me the kind of company it is possible to build, and the way you can go about making something.</li> <li>The <a href="https://www.indiehackers.com/start">indie hacker</a> movement have been excellent at showing me countless examples of people who have built businesses at various speeds and with various goals.</li> </ul>]]></description> </item> <item> <title><![CDATA[Kickstarting UX Design with ugly working documents: Screens, Components, Actions, and State.]]></title> <link>https://thomaswilson.xyz/blog/2020-03-15-ugly-but-functional-ux-design</link> <guid>https://thomaswilson.xyz/blog/2020-03-15-ugly-but-functional-ux-design</guid> <pubDate>Sun, 15 Mar 2020 00:00:00 GMT</pubDate> <description><![CDATA[<p>UX design resists standardisation or templates. It can't be a one-size-fits-all approach, and the nature of the product, audience, and production team all mean that something different is needed each time. Whenever I get past the early stages of UX design (like understanding what a product does, and who it does it for) - I find myself with a different working document and process than I've needed before.</p> <p>I wanted to share the things I do that give me the momentum to get to a place where I can do this more specific kind of document.</p> <p>I am a very visual person, so this starts with low-fidelity UI mockups: clunky boxes and text, that I can setup and tear down quickly. My process is built around forcing me to move through all the parts of an app quickly. This means I force myself to encounter all the information an app needs,every way that it's displayed, and everything a user can do with it. Seeing these things within a short time makes repetition and patterns more obvious - and helps me make connections and similarities.</p> <h2>Tl;dr</h2> <ol> <li>You are going to make a list of all the Screens & Components in your app. You're going to do it in an ugly-ass looking document that you're never going to share and actively should not spend time to make pretty. Make this document however makes sense for you - Figma, Sketch, Paper, whiteboard, plaintext, WHATEVER I DON'T CARE AND NOR SHOULD YOU - YOU'RE NEVER GOING TO SHARE IT</li> <li>First, make a list of all the <strong>Screens</strong> in your app, and lay them out (roughly, don't fiddle with arrows) in an order that someone could realistically move through your app. I like to group similar screens closely together, and I also look for common screen patterns (e.g. screen with a header and a footer nav).</li> <li>You're going to make a note of all the high level <strong>Components</strong> on the screens. Start by just making a boring old box with really clear terms on it: e.g. "Account Details", "Sign in form", "Create account form", "Recent transactions".</li> <li>Go through these high level components and start making the low level, more abstract/utility ones: "TextField", "Button", "Icon", "Label". And begin to compose these together in your higher level components.But <strong>do not lay them out nicely</strong>.</li> <li>Take your Screens and Components, and list all the variants in <strong>State</strong> that you can have: can a TextField be <code>selected</code> or <code>disabled</code> ? Can an event in a calendar be <code>upcoming</code> or <code>passed</code> ? Can the Screen for editing an article be in <code>edit</code> mode or <code>read</code> mode ?</li> <li>You're going to look at all the components you have that are <strong>Actions</strong> - i.e. can I click it, slide it, interact with it in a way that does something: navigates me somewhere, opens a modal, logs me out. Use this as a chance to understand all the ways a user can navigate around the app - going from one screen to another.</li> <li>Look at all this amazing information you have about your app or product, and how you can organise it to help your team design and build a product in a way that creates the most value most quickly.</li> </ol> <h2>Why even do UX?</h2> <p>I mean, honestly, if you don't think it will serve you, your product, or your team, don't do it. Don't invest in work uncritically, if you don't see how it ultimately makes you more money or a better product. If you think what I'm saying is dumb, don't listen or read - I think plenty of people have useless opinions, especially on the internet.</p> <p>For clarity, when I talk about UX design, I am talking broadly at developing an understanding of an app or service from the end-user's perspective. How will they interpret the thing we put in front of them, and what can a design/engineering team to do make sure that the creative vision is the same as the user's experience?</p> <p>It's like viewing a miniature model of a town: you can see distinct regions, connections between them, and kinds of buildings in each. But you don't get bogged down in the specifics, like "is that store a pharmacy or a grocery store?".</p> <p>More concretely, this understanding is useful in making a product that actually does what you want it to. It's no good having an app that does something "in theory" - because truly most of your users don't care about "in theory". They want to learn a another language, make a claim on their insurance, or get a new beautiful handmade scarf. This is similar to the Jobs to be Done mentality.</p> <p>From an engineering perspective, as someone who <em>makes</em> apps, doing UX design helps break a "simple" app into exactly how many things need to be built, and what they need to do. It lets me build the necessary things, in a sensible order, and gives me a shared language/understanding that then lets me communicate effectively with a team.</p> <h2>0: Screens & Components, State & Actions</h2> <p>Everything I do in this early UX process is designed to help me understand my app along four heuristics: Screens, Components, State, and Actions. These are the things that I find it useful to break an app into - they might be useless to you and that's okay. Do read on, and see what sticks.</p> <ul> <li><strong>Screens</strong> - these are easy to intuitively grasp but hard to define. Assuming prior knowledge of the internet: they're like URLs of a website, which will take you to a specific page, like a profile, sign-up form, or edition of a newsletter. More abstractly, they're discrete, separate views into an application which are containers of other content (i.e. Components).</li> <li><strong>Components</strong> - are also really hard to define - they're visual <em>things</em> on the screen. The <a href="https://reactjs.org/docs/components-and-props.html">ReactJS</a> docs calls them "independent, reusable pieces, [that let you] think about each piece in isolation". The most commonly thrown-around example of components are Buttons or Cards - they're just reusable bits of UI, that can be really small (like a button) or larger (like a log-in form).</li> <li><strong>State</strong> - is a way of modelling what information/data the app will store, it usually affects what will be displayed or how it will appear. For example, what's the name of the current logged-in order, what are the details of the current search/filter being set by the user?</li> <li><strong>Actions</strong> - are the things a user can <em>do</em> on a screen, what can they press, swipe, toggle, move, type into, etc. The consequences of these actions can be things like opening a modal (a Component, by the way) or navigating to a new Screen .</li> </ul> <h3>You are creating a low-fidelity working document.</h3> <p>To help identify these things, we're going to make a visual representation of each. At the early stage on the UX design process I have to remind myself often that <strong>I am creating a working document</strong> - one that won't be shared widely (or at all) within my team, let alone outside of it. This is just a way for me to organise my thinking. This isn't about making any kind of mockup that looks pretty, or crafting meaningful naming conventions.</p> <p>Your working document will probably be ugly. Mine <em>definitely</em> are. I have intentionally put ugly images / mockups in this article so you can feel better about how bad yours look and how little you want to share them. Anything you create during this process is meant to serve you, not Dribbble or Instagram. Embrace the brutality and Spartan utility of your UX diagrams.</p> <p>Trying to optimise for visual and semantic consistency at this stage makes you <em>feel</em> busy, without having to address the important questions. So long as I know what a component or screen means, then it doesn't matter.</p> <p>I also really encourage you to <strong>work with pencil and paper next to you</strong>. Even if you're prototyping on paper - have more paper ready just to jot down questions, sketches, ideas as they arise to your brain. You can't go chasing down every rabbit hole - it will break your flow, and I really think it's important to build up a good flow, in this process. This flowcess. But you also don't want to lose any legitimate ideas or questions you have, they can help you a lot when you're doing higher-fidelity design.</p> <h3>Oh my plants</h3> <p>In this article I'll be using the example of an app that helps you keep track of all of your houseplants. I've called it "all my plants" and I've given it a very predictable green theme.</p> <h2>1: Identify Screens</h2> <p>So let's imagine the following user journey in <em>oh my plants</em> - I want to get to a page that has a whole bunch of details about a specific herb. I can get there by searching for it, by seeing it in a list of plants I've said I own, and perhaps by an automatically created list of plants (like what's in season). This gives us five screens: starting at <em>Home</em> we can end up at <em>Plant Details</em> by going through either of the three possible routes.</p> <p><img src="/assets/blog-images/FF9A9D2E-BB92-4334-8EE6-67BE6F85B14C.png" alt=""></p> <p>This kind of layout, with the arrows drawn between them, is useful at some points, but it's exactly the kind of over-optimisation I just warned against. Because what happens if I need to add in a new screen or remove one? I have to re-structure all of the positions and arrow flow.</p> <p>Robust software architecture is about fighting rigidity and letting developers change individual parts quickly - because requirements are always changing. Good UX design can learn from this - build a working document is about rapid change - the tool you use should work as close to the speed of your thought process as possible so that one isn't lagging behind the other.</p> <p>I'll end up with something like this: simply a list of screens, in some semblance of order that make sense to me. In Figma I make each of these into its own Component (or Symbol in Sketch) so that when I begin fleshing out user journeys later on (like the pretty arrow diagram above) - we'll see something less abstract than just white boxes and black text to represent a screen.</p> <p><img src="/assets/blog-images/E8AEAC0A-FAE2-40B9-AABB-3BDA358F6167.png" alt=""></p> <h2>2: Identify the Components</h2> <p>Once you've got all the screens, start going one-level deeper by identifying Components - distinct bits of UI. I find it most useful to start with the high-level components - i.e. Start with high-level components - things driven by their use cases. I name these in very opinionated ways: "User Owned Plants" is a list of plants the user has said they one, and "In Season Plants" might be a list of plants that are ripe for planting.</p> <p>After I've done that, I start identifying the lower level components: things which are not so closely tied to specific use cases. Prime examples are Lists and List Items, as well as Buttons or Cards. Use your own discretion and opinions here: is a <code>SearchBar</code> component distinct from a <code>TextField</code> - or should they be the same thing? I would advise leaning towards how you communicate things to the user: do you want them to conceptualise a search bar as the same thing as a field in a form? For me, I would keep them as different components, but I could very easily see it argued either way.</p> <p><img src="/assets/blog-images/34B9248A-544A-424A-8047-AE1A2AD07CB4.png" alt=""></p> <h2>3: Identify State</h2> <p>With your new list of screens and components, you're going to want to go through and make a note of every possible variant based on state.</p> <p><img src="/assets/blog-images/FD4E6849-5A3C-49FA-90E6-578E0754C050.png" alt=""></p> <p>This is when things start to get a little complex/tedious, because it can massively increase the sheer number of screens and components that it looks like you're going to have to design. It's also worth paying attention here to the kinds of State - chances are there aren't that many discrete ones, and they can come in groups and are conceptually related: selected/disabled, read-only/edit, locked/available, active/not-active.</p> <p>When it comes to the actual design, you'll be able to share visual metaphors here. In fact I would suggest that kind of consistency can make complex business logic or states feel much more simple than their implementation details. If things are disabled/inactive/locked, for example, the result in very similar to a user: there's a thing on the screen that I can't interact with right now.</p> <h3>Wait, why do I need state on my components AND screens?</h3> <p>Yeah, this is a very fine line - and totally <em>is</em> a matter of opinion. This is one of the points that makes product and UX design a skilled profession.</p> <p>For me, it comes back to what I said at the beginning: UX is about understanding how the user will perceive the product. Even if the information we're presenting is correct, it's the <em>way</em> it's presented that makes the difference between a good and a great experience.</p> <p>Enough talk, let's give an example. Imagine <em>oh my plants</em> knows when's the perfect time to plant each garden herb. It has a <code>PlantList</code> screen - which is a simple list view of <code>PlantListItem</code>s.</p> <p>A <code>PlantListItem</code> represents one individual plant - which is the thing that's in season. Following that logic, we want to flag each plant as in "in season".</p> <p><img src="/assets/blog-images/9AA37981-1E94-4C85-8923-4E183CEB439E.png" alt=""></p> <p>In practice, however, the fact that all the plants are highlighted means that none of the plants are highlighted. It also just looks weird and cluttered and busy. Instead, what if the <code>PlantList</code> was highlighted with some special way of saying that it is in-season?</p> <h2>4: Identify Actions</h2> <p>An action is normally something that changes the state of a component or screen, or that navigates the user around the app.</p> <p>If you identify actions at this point in the design process, it should be really easy for you. It's probably anything that uses a component like <code>button</code> or <code>select</code> or <code>switch</code> or <code>tab</code>... you get the idea.</p> <p><img src="/assets/blog-images/EB659E9B-3FC1-4A0F-B6C2-E1C2622159FB.png" alt=""></p> <p>Conversely, if you recognise there are actions that are triggered by clicking non-typical components, like undecorated <code>text</code> or <code>header</code> - then maybe these are interaction patterns you need to make discoverable to your users.</p> <p>What's considered "typical" depends on the conventions of the platform, e.g. long-press and double-tap on mobile don't really have equals on the web.</p> <h2>5: Go forth</h2> <p>Look, you made it all this way, congrats because even I struggled to make it this far down when I was proof-reading. Hopefully at some point along this journey you've thought "wait, why am I doing this next bit, surely I should go off and do something else instead" - then good. Go do that other thing, like thinking about adding new features or, even better, removing others, or making clearer visual metaphors or condensing many metaphors into one.</p> <p>You've hopefully got a much more complete and accurate (read: big and scary) picture of your product: all the things it needs to do, what you need to build, and exactly how many designs you've got to flesh out and then build. Or throw over the wall to the developers and hear them argue over for the next 2-9 months.</p> <p>Take this blueprint forward and make something you're proud of, or ignore my opinions and become successful anyway - I truly do not mind.</p>]]></description> </item> <item> <title><![CDATA[Why I chose React Native to build a new app in 2020]]></title> <link>https://thomaswilson.xyz/blog/2020-03-22-why-i-chose-react-native-for-app-in-2020</link> <guid>https://thomaswilson.xyz/blog/2020-03-22-why-i-chose-react-native-for-app-in-2020</guid> <pubDate>Sun, 22 Mar 2020 00:00:00 GMT</pubDate> <description><![CDATA[<p>I am currently in the process of building herabouts - an app that's like a tour guide, only cooler. Most of my previous engineering work has been web-based (react and vue) because the internet is an accessible and very capable system for building modern applications. However hereabouts needed certain native functionality - like location, reliable offline data access, battery status, and access to the camera. Yes some of these things are <em>possible</em> on the web, but they're much more native functionality.</p> <p>I've made the decision to write the app in <a href="https://reactnative.dev">React Native</a> - a library for creating applications for native platforms (like iOS and Android) using React and JavaScript.</p> <p>I wanted to share the reasons I made this decision because despite having worked with React Native for clients in the past, I was cautious about adopting it for a personal project. AirBNB famously <a href="https://medium.com/airbnb-engineering/sunsetting-react-native-1868ba28e30a">abandoned React Native in 2018</a> citing a couple of pretty damning reasons: long initialisation and first-render times; lack of code-sharing between platforms; mixed developer experience.</p> <p>In the same post, however, they say that most (80%) of their devs found the experience at least slightly ‘positive' (subjective as that is), and acknowledged that a lot of their problems may relate to the the size and complexity of their team and product, alongside the early nature of React Native at the time. In the years since that was published, React Native and the surrounding ecosystem (like <a href="https://expo.io/">expo</a>) have made the development experience of making a native app a <em>lot</em> better. Big tech companies, like <a href="https://www.theregister.co.uk/2020/01/30/shopify_shifts_its_mobile_development_to_react_native/">Shopify, have also adopted</a> React Native.</p> <p>It's never a clear choice what tech to use, and it's especially difficult when you're starting something new and have no constraints. So I wanted to make sure I was making an informed decision, and this article outlines that process.</p> <h2>Why not native-native?</h2> <p>I initially started working on hereabouts as a native iOS application, written in Swift. At present (March 2020) Apple are transitioning the way UIs are written in Swift to use <a href="https://developer.apple.com/xcode/swiftui/">SwiftUI</a>. The API for SwiftUI is still in beta (currently beta 4) and still has a few quirks (e.g. see <a href="https://www.reddit.com/r/iOSProgramming/comments/fd7mpz/holy_shit_how_the_hell_do_i_use_swiftui_its_the/">this Reddit post</a>) that made the process of building an app cumbersome and awkward. I was unsure of the relationship and split of responsibilities between the existing UIKit, storyboard, and SwiftUI. Given how SwiftUI is largely <a href="https://www.macrumors.com/2019/06/03/apple-unveils-swiftui-framework/">seen as the future</a> of iOS development (and its declarative philosophy shared by react), I didn't want to tie myself to supporting an app written without it, nor did I like the possibility of having to maintain a hybrid UIKit/SwiftUI app where the roles and responsibilities of both parts were changing regularly.</p> <p>This opened up the possibility of creating my app using a cross-platform library - not because I wanted a cross-platform app, but because I wasn't happy with the native tooling. This just happened to open up the Android market. Previously I made the decision to focus on iOS over Android because a) I am personally all in on the Apple ecosystem, and b) <a href="https://www.businessofapps.com/data/app-revenues/">more money</a> <a href="https://sensortower.com/blog/average-publisher-revenue">is spent</a> in Apple's App Store and in the Google Play store. Although I'm not making hereabouts to get rich, I'd certainly like some gin money.</p> <h2>Reason #0: I already know React</h2> <p>The simplest reason for me choosing React Native, over say <a href="https://www.nativescript.org/">NativeScript</a> or <a href="https://flutter.dev/">Flutter</a>, is that I already know React. I've got experience writing production and personal static websites and enterprise apps in it. The declarative and data-bound nature of writing React, especially with <a href="https://www.typescriptlang.org/">TypeScript</a>, comes quite naturally to me now.</p> <p>NativeScript supports Angular and Vue as first class citizens, which I simply don't use as much as React. I started off my Frontend Engineering career writing apps in Angular, and I've written a couple of fast and easy websites in Vue. They're good frameworks, but right now I think React has a large (if not consistently <em>good</em>) community. I know how to handle complexity in React, and I have opinions about styling and architecture that React doesn't fight.</p> <p>Additionally, Google has a reputation for sunsetting projects with little notice, which makes me a little apprehensive about Flutter.</p> <h2>Reason #1: React Native isn't a hybrid WebView app</h2> <p>Many people's gut reaction to creating a cross-platform app is to think of something laggy, and distinctly <em>un-native</em>. One of the simple and earliest approaches to adopting cross-platform mobile development was to use web technologies, which are famously cross-platform and system agonistic, and have the native app render the web app (in its own HTML, CSS, JS) through a WebView. This is how platforms like <a href="https://ionicframework.com/">Ionic</a> and <a href="https://cordova.apache.org/">Cordova</a> work - and they're great for very simple apps, but they're notoriously <a href="https://www.netguru.com/blog/why-you-should-migrate-your-app-from-ionic-cordova-or-phonegap-to-react-native">not very performant</a>.</p> <p>Native apps are better than, and distinguished from, websites by how "snappy" they feel - how responsive the app is to a button being pressed, giving haptic feedback, and then navigating somewhere. It's hardly noticeable when done right, but when there's a 400ms delay between pressing a button and seeing something happen - you <em>will</em> notice.</p> <p>However, React Native works differently: you write your views using JSX, and these are then bridged to native code for iOS and Android - meaning, at some point, it becomes native, and is not just a DOM.</p> <p>Let's just take a second to clarify some of these words: first <strong><a href="https://facebook.github.io/jsx/">JSX</a></strong> is an extension to JavaScript (or to give it its full title: ECMAScript) that introduces XML-like syntax for creating structured data. It looks an awful lot like HTML, but with a few syntactic differences, and the ability to include data in the structure:</p> <pre><code>import React from ‘react' const Message = () => { return ( <div style={{colour: ‘blue'}}> <h1>Hello!</h1> <p className="message__text">Welcome, friend</p> </div> ) } export default Message </code></pre> <p><strong>JSX</strong> is <a href="https://en.wikipedia.org/wiki/Syntactic_sugar">syntactic sugar</a> - its goal is to makes the code easier to write and parse by the humans who have to read and write it. It's also a separate library from React and React Native, but is used by both libraries by default as a way to construct a virtual representation of view elements, like HTML Elements or DOM Nodes. It compiles down to something different, and instructs React to do React-y things like <code>createElement()</code> but we're not talking about that here.</p> <p>The second term I want to bring out and talk about is <strong>bridging</strong>. For an application to run natively, it has to be able to talk to the system in a language and API it understands: e.g. UIKit and Objective-C/Swift for iOS, and android.View with Java/Kotlin for Android. This is a distinguishing factor between cross platform apps (like those in React Native) and the hybrid WebView Apps - we can use a cross platform application to communicate with native APIs, like maps or device orientation.</p> <p>The part of the architecture that lets a JS thread, where a React Native application runs, talk to the native Threads, <a href="https://hackernoon.com/understanding-react-native-bridge-concept-e9526066ddb8">is called the Bridge</a>. The details of how this works are covered for both <a href="https://reactnative.dev/docs/communication-ios">iOS</a> and <a href="https://reactnative.dev/docs/native-modules-android">Android</a> in the React Native docs and aren't really relevant for this discussion - just know they happen.</p> <p>This article isn't an explainer about JSX (but JSX is a interesting idea, regardless of what you think about React itself) or Bridges - but they're two big technological differences between React Native and other libraries that let you use web technologies to write apps.</p> <h2>Reason #3: The performance and benchmarking discussions are nuanced</h2> <p>One of my core beliefs (read: something I work very hard at, but am not necessarily always good at) is only releasing/selling products that I would be happy for someone to pay for. Above all other things, I want hereabouts to have a native feel - to be responsive and feel intuitive to use. It needs to hit that magical 60fps bar, and <em>feel</em> like a first class citizen on a mobile phone because that is what I would expect from an app that I paid for.</p> <p>I've seen a couple of blog posts that (like <a href="https://medium.com/swlh/flutter-vs-native-vs-react-native-examining-performance-31338f081980">this one</a> from inVerita, and <a href="https://thoughtbot.com/blog/examining-performance-differences-between-native-flutter-and-react-native-mobile-development">this one</a> from Thoughtbot) about the performance of React Native that had me worried that I'd be fighting an uphill battle to get performance two where I wanted it.</p> <p>Fundamentally, though, good performance in React Native <em>is</em> possible. It requires a <a href="https://reactnative.dev/docs/performance">thoughtful consideration around what you're doing</a>, and building with the tools that let you investigate and profile your app to let you know when there's a problem.</p> <p>It's much easier to read an article and see how React Native (or any tech) "has bad performance" but this depends too much on what you're doing and how you're doing it. It's a nuanced discussion and it also gets at the whole "software engineering is a skilled profession" thing. The research I did in this area was enough to assure me that I can code myself into a bad situation, but I can code my way (at least mostly) out of it.</p> <p>So I'm not overly concerned about poor performance in hereabouts <em>just</em> because it's written in React Native. Of course I am concerned about it, but I don't think this is a problem unique to the platform.</p>]]></description> </item> <item> <title><![CDATA[Hereabouts devblog #2 - March 2020]]></title> <link>https://thomaswilson.xyz/blog/2020-04-02-hereabouts-devblog-2</link> <guid>https://thomaswilson.xyz/blog/2020-04-02-hereabouts-devblog-2</guid> <pubDate>Wed, 01 Apr 2020 00:00:00 GMT</pubDate> <description><![CDATA[<p>Hi, I'm Thomas Wilson, I'm a web and mobile engineer building <a href="https://www.hereabouts.app">Hereabouts</a> - an app that's like a tour guide if the tour guide was like <a href="https://99percentinvisible.org">Roman Mars</a> after three beers. This is a devblog where I talk about my progress building that app. Also I'm very sorry, Roman, you're one of a handful of people who I genuinely aspire to be like please don't take me seriously.</p> <hr> <p>Well March 2020 has certainly turned out to be quite the introduction to working on a side project. It's the month that the UK (and Europe, North America, etc.) started nationwide lockdowns to prevent and slow the spread of Covid-19. Social distancing, self isolation, and quarantine are all in full swing.</p> <p>Imagine starting a side project based almost entirely on being able to travel somewhere new, or even just go outside and walk around. It's a strange time, but everyone's talking about it being a strange time, and honestly we're all just trying to find a new temporary normal. So with that in mind, here's an inconsequential update on Hereabouts.</p> <p>I'm still pretty undecided on the format of a devblog, which makes this one a brain dump, but definitely the kind of brain dump that you should read.</p> <h2>Notable things</h2> <ul> <li>The Covid-19 Pandemic.</li> <li>By September-October, I want something that I would be happy for someone to download, and happy to ask them to pay for. Assuming there's still an App Store to host on, a functioning economy, cities to visit, or people to buy it. Okay that was my last Coronajoke. And that, my last coronamonteau.</li> <li>Decided on running development in 4-6 week cycles. This is based off what I've read from Basecamp, but also a general understanding about how long things <em>actually</em> take to design and build to a certain quality.</li> <li>Started building more formal documentation (in Notion and Figma) for use case + market summaries, user journeys, business entities, and visual design language.</li> </ul> <ul> <li>Purchased hereabouts.app domain, built a <a href="https://www.hereabouts.app">simple landing page</a> (ReactJS on NextJS, hosted on Zeit's Now), and created a mailing list that so far only my friends (and not even my parents (?!)) have signed up for (SendGrid, NowJS API routes, and CloudFlare worker).</li> <li>Started building the app. Started in Swift, moved to React Native. Enrolled in Apple Developer Programme (arguably too early - it's a motivator)</li> </ul> <h2>What an Emotional Rollercoaster, feat. The Covid-19 Pandemic</h2> <p>This past month has been one of the most varied emotional months I've had in a long time. I my emotions to be strong in number and force at the best of times, but imagine quitting your job to go freelance in what is possibly the worst time in 30 years.</p> <p>I am not a stranger to self-doubt. I often think I am about to get fired, when in reality I have never been fired, or come close to being fired. Maybe I have and I've just instinctively played the "you can't fire me I quit" card.</p> <p>The big situation here is the SARS-COV-19 pandemic that's needling through the globe right now, causing unnecessary loss of life and bringing an economic recession and a wake of social crises. What a time to be alive.</p> <p>Can you imagine finally deciding on a side project you want to carry through to production/publication, and then a <a href="https://www.who.int/dg/speeches/detail/who-director-general-s-opening-remarks-at-the-media-briefing-on-covid-19---11-march-2020">global pandemic breaks out</a>. Not great for the global community or economy, or for an app specifically built around the idea of being outside. This comes at at time where most of the advice from European governments is to stay inside, with <a href="https://www.bloomberg.com/news/articles/2020-03-14/spain-s-coronavirus-cases-jump-36-to-5-753-deaths-rise-to-136">increasing</a> policing and <a href="https://www.aljazeera.com/news/2020/03/europe-edging-total-coronavirus-lockdown-200316131203376.html">enforcement</a>.</p> <p>I've had to seriously think if building this app remains a good idea, and I think it is. I really struggle with shiny-things-syndrome, where I flit between and around ideas and never commit fully to something. Hereabouts is the first side project in 3-4 years that I decided to see through seriously <em>and then did something about</em>. It's the only one that made it past a line in a note on my iPhone. It's not the only idea I've got rolling around in my phone's notes, and it's probably not even the best one. But it's one that excites me: it's an app I would like to have and use, and it's something that I think can offer value to people. It's also going to teach me a lot about launching an app in the real world.</p> <p>Yes, a pandemic with strong government response <em>is</em> a good mitigating factor - March 2020 has truly been wild, and I don't think anyone would blame me if I let the idea go to find something more stable. Like a Zoom alternative or remote yoga teaching software. Or just a Zoom alternative without extremely concerning privacy policies. I'm sure video conferencing can't be that hard, there's no reason that all the alternatives are terrible to use.</p> <p>What's more, the current economic climate has seen travel and leisure industries basically tank out, and it's looking a lot like many people this year won't be able to take holidays. Some of those holidays will be honeymoons, or retirement cruises, or long-overdue personal relaxation time. This pandemic is making a lot of us suffer in a lot of ways, but I digress. There's a <a href="https://www.theguardian.com/business/2020/mar/15/prepare-for-the-coronavirus-global-recession">global recession</a> <a href="https://www.economist.com/finance-and-economics/2020/03/05/a-recession-is-unlikely-but-not-impossible">threatening</a> and although central economic bodies are all trying to act to mitigate these factors, there's a chance that people don't have money to spend.</p> <p>I am aware that I don't want to continue under the guise of <a href="https://www.inc.com/serhat-pala/alexis-ohanian-says-hustle-porn-is-most-dangerous-trend-in-silicon-valley-heres-how-to-eradicate-it.html">hustle porn</a> - I don't want to see this hardship and fight against it <em>just</em> because it's a struggle and it makes a great narrative. I don't want to think of myself as a company that was shaped by the COVID-19 quarantine and panic. I don't really see that as an influential factor in what I've decided to do, or how. What's more, I don't think end users really care about how or when an app was made, especially as people will (hopefully) start to forget what things were like during these times within months of them ending.</p> <p>The primary reasons I want to continue development of this idea, at least for now, is how early in development I am and how this remains a side-project. I have other full time work that lets me pay the bills and I don't <em>need</em> this to take off. I've given this project about 6 months, taking it to the end of summer (September-is) which was always going to be just off-peak for summer for tourism. But it looks like we're not going to get peak tourism anyway on account of the global lockdown. I want Hereabouts to be an app that could be used by someone who already lives in a city, and as a cheap day activity for anyone. I think there remains a market for the app, and the possibility that I learn some interesting things from releasing it to a smaller audience.</p> <p>In short: I'm going to continue with development. It's just a weird part of the Hereabouts story - that the worst pandemic in literally 100 years strikes just as I get going with it. What impeccable timing.</p> <h2>Thinking about development cycle and Topic Lock</h2> <p>I disagree with common practice of two-week sprints and an endless backlog as the best way to manage and drive software development. I think it's short sighted and makes you feel comforted by how busy you are and how much work you have to do. If something's important, it will keep raising itself as important, and I shouldn't move on without it. If something <em>feels</em> important but I forget about it quickly, and didn't latch on and flesh it out - it probably wasn't actually that important.</p> <p>This is especially true for right now: creating the idea for a new product, and then putting that into concrete UIs and code. What <em>is</em> Hereabouts, what does it do, and how is it used? These questions are the most rabbit-hole kinds of questions, because there's a lot of edge-cases and what-ifs that can found or ruin a feature idea.</p> <p>I want to feel I have the freedom to go down these rabbit holes because they are important and I don't want to spend time and energy justifying that when I could spend that energy exploring them.</p> <p>To counteract the (very real) chance that I spend all the time designing or thinking of possibilities, and no time actually building them, I am thinking about how I can integrate the <a href="https://www.designcouncil.org.uk/news-opinion/what-framework-innovation-design-councils-evolved-double-diamond">Double Diamond</a> process which is a needlessly buzzword-y way of saying that I am consciously separating out the processes of a) generating as many ideas as I can, and b) paring these ideas down to find the useful or recurring ideas.</p> <p>Alongside that, I am thinking about Topic Lock. This is something I first heard from CGP Grey said in the <a href="https://www.relay.fm/cortex/95">Cortex podcast</a>, in regards to his work as an independent content creator. It's influenced from the way movie studios produce movies, and the Kanban project methodology: have a fixed number of things that are in progress.</p> <p>I am striving to build a way of working that allows me to create and shape ideas, but also then critically examine the ideas individually and as a collective.</p> <p>This is getting abstract and I'm only a month in, so I'm going to save this for another time. But look - I've been thinking about how to create a process and environment that works well for me, my brain, and the product.</p> <h2>User Journeys, Internal Documentation, and Design Language</h2> <p>This is my party, I'll do what I want, and I want to start by talking about the tools I used to do this work because I find that more interesting than the work itself. I'm not proud of this part of me, but I love well designed, cool, and hipster apps.</p> <p><a href="https://www.notion.so">Notion</a> is hard to describe: it's like a Google Doc meets a database. I actually wrote about <a href="https://thomaswilson.xyz/blog/back-to-bear">why I gave up using Notion</a> back in August so this is a little embarrassing - but I stand by what I said: I cannot use Notion to write long form prose, like this. I am writing this blog post in <a href="https://bear.app">Bear</a>.</p> <p>Notion does let me capture my thoughts in a much more organised way, compared to plain text and markdown. I'm not going to go into detail about how I use Notion specifically, but I am using it for:</p> <ul> <li>Writing that I don't intend to share but need to refer back to, e.g. business models, elevator pitch. Like a classic Wiki.</li> <li>Articulating and formalising the goals I have for a particular development cycle.</li> <li>Keeping track of the business entities or key "things" in the code base, like what is a "Tour" and "Place", etc.</li> <li>Noting down research for both the content of Hereabouts (like interesting places), and the meta research around running a business.</li> </ul> <p>Notion gives me freedom but also constrains me a little more than free form text. This is useful when I just need to get my goals and intentions down, and not spend hours worrying about how it looks. Notion's got great design by default, kudos.</p> <p>They've also fixed the navigation by Smart Keyboard on the iPad THANK GOODNESS. Not being able to move around in a sensible way without using my slow meaty dumb fingers on the screen was infuriating. I didn't spend dozens of hours of my life forcing vim's philosophy into my own world view to have it ruined like this.</p> <h3>User Journeys and Design Language - Another blog post (in Figma and Notion)</h3> <p>I've done a <em>lot</em> of work this month doing visual and UX design. The results, and how I manage these parts of my thinking and planning can't / shouldn't be described here because this is a devblog. I've made a note to write about them in more detail later.</p> <h2>React Native</h2> <p>I wrote a more in-depth post about <a href="https://thomaswilson.xyz/blog/2020-03-22-why-i-chose-react-native-for-app-in-2020">why I choose React Native</a>, also on my blog. So yeah, I'll be writing this thing in TypeScript, using React Native, and the <a href="https://expo.io">Expo platform</a>.</p> <p>Let's take a whole paragraph to acknowledge how good a job the Expo team are doing. Honestly, such brilliant tooling.</p> <p>I started working on this project in Swift: first with SwiftUI then moving to UIKit.As someone's who's more fluent in frontend engineering (3 years full-time professionally), having to debug some of the problems and limitations of the new SwiftUI API wasn't productive. I simply don't have the frontline experience of using Swift in a production environment that made debugging and interpreting documentation a viable option.</p> <p>Moving to UIKit very briefly made sense, but SwiftUI is the future of development on Apple platforms so why waste time working through that.</p> <p>I'd like to come back to SwiftUI in a couple of months/years, when it's out of beta. I hear good things about it, and it sounds like they're bringing in an opinionated declarative philosophy. I'm excited to see how this affects the UI development community at large.</p>]]></description> </item> <item> <title><![CDATA[I don't want to be a unicorn, an engineer or a designer - I just want to build things better]]></title> <link>https://thomaswilson.xyz/blog/2020-05-31-unicorns</link> <guid>https://thomaswilson.xyz/blog/2020-05-31-unicorns</guid> <pubDate>Sun, 31 May 2020 00:00:00 GMT</pubDate> <description><![CDATA[<p>I like building software, or parts of software, which are visual and interactive. I do not particularly enjoy the more abstract, very important, areas like technical optimisation, language design, or anything with the word "distributed" in it. I like building user interfaces (UIs); but also architecting and engineering the code that underlies these interfaces, so that engineers can build delightful and functional UIs, without going through as much effort. Good UI and user experience (UX) should be a norm, a default.</p> <p>A lot of people either design <em>or</em> code. People with feet in both sides of this skillset are often referred to as Unicorns 🦄, because people who do this are rare.</p> <p>I don't like the term Unicorn, but it is dangerously close to describing where I am working hard to move my career. I have a difficult time explaining what I do to people. This is a problem when I want some of those people to pay me real human money to do that thing that I can't quite explain. The current software/technology landscape has made it hard for me to feel I can convey my self, my interests, and my skills using the small number of keywords (<em>Engineer, Designer, Manager</em>). I don't <em>want</em> to be a unicorn, or an engineer, or a designer - I would like to be seen as a professional who can help teams and companies build things better. And this little essay is nearly 2,000 words asking <em>why is that so difficult to convey in a way which is taken seriously?</em></p> <h2>Unicorns 🦄</h2> <p>This is a subject I've had to mull over since I entered the workforce 4-5 years ago. I have a very clear memory of listening to <a href="https://designdetails.fm/episodes/310638">Episode 318 of the Design Details</a> podcast, apparently in mid-late 2019, in which the co-hosts answer a question about the topic of unicorns (emphasis my own, <em>I've not transcribed the "erms" and "likes" which were superfluous, forgive me</em>):</p> <blockquote> <p>I've been thinking about this idea of a unicorn, I think it's kind of a meme at this point. A designer being a unicorn is a designer who can code. <strong>I think that's actually not possible anymore, or maybe it hasn't been possible for a long time</strong>. And if we add in product management into the that, the ability for a single person to be really good at product, and also really good at design, and then when you get into coding it becomes so broad it's like: okay, can they make iPhone apps? Android apps? Websites? Can they do the frontend and the backend, are they really good at animation and visuals? Can they do user research? There's so many disciplines that to expect that of one person seems entirely unreasonable. And thus, kind of breaks the idea of a unicorn being one person who can do it all.</p> </blockquote> <p>While I was searching around for other people's opinions on this matter, it's hard to find people praising the idea of hiring a unicorn, or marketing yourself as one. I've seen them called <a href="https://www.atlanticbt.com/insights/myth-full-stack-unicorn-developer/">"so hard to hire they might as well be imaginary"</a>. Or that "<a href="https://uxdesign.cc/the-mystical-unicorn-designer-c824d992599">Hiring a generalist typically means you hire someone mediocre at everything.</a>". Or criticised as "<a href="https://www.brianhoadley.com/2019/07/17/a-world-of-increasing-expectation-10x-engineers-and-unicorn-designers/">creating teams that are light on experience and overly competitive to move onto the next skillset before mastering the previous one</a>". These are all valid criticisms that any business looking for a cross-discipline employee should be aware of.</p> <p>Despite this criticism, I think the relatively recent <a href="https://www.businessinsider.com/top-low-code-no-code-startups-investors-2020-1?r=US&IR=T">expansion and funding</a> in the no/low code tools space is evidence that creating software shouldn't always be done by those with the technical knowledge or experience. Most directly with tools like Framer, which prides itself on being able to output code from visual prototypes. There's more to software than a robust codebase, and engineers can be better utilised than a widget/JIRA/feature factory. The notion of sliding pizza and some printed-off functional requirements under a door and waiting 3 months for the software to emerge is a funny trope. It's a trope because it was once more widespread than it is today, but also because it implies that engineers are <em>only</em> code machines. That they cannot bring technical and creative energy to a project.</p> <h2>Specialisation and language</h2> <p>I, like a lot of humans, am not just interested in one thing. I imagine very few accountants go home and keep thinking about accounting (by choice), and I'd imagine even less janitors go home and think about building maintenance. In the west we accept having hobbies and interests outside of work as normal, and to some extent, w expect it. If I go on a date with someone and they have literally 0 hobbies (liking food, travel, dogs, and gin are not hobbies or a personality) that's probably going to be the last date.</p> <p>In a professional context, however, it's much more common to do one thing, or a narrow set of things. Sure, we change jobs, but this is mostly in seismic events - a promotion, a sideways move, a career change. Economically speaking, allowing people to specialise makes sense - <a href="https://en.wikipedia.org/wiki/Division_of_labour">it's division of labour</a>. We should let jobs be done by those who are good at them, and we can offer more value to a company (and therefore the entire economy) by having a higher unit output per unit input. I can't turn up one day to work and play CEO, then turn up on Wednesday and be HR, then round the week off by being CFO. If you listen closely you can hear all the co/founders of small, scrappy startups blustering "BUT THAT'S WHAT I DO" - listen Jennifer, you know as well as I do that the first thing you'll do if you have money is hire someone to do the things you don't like doing, and they'll do it better than you've been doing it. You'd be mighty annoyed if you hired Benedict to do your accounts for you, and two weeks later he's running your Instagram marketing campaigns instead of running payroll. Stay in your lane Benedict 👎</p> <p>Look, I got off track, let's bring this back to software. There's a lot of <em>things</em> to build when you're building a system of software to support a modern business. Sometimes, there's not a lot of room for mistakes in these systems: your bank and the government need the highest quality security, search engines need the fastest indexing, e-commerce websites need to load fast, and so on. No one person can master all of these things - if they could, then they would - but I would be so bold as to say that most software engineering teams are more than one person big.</p> <p>Like a lot of things, the closer you look at each area of software, the more detail you see. I've got a bit of experience working with web technologies - over the past few years, people have been really ambitious about what they can do with the web platform and technologies. The result is a bigger set of moving parts that you can plug together to produce really engaging, sturdy, and high quality software. Arguably, <a href="https://macwright.org/2020/05/10/spa-fatigue.html">we're getting a little bit carried away with all we can do</a> but let's stay on track.</p> <p>I really like Chris Coyer's idea of <a href="https://css-tricks.com/the-great-divide/">The Great Divide</a>, a term and an idea which evolved from conversations he has on the podcast he co-hosts (<a href="https://shoptalkshow.com/">Shoptalk Show</a>). The tl;dr is that "frontend engineer" or "web engineer" no longer gives you enough granularity to summarise someone's job, or skillset. Instead, you can think about it in terms of the "front of the front" and the "back of the front".</p> <p>This division rings true for me personally. My interests and skills in web are around creating and systemising visual design, and creating accessible, usable pages. Equally valid is someone who loves working with web technologies because the challenges in data fetching, build process, authentication or security. These are different jobs, but both could very easily fit into the category of <em>Frontend Engineer</em> on a job board.</p> <p>This isn't just a frontend thing: I see similar things happening with DevOps and Reliability Engineering: these are engineers tasked with making sure software is deployed in a sound and reproducible way, and consistently available to the end user. Some people say this is everyone's job, someone people say it's a speciality.</p> <h2>So...?</h2> <p>So why does any of this matter? Look, if you want to get high minded about it, but you need to know what makes you happy on the day-to-day basis, because life is just a series of day-to-days and we shouldn't underestimate their importance. For me that's about knowing what kind of problems my brain enjoys solving, and what kind of work I find meaningful. It's also about knowing the kind of people I want to work with and for. I cannot really do any of that, if I cannot explain what I do professionally.</p> <p>To make it more pragmatic, businesses need to know what kind of technical and creative talent they're trying to attract. We need the right words to describe the job - for some companies it <em>will</em> be "all about the koolade-train" - looking for <em>Design Unicorns.</em> For others it might be more toned-down, or basic, <em>UI/UX Engineer</em> or <em>Design-Developer Hybrid.</em> Even if these jobs are functionally identical, you will be signalling more than just the functional requirements.</p> <p>The final thing I wanted to end on is something that I only realised when I was in the process of putting my stray and abandoned thoughts together into writing. It is dangerously easy to use these words, like <em>hybrid</em> or <em>unicorn</em> and accidentally misrepresent your ability or competencies. Or if, for example, you're writing - the vagueness makes it all too easy to make sweeping generalisations. The term <em>Unicorn</em> appears to have been adopted for the design-code boundary I discussed, but also a UX Unicorn, and also engineers who work at Unicorn (i.e. >$1bn valuation companies). We have to use language to make shortcuts, in part because not every<em>one</em> can understand every<em>thing</em> (like how we say "compiler" when really we mean "magic box"). When we use words like "full stack" or "hybrid" or "unicorn" - they're so vague, you're asking people to fill in the blanks with their own colours or words, which is kind of like asking people to put words in your mouth. Something a true unicorn would never do.</p>]]></description> </item> <item> <title><![CDATA[Deploying an MVP Rails App with Render like it's 2020 ]]></title> <link>https://thomaswilson.xyz/blog/2020-06-11-deploy-rails-in-render</link> <guid>https://thomaswilson.xyz/blog/2020-06-11-deploy-rails-in-render</guid> <pubDate>Thu, 11 Jun 2020 00:00:00 GMT</pubDate> <description><![CDATA[<p>📚tl;dr - I used <a href="https://render.com/">Render</a> to deploy a Rails app and database. It was very easy, very fast, and very modern. Would recommend to everyone.</p> <hr> <p>Way back before the pandemic I had the idea for <a href="https://hereabouts.app/">hereabouts</a> - an app that people can use to explore the city they're visiting, or live in. After making a landing page, working hard to build a lot of UI and UX prototypes, and beginning the process of emerging from national and international lockdown from a pandemic, I've had to come to the part where I build out a backend API - to store data, largely.</p> <p>I've decided to use <a href="https://rubyonrails.org/">Ruby on Rails</a>, a framework for web applications written in Ruby, to build out my backend. I don't want to talk too much about why I made this choice - but the short answer is it's reliable, boring, and I'm fast at building with it (or at least I was, back when I was using it every day). "But Wilson, why aren't you using Microservicesâ„¢ï¸" - I don't know fictional question answer, probably because I don't expect to run into the problems that people argue microservices can solve for you. If you're interested, I think <a href="https://www.infoq.com/presentations/microservices-panel-value/">this panel discussion</a> gives a good primer.</p> <p>After building out the very basics of my rails app, I wanted to get it hosted so I could start toying with integration to the mobile app I'm building. And I had an absolutely terrible time of it. I lost the best part of a weekend trying to solve this problem. Why? Why is the "deploy this app to a server" story so unclear, for one of the notorious and used web frameworks in the world.</p> <h2>The Demands</h2> <p>I've spent the last few years mostly in FrontendLand, where all the cowboys and cowgirls have been absolutely <em>spoiled</em> by the modern deploy process for websites.</p> <p>You can set <a href="https://www.netlify.com/">Netlify</a> to deploy a static website in probably under a minute, pay nothing, and it'll watch a git repo and re-build when it sees changes, provide you with immutable URLs for each version, and just... work. The list of integrated features from Netlify is impressive: split testing, cloud functions, a CMS, and some other. Netlify aren't event alone, <a href="https://vercel.com">Vercel</a> (previously <em>Zeit</em>) are building out <a href="https://nextjs.org/">NextJS</a> (a framework for building websites using React) and will host websites and cloud functions on <a href="https://www.cloudflare.com/learning/serverless/glossary/what-is-edge-computing/">The Edge</a>. It's like <a href="https://pages.github.com/">GitHub pages</a>, <a href="https://docs.gitlab.com/ee/user/project/pages/">GitLab pages</a> - but taken one step further.</p> <p>For better or worse - modern software needs more than just a stateless interface - we've got to put data somewhere. I don't want to have something beautiful and clean on the front, but disgusting and cumbersome on the back. Deploys should be frequent, which means they have to be easy and without friction for the developer.</p> <p>I want to deploy my rails app...</p> <ul> <li><strong>Easily</strong> - I want the app to build somewhere, and then be deployed. I am not a DevOps or infrastructure kinda-guy. I can ssh into servers but it makes me nervous, and fundamentally I'd rather use my time to learn things other than unix and server platforms.</li> <li><strong>Cheaply</strong> - I want the server hosted somewhere, I can't just run it locally. But for the next 6-12 months <em>at least</em> it's going to see very little traffic, and I do not want to pay more than I have to for the resources I am not using.</li> <li><strong>Alongside a database</strong> - I'll happily throw up a Postgres database somewhere, and object storage somewhere else. I just want a server (real, or containerised) to run a ruby application, allow network traffic, support environment variables, and map between some ports.</li> <li><strong>Integrated with git</strong> - Having tasted modern dev ops, where test suites run, and deployment happen automatically alongside the git activity, I don't want to go back. I want easy integration between hitting <code>git push</code> locally, and seeing something happen on a server.</li> </ul> <h2>⌠Create a Virtual Server</h2> <p>I've been a fan of <a href="https://www.digitalocean.com/">Digital Ocean</a>'s no-nonsense pricing and interface since 2014 when I deployed my first Rails app. So I went to their site, spun up a PostgresSQL database and small Ubuntu droplet for a combined cost of $25/month. An absolute steal, and enough power to probably go un-touched for the next 12 months.</p> <p>What followed after was an entire day of figuring out how to configure rails to run as a daemon process on ubunutu, which rails-friendly web server to use (I tried <em>puma</em>, <em>passenger</em>, and <em>mina</em>), how to match that to the nginx configuration, and then how to re-deploy that.</p> <p>I am at a loss as to why there are a) so many different ways to deploy a rails app on an unix system, and b) why trialling each of them in turn produced equally cryptic but entirely dissimilar errors.</p> <p>For a framework who gives you Convention over Configuration (thank goodness) - why is there no simple, blessed, recommended path for deploying. Surely every rails app that gets spun up has dreams of one day being deployed in the big wide world, it's a basic use case. It is <em>the</em> use case. Why is the advise and experience here so different. Why did it take me, an engineer with at least some experience managing server deploys, a whole day to get something to not work.</p> <p><strong>Results:</strong></p> <ul> <li>⌠<strong>Easy:</strong> Running the service wasn't always simple</li> <li>✅ <strong>Cheap</strong>: $25/month for server and database</li> <li>✅ <strong>Database</strong>: Got a hosted/managed Postgres database</li> <li>⌠<strong>Integrated with git:</strong> No native/simple git integration</li> </ul> <h2>⌠Deploy on the Cloud</h2> <p>I turned my eyes towards the promising metropolis of Cloud Providers. I've got a few other projects spun up on Google Cloud, so I gave them a go. It's worth noting that I'm using their Cloud Storage for blob/data storage in the app (like images). I could have used AWS, yes.</p> <p>The platform had some some documentation on <a href="https://cloud.google.com/ruby/rails">how you could deploy a rails app</a>, which was useful. They suggested three possible pathways:</p> <p><strong>Deploy on a virtual server with Computer Engine</strong>: We've just been through this with Digital Ocean. Fool me once...</p> <p><strong>Deploy with Kubernetes.</strong> I've only got a passing familiarity with containerising apps, solely using Docker. I didn't much fancy having to learn a whole new set of technologies and terminologies to deploy an app, nor did I want to risk copy-pasting things from the internet. I've heard horror stories of resource provisioning getting out of hand, which would obviously affect pricing and cause it to spike. At present, I would rather have a predictable pricing model, and not be worried that it could spike without warning.</p> <p><strong>Deploy as Backend As A Service on App Engine</strong>. This is Google's own platform for containerising and distributing apps as serverless. This looked good at first glance, but after using their pricing calculator I could end up paying somewhere between £30-50 per month. This is a fine cost for a production environment, but but not compared to the $10/mo Digital Ocean droplet I'm comparing it to.</p> <p><strong>Results:</strong></p> <ul> <li>🤷â€â™€ï¸ <strong>Easy:</strong> I didn't actually try any of them</li> <li>⌠<strong>Cheap</strong>: At least £30/month <em>just</em> for the server</li> <li>⌠<strong>Database</strong>: Didn't come with a database included, would have to u</li> <li>â“ <strong>Integrated with git</strong>: No, but it does integrate with the Google Cloud CLI so it could be easily configured with a hook</li> </ul> <h2>✅ Used Render.com</h2> <p>I can't remember how I found out about Render. I think they came to my attention when they <a href="https://techcrunch.com/2019/10/07/daily-crunch-render-wins-the-startup-battlefield/">won Tech Crunch's Disrupt award</a>. I think I also heard about them in a conversation about next generation cloud providers making a market by essentially taking a single service in the current cloud providers, and doing it really well. I think that might have been on <a href="https://podcastgang.com/podcast/software-engineering-daily/322654317196215">this episode of Software Engineering Daily</a>.</p> <p>Using Render to deploy the app took me maybe 30 minutes, and it reminded me a lot of the FrontendLand experience that Netlify normalised. It... <em>just works</em>. They've got first-class support for Rails, and so I just connected the git repo and the Render built the container. It <em>was</em> that simple.</p> <p>Then I spun up a Postgres database, which also just worked.</p> <p><strong>Result:</strong></p> <ul> <li><strong>✅ Easy:</strong> Followed <a href="https://render.com/docs/deploy-rails">their docs</a> on deploying a rails app</li> <li><strong>✅ Cheap</strong>: $14/month for server and database</li> <li><strong>✅ Database</strong>: Yep, managed Postgres instance</li> <li><strong>✅ Integrated with git:</strong> Yep, automated deploying, with logs</li> </ul>]]></description> </item> <item> <title><![CDATA[Where I go for UI inspiration]]></title> <link>https://thomaswilson.xyz/blog/2020-08-07-where-i-go-for-ui-inspiration</link> <guid>https://thomaswilson.xyz/blog/2020-08-07-where-i-go-for-ui-inspiration</guid> <pubDate>Fri, 07 Aug 2020 12:00:00 GMT</pubDate> <description><![CDATA[<p>Like anybody who makes interfaces for apps/websites, I spent a lot of time looking at <em>Design Inspiration</em> (read: UIs, real or imaginary, made by other people). This is a really good way to look at visual conventions that other people made, and have used in their UIs and UX.</p> <p>If I were to examine the time I spent "designing" more closely, and divided it between <em>actually pushing pixels around in Figma</em>, and <em>looking at other people's work on Dribbble</em> I would be shocked and ashamed.</p> <p>Allow me to justify this though: unless you are one of two-three social media giants, literally nobody spends the majority of screen time in your app. It would be incredibly arrogant to assume your app is good enough that people are willing to learn a whole new style of interaction, navigation, and visual metaphors for it. In this teeny blog post, I just want to list some of the places I go when I want to find good UI to look at</p> <p><strong>A quick caveat though.</strong> These sites are good in the same way that a buffet is good. But they're also bad in the way that a buffet is bad. If you're not consciously selective in how you expand your UIs, it can feel like a collection of disparate widgets. Would you trust a website that could go from crunchy spring role to full-bodied bolognese, <em>just because a designer fancied it</em>? As a designer it is your responsibility to understand the types of data, interactions, and journeys that your app is trying to promote or facilitate. Sometimes "because it looks cool" <em>is</em> enough of a reason - but this might not fly so well on a village GP surgery.</p> <p>Anyway, this post isn't about that, it's about some sweet sweet list of cool sites for design inspiration. Well have I got a twist for you, I actually made two lists (<em>Inception Horn</em>).</p> <p><strong>Here are some sites that put words to visual design patterns</strong>:</p> <ul> <li><a href="https://www.uiguideline.com/">UI Guideline</a> : Web-focused, component-level naming.</li> <li><a href="https://ui-patterns.com/patterns">ui-patterns</a> : Mobile-focused, pattern and component-level naming.</li> <li><a href="https://lookup.design">lookup.design</a> : Another great free library of examples of components used in the wild. Clean UI and tags, with a nice variety.</li> </ul> <p><strong>Here are almost endless numbers of mockups from people far more talented than I</strong>:</p> <ul> <li><a href="https://www.uisources.com/">UI Sources</a> (💸 paid) : A well-curated collection of app design patterns.</li> <li><a href="https://mobbin.design/">mobbin.design</a> : Another nicely curated list of mobile app designs</li> <li><a href="https://uimovement.com/">UI Movement</a> : Primarily mobile and animated interactions.</li> <li><a href="https://search.muz.li/">Muzli search</a> : Find designs by searching words or colours, a cool little tool run by Adobe.</li> <li><a href="https://dribbble.com/">Dribbble</a> : I'm putting these guys on the list, but they don't need the recommendation.</li> </ul> <p><strong>And for Colour Palettes</strong>:</p> <ul> <li><a href="https://colors.muz.li/">Muzli Colors</a> : A really nice little tool that shows you a selection of colours in some standard UI mockups (pie charts, chats, cards, etc.)</li> <li><a href="https://coolors.co/">Coolors</a> : A classic tool I use <em>very</em> frequently to help me find complementary colours.</li> </ul>]]></description> </item> <item> <title><![CDATA[Things I learned this week #1]]></title> <link>https://thomaswilson.xyz/blog/2020-08-14-things-i-learned-1</link> <guid>https://thomaswilson.xyz/blog/2020-08-14-things-i-learned-1</guid> <pubDate>Fri, 14 Aug 2020 00:00:00 GMT</pubDate> <description><![CDATA[<ul> <li><strong>This tidbit about a literary villa</strong>: Over three days in June of 1816 at a villa in Geneva, Mary Shelley started writing <em>Frankenstein, or The Modern Prometheus</em> and John William Polidori started <em>The Vampyre</em> (which preceded the modern romantic image of vampires). The latter inspired Lord Byron (who was also at the villa, by the way) to write <em>A Fragment</em>. Imagine being 2am whiskey drunk at that, wow.</li> <li><strong>This way to think about css/styling</strong>: The decisions we make about the naming, structure, and languages/frameworks for modern styling tools just <em>move complexity</em>, they don't solve it. If you use CSS, it doesn't matter too much how do you name it (BEM or utility classes?) or how do you build it (vanilla CSS, post-CSS, SASS?). Likewise, CSS-in-JS vs inline styles won't affect things. <em>Be consistent</em> and <em>know where the complexity in your codebase is</em> (<a href="https://shoptalkshow.com/425/">source</a>)</li> <li><strong>This thing about viruses during a pandemic</strong>: It makes evolutionary sense for a virus to be less virulent (to cause less disease). Those viruses which can infect more people will, by definition, be more evolutionary successful. This is one reason (alongside massive economic, medical, and societal changes) that the global death toll from HIV is lower now than it was in the pandemic of the late 1980s. (<a href="https://www.nhs.uk/news/medical-practice/hiv-evolving-into-less-deadly-form/">source</a>)</li> <li><strong>This puur-fectly fitting French word</strong>: The** French word for the verb ‘to purr' is *ronronner* - which sounds simply excellent with a French guttural accent.</li> </ul>]]></description> </item> <item> <title><![CDATA[Things I learned this week #2]]></title> <link>https://thomaswilson.xyz/blog/2020-08-21-things-i-learned-2</link> <guid>https://thomaswilson.xyz/blog/2020-08-21-things-i-learned-2</guid> <pubDate>Fri, 21 Aug 2020 00:00:00 GMT</pubDate> <description><![CDATA[<ul> <li><strong>This useful thinking tool</strong>: good writing starts with observations, and moves to analysis. Making the transition is difficult. One way to spot a mental crutch is to see where you reach for words like "interestingly", "surprisingly", or "notably". These all <em>hint</em> at a significance or meaningfulness, but don't actually clarify it. (<a href="https://ocw.mit.edu/courses/literature/21l-001-foundations-of-western-culture-homer-to-dante-fall-2008/writing-resources/obser_ver_anlsis.pdf">source</a>)</li> <li><strong>This hot takeaway</strong>: Did you know that during the 1970s if you ordered a takeaway coffee it came in a styrofoam cup and a lid without a hole. If you wanted to drink your beverage, you had to take the lid off <em>and then put it back on</em> - can you imagine? Obviously impatient, the hardcore mobile coffee drinkers (think: taxi drivers) kept ripping holes in the lid to drink their Joe on the Go. Where there's demand, there's business and thus was born a <a href="https://designobserver.com/feature/coffee-lids-peel-pinch-pucker-puncture/39790/">whole field of design</a> for designing the most safe and ergonomic way to drink coffee from a cup without having to actually take the lid off.</li> <li><strong>This Frank etymology</strong>: "Lingua Franca" describes a common language between a group of people. It emerged in the late 1700s and translates functionally as "Language of the Franks", with <em>Franks</em> being anyone broadly from Westen Europe. The original Lingua Franca was a mixture of simplified Italian, Greek, Old French, Portuguese, Occitan (a Romance language spoken around southern France and northern Italy and Spain - <a href="https://en.wikipedia.org/wiki/Occitan_language">wiki</a>) , Spanish, Arabic, and Turkish (<a href="https://en.wikipedia.org/wiki/Lingua_franca#Etymology">source</a>)</li> <li><strong>These Kinswomen</strong>: King James II had a thing for witty, plain looking mistresses. Two such mistresses were <a href="https://en.wikipedia.org/wiki/Arabella_Churchill_(royal_mistress)">Arabella Churchill</a> and <a href="https://en.wikipedia.org/wiki/Catherine_Sedley,_Countess_of_Dorchester">Catherine Sedley</a>. Arabella is described in <a href="https://books.google.co.uk/books?id=GfQ_TquTZicC&lpg=PP1&pg=PA30#v=onepage&q&f=false">The Ladies Dictionary (1694)</a> as being "of no less Eminence for learning and ingenuous Parts than her Quality... she had a great facility in poetry and was a celebrated conversant among the Muses". Despite carrying four children for the man, she was later replaced by 16 year-old (yep) Catherine Sedley, who <a href="https://archive.org/details/sexwithkings500y00herm/page/52/mode/2up">remarked</a> of being chosen that "It cannot be my beauty, for he must see I have none... and it cannot be my wit, for he has not enough to know I have any". James, buddy - you did not deserve these women.</li> </ul>]]></description> </item> <item> <title><![CDATA[Why are you like this, JavaScript? Taking a look at JavaScript's single threaded nature.]]></title> <link>https://thomaswilson.xyz/blog/2020-08-23-why-are-you-like-this-javascript</link> <guid>https://thomaswilson.xyz/blog/2020-08-23-why-are-you-like-this-javascript</guid> <pubDate>Sun, 23 Aug 2020 00:00:00 GMT</pubDate> <description><![CDATA[<p>Sometimes you hear something so often that you don't really hear it anymore. One of those things for me is words to the effect of "How does this JavaScript code even run?". I choose to interpret this generously as "How does JavaScript itself run", and not "how does this hot garbage code you wrote run?".[^I really hope I don't write as much hot garbage JavaScript as I used to]</p> <p>There's a lot of ways we could describe JavaScript (including some really colourful adjectives), but objectively it is an asynchronous, single-threaded, dynamic programming language. These characteristics, which are deliberate design decisions, are responsible for a lot of the quirks, gotchas, and design patterns that make being JavaScript developer tricky for anyone just getting started. Luckily it's almost never tricky for anyone else (<em>he lied</em>).</p> <p>For example, have you written and run JavaScript code which:</p> <ul> <li>Ran in the browser, got in an infinite loop somewhere, and prevented all interactions with the web page (including the ability to close a tab or the browser)?</li> <li>Fetched data from another server, tried to access the data, and got an <code>undefined</code> or <code>Promise</code> related error?</li> <li>Written server-side JS with a callback/promise chain for data processing/cleaning and had your code start, but not finish, its execution of this chain - leaving the request hanging for a response.</li> </ul> <p>These are all common problems which I have encountered, realistically, hundreds of times by now. They're each a rough result of the design of the JS run time, i.e. how we go from JS you wrote to the commands being executed on the computer. I don't want to talk about JS run times / environments now, so don't worry about the details. Just know that the JS code you wrote is executed by the computer in a way that makes these kind of errors possible, and even likely, if you're not thinking like JS wants you to.</p> <p>Over the past couple of weeks, I've been trying to understand why JS wants us to think in this way. I've been asking JS "why are you like this?" and "did I do something to upset you? I'm sorry if I did, but please, this really shouldn't be <code>undefined</code>".</p> <h2>A brief aside: on JS's dynamic-ness</h2> <p>A brief side note before we get into the rabbit hole here: JavaScript will take an awful lot of mistreatment and still run. That's largely because it's a dynamic language (i.e. it isn't typed), and also partly because it'll try and do whatever it can with whatever types of data you give it. It's famous for it: (<code>false == 0</code> or <code>'30' + 10 === '3010'</code>).</p> <p>But you better believe that you're renting this flexibility from JavaScript, because at some point it's going to <code>undefined is not a function</code> you and act like it did nothing wrong - largely because <em>it didn't</em>.</p> <p>This is an entirely different type of problems and design decisions in the language, which I'm just not going to talk about in this article.</p> <h2>JavaScript is Single Threaded</h2> <p>JavaScript is single threaded, that means that while something is on the <a href="https://developer.mozilla.org/en-US/docs/Glossary/Call_stack">call stack</a> - JavaScript is unable to run anything else. Any function that gets called by anything in our JS code is going into the call stack - it's how the internals of our app (specifically the interpreter) knows where it is, and what it needs to do now and next.</p> <p>So if something long-running is being done on the call stack, like a really long iteration function, then no other functions can be called until that iteration has finished. Say that we have a list of 1 million movies as a massive array of objects, and we want to get all their titles:</p> <pre><code class="language-js">const movies = [{title: 'A Knights Tale', rating: 10}, ..] const titles = movies.map((movie) => movie.title) </code></pre> <p>This <code>map</code> function will go into the call stack, it will start executing. So it'll go to our <code>movies</code> array, and for each item in it, run our little <em>anonymous function</em> (i.e. function without a name), and then start populating the call stack with a million of these references:</p> <pre><code class="language-js">// THIS IS ALL PSEUDO CODE, PLEASE GOLLY PLEASE DON'T TAKE LITERALLY // Find the specific `movie` from the `movies` array const movie = { title: "A Knights Tale", rating: 10, } // Get a reference to the anonymous function function(movie) { return movie.title } // Then: Add the above function to the call stack </code></pre> <p>This operation will block everything else from running until it's finished. This might sound <em>sort of</em> bad, but if we're often running JavaScript in the browser, that "everything else" can include like: rendering a web page, or allowing a user to interact with the page or browser tab.</p> <p>At this point you'd want to ask why the lingua franca of the web would allow such a thing to happen. And that's a great question. Unfortunately, this objection doesn't do anything to dethrone JS and its utility in the web. The burden falls on us as engineers to design around this single-threaded ness.</p> <h2>JavaScript is Asynchronous and Event-Based</h2> <p>So, if JavaScript is single threaded, and blocks everything else from running until it finishes a function - how does it handle asynchronous functions? For example: what happens when I fetch some data remotely (e.g. an updated list of movies) - will it stop everything else from rendering?</p> <p>This is potentially a really bad design flaw. Especially as the modern web - which can't seem to help itself from making too many HTTP requests. Imagine if every time you wanted to read a BuzzFeed article you had to wait for bit of content, every external tracker, and every ad to load before anything appeared on the screen. It'd be a nightmare and you'd never find out which kind of Frappicino you are.</p> <p>JS solves this problem, by having an internal understanding of <a href="https://eloquentjavascript.net/11_async.html">asynchronous actions</a>. In the previous example, where we wanted to get a million movie titles (for some reason) - our code is <em>synchronous</em> - there is a simple <a href="https://www.computerhope.com/jargon/c/contflow.htm">Control Flow</a>: the code had a correct understanding that "here are a million items, I need to do this one thing to each of them, one at a time". And thus the single JS thread was occupied with those million and one tasks.</p> <p>To give an async example similar to an example above, let's try and retrieve a list of movies across ten genres, from a single API:</p> <pre><code class="language-js">// NOTE: This code is illustrative, and not perfect, pls ignore edge-cases and separation of concerns problems // Imaginary API const MOVIE_URL = "https://www.mymovieservice.com/api"; // A list of genres const apiEndPoints = [ { label: "action", path: "/action-movies", movies: [] }, // Imagine 9 others .. ]; // Go and fetch remote data and update the array const updatedEndPoints = apiEndPoints.map((endPoint) => { return fetch(`${MOVIE_URL}/${endPoint.path}`) .then((res) => res.json()) .then((moviesData) => { return {...endPoint, movies: moviesData.movies} }); }); </code></pre> <p>An intuitive understanding of asynchronous behaviour would be for JS to see a call to <code>fetch</code> and understand that it needs to:</p> <ol> <li>Make an HTTP call to the specified endpoint;</li> <li>Recognise that a response will come back <em>at some point</em>, so put this function aside, and get on with something else;</li> <li>Recognise when the data from <code>fetch</code> returns, and then do something with it (in this case, format it with <code>.json()</code> then run the anonymous data handler function to add the movies</li> </ol> <p>It's worth noting here that JS allows us to have this notion of asynchrony <em>without</em> asking us to manage multiple threads. This is the trade-off we are making with JS's design: we can have asynchronous behaviour relatively simply in our code, without having to manually manage memory threads.</p> <p>This post is already too long, I think, and I don't want to get into the specifics of how this works - but understanding that JS is able to make these kinds of decisions at run time, and when they're made - is an important part of writing faster, less blocking JavaScript.</p>]]></description> </item> <item> <title><![CDATA[Things I learned this week #3]]></title> <link>https://thomaswilson.xyz/blog/2020-08-21-things-i-learned-3</link> <guid>https://thomaswilson.xyz/blog/2020-08-21-things-i-learned-3</guid> <pubDate>Fri, 28 Aug 2020 00:00:00 GMT</pubDate> <description><![CDATA[<ul> <li><strong>This medieval lingo</strong>: Have you ever wondered how to refer to the area where a good-old-fashioned joust took place? You know, jousts? Two men, two horses, two giant poles, and one film where Heath Ledger is irresponsibly handsome? Sorry, I got distracted there - did you know the area where the jousts took places is called a <em>List</em>, and the fence that separated the two riders is called the <em>Tilt</em> (<a href="http://www.lordsandladies.org/jousting-terminology.htm">source</a>). Initially it seemed a little wild to me that people ever jousted without the tilt, seems a little bit like unnecessary risk but that seems a little like mopping up the seawater as the Titanic sinks.</li> <li><strong>This unusual payment</strong>: Between the 12th and 19th centuries there was a menagerie at the Tower of London. Around the 17th century, if you didn't fancy paying the three half-pence entrance fee, you could bring a cat or a dog - which was presumably used for food. <a href="https://www.thevintagenews.com/2018/03/03/18th-century-zoo/">source</a></li> <li><strong>This new word</strong>: <em><a href="https://en.wiktionary.org/wiki/heterodox">Heterodox</a></em> or <em>Heterodoxy</em>, meaning a belief which deviates from some norm or convention, but not enough to be unorthodox or unorthodoxy.</li> <li><strong>This Minoan jewellery</strong>: About three-four thousand years ago, the Minoans created some <a href="https://culturetaste.com/blog/45_minoan-malia-bees-history-symbolism.html">incredible</a> <a href="https://www.ancient.eu/image/885/minoan-bee-pendant/">bee</a> jewellery. Created around 1800-1700 BE by the Minoans in what is now Crete, the Bees were symbols of nature/earth, with honey being used in holy rituals by the culture. I'm amazed that humans made those so long ago, and that they survive until today to be seen.</li> </ul> <h2>Things I've had on rotation</h2> <ul> <li><strong>Something new</strong>: <em>Broken Access</em> by Theo Alexander (2020). The spacious, elegant classical tones of this piece make it a joy to drift off to and come back to. (<a href="https://open.spotify.com/album/2WN5bFYGFunOS7AMGZbmgI?si=dc3ZldZTSZ-r30TMLG4tYQ">Spotify</a>, <a href="https://music.apple.com/gb/album/broken-access/1513480825">Apple Music</a>)</li> <li><strong>Something old</strong>: <em>Camp</em> by Childish Gambino (2011). While I'm glad that Childish Gambino has evolved into what he is, the mixtape, hype, and always-woke vibes of old Gambino are what you need sometimes. (<a href="https://open.spotify.com/album/4yE6WFFun0KjJXbdWkoVrp?si=ZpWDgL4YSz2gTgCg5RYbLQ">Spotify</a>, <a href="https://geo.music.apple.com/us/album/camp/1450829373">Apple Music</a>)</li> </ul> <h2>Cool things:</h2> <ul> <li><a href="https://screenshot.rocks/">screenshot.rocks</a> - Create nice little screenshot mockups in your browser. Found this on <a href="https://www.reddit.com/r/webdev">r/webdev</a>.</li> <li><a href="https://arwes.dev/">Arwes.dev</a> - A futuristic sci-fi and cyberpunk GUI. I love me some retro-future aesthetic. Found this <em>everywhere</em> because people kept sharing it.</li> </ul>]]></description> </item> <item> <title><![CDATA[Apple, What are you doing?]]></title> <link>https://thomaswilson.xyz/blog/2020-08-29-apple-what-are-you-doing</link> <guid>https://thomaswilson.xyz/blog/2020-08-29-apple-what-are-you-doing</guid> <pubDate>Sat, 29 Aug 2020 00:00:00 GMT</pubDate> <description><![CDATA[<p>I have loved Apple solidly for eight years, since I was 20 and gifted a Mac Mini for Christmas. I wrote my Masters thesis on that thing in a ground floor bedroom of a student house overlooking suburbia at 3am on a Tuesday night. I finished my Ph.D. thesis on a MacBook Air (which certainly didn't deserve to be put through what I asked it to do) as I sat, hunched over, on a rainy November afternoon, in a tiny flat in Paris that smelled like fresh lemon and ginger.</p> <p>MacOS is the operating system is the vehicle I drove from environmental scientist to software engineer, and so changed my life trajectory inexplicably. I love the build quality of their machines, the UI aesthetic decisions, and the entire world of Open Source software which was opened up to me by its <a href="https://en.wikipedia.org/wiki/POSIX">POSIX</a> compliance. This is helped by the fact that I moved into a Web Development: an argumentative ADHD-sort of community but one that really likes to share and discuss things openly.</p> <p>This is the community which modelled to me "this is how a good engineer behaves" - looking around and seeing Kent C. Dodds, Sara Viera, MPJ, Chantastic, Dan Abramov, Sophie Alpert, and so many others just like... be chill patient folk who take the time to explain what they're doing and thinking and making.[^And surrounded, obviously, by so many other who are not chill or patient]</p> <p>So to see one of the largest companies in the world (<a href="https://www.macrumors.com/2020/08/21/aapl-closing-in-on-500-mark/">2T$ now</a>) scrapping with developers and (multi-)national legal systems for using practices which look <em>an awful lot</em> like monopolistic and anti-competitive practices seems wrong to me, and also a lot of other people in the dev and tech spaces.</p> <h2>The Hey Drama</h2> <p><a href="https://hey.com/">Hey.com</a> is an e-mail service released by Indie Tech Darling <em>Basecamp</em>. They released Hey with admirable ethical (no tracking) and technological (no unnecessarily complex stacks) intentions to change some aspect of the e-mail domain. They priced their product at $99/year, which you could only buy through their website.</p> <p>They created desktop, web, iOS, and Android apps for people to access their Hey e-mail accounts - and before the public release they had their iOS version approved on Apple's App Store. In the lead up from beta to release, Basecamp made bug fixes to their iOS and submitted it for review (as every developer must), and had their app rejected because it did not provide a way for iOS users to create an account in the App.</p> <p>To be clear - this functionality had never been in the Hey app. It had not been present and then suddenly removed.</p> <p>Any in-app purchases (IAPs) result in a 30% cut going to Apple (or a 15% cut in the case of a recurring annual subscription after the first year). It's not hard to understand Apple's immediate concern: Apple are missing out on a potential $30 each time a user downloads the Hey app and creates an account in app and signs up for a year's worth of service. Apple stated that until this IAP option was added, they won't approve any further changes to Hey's iOS app. This meant bugs would go unfixed, weeks-days before Hey was to be released to the world at large.</p> <p>One can easily understand the outrage this caused in Basecamp, and then further afield. David Heinemeier Hansson (DHH), the CTO at Basecamp and general holder of strong opinions <a href="https://twitter.com/dhh/status/1272972718384623616">tweeted</a>: \</p> <blockquote> <p>There is no chance in bloody hell that we're going to pay Apple's ransom. I will burn this house down myself, before I let gangsters like that spin it for spoils. This is profoundly, perversely abusive and unfair.</p> </blockquote> <p>In the end, Basecamp offered users the chance to create a two week "trial" account in the app - so <em>technically</em> users without an account could open the app for the first time and get started with sending/receiving e-mails.</p> <p>This isn't even a satisfying conclusion or resolution - it feels more like Apple just wanted to do... <em>something</em>. Tim Cook's recent defence of the 30% cut included the argument that it's only included when a business "acquires a customer on an Apple" (<a href="https://9to5mac.com/2020/07/29/tim-cook-antitrust-statement/">source</a>). But now you're demanding a way for an App to turn a new user into a customer - even if that process has historically only been done outside the iOS ecosystem (e.g. Netflix)?</p> <p>If you want to see more about the Hey scandal, Basecamp covered the issue in an episode of their own podcast, <a href="https://rework.fm/two-weeks/">Rework</a>.</p> <h2>The Fortnite Drama</h2> <p>In the weeks leading up to writing this article, a similar skirmish has started <a href="https://www.ft.com/content/a01807f8-606c-4444-8a27-398984e3bf3d">between Epic Games and Apple</a>. This time it's over Epic's Fortnite, an extremely popular Battle Royale-style game (last-person-standing).</p> <p>Fortnite was <a href="https://fortnite.gamepedia.com/Release_Timeline">released</a> on PC in September 2017, and later on iOS in March 2018. The app's in-game economy uses an in-game currency (V-Bucks) that lets people purchase cosmetic items, things that look fun but don't affect the core gameplay. Earlier this year, Epic updated the app to allow users to make IAPs using this in-game currency - as opposed to the system-level iOS integration.</p> <p>In a similar argument they raised with Basecamp, Apple blocked updates to the App as these IAPs did not use Apple as the platform/payment provider, and so did not offer the 30% cut. As of 28th August 2020, Apple <a href="https://9to5mac.com/2020/08/28/apple-has-now-terminated-epic-games-app-store-account/">removed the Developer Account</a> associated with Fortnite from the App Store. Users can no longer download the Fortnite App on iOS.</p> <p>Similar to Basecamp, Epic's rejection of these terms has been very public. In fact, probably more spectacle-making than Hey's, with the release of a <a href="https://www.youtube.com/watch?v=euiSHuaw6Q4">riff</a> on Apple's famous 1984 Macintosh advert. Additionally, the opening pages of Epic's lawsuit read well enough that one could argue they were written for non-lawyers.</p> <p>Unlike Basecamp, Epic have so far been willing to create some kind of compromise, no matter how purely <em>technically</em> correct that compromise is. Both Apple, and the US legal system have argued that Epic's repeated, intentional non-compliance with the rules mean that Apple are within their right to remove them from the App Store.</p> <h2>It's not just Epic Games anymore</h2> <p>The twist in the Fortnite story came when Apple threatened to remove the both the developer accounts associated with Fortnite <em>and</em> <a href="https://www.unrealengine.com/en-US/">Unreal Engine</a> - a free-to-start video game engine owned by Epic.</p> <p>In case it is unclear: Unreal Engine is a technology for building games other than Fortnite. It's used by developers across the world, including games in Apple's own <em>Apple Arcade</em></p> <p>If it went away on iOS anyone building games for iOS that used Unreal Engine just... couldn't. Quoting Kevin Gammill the General Manager of Gaming Developer Experiences at Microsoft:</p> <blockquote> <p>"<em>Unreal Engine's</em> sudden loss of support for iOS and macOS would create significant costs and difficult decisions" for game creators, who "would have significant sunk costs and lost time using <em>Unreal Engine</em> for game creation, and would have to choose between (a) starting development all over with a new game engine, (b) abandoning the iOS and macOS platforms, or (c) ceasing development entirely"... It is abundantly clear that Apple's retaliatory steps are intended to harm Epic and its licensees. (<a href="https://cdn2.unrealengine.com/epic-pi-tro-08-23-2020-819871195.pdf">court proceedings p.9</a>)</p> </blockquote> <p>Luckily the courts swept in and prevented Apple from doing this. U.S. District Judge Yvonne Gonzalez Rogers commented:</p> <blockquote> <p>Apple has chosen to act severely, and by doing so, has impacted non-parties, and a third-party developer ecosystem. In this regard, the equities do weigh against Apple</p> </blockquote> <h2>Creating a Developer Ecosystem</h2> <p>I am concerned that Apple's anti-competitive, monopolistic practices are harming the consumers of <em>and</em> third-party developers for their own platform. So I suppose, actually, my concern is this: Apple aren't distinguishing between end-users and developers - they're both just consumers of a service.</p> <p>Or perhaps they see little problem with applying pressure to the development community to stop others from raising such vocal fights against the conditions of the App Store and IAPs.</p> <p>This from a company which famously celebrates quality and diversity of their platform. Every years at WWDC they give out awards for the third-party Apps and games which are well designed.</p> <p>Equally, from a business perspective they profit from the diversity and quality. The fact that indie-devs, talented teams, and huge corporations can all publish something into the App Store gives the iPhone an appeal across demographic, generations, and personality. Just want e-mail, a PDF viewer, and a spreadsheet viewer? No worries. Want to cram your phone as full of bright-and-loud games, also fine, friend. Artistic type who wants to take and edit photos or videos, check.</p> <p>Apple are acting acting as if they're irreplaceable, and as if there are no alternatives for developers, or as if this diversity and quality across the board is inevitable and without condition. This is <em>literally</em> why they're on trial for anti-trust - they're abusing their market position, capitalising on a lack of viable alternatives, and influencing the ability of developers to speak out, or find alternative revenue streams.</p> <p>In the recent antitrust hearings, Tim Cook <a href="https://9to5mac.com/2020/07/29/tim-cook-antitrust-statement/">argued the 30% cut</a> is justified because the App Store is a trusted place for the discovery (user), distribution (developer), and payment (both) of Apps globally. A particularly pessimistic reading of this statement makes it sound as if the App Store is the <em>only</em> platform for doing so. That without Apple, all businesses, talented designers, and savvy engineers would be unable to reach customers - or that end users would be paralysed by choice or stifled by lack of options. The Wild West of the internet, with its ample e-commerce and payment platforms stands as a blatant contradiction of this statement.</p> <p>How many people rely, if not entirely then at least notably, on IAP revenue for food and rent? How many people have had to increase prices for IAPs, or to encourage more IAPs just to negotiate around this 30% cut? Epic Games won't go broke because of a 30% cut of purchases made on iOS devices, but an indie-dev easily could.</p> <p>Apple aren't willing to budge on this 30% figure. PayPal <a href="https://www.paypal.com/us/webapps/mpp/paypal-fees">charges</a> 2.9% + $0.3 for a transaction, <a href="https://stripe.com/pricing">so does Stripe</a>. Gumroad <a href="https://gumroad.com/features/pricing">charges</a> 3.5% + $0.3. Shopify <a href="https://www.shopify.com/pricing">charge</a> 2.4-2.9% + $0.3. Apple are justifying a 10x increase on web payment providers, and then fight back these claims of injustice from developers who try and find ways around them (ignoring that Netflix, Amazon, and other big players seemingly get around this without problem).</p> <p>Instead, this is... The Developers' fault? In a <a href="https://techcrunch.com/2020/08/28/apple-terminates-epic-games/">statement made</a> on the Fortnite case, Apple said:</p> <blockquote> <p>Instead [Epic Games] repeatedly submit Fortnite updates designed to violate the guidelines of the App Store. This is not fair to all other developers on the App Store and is putting customers in the middle of their fight</p> </blockquote> <p>There just seems too much irony, gaslighting, and hypocrisy in this statement. This cannot be an actual lack of self-awareness on Apple's part - someone must have raised these questions internally. Someone must have noticed.</p> <p>As someone who builds software, it raises serious questions about the value that being on the iOS store adds, and the additional work that would need to be done to make a native app useful over, say, a web-based purchase. If I was building a new product, this would push me more towards web-only or a more read-only iOS experience. It makes me as a developer question how much Apple value my business, especially when they have global insights into the most valuable kinds of apps and could <a href="https://www.ft.com/content/a01807f8-606c-4444-8a27-398984e3bf3d">build out their own</a> alternatives to crush my business if its part of a popular genre.</p> <p>This is the environment that Apple are creating for consumers, developers, and businesses who want to use their platforms - and it doesn't seem right. This is bad PR, this seems damaging in the long run. It seems an awful lot like the company could maintain their standards of quality and security without a lot of these practices (he says, with literally no evidence to back it up). It worries me that one company can raise all these questions and concerns.</p>]]></description> </item> <item> <title><![CDATA[Things I learned this week #4]]></title> <link>https://thomaswilson.xyz/blog/2020-09-04-things-i-learned-4</link> <guid>https://thomaswilson.xyz/blog/2020-09-04-things-i-learned-4</guid> <pubDate>Fri, 04 Sep 2020 00:00:00 GMT</pubDate> <description><![CDATA[<ul> <li><strong>This world</strong>: The Word <em>Kipple</em> is a word invented by SciFi writer Phillip K. Dick, to mean the kind of rubbish/trash that accumulates if humans don't intervene. <a href="https://www.urbandictionary.com/define.php?term=kipple">source</a></li> <li><strong>This part of our brain</strong>: You know when you suddenly remember that you need to reply to that e-mail, drop off that parcel, or pick up eggs before dinner? That's your <a href="https://en.wikipedia.org/wiki/Prospective_memory">prospective memory</a> - which is kind of the opposite of your normal memory (your retrospective memory) because it "remembers" things which need to happen in the future. Don't think about it too much.</li> <li><strong>This Chopstick Etiquette</strong>: Cultures who eat with chopsticks each have rules about where they can/not be be placed. In mainland China, you should never leave rested chopsticks pointing towards anybody else at the table. In Japan, unused chopsticks should be placed into a rest - and if no rest is provided then one can be fashioned from paper. In Korea, chopsticks must never be placed to the left of the spoon they are paired with. In Thailand, you should never leave your chopsticks stuck into food in a bowl, or to eat rice. In Vietnam, placing your chopsticks in a "V" shape when you're done eating is considered a bad omen. (<a href="https://en.wikipedia.org/wiki/Chopsticks#Etiquette">source</a>)</li> <li><strong>This one person's damage to the Scots Language</strong>: For the past 5-10 years, one guy in America (who does not speak Scots) has been contributing to the Scots language version of Wikipedia. What they've actually just written is the English version with phonetic Scottish pronunciations. As a result, "this person has possibly done more damage to the Scots language than anyone else in history." (<a href="https://www.vice.com/en_us/article/wxqy8x/most-of-scottish-wikipedia-written-by-american-in-mangled-english">article</a>)</li> <li><strong>This unrecognised inventor</strong>: Early video game consoles had their games built into the circuitry of their computer-parts. In the 70s, <a href="https://www.engadget.com/2015-02-20-jerry-lawson-game-pioneer.html">Jerry Lawson</a>, a self-taught African American engineer, invent ed the cartridge, i.e. a swappable bit of memory which you'd insert into the machine to play a game. He built it a console called the <em>Channel F</em> which never had the popularity of the Atari/Sega/Nintendo consoles of the day, and his achievement wasn't ever really noticed for what it was: something that allowed for a Cambrian Explosion of video games.</li> </ul> <h2>Cool articles</h2> <ul> <li><strong>‌My three decades alone, basking in the company of a mountain</strong>, Susanne Sener for Psyche (<a href="https://psyche.co/ideas/my-three-decades-alone-basking-in-the-company-of-a-mountain">link</a>). A personal piece written by a woman who has spent over 30 years living alone in a cabin by a mountain. I've been thinking about this importance of silence/lack of input recently.</li> <li><strong>Popular Writers: A Stephen King interview</strong>, Neil Gaiman on his own blog (<a href="https://journal.neilgaiman.com/2012/04/popular-writers-stephen-king-interview.html">link</a>). King's written more books than a lot of us ever will, and I really enjoyed the following statement he makes on where/how he arrives at them:</li> </ul> <blockquote> <p>I never think of stories as made things; I think of them as found things. As if you pull them out of the ground, and you just pick them up. Someone once told me that that was me low-balling my own creativity. That might or might not be the case. But still, on the story I am working on now, I do have some unresolved problem. It doesn't keep me awake at nights. I feel like when it comes down, it will be there...</p> </blockquote> <h2>What I've had on Rotation</h2> <ul> <li><strong>Something Almost-New</strong>: <em>The fall of Hobo Johnson</em> by Hobo Johnson (<a href="https://songwhip.com/hobo-johnson/the-fall-of-hobo-johnson">links</a>). This almost-poetry-almost-hip-hop-almost-punk sound is really great, it's got levity in places and untouched rawness in others. I've really enjoyed it.</li> <li><strong>Something Old</strong>: <em>Echos, Silence, Patience & Grace</em> by Foo Fighters (<a href="https://songwhip.com/foo-fighters/echoes-silence-patience-and-grace">links</a>). This is such an absolute classic album from the 2000s for me (and I think a whole bunch of other people). If you're in the mood for some Excellent rock vibes, put this on and remember how good it is.</li> </ul>]]></description> </item> <item> <title><![CDATA[Why are you like this, JavaScript? An introduction to Promises by using Fetch.]]></title> <link>https://thomaswilson.xyz/blog/2020-09-06-javascript-promises-introduction</link> <guid>https://thomaswilson.xyz/blog/2020-09-06-javascript-promises-introduction</guid> <pubDate>Sun, 06 Sep 2020 00:00:00 GMT</pubDate> <description><![CDATA[<p>Let's start with a correct, but pretty dense, definition: JavaScript Promises are a first-class abstraction for handling asynchronous actions, like:</p> <ul> <li>Fetching data from a remote API.</li> <li>Reading or writing (i.e. opening or saving) a file to the filesystem (in a server-side environment, not in a browser).</li> <li>Retrieving a <a href="https://css-tricks.com/the-blur-up-technique-for-loading-background-images/">non-blurred-up</a> version of an image based on a page-scroll event.</li> <li>Using network or system utilities in native mobile frameworks like <a href="https://reactnative.dev/">react-native</a> or <a href="https://expo.io">expo</a>.</li> </ul> <p>First class? That's a programming term to say that this kind of value (i.e. Promise) can be stored in a variable or passed as an argument. Other first-class citizens in JavaScript include booleans, arrays, and functions. This means that JavaScript has an internal way of representing and understanding Promises, and we don't have to do any kind of coaxing, coercion, or pollyfilling to use them since ECMAScript2015.</p> <p>Asynchronous actions? Promises represent the <em>eventual value</em> returned from a function (or more broadly, an <em>action</em>). This means that when we ask for the value of a Promise, JavaScript can distinguish between what is the value at the time you requested, and is this the last, unchanging value of the Promise. In JavaScript Promises, we call these two states:</p> <ol> <li><code>pending</code> - where we've described and started the async operation, but it's not completed, or</li> <li><code>settled</code> - that async operation has completed (successfully or not) and the value we have isn't going to change again.</li> </ol> <p>Let's take an example and show how we can use Promises. Actually, no, let's show how we can't/shouldn't use them. Imagine we own a taco truck, and we have a menu that changes every day. This means we don't want to build a fully static site, and we want to use JS to add a little dynamic behaviour. To make sure our website always shows us today's menu we:</p> <ol> <li>Run a <code>fetch</code> function as soon as the page loads which retrieves today's Taco Menu as an array of tacos from an API end point,</li> <li>Parse that data to extract the <code>id</code> and the <code>name</code> for each taco in that array, and</li> <li>Iterate through this parsed list and insert new DOM Elements onto the page using any number of JavaScript libraries or frameworks.</li> </ol> <p>Which in some code would look like<sup><a href="#user-content-fn-1" id="user-content-fnref-1" data-footnote-ref aria-describedby="footnote-label">1</a></sup> :</p> <pre><code class="language-js">// âš ï¸ Code is purposefully error-ful, don't run // âš ï¸ gollyilovetacos doesn't exist (yet) - this is illustrative const menuItems = fetch("https://api.gollyilovetacos.com/v1/menu_items") const parsedMenuItems = menuItems.data.menu_items.map(item => ({ id: item.id, name: item.name, })) </code></pre> <p>This is going to throw us an error (something like <code>Uncaught TypeError: can't access property "menu_items", fetch(...).data is undefined</code>). Why? No legit, it you genuinely don't know, please think about why.</p> <p>It's because <code>fetch</code> returns us a Promise. The code above applies a synchronous way of thinking onto the Promise: we declare it, parse it and parse it (on those two last lines) exactly as if it was synchronous (i.e. the data would resolve immediately) - so on that last line we're looking to get the <code>data</code> attribute of the Promise, as if the Promise was an object representing the API response.</p> <p>Promises are references to the <em>eventual values</em>, which is different to storing the value itself. We were trying to access the <code>data.menu_items</code> on the Promise which doesn't exist.</p> <p>The only things that exist on a Promise are: <code>then</code> and <code>catch</code>. This is the most technical definition of a function: Promises are Objects in JavaScript which have a <code>then</code> function, <a href="http://wiki.commonjs.org/wiki/Promises/A">so says the spec</a>.</p> <p>Before we dig more into promises, I think it's important to ask <em>why bother</em>? Especially when the JS community had a way of handling things like this before ECMAScript2015. Promises aren't technically anything new.</p> <h2>Can't I already do that in JavaScript?</h2> <p>So what? Can't I just use event handlers or callback functions? Yeah, you absolutely can. In fact, these are two ways that we handled async processes in the land before promises. They're both a little bit problematic, however. Events, for example, <a href="https://web.dev/promises/#events-aren't-always-the-best-way">can fire before</a> we (or rather, the control flow of our program) can assign event handlers to them. This means that can't always guarantee that an event will be handled using the event handler we define.</p> <p>Alternatively you can use callback functions. Callbacks are kind of like events and handlers, only because you pass pass a function as an argument to a function (possible because functions are a first-class object in JavaScript btw, just like promises) - you don't run the risk of the event firing outside the scope of the event handler function. The problem with callback functions is they can easily get out of hand - as soon as you start chaining data through more than a couple of asynchronous functions, you can end up in <a href="http://callbackhell.com/">Callback Hell</a>: where you're calling callbacks in callbacks in callbacks.</p> <p>Callback hell is actually a really good example of a particular kind of code smell: technically correct, but difficult for a human to parse, or interpret. We should always be thinking about how code reads to someone new, or even to ourselves if we context switch for five days or six months.</p> <h2>Using somebody else's Promise: Fetch</h2> <p>I want to round off this introductory post by using the Fetch function: which is one of the more common ways that JS devs interact with promises.</p> <p>Fetch is (browser<sup><a href="#user-content-fn-2" id="user-content-fnref-2" data-footnote-ref aria-describedby="footnote-label">2</a></sup>) JavaScript's own in-built function for making HTTP requests, and it uses promises. If you've ever used <code>XMLHttpRequest</code> in browser JavaScript, it's a bit like that. If you've not, then you've not got anything to unlearn to alright, let's go.</p> <p>For now, let's just get our hands on one, and not worry about what it looks like under the hood (as in, medieval fantasy hood not car hood, obviously).</p> <p>This is one of the benefits of coding to an interface, and if you're really deep into JavaScript land and lost without a map I just want you to know how useful interfaces can be. If you're much newer to JavaScript Land or Software Continent, don't worry I'm just throwing some playful shade.</p> <h3>Sidenote: Emojis in code snippets</h3> <p>I like Emoji, I think they can quickly signify meaning. In the code snippets below I use the following emoji in code snippets to explain things:</p> <ul> <li>âœï¸ to signify that you're about to write something, and this is what it is.</li> <li>â„¹ï¸ to signify that I'm about to explain an output from the console.</li> </ul> <h3>Back to the show</h3> <p>If you're on a Desktop, I want you to go to Chrome<sup><a href="#user-content-fn-3" id="user-content-fnref-3" data-footnote-ref aria-describedby="footnote-label">3</a></sup> and open the dev tools (<code>⌘ + ⌥ + I</code> on a Mac, <code>Control + Shift + I</code> on Windows) and go to the Console tab. We're going to go ahead and get a random <em>Game of Thrones</em> quote because the kind people of the internet have not only created, but made freely available, servers which will serve us wonderful data like this for free (<a href="https://github.com/shevabam/game-of-thrones-quotes-api">GitHub link</a>).</p> <p>We're going to do all of this using Promises and I need to you shut your jaw, I know it's amazing but flies will get in there.</p> <p>We'll be using an API endpoint to get a random Game of Thrones quote, it's a GET request to <code>https://game-of-thrones-quotes.herokuapp.com/v1/random</code>, and it'll return data that looks like:</p> <pre><code class="language-json">// â„¹ï¸ An example quote from the Game of Thrones Quote API { "sentence": "Fighting bravely for a losing cause is admirable. Fighting for a winning cause is far more rewarding.", "character": { "name": "Jaime Lannister", "house": { "name": "House Lannister of Casterly Rock", "slug": "lannister" } } } </code></pre> <p>Actually, if you're really new here, go ahead and just copy-paste that URL into Chrome's address bar. Because it's a GET request, we don't need to worry about anything fancy. You'll get back a plain-old bit of (unformatted and un-syntax-highlighted) text with the data right there in your browser window. This is just like any other HTTP request (the same as going to <code>https://www.reddit.com</code>), it's nothing special.</p> <h2>Calling Fetch</h2> <p>Let's crank the HackerMan dial up a notch and fetch that same data using the console in Chrome's dev tools. In the console type:</p> <pre><code class="language-js">// âœï¸ Go to the Game of Thrones quotes server and get a random quote fetch("https://game-of-thrones-quotes.herokuapp.com/v1/random") // â„¹ï¸ The console will log you something like: // Promse {<pending>} </code></pre> <p>Oh.</p> <p>That's actually a little disappointing, no?</p> <p>So what have we done here? I'm being serious - read the gosh darn code and console output and think about what you did then try and explain it to yourself. I'm being serious, say it aloud or write it out - actually go through with the words that you would need to say.</p> <p>If you did it, I'm proud of you. If you didn't then <em>gee golly,</em> friend I wish I had your confidence in my knowledge. Here's what we did:</p> <ol> <li>We instantiated the <code>fetch</code> function with a URL for the Game of Thrones quote API. By default, <code>fetch</code> knew that we wanted to make a <code>GET</code> HTTP request (and not a <code>POST</code> or <code>PUT</code>, etc.).</li> <li>The console then logged out the implicit return value of our statement (which was to call <code>fetch</code>). From this log statement we can see that <code>fetch</code> returns us a Promise.</li> </ol> <p>And that little <code><pending></code> sitting there? Why that just means it's not <code>fulfilled</code> - remember earlier where you learned about the possible states of Promises in JavaScript (<code>fulfilled</code> or <code>pending</code>. You know, like 500 words ago. That's that! An unfulfilled promise in the wild.</p> <h2>Storing the Promise in a variable</h2> <p>So how do you actually get the quote in the response, when it comes back?. Well, we didn't store the Promise we generated in the above code-sample, which means we have no way to do anything with it - like check if it's back yet.</p> <p>Let's fix this, and take a look at the settled promise value:</p> <pre><code class="language-js">// âœï¸ Go to the Game of Thrones quotes server and get a random quote, and save it to the `quote` variable const quote = fetch("https://game-of-thrones-quotes.herokuapp.com/v1/random") // â„¹ï¸ The console will log you something like: // undefined // âœï¸ Wait a few seconds, then let's look at the value of `quote` quote // â„¹ï¸ Will log // Promise {<fulfilled>: Response} </code></pre> <p>Oh cool, we made the request and it returned... now what? How do we get the data out of it.</p> <p>You know what's really cool about Promises? When you create them, you don't have to specify what to do on their success/failure right away. You can create the promise, then handle it later. So assuming you did the above, and you've got a variable called <code>quote</code>:</p> <pre><code class="language-js">// âœï¸ Add the onFulfilled event handler to the promise quote .then(response => response.json()) .then(data => { console.log(data.sentence) }) // â„¹ï¸ Will return something like: // "Fighting bravely for a losing cause is admirable. Fighting for a winning cause is far more rewarding." </code></pre> <p>You know the drill: tell me what you did here. In a list, out loud, what's happening?</p> <p>Oh, there's not inline list this time. There's a lot going on here that we've go to break down. Are you ready?</p> <h3>1: Call the <code>then</code> function</h3> <p>We take the Promise which has a <em>Game of Thrones</em> quote in it (somewhere) and <strong>we call the <code>then</code> function</strong>. This is really important: <code>then</code> is a function on a Promise.</p> <p><code>then</code> is a function that takes one or two functions as arguments:</p> <ol> <li>Argument #1 : The <code>onFulfilled</code> function - which runs when the async operation behind the promise is successfully completed.</li> <li>Argument #2 : The <code>onRejected</code> function - which runs when (or if) there's a problem completing the async action.</li> </ol> <p>Here, we're only giving it one argument, so we're only defining the <code>onFulfilled</code> part. JavaScript is cool with us leaving the <code>onRejected</code> argument as <code>undefined</code> so now everyone who didn't like that thing about Interfaces has smug little smiles on their joyous faces.</p> <p>So we're calling the <code>then</code> function with one argument: an anonymous arrow function (i.e. a function that we've not assigned to a variable somewhere else) which takes one argument: which we've called <code>response</code> - which represents the HTTP Response that fetch returned to us.</p> <h3>2: The <code>json</code> function</h3> <p>We call the <code>json()</code> method, the return value from which is returned implicitly<sup><a href="#user-content-fn-4" id="user-content-fnref-4" data-footnote-ref aria-describedby="footnote-label">4</a></sup>. The <code>json</code> function is defined on the <code>Body</code> of the <code>Response</code> object that <code>fetch</code> returned to us- so don't worry about where it's coming from.</p> <p><code>json()</code> essentially takes the HTTP response body that <code>fetch</code> got, and parses it like JSON, so that we can treat it like an Object in JavaScript.</p> <p>One last thing: <code>json()</code> is an async function, so it returns another promise.</p> <p>If you're curious about <code>json()</code>, <a href="https://developer.mozilla.org/en-US/docs/Web/API/Body/json">here's the MDN docs</a></p> <h3>3: Promise Chaining</h3> <p>Because that first <code>then</code> function (implicitly) retuned a Promise (from the <code>json()</code> function), we can then call the <code>then</code> function on that <em>that</em> Promise so that we can actually handle the data from the API. This is called <strong>Promise Chaining</strong> - because you are flowing the result of one async action into another async action handler.</p> <p>All this work for a damned quote.</p> <p>Promise chaining is an application of Functional Composition: the way we compose together individual functions into production lines, or conveyor belts, which take in raw data at one end, and produce formatted data at another.</p> <p>So we take the result of the fulled Promise that the <code>json()</code> function invocation returned - which is a plain-old-javascript object. We refer to this as as <code>data</code> in that second <code>then</code> function - where we read and enjoy with humour or dread, or whatever it is that GRRM was going for.</p> <p>This isn't the place to talk about functional composition, but if you're already familiar with JS, you can learn more about it <a href="https://www.freecodecamp.org/news/function-composition-in-javascript/">here</a>.</p> <h2>Doing the same thing at author-time for Promises</h2> <p>Now that we've covered each of the individual parts of a promise, and you've either got confused and left or scrolled to the bottom, I just want to mention that normally you'll declare your <code>then</code> functions in the same place you create your Promise.</p> <p>This will give you code which looks like:</p> <pre><code class="language-js">// âœï¸ Go to the Game of Thrones quotes server and get a random quote, then process the data in-situ (so don't take it anywhere else) fetch("https://github.com/shevabam/game-of-thrones-quotes-api") .then(response => response.json()) .then(data => { console.log(`${data.character.name} says:`) console.log(data.sentence) }) </code></pre> <section data-footnotes class="footnotes"><sup class="sr-only" id="footnote-label">notes</sup> <ol> <li id="user-content-fn-1"> <p>There are some problems with this example (namely that it's actually using Promises under the hood, but please ignore those)]: <a href="#user-content-fnref-1" data-footnote-backref="" aria-label="Back to reference 1" class="data-footnote-backref">↩</a></p> </li> <li id="user-content-fn-2"> <p>The <code>fetch</code> function is <a href="https://caniuse.com/#feat=fetch">available in most browsers</a>. If you're going to do this in the Node /server environment, you'll probably need a package like <code>node-fetch</code> or some other polyfill. <a href="#user-content-fnref-2" data-footnote-backref="" aria-label="Back to reference 2" class="data-footnote-backref">↩</a></p> </li> <li id="user-content-fn-3"> <p>It does actually have to be Chrome, I tried on Firefox and some errors get thrown. Don't worry about them. <a href="#user-content-fnref-3" data-footnote-backref="" aria-label="Back to reference 3" class="data-footnote-backref">↩</a></p> </li> <li id="user-content-fn-4"> <p>Implicit returns in arrow functions in JavaScript don't have the curly (<code>{ }</code>) braces. For example <code>() => 5</code> will return <code>5</code>, whereas <code>() => { 5 }</code> will return <code>undefined</code> <a href="#user-content-fnref-4" data-footnote-backref="" aria-label="Back to reference 4" class="data-footnote-backref">↩</a></p> </li> </ol> </section>]]></description> </item> <item> <title><![CDATA[Things I Learned this week #5]]></title> <link>https://thomaswilson.xyz/blog/2020-09-11-things-i-learned-5</link> <guid>https://thomaswilson.xyz/blog/2020-09-11-things-i-learned-5</guid> <pubDate>Fri, 11 Sep 2020 00:00:00 GMT</pubDate> <description><![CDATA[<ul> <li><strong>This missed opportunity to name something</strong>: Ping Pong is a weird name for a sport, right? Ping Pong is actually a trademarked name, but it's not uncommon to call a thing by a brand name: it's like Hoover vs. Vacuum Cleaner, or Kleenex vs. Tissue. The real-fun fact here is that in 1900 Slazenger, a sports company, filed a trademark for the term Whiff-Waff - and 120 years laters (somehow) <em>Ping Pong</em> prevailed while <em>Whiff-Waff</em> died out, despite the fact that it's clearly more joyful. (<a href="https://www.worldwidewords.org/topicalwords/tp-whi1.htm">link to an oddly self-righteous article</a>).</li> <li><strong>This stone man</strong>: The Apennine Colossus (<a href="https://unusualplaces.org/the-appennine-colossus/">link</a>) is a stone sculpture in Tuscany, Italy, which is a personification (embodiment?) of the Apennine mountain region. This is why he's really big, but also I guess why he's made of stone? The use of stone to represent stone is perhaps a little on-the-nose, but the piece is gorgeous and captivating.It was created in the late 1500s by a Flemish sculptor residing in Florence, and some people argue that if it placed in the Piazza della Signora (and not in the private garden of a Medici home some seven miles from Florence) it would be considered a masterpiece.</li> <li><strong>This new word</strong>: <em>Farrago</em> means some kind of confused, haphazard, or disorganised mix - a word around which I appear to have been building a life philosophy.</li> <li><strong>This set of tarot cards</strong>: Don't ask how I got here, but this week I learned one can purchase a Hello Kitty themed set of tarot cards for a cool £250 (<a href="https://www.etsy.com/uk/listing/637754503/last-day-70-off-and-free-shipping">etsy link</a>)</li> <li><strong>This medical condition</strong>: Stendhal Condition, named after a French novelist, is characterised by dizziness, hallucinations, and heart palpitations which come on after being overwhelmed by the beauty of art. Amazingly, that means it's really common in Florence, Italy (<a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2991758/">link</a>)</li> </ul> <h2>Cool Articles</h2> <ul> <li><strong>What to talk about in 1:1s</strong> by Julia Evans on her <a href="https://wizardzines.com/comics/1-1s/"><em>wizard zines</em></a> site. I really like the simplicity of this piece - it's just a collection of example things you might want to raise to a manager, so that 1:1s can actually be useful to you in the 6-12 month time span, and not just a box to tick, or reason to spend time away from your desk.</li> <li><strong>Against Waldenponding</strong> by Venkatesh Rao on their <a href="https://breakingsmart.substack.com/p/against-waldenponding"><em>Breaking Smart</em></a> newsletter. No one is quite sure on the effects of so much technology, content, and mediums (podcast, YouTube video, Netflix, Newsletter) on our brain. It's given rise to a counter-culture, which is almost a meme in some tech circles, where someone voluntarily completely disconnects and go to live in a cabin in the woods. This article argues against, and while I don't necessarily agree with all the points the author makes, I think it's an interesting counter point in a debate where I rarely see someone taking an opposing side.</li> </ul> <h2>What I've had on Rotation</h2> <ul> <li><strong>Something New</strong>: <em>Pink Elephant</em>, by Stand Atlantic (Pop Punk). I adore pop-punk, and I think everybody should embrace their inner teenager. This album is cathartic and comfortably pop-punk, but even better than that, it's a great album in its own right - it doesn't rely on nostalgia or tropes. Put it on play and relive the vibrancy of being 17-19 again. (<a href="https://songwhip.com/stand-atlantic/pink-elephant">links</a>).</li> <li><strong>Something Old</strong>: <em>Safe in the Steep Cliffs</em> by Emancipator (Contemporary Instrumental). I've spent a lot of time this week needing music without words, and I've been rediscovering a lot of my old favourites during my time at University. The tempo and beat of this album is great to head-bop to while you're in a flow state, but perhaps a little too-high energy of more cognitively intense tasks (<a href="https://songwhip.com/emancipator/safe-in-the-steep-cliffs">links</a>)</li> </ul> <h2>Cool Things</h2> <ul> <li><a href="https://mailchimp.com/presents/by-the-books/">By the Books</a> - it's like the online experience of browsing a friend's bookshelf, but online. Created / curated by MailChimp.</li> <li><a href="https://blobs.app/">blobs.app</a> - soft and gooey blobs are becoming more commonplace in UI design. This little web UI will generate a simple svg (or Flutter) blob for you to use. I got this from the Smashing Magazine newsletter,</li> </ul>]]></description> </item> <item> <title><![CDATA[Things I learned this week #6]]></title> <link>https://thomaswilson.xyz/blog/2020-09-18-things-i-learned-6</link> <guid>https://thomaswilson.xyz/blog/2020-09-18-things-i-learned-6</guid> <pubDate>Fri, 18 Sep 2020 00:00:00 GMT</pubDate> <description><![CDATA[<ul> <li><strong>These ways of thinking</strong>: When we hand over a new problem to our brain there's a lot of things we need to do to solve it. We need to understand the problem and the surrounding/causal concepts as well as the constraints on a solution. For example the challenge might be "what should I write about on my blog this week?", and a constraint might be that it a) can't be boring, and b) can't be too long. When we're doing these mental processes we have two broad types of thinking: <em>Divergent Thinking</em>, where we produce a lot of possible solutions and new ideas; and <em>Convergent Thinking</em>, which is where we hone in on a narrow "right" answer. Often one will follow the other: we'll generate ideas with Divergent Thinking and filter them using Convergent Thinking. (<a href="https://blog.dce.harvard.edu/professional-development/divergent-vs-convergent-thinking-how-strike-balance">source</a>)</li> <li><strong>A word for this social media phenomenon</strong>: "Sadfishing" is the act of exaggerating or highlighting personal struggle or problems online in order to gain attention. Interestingly, the same kind of person who is more likely to sadfish is also more likely to judge someone else's emotional/personal social media posts as less genuine (<a href="https://theconversation.com/sadfishing-frequently-sharing-deeply-emotional-posts-online-may-be-a-sign-of-a-deeper-psychological-issue-126292">source</a>)</li> <li><strong>This thing about embryonic cells</strong>: It's wild that as an embryo develops, each cell knows what it needs to become. The protein SHH, which actually genuinely short for Sonic Hedgehod (I'm not joking) is a <em>morphogen</em>, which means it is used in the process of instructing cells in what they should become. Specifically, SHH, plays a role in the neural development of an embryo - letting cells know that they need to form the nervous system by forming the <em>nerual tube</em> (kinda cool, kinda gross name). Anyway, a beacon emits SHH into the surrounding area and the surrounding cells "eat it up", so the further away from the beacon the further cells know they are from the neural tube (and vice-versa). Nature's cool, yo. (<a href="https://www.reddit.com/r/askscience/comments/irxncu/how_does_a_cell_know_what_to_become_if_they_all/g54ffw9?utm_source=share&utm_medium=web2x&context=3">amazing explanation on reddit</a>)</li> <li><strong>This surprisingly relevant architecture</strong>: Nothing would stop the Italians drinking wine, not even the Black Death. During the 1600s, the Italians started building tiny windows in wine shops through which wine could be purchased and passed, without the need for face-to-face contact. They're called <em>Buchette del vino</em> and during the COVID-19 pandemic, certain Florentine cafes, bar, and gelaterias started re-serving food through them. (<a href="https://buchettedelvino.org/home%20eng/index.html">more info</a>)</li> <li><strong>This thing that oak trees do</strong>: This year is apparently a <em>mast year</em>, which means that oak (and other fruit-bearing trees, like beech) produce loads and loads of their fruit (e.g. acorns). Evolutionarily speaking, this means that the animals who feed off these fruits are not able to eat everything the trees produce, and there's a higher chance that there will be leftover seeds for producing baby trees (saplings?) come spring. We're not sure how trees know when they should fluctuate their fruit production, but we suspect it's something to do with the weather in spring. (<a href="https://www.woodlandtrust.org.uk/blog/2017/10/autumn-is-back/">source</a>)</li> </ul> <h2>What I've had on Rotation</h2> <ul> <li><strong>Something New</strong>: <em>Boreas</em> by The Oh Hellos (Folk). The folksy sound of this band are unlike a lot of similar bands. They're loud and delicate, joyful and mournful - they're a beautiful set of humans, and their new EP brings more of their delightful tones into my life. (<a href="https://songwhip.com/the-oh-hellos/boreas">links</a>)</li> <li><strong>Something Old</strong>: <em>Oh Wonder</em> by Oh Wonder (Gentle Pop). I remember discovering Oh Wonder during my time at uni and I remember vividly listening to them in my car as I was driving around a busy but happy time of my life. This album is calm and gentle, and brings back a lot of those memories. (<a href="https://songwhip.com/oh-wonder/oh-wonder">links</a>)</li> </ul> <h2>Cool Articles</h2> <ul> <li><strong>A supercomputer analyzed COVID-19 - and an interesting new theory has emerged</strong> by Thomas Smith on <a href="https://elemental.medium.com/a-supercomputer-analyzed-covid-19-and-an-interesting-new-theory-has-emerged-31cb8eba9d63">Medium's Elemental</a>. We're all a little tired of hearing about COVID-19 but in this article, Smith breaks down a lot of the current pathological/biological theories behind COVID-19 which I don't hear a lot of discussion about. I don't think we're giving enough airtime to the global scientific community who are figuring this out as fast as is realistically possible, largely because these things are inherently uncertain and changing. The main takeaway for me was this increased view of COVID-19 as blood/circulatory disease, not primarily a respiratory one.</li> <li><strong>Web Brutalism, Seamfulness, and Notion</strong> by Brandon Dorn on <a href="https://www.viget.com/articles/web-brutalism-seamfulness-and-notion/">Viget</a>. As I've moved further away from design as a UI-centric process (i.e. drawing rectangles and selecting the right kind of grey), I've taken a lot more value from design as a UX or thought process. This piece covers the design/aesthetic/philosophy of brutalism, just in the context of web and software - as an approach which argues that we should embrace the underlying tools, materials, and concepts and not try to design them away. The author makes a compelling point, which is likely too extreme to be useful to many, but there's nearly always value in hearing an apposing opinion made coherently.</li> </ul>]]></description> </item> <item> <title><![CDATA[My experience finding a new job as a software engineer in summer of 2020]]></title> <link>https://thomaswilson.xyz/blog/2020-09-20-interviewing-experience-2020</link> <guid>https://thomaswilson.xyz/blog/2020-09-20-interviewing-experience-2020</guid> <pubDate>Sun, 20 Sep 2020 00:00:00 GMT</pubDate> <description><![CDATA[<p>In late summer of 2020 I moved from freelance software engineer to a full-time position. I want to outline this process for literally anybody who's interested because I've found it useful when other people have done the same - like <a href="https://habr.com/en/post/489698/">this post</a> about interviewing at Google, <a href="https://css-tricks.com/interviewing-front-end-engineer-san-francisco/">this front-end</a>, and <a href="https://meekg33k.dev/what-i-learned-from-doing-60-technical-interviews-in-30-days-ckda9sn7s00iftss13b0wd0ky">this more generic post</a>.</p> <p>Web development is a joyfully open community. There's a lot of sharing, most often we share code, but we also share details about the wider context of our field. Navigating a career is hard, and that's not made easier when people don't talk about their experience of moving (up, down, sideways) within and between companies.</p> <p>It can be hard to talk about these things with your current colleagues without sounding like you're planning on leaving. It's also just a weird industry, where applying for jobs can take a long time, require a lot of standardised hoop-jumping and box ticking, and just generally feels pretty daunting. Not to mention the global pandemic and economic down-turn that hit us in 2020.</p> <p>Anyway, I've managed to find a new job that I'll be starting in October 2020. I'm (secretly) very excited and hopeful for it, and I want to share what it was like interviewing for a frontend / fullstack software engineering role in the summer of 2020.</p> <p><strong>A note on honesty:</strong></p> <p>I want to be as honest as possible here, and not skip over mistakes or hurtful events (like being rejected). I still have to be purposefully vague in some places. Honestly, the specifics don't really affect the trends and takeaways as a whole.</p> <p>I'm also not going to go into detail about my salary here. I would (and do) discuss salary in person with trusted peers because people and companies have (and do) get away with discriminatory (e.g. by gender) pay for people in similar positions. But this is the internet, yo - I'm not going to talk about this right now.</p> <p>If no one around you is willing or able to talk about salary, it's fairly easy to find average data for your city and job position. For example, the average salary for an engineer (which is a broad definition) in London in 2020 is about £50-60k:</p> <ul> <li><a href="https://www.linkedin.com/salary/search?countryCode=gb&geoId=102257491&keywords=software%20engineer">LinkedIn</a> says £50k</li> <li><a href="https://www.glassdoor.co.uk/Salaries/london-software-engineer-salary-SRCH_IL.0,6_IM1035_KO7,24.htm">Glassdoor</a> says £52k</li> <li><a href="https://hired.com/blog/highlights/2020-state-of-salaries-report/">Hired.com</a> says £60k</li> </ul> <h2>Being open to opportunities</h2> <p>I am a software engineer with 3-5 years<sup><a href="#user-content-fn-1" id="user-content-fnref-1" data-footnote-ref aria-describedby="footnote-label">1</a></sup> of front-end and full-stack experience. I have worked in academia, in large (>500 person), scaling (50-150 people), and small (~5 people) companies. I spent 2.5 years in companies, and about 8 months freelance.</p> <p>I signalled myself as open to new opportunities for related positions around July-August of 2020. Around the middle of September I accepted a full-time position as a front-end engineer. In all, it took me ~10 weeks from first thinking "I should see what's out there" to signing a contract.</p> <p>Much of my job hunting was through "passive" platforms, where recruiters and companies would come to me with information about positions. I used LinkedIn, <a href="https://hired.com/x/bec1ebaca8237ac16389e129029c0c0b">hired.com</a>, and <a href="https://www.talent.io/ref/iyhqVAh7">talent.io</a><sup><a href="#user-content-fn-2" id="user-content-fnref-2" data-footnote-ref aria-describedby="footnote-label">2</a></sup>. On the latter two platforms, you have the ability to set salary expectations and create a list of technology stack/work environment preferences.</p> <p>I also used various job boards, notable hacker new's monthly "Who's Hiring" (which are <a href="https://hnhiring.com/">consolidated here</a>) post, to look for jobs maybe once a week. There's a lot of nonsense, unclear, non-applicable job postings out there, and it's easy to spend too much time searching the noise for signal.</p> <p>I want to be in my next position for ideally 3+ years so I was very selective about the companies I wanted to work with. I did not <em>need</em> a new job, and so I could be afforded this luxury.</p> <p>In that time I had introductory phone calls with 10-15 companies, and interviewed with seven (i.e. arranged a follow-up from the introduction call). I ended up accepting an offer from one, was rejected by one, ghosted by two others, and declined three at the point where they asked me to complete some kind of code challenge.</p> <h2>The interview process</h2> <p>The interview process for all companies who I spoke with (more than the seven mentioned here) looked surprisingly similar:</p> <ol> <li><strong>A pre-interview interview</strong>. Have a 30-45 minute one-to-one chat with a recruiter or product-person. The point of this chat is for both parties to get a sense for each other. I am good enough at faking extroversion to actually enjoy these, to chat with interesting people about interesting problems. If you're roughly qualified in the technologies, and find yourself actually engaging with the problems the startup are facing, then you'll normally be screened through these calls an invited to the next stage.</li> <li><strong>A technical chat</strong>. If you make it through the introduction call, a few days later you'll probably have a more focused conversation with somebody, or somebodies, more technical. These chats are about drilling down on the kind of work you've done recently, and examples of your character. Be prepared to have a few case studies for specific projects you've worked on, things which have made you proud, and things which you have done wrong. Smaller companies tend to have more free-form interviews but larger/scaling companies will have a more formalised process with more set criteria. Try to stick to your time, don't ramble (but don't be too short), be honest, and be kind to yourself, your colleagues, and the industry as a whole. If the company think you're as qualified as you say you are, and you're a good ✨cultural fit✨ then you'll make it through this stage.</li> <li><strong>A code-based test</strong>. At some point they're going to want to see you write code, and you're going to want to show off how able to write code you are. The format of these varied, and I'm really happy to see a move away from take-home tests as the only thing they ask you to do. Methods I either experienced, or would have experienced, include: <ul> <li>Walking someone through a codebase I had written, or was familiar with.</li> <li>Taking a look at the company's codebase, and running a think-aloud style interview where I explain what I'm seeing and what I think about both syntax and architecture.</li> <li>A time-boxed take-home problem, i.e. being given a specific coding challenge but with an explicit deadline or limit on time (in the order of days, not hours). The company would tell you ahead of time if you needed to set anything up in particular (e.g. libraries, virtual environments, software).</li> <li>The classic homework take-home problem, i.e. being given a problem and asked to submit a solution when it's ready.</li> </ul> </li> <li><strong>An on-site interview</strong>. If you can write the code, and the company like how you write code - then you'll probably be invited to an on-site interview. All companies I spoke to (which weren't 100% remote) had an on-site part of their interview, and all made concessions given the COVID-19 pandemic (only meeting a certain number of people, social distancing measures, etc.)</li> </ol> <h2>The companies</h2> <p>In all, over the summer (6-8 week period) I interviewed with seven companies. I've grouped them by outcome, the order other than that is completely random.</p> <p>### Sustainable Laundry company</p> <p>🎊 Accepted an Offer</p> <p><strong>What do they do?</strong> They wash clothes, I guess, with the USP of being zero carbon.</p> <p><strong>What happened</strong>: one-on-one intro chat with head of tech, two-on-one chat with CEO and head of tech, then an on-site with the wider team. Offer made the following day and accepted two days after that.</p> <h3>Hospitality/Services adjacent company</h3> <p>🙠Declined before code-test</p> <p><strong>What do they do?</strong> They work with companies in the hospitality and services industry to increase efficiency.</p> <p><strong>What happened?</strong> After a productive chat with someone product-focused I had another productive chat with someone in the tech team. I was offered a take-home code test which I declined because I accepted the other job. I was offered contract work at a later date, and would have accepted it if I had the time, they were genuinely a good bunch of people.</p> <h3>Civil Infrastructure company</h3> <p>🙠Declined before code-test</p> <p><strong>What do they do?</strong> The company use novel software to reduce losses and increase efficiency on civic infrastructure (think roads, water, sewage, power lines).</p> <p><strong>What happened?</strong> A successful introduction call with a product person, then a one-on-one with a C-level person. I declined the take-home coding test as I accepted the above offer, additionally their tech stack was far outside my current area of expertise.</p> <h3>Productivity software company</h3> <p>🙠Declined after first interview</p> <p><strong>What do they do?</strong> A very early stage (almost-finished internal MVP worked on by small team) team building a real-time, collaboration-focused, web productivity tool for teams.</p> <p><strong>What happened?</strong> I declined a code-based assessment because I did not believe in the company's mission, especially in a crowded marketplace - they couldn't verbalise a strong, coherent USP or value proposition in a busy marketplace.</p> <h3>Logistics company</h3> <p>🙅 Rejected</p> <p><strong>What do they do?</strong> A growth-stage startup with a vibrant and varied tech team who handle global-level logistic chains.</p> <p><strong>What happened?</strong> I was rejected after a personal fit interview with a number of employees. I received specific and targeted feedback.</p> <h3>HR company</h3> <p>👻 (Almost) Ghosted</p> <p><strong>What do they do?</strong> They're working in the talent acquisition space to help recruiters find talent and streamline the process from applicant and recruiter side.</p> <p><strong>What happened?</strong> After ~4 weeks I got an e-mail back saying the position had been filled, but was offered short-term contract work with the team.</p> <h3>Data Privacy Company</h3> <p>👻 Ghosted</p> <p><strong>What do they do?</strong> An international data-privacy company who were looking for frontend engineers to improve the UI of their products.</p> <p><strong>What happened?</strong> I saw the job advertised online and reached out to the contact e-mail address given (who was the CEO). The CEO asked for a CV and a cover letter which I sent in and never received an acknowledgement or reply.</p> <section data-footnotes class="footnotes"><sup class="sr-only" id="footnote-label">notes</sup> <ol> <li id="user-content-fn-1"> <p>Depending on if you count my PhD as "professional" experience or not. <a href="#user-content-fnref-1" data-footnote-backref="" aria-label="Back to reference 1" class="data-footnote-backref">↩</a></p> </li> <li id="user-content-fn-2"> <p>Each of those links are referrer links, we both get a rewarded if you find a job with that platform. If you feel weird about using a referral link it's very easy to get started on both platforms without them. <a href="#user-content-fnref-2" data-footnote-backref="" aria-label="Back to reference 2" class="data-footnote-backref">↩</a></p> </li> </ol> </section>]]></description> </item> <item> <title><![CDATA[Things I learned this week #7]]></title> <link>https://thomaswilson.xyz/blog/2020-09-25-things-i-learned-7</link> <guid>https://thomaswilson.xyz/blog/2020-09-25-things-i-learned-7</guid> <pubDate>Fri, 25 Sep 2020 00:00:00 GMT</pubDate> <description><![CDATA[<ul> <li><strong>This unknown origin</strong>: No one is quite certain where the term "rule of thumb" came from. It has been mistakenly attributed to a British Judge's rule that a man can beat his wife if the stick so long as it is less wide than his thumb, however there's no evidence to support that this ruling was ever made. (<a href="https://freakonomics.com/2011/07/01/rule-of-thumb/">source</a>)</li> <li><strong>This heist</strong>: The police recently seized about £2.5m worth of books which were originally stolen in 2017. How were they taken? The thieves cut holes into the roof of the warehouse near Heathrow Airport and (I don't see how this can't be true) hummed the Mission Impossible theme tune as they lowered themselves down on carbon fibre grappling hooks past motion sensors (that bit's actually true) all the way to original copies of books by Newton, Copernicus, and Galileo. The books were stolen by a Romanian crime gang, and found buried under a house in rural Romania. (<a href="https://www.bbc.co.uk/news/world-europe-54209366">source</a>)</li> <li><strong>This thing about conspiracy theorists</strong>: There's possibly an evolutionary reason behind conspiracy theories: people/groups of people who are more likely to believe others are maliciously conspiring against them are less likely to underestimate the power or potential of others. This may increase the survival rate of those who are more suspicious of others. This means that our disposition to believe in conspiracy theories may to some extent be favourable and innate. (<a href="https://onlinelibrary.wiley.com/doi/pdf/10.1002/ejsp.2530">source</a>)</li> <li><strong>This thing about reading</strong>: On average, people onlyy read about 20% of the content on any given web page. This study was done in 2008, and I couldn't easily find a more up-to-date revision. That means most people would only read <em>one</em> of these five wonderful things I learned this week. (<a href="https://www.nngroup.com/articles/how-little-do-users-read/">source</a>)</li> <li><strong>This Roman god</strong>: Domitius is the Roman god who kept a woman in the house of her husband. His wife, Domiduca, protects children on the way back to their parents' house. Thanks for your service Domitius, but I think we can take it from here - you've had a good couple of thousand years, yeah? Domiduca, go take a spa weekend or something - go somewhere outside the house and without children. (<a href="https://en.wikipedia.org/wiki/Domiduca">source</a>)</li> </ul> <h2>What I've had on rotation</h2> <ul> <li><strong>Something New</strong>: <em>Fragments</em>, by Bear's Den and Paul Frith (Acoustic Folk Pop). This is such a gentle album, containing fully instrumental/acoustic remakes of their own songs, from across a number of their own albums. It's a great early autumn playlist to sit inside with, to read to, and to take the pressure out of an evening with. (<a href="https://songwhip.com/bears-den/fragments">links</a>)</li> <li><strong>Something Old</strong> <em>Blink 182</em> by Blink 182 (Pop Punk). I rediscovered this album on a bike ride I took earlier this week, in possibly the last of our summer sun. It was one of the first CDs I ever got, and the words to pretty much every song have been burned into somewhere deep in my brain. The pop-punk energy, distinct vocals, and general teenage melancholy make this a great album all round, if we're being honest. (<a href="https://songwhip.com/blink-182/blink-182">links</a>)</li> </ul> <h2>Cool Articles</h2> <ul> <li><a href="https://www.theverge.com/21444203/facebook-leaked-audio-zuckerberg-trump-pandemic-blm">Mark in the Middle</a> by Casey Newton for <em>The Verge</em>. This is a great bit of reporting on both Facebook and Mark Zuckerberg's approach to leadership and management. Zuck is a man who appears increasingly out of touch with human and social sentiments that make up a lot of the human experience. The article also highlights some wider tensions around Facebook which I had never previously considered, for example that Facebook employees are largely left-leaning but its customer base is increasingly right-wing; and how Facebook sells its mission to its employees as a democratising force for opportunity and connection for all. Ultimately, however, management within the company seems to continue to ignore the damaging consequences of providing a platform, and even amplifying voices, of hate speech and conspiracy theorists. The recordings in this article are also tightly integrated, and I love the design of the piece as a whole.</li> <li><a href="https://firstround.com/review/after-15-years-as-a-product-leader-ceo-and-now-vc-heres-the-advice-i-always-share-with-future-founders/">After 15 Years as a Product Leader, CEO and Now VC, Here's the Advice I Always Share with Future Founders</a> on the <em>First Round</em> blog. This is a nice reminder of the importance of always staying product and experience focused, accepting nothing less than what you envisioned. Even as products and teams grow (or bloat), these shouldn't slip (but pretty much always will). There's definitely some gems in there, but not every company can afford Google levels of financial, time, and mental resources. I don't think anyone can just stop everything and only ship excellence (as much as we all want to say we can and do).</li> </ul>]]></description> </item> <item> <title><![CDATA[Software Engineering as a Craft]]></title> <link>https://thomaswilson.xyz/blog/2020-09-28-software-engineering-as-a-craft</link> <guid>https://thomaswilson.xyz/blog/2020-09-28-software-engineering-as-a-craft</guid> <pubDate>Mon, 28 Sep 2020 00:00:00 GMT</pubDate> <description><![CDATA[<p>A few months ago a prominent figure in the tech and software space was uninvited from a conference<sup><a href="#user-content-fn-1" id="user-content-fnref-1" data-footnote-ref aria-describedby="footnote-label">1</a></sup>. In an (intentionally humorous) summary of this person, Melissa McEwan wrote a <a href="https://techexplained.substack.com/p/tech-bullshit-explained-uncle-bob">Tech Bullshit Explained</a> about the person. I don't want to talk about any of allegations or (tellingly-immature) reactions to the allegations, but something McEwan said in her post didn't seem to fit, and to me seemed a little too far. She says:</p> <blockquote> <p>They had to make Software Craftsmanship because Agile became too much about project management and not about code. This made software devs sad because they hate it when things aren't about them. [Person of Interest] and others thought too much code sucked. And people weren't paying enough attention to writing code that didn't suck. They decided the solution was to LARP as medieval craftspeople. And pretend they were making beautiful woodcarvings instead of pop up windows on websites.</p> </blockquote> <p>Look, I'm all for making fun of nerds, especially when they put on ill-fitting armour and probably very itchy wool and run at each other in a field, we've all seen <em>Role Models</em>. Just as people make fun of the nerds who have nothing better to do on a Tuesday evening than write things no one will ever read because it feels mildly more productive than watching the third episode of Ru Paul's since dinner.</p> <p>I don't take issue with calling it craftspersonship or artisanal. We can just go ahead and remove all the needless gendering from our language, it adds nothing and does damage as a whole. I also take some umbrage with the fact that damn near everything is <em>artisanal</em>: ice-cream, every Etsy store, and now apparently anyone who writes code.</p> <p>I see the humour in the choice of naming: a bunch of engineers get tired of no one else understanding how hard it is to do their job and how clever and skilled they are. So they look around and the only analogy they can find is <em>obviously</em> something right out of a D&D game or fantasy trope: the student/master, artisan/apprentise model.</p> <p>And finally, yep, we've all met at least one Grumpy Engineer (TM) or Egotistic Engineer (TM). I think in part it's because the salaries are comparatively high (because they provide high value), another part because of the underlying nature of the job, and a further part selection bias for the kind of people who want to become software engineers. It is a good idea to account for this inflated sense of self-importance when making software: give an engineer 1-12 weeks and at some point they're going to demand this awful code needs a re-write because <em>they</em> wouldn't make something this messy. Part of managing and working alongside/within engineering teams is compressing this need for perfection, or the illusion of perfection, in favour of "yes but also we need to satisfy our customers because they pay you".</p> <p>I do, however, take issue with the idea that we can use these easily mockable and related things to dismiss or diminish the sentiment behind what lead to the need for Software as a Craft (SaaC?). There's a clear underlying point to me, and one that doesn't even start with <em>these</em> old white men - in 1998 Freeman Dyson drew comparison between the historic practice of craft and the modern (at the time) software development.</p> <p>In his essay <em>Science as a Craft Industry</em>, Dyson puts <em>Craft</em> against <em>Mass Production</em> as two ends of a spectrum. Both approaches have their pros and cons. Mass production has enabled pretty much everything, from water bottles to cars, to become massively affordable and therefore pushed societal advancement as a whole. But mass Production is all about producing one thing: that single factory <em>only</em> pumps out motorcycles or water bottles. It's not going to start producing jigsaws by mistake if you stop watching it for thirty minutes, but nor could you easily turn it into a jigsaw factory very easily.</p> <p>The original <a href="https://en.wikipedia.org/wiki/Arts_and_Crafts_movement">Arts and Crafts movement</a> emerged around the turn of the 20th century in response to increased mechanisation and mass production. William Morris was an even first-er "Old White Men" that McEwan could point at. Morris argued strongly that artists and designers see themselves, and their work, as craftspeople would: working by hand to create the highest quality individual work. The Arts and Crafts movement criticised mass production or mechanisation, at times calling for all work to be done by hand and at other saying that so long as machines could produce work (designed by craftspeople, obviously) of good quality, then it was okay to use them.</p> <p>In a much more moderate, less social reformist, argument Dyson argues for software as a craft from the perspective that humans are a tool-making species. We will continue to use the materials available to us (physical and conceptual) to craft tools and solutions which help us do things. Mass production may help spread those tools, but we're always going to be tinkering and building - and <em>that</em> is the craft. He argues that software development is just as much a craft as the development of better, more precise, more capable scientific equipment:</p> <blockquote> <p>Because of the enormous variety of specialized applications, there will always be room for individuals to write software based on their unique knowledge. There will always be niche markets to keep small software companies alive. The craft of writing software will not become obsolete. And the craft of using software creatively is flourishing even more than the craft of writing it (<a href="https://science.sciencemag.org/content/280/5366/1014.full?view=full">Science as a Craft Industry</a> Freeman Dyson, 1998)</p> </blockquote> <p>When the production of software is a craft we appreciate, and even require, high levels of proficiency in a the problem domain and the technical tools available. This is what lets someone create, or purposefully work towards creating, software which is better, stronger, more efficient, cheaper, faster, easier to use, more stable, etc. - whatever the problem space demands.</p> <p>When we see software <em>only</em> as a craft, as something which is entirely small scale in scope and also in team size, we risk producing only small-scale work. Perhaps worse, we risk having pockets of high quality work, undertaken by people who both love the craft, and have the mental aptitude to truly improve the craft. I would argue that software engineers have a duty to share experiences, best practices, evaluations, and tradeoffs. Part of being a craft, then, is the teaching/learning aspect of student and teachers. Though, given the already vast breadth and depth of modern software, all engineers should be coming into the craft with a student's mindset. I digress, though.</p> <p>Both approaches, software as a craft vs. mass produced software, are necessary. It's a shame that we made the decision to point to the people who made furniture and cutlery 500 years ago and be like "do it like they did it", because they're seemingly very different. However, the fundamental designs of a chair and a fork haven't much changed in the last 500 years, nor have we yet converged on a single utilitarian design for either. Take a metal worker or a carpenter from today and 500 years ago and watch them work, and it probably looks very similar. Now people might learn more from YouTube than they did in the 1500s - and people may not serve a seven year apprenticeship - I'd imagine the two could sit down over a pint and make good conversation.</p> <p>Ian Martin <a href="http://oro.open.ac.uk/10383/">makes an interesting point</a> related to this: the decreasingly tangible product of code, i.e. that all we have are files on a hard-drive, may make it easy to forget that writing software produces a <em>thing</em>. If you produce a wonky chair or an overly long fork, it's easy to see the quality of work was not great. By calling for a perception of software as a craft, we fight against that ability to forget or not notice the final quality of the product. You could watch two software engineers with different levels of experience, or in different domains, and it wouldn't necessarily be so easy to guess which is which, at least from a distance.</p> <p>So maybe there <em>is</em> something to be said for the value of software as a craft, for sometimes focusing on the practice of making better, or at least different, software just for the sake of it. It's a shame that some developers get arrogant, zealous, and grumpy enough to give this idea a bad name. No matter how you justify it - as career advancement for yourself, value added to your business, or experience to your users - we should all be seeking to write better code and that doesn't happen by accident - that happens with the careful application and slow refinement of the craft. If you need to wear a leather gauntlet and call yourself Hilda The Blacksmith's Daughter to do that, then sure, buddy, I'm with ya.</p> <section data-footnotes class="footnotes"><sup class="sr-only" id="footnote-label">notes</sup> <ol> <li id="user-content-fn-1"> <p>I don't want to name them in this post because this isn't about them, or really the situation. Please oh goodness please don't let anything I say here be seen as any critique or defence of anyone or their action. <a href="#user-content-fnref-1" data-footnote-backref="" aria-label="Back to reference 1" class="data-footnote-backref">↩</a></p> </li> </ol> </section>]]></description> </item> <item> <title><![CDATA[Things I learned this week #8]]></title> <link>https://thomaswilson.xyz/blog/2020-10-02-things-i-learned-8</link> <guid>https://thomaswilson.xyz/blog/2020-10-02-things-i-learned-8</guid> <pubDate>Fri, 02 Oct 2020 00:00:00 GMT</pubDate> <description><![CDATA[<p>This week's <em>Things I learned</em> is a little shorter than usual because I've been moving house. I hate every part of moving house. Anyway, enough excuses, here are some of the things I learned this week:</p> <ul> <li><strong>This thing about reading</strong>: I've been thinking about how much we read recently. I think we'd all like to read more, and you hear so often of speed readers who can devour books in hours. The thing about reading is that you're limited by a) how fast your eyes can move, and b) how much you actually take in when you read. Most Higher Education level readers can read and comprehend no more than about 400 words per minute, but you can typically expect to fall within the 200-400 words per minute range. (<a href="https://slate.com/news-and-politics/2000/02/the-1000-word-dash.html">source</a>)</li> <li><strong>This incredible woman</strong>: Pearl White was an American actress born in 1889 who worked as an adult on stage, screen, and also the circus when she was a kid. She started in America, moved to Paris, and by 1924 (aged 35) she had been divorced twice, saved $2m, invested in clubs, casinos, and race horses (name three more badass investments) and bought a house in Egypt. She died aged only 49 following years of heavy drinking. (<a href="https://en.wikipedia.org/wiki/Pearl_White">source</a>)</li> <li><strong>This Elizabethan law case</strong>: In 1623 a woman called Susan Baskervile, lived in London and was was married (not all at once) to various theatre- or actor-types (we've all got our flaws, Susan). Susan sued the <em>Queen Anne's Men</em> - a theatre group, because the actors were not able to pay her stipulated pension, which Baskervile was given in the will of her deceased husbands. Not only did she win this lawsuit, but the documentation which was produced provided some of the best evidence in the pay, duties, grievances, and general operations of a theatre company in Elizabethan London. This period was known as the English Renaissance, and because of these documents we know a lot more about the behind-the-scenes aspects of the era. (<a href="https://en.wikipedia.org/wiki/Susan_Baskervile">source</a>)</li> </ul> <h2>Cool Articles</h2> <ul> <li><a href="https://sintagma.com/an-empty-boat-on-a-foggy-lake/">The Parable of the Empty Boat</a> a Zen parable explained by <em>Sintagma</em>. The core of this parable is that if you were sailing a boat out on a lake and you were crashed into by another boat you would be furious at whoever was in control of that boat. If that boat was empty, floating aimlessly about the lake, then you'd be more willing to accept the random bad accident. It's a nice reminder that bad things can happen and that your reaction to them won't always be constant, so you can control it.</li> <li><a href="https://www.theguardian.com/travel/2020/jun/18/end-of-tourism-coronavirus-pandemic-travel-industry?utm_source=densediscovery&utm_medium=email&utm_campaign=newsletter-issue-107">The End of Tourism?</a> by Christopher de Bellaigue for <em>The Guardian</em>. Travelling, especially for western millennials, has become more about box-ticking than deeper investment, understanding, or a sense of <em>seeing</em> another culture. I've thought this for a while, and it's why I normally holiday in the same couple of places. De Bellaigue puts forward some interesting ideas here bout how the current global pandemic can be a force to promote sustainable and responsible tourism, which tour operators, governments, and tourists may not previously have been encouraged to do.</li> </ul> <h2>What I've had on rotation</h2> <ul> <li><strong>Something New</strong>: <em>20/20</em> by Knuckle Puck (Pop Punk). I love when a new, fresh Pop Punk album drops, and that's exactly what this is: upbeat but low-key sad, pop punk. I've been really enjoying this album. (<a href="https://songwhip.com/knuckle-puck/2020">links</a>)</li> <li><strong>Something Old</strong> <em>III</em> by Bersarin Quartet (Contemporary Instrumental). I've choreographed/danced to works by this band before - they've got a wonderful ability to create space and ambience around surprisingly little sound. Their sound is delicate and careful, but intense at times. (<a href="https://songwhip.com/bersarin-quartett/iii">links</a>)</li> </ul>]]></description> </item> <item> <title><![CDATA[Things I learned this week #9 (Nobel Prize edition)]]></title> <link>https://thomaswilson.xyz/blog/2020-10-09-things-i-learned-9</link> <guid>https://thomaswilson.xyz/blog/2020-10-09-things-i-learned-9</guid> <pubDate>Fri, 09 Oct 2020 00:00:00 GMT</pubDate> <description><![CDATA[<p>In honour of the announcement of (some of) the 2020 Nobel Prizes, this week's edition contains entirely things I learned when reading about the people and work announced so far. Note that this doesn't include anything about the Peace or Economics prizes, which had not been announced at the time of writing.</p> <p>I also started a new job this week so I'm running at 5-10% mental capacity so we're in for another short edition this week!</p> <ul> <li><strong>This line of poetry</strong>: from Louise Glück's <em>Lullaby</em> "The Soul's like all matter: / why would it stay intact, stay faithful to its one form / when it could be free?". Glück is an American poet who has been publishing poetry since the 1960s. She has also taught at various American colleges. Her work carries various first-person narratives, often looking at intimate human relationships.</li> <li><strong>This weird name</strong>: Before we discovered Hepatitis C, we had only discovered Hepatitis A and Hepatitis B. The thing about Hepatitis C, is that it's chronic and it doesn't present many immediate symptoms (but it'll still kill ya) and we just hadn't isolated the virus yet. Around the 1960s, doctors started noticing something Hepatitis-y in patients who had received blood transfusions, or therapies derived from blood. So for a while, actually about a decade, we called this new virus <em>Non-A, Non-B Hepatitis</em> (NANBH) when really maybe we should have just called it Hepatitis C from the beginning. This year's Nobel Prize in Physiology or Medicine was awarded jointly to Harvey J. Alter, Charles M. Rice, and Michael Houghton for their work in discovering Hepatitis.</li> <li><strong>This use-case for genetic modification</strong>: The Nobel Prize in Chemistry was awarded to Emmanuelle Charpentier and Jennifer A. Doudna for their work on Crispr-Cas9, a tool for gene editing. The <em>Revive & Restore</em> project (<a href="https://reviverestore.org/projects/woolly-mammoth/progress/">link</a>) is trying to use this technology to create a mammoth-like animal, using the Asian Elephant as a baseline. If this is successful, I put good money on someone farming these animals for food and selling Wooly Mammoth Burgers from a food van. Bonus points to that van being Flintstones themed.</li> <li><strong>This family</strong>: The Nobel Prize in Physics was awarded to Roger Penrose, Reinhard Genzel, and Andrea Ghez for their work on Black Holes. As a child Dr. Penrose, now a maths professor at Oxford, would go for walks with his family. During these walks, his brother and father would play chess entirely in their heads, and Dr. Penrose would run back and forth between them, relaying one's next move to the other.</li> </ul> <h2>What I've had on Rotation</h2> <ul> <li><strong>Something New</strong> <em>DEMOTAPE/VEGA</em> by BERWYN (Hip Hop/Genre-Queer). This is a personal album, BERWYN puts a lot of himself and his situation into it. It flits between genres but still makes a consistent rap-ish sound and story. This is a good album from a relatively new artist who's obviously got things to say and the ability to say them. (<a href="https://songwhip.com/berwyn/demotapevega">links</a>)</li> <li><strong>Something Old</strong> <em>Wild Rivers</em> by Wild Rivers (Folk). With the shift of seasons from summer to autumn, it's a great time to be pensive. I've always found folk music to fit this mood well, and this album has gentle vibes by the bucket. (<a href="https://songwhip.com/wild-rivers/wild-rivers">links</a>)</li> </ul> <h2>Cool Articles</h2> <ul> <li><em><a href="https://explore.org/meet-the-bears">Meet the Bears of Fat Bear Week</a></em> on expore.org. Did you know about Fat Bear Week? You should, it's great. You can read all about your new best bear friends, or you can just look at the pictures of chubby bears.</li> <li><em><a href="https://css-tricks.com/the-widening-responsibility-for-front-end-developers/">The Widening Responsibility for Front-End Developers</a></em> by Chris Coyier for CSS Tricks. Every year or so, Coyier, puts out a really great essay on the state of modern web development, without bending to trends, companies, frameworks, or click-baity titles. If you work in web, this piece is definitely worth reading.</li> <li><a href="https://fs.blog/2020/10/why-life-cant-be-simpler/">Why Life Can't be Simpler</a> on the Farnam Street blog. This article is filled with tiny nuggets worth making a note of, especially if you're in the business of making anything. One of my favourite such nuggets is is that "complexity is like energy. It cannot be created or destroyed, only moved somewhere else. When a product or service becomes simpler for users, engineers and designers have to work harder."</li> </ul>]]></description> </item> <item> <title><![CDATA[Five (and a bit) useful questions to answer in your first week at a new job]]></title> <link>https://thomaswilson.xyz/blog/2020-10-10-five-useful-questions-new-job</link> <guid>https://thomaswilson.xyz/blog/2020-10-10-five-useful-questions-new-job</guid> <pubDate>Sat, 10 Oct 2020 00:00:00 GMT</pubDate> <description><![CDATA[<p>I've just had my first week at a new job (I'm now a frontend software engineer at <a href="https://www.oxwash">Oxwash</a>), which is cool. I find first weeks intense because I have to balance a) the immediacy of being introduced to everything and everyone in "real life", i.e. not an interview setting, for the first time, and b) trying to convey your long-term personal and professional ambitions to your new bosses without sounding like a career lunatic or emotionless psychopath.</p> <p>Managing long and short term goals is hard for humans to do, but worthwhile and rewarding when you get it right. Long term goals are rarely immediately relevant or present, it's not always easy to go from "I would maybe like to be an engineering manager" to an actionable thing. It's even harder to consider long term goals in chaotic situations, like when you're being introduced to new people, places, processes, technologies, terminology, and expectations. Plus the added complexity of trying to present yourself as someone who can totally stay afloat and cognisant during all the above.</p> <p>But if I don't have a long-term idea of who I want to be, even if it's subject to change, I worry that I'll be nudged into doing entirely what's best for the immediate concerns of others or the company. I would rather that my personal and professional development come from a dialog between what others need me to do, and what I think I want to be doing.</p> <p>For that reason, I came into the first week at a new job with a couple of personal and career-focused questions to help me understand myself and others. These questions ended up being really helpful to me, even if the answer to the questions is was a (polite) "can we come back to this later?".</p> <p>These are the questions I arrived at when I thought about all these things. They could be riffed on to help find something useful to you, or taken verbatim. I don't think their usefulness is limited to the first week at a new job, nor do I think they necessarily need to be asked to anyone other than yourself. The act of answering your own questions is a good little meditation (and it's at least 50% of the reason I try to write so much).</p> <p>So yeah, here are the five questions I came up with:</p> <h2>Imagine 12 months has passed - what could I do that would bring the quality of my work from 'Good' to 'Excellent'?</h2> <p>There are a couple of dangerous implications with this question, especially in a first week: it implies that you are capable of doing excellent work. You may well be, but it definitely sounds like you could be over promising.</p> <p>Despite that, I found this a useful question because it shows you how people understand, see, and value the kind of work you'll be doing. As an engineer, you'll get a different response to this question from people in management, product, operations, strategy, and tech. This is great - it shows you how the current tech team and offering are seen by the company at large, and how each person/team would define success.</p> <p>Another little life hack for you is that people rarely have a well defined, concise response to this question. You're probably not going to get told "a 7.5% decline in response times over the next 12 months" (obviously great if you do). Take a note of these points, of what people want, and use them when you're talking about, planning, and polishing tech internally.</p> <h2>What does the company look like in 12 months, five years, and ten years?</h2> <p>By default, your onboarding will give you a good idea about what you'll be doing immediately, maybe in the next 1-3 months. I found asking this question a great way to prepare me mentally for what I might be doing in the future.</p> <p>Asking this question to anybody senior in product or strategy (even in C-Suite, if you can) will help you understand what you'll be working on if you stay at the company for a longer (in startup years) amount of time.</p> <p>As before, this knowledge can help when planning and building software or roadmaps. Things will always change, and your software will always be somehow inflexible or caught off guard, but hopefully this question will help you minimise that.</p> <p>This question is most valuable in early stage companies, because of the difference between present and planned situation is probably quite large. I have intentionally joined an early stage company, and while they're definitely no longer struggling for product-market fit (if that's even a thing anymore?), the chance that they have already streamlined and perfected everything by now is pretty close to 0%. This is great - you can use your knowledge you're gaining in answering these questions to help get them closer to that goal.</p> <p>The caveat to this is that the uncertainty and unpredictability could mean that the longer-term projections or ideas are <em>just</em> words. Customers, economies, investors, management, talent, and global pandemics are all winds that will guide your ship. Don't get tied to these ideas, and keep a pulse on it - things can change fast and you'll have to learn when to stick to what you've learned and when you need to learn new lessons.</p> <h2>When, and how, is my performance going to be evaluated?</h2> <p>This is probably the most boring of the questions, because it is self-serving. However it <em>is</em> important to know how you're going to be assessed, because you want little to no concern about losing your job, failing your probation, or what not. At the end of the day, any good company is going to be equally critical and supportive in examining your work, and feed back to you. This is naturally uncomfortable enough, and so the least you can do is make sure it's not happening against â“mystery criteriaâ“.</p> <p>The answer to this question won't be relevant until you start digging in to actual work. I would still recommend making a note of it. It might encourage you to keep a better log of work you've done, problems you've faced, ways you've improved, or whatever. It might let you know about the company's culture around sharing, feedback, and openness.</p> <h2>If I'm struggling or have problems, where do I go?</h2> <p>This is the kind of thing you want to know before you need to know it. It might be your direct manager 95% of the time, but it's always good to have an idea about where to go if you were to have a problem with your manager.</p> <p>Get a sense for which people are best for which problems: management questions, tricky technical work, variable mental health, and ongoing family problems will at some point affect your work. Understanding who needs to be told what, and what kind of support can be offered (internally or externally) is a good thing to suss out.</p> <h2>What are your immediate team's backgrounds and interests?</h2> <p>Get to know your team, as much as this is <em>painfully</em> obvious, it's surprisingly easy to forget in the chaos of starting a new position. Allow these conversations to happen naturally during your first couple of days working alongside your new team. Don't come in with forced or canned one-liners with your team, this is your first week not a corporate retreat.</p> <p>I found it useful to get a broad idea about who my team is and what they find interesting. This goes for personal as well as professional interests. We're all complex, complete humans and you'll find something to bond about, even if it's just the weather, crowding on the underground, or the best kind of milk to have in coffee.</p> <p>Knowing what people do/not know, or where they are/not confident could help you phrase future feedback or explanations in a slightly different way. I'm not always great at asking for explanations of basic terms when someone explains something at a million miles an hour, and I know some people feel similarly. Likewise, when you need feedback or clarity on something, it's good to know where to go in order to get it.</p> <h2>Bonus Question: Does anybody have any dietary requirements or allergies?</h2> <p>If you're a cook or a baker you might want to bring in some sweet treats now, or in the future. It's always a good idea to know if anyone's going to be excluded, or mortally threatened, if you bring in a particular kind of baked good.</p>]]></description> </item> <item> <title><![CDATA[Things I learned this week #10]]></title> <link>https://thomaswilson.xyz/blog/2020-10-16-things-i-learned-10</link> <guid>https://thomaswilson.xyz/blog/2020-10-16-things-i-learned-10</guid> <pubDate>Fri, 16 Oct 2020 00:00:00 GMT</pubDate> <description><![CDATA[<ul> <li><strong>This Tiny City</strong>: St. David's is a city with a population of about 1,000 people. In 1886 it was stripped of its status as a city, being described as "lonely, and the neighbouring district wild and unimproved". In 1994 Queen Elizabeth II requested it be restored as a city, and now it is. (<a href="https://en.wikipedia.org/wiki/St_Davids">source</a>)</li> <li><strong>This Terrible Surgeon</strong>: In the 1800s Robert Liston, a London-based surgeon, was famous for performing amputations quickly. This wasn't just a neat party trick, at a time when surgical complications would kill a lot of people, being quick often meant less pain for the patient and less chance for something to go wrong. Liston once conducted a leg amputation in 28 seconds, during which he accidentally took off the thumb of his assistant and frightened a spectator to death (I'm not joking, he accidentally hit their coat with his knife as he was waiving it about, and the spectator literally died). The patient as his assistant later both died from infections to their wounds. Liston's surgery clocked up a 300% mortality rate.</li> <li><strong>This Monastic Meal Plan</strong>: St. Benedict remains an influential figure in modern Christianity. He wrote a book (a really big book) on how to be a monk and how to run a monastery (which were, at the time, full of monks). St. Benedict thought that monks should have two meals a day, but sometimes one, eaten in complete silence except for one monk reading aloud from the bible. He had a surprisingly well-balanced nutritional plan: fresh fruit and vegetables, two separate dishes, about pound of bread, half a pint of wine (a <em>hemina</em> to be precise), and a except for the sick or very weak, "let all abstain entirely from eating the flesh of four-footed animals". (<a href="https://en.wikipedia.org/wiki/Rule_of_Saint_Benedict">source</a>)</li> <li><strong>This Play Houdini Was In</strong>: Houdini's business model was pretty weird when you think about it: do things that sound and look impossible, like escape from a sealed container of water in handcuffs, and make sure nobody figures out how you do it. Make it so cool and outrageous and impossible that people pay to see it. A very Victorian sensibility. In 1911, Houdini performed his famous <em>Chinese water torture cell</em> trick - in which he escaped from a sealed container of water (chained down, of course). He wanted to patent it, so that others couldn't copy it, but by filing a traditional patent he'd have to reveal how the trick was done as part of the documentation. So instead, he performed the trick once, as a one-act play, to an audience of one. This allowed him to patent the trick as a performance, not as a device, and so did not need to provide any details about how it was done. Incidentally, no one figured out how he did this trick during his lifetime.</li> <li><strong>This Reasonless Nudity</strong>: No one knows why ancient Greek athletes used to perform naked. It was so inherent to the culture that the Greek adjective <em>gymnos</em> (on which 'gymnasium' is based) means 'Lightly clothed or naked' - yet there wasn't a clear reason for doing it. They started doing it about 50 years after the first Olympics and just... liked it, I guess? One story goes that a runner tripped over his loincloth and died, another story is that one sprinter (called Osippus) won a race nude, because he realised it would help him run faster.</li> </ul> <h2>What I've had on Rotation</h2> <ul> <li><strong>Something New</strong>: <em>The Quiet City</em> by David Wenngren & Library Tapes (Contemporary Instrumental). This is such a beautifully atmospheric album, it's perfect to put on as the evenings get colder and the rain starts coming in. The entire album flows into itself beautifully, and the orchestration is superb. (<a href="https://songwhip.com/librarytapes/the-quiet-city">links</a>)</li> <li><strong>Something Old</strong>: <em>The Come Up</em> by J Cole (Hip Hop). I really love some classic J Cole, this album has such a classic boom bap production sound and style, and the raw energy of an early J Cole. His new stuff is great, he's got a lot to say, but his old stuff is great to remember too. (<a href="https://songwhip.com/j-cole/the-come-up">links</a>)</li> </ul> <h2>Cool Articles</h2> <ul> <li><a href="https://www.theverge.com/2020/9/26/21456628/duolingo-app-design-characters-language">How Duolingo designed the new character for its project world</a> by Kim Lyons for The Verge. If you've used duolingo, even if just for a bit, over the years you'll know Duo, the green owl mascot. Recently, Duo'sgrown quite the little friendship circle. This article covers how the company behind the owl developed his new friends. There's a nice mix of psychology, education, and design in this article. It's a good read.</li> </ul>]]></description> </item> <item> <title><![CDATA[Think in Frameworks, build with Libraries - Thinking about CSS in Web Development]]></title> <link>https://thomaswilson.xyz/blog/2020-10-20-mental-frameworks-in-design-engineering</link> <guid>https://thomaswilson.xyz/blog/2020-10-20-mental-frameworks-in-design-engineering</guid> <pubDate>Wed, 21 Oct 2020 00:00:00 GMT</pubDate> <description><![CDATA[<p>I'm a few weeks into starting a new job as a frontend software engineer, and I've been moving around our (Angular) codebases to make a few smaller changes, and bump a number of our core dependencies through a couple of major (e.g. <code>1.0.0</code> -> <code>2.0.0</code>) versions.</p> <p>This caused a few visual changes, and in fixing, or at least understanding, what's happened I was rooting around a lot of the component-scoped style files (which are SASS files). I noticed that a lot of the selectors, including nested selectors, are using elements to create queries, for example:</p> <pre><code class="language-scss">// random-component.scss main { h1 { font-size: 1.5em; } img { width: 100%; } p { font-size: 1.15em; line-height: 120%; padding: 12px; span { background-color: #f1f1f1; font-size: 1.1rem; } } } </code></pre> <p>This is completely valid SCSS - it had done its job of styling <code>random-component</code>. There's a million ways to style a modern web app, plus <a href="https://daverupert.com/2020/06/tradeoffs-and-shifting-complexity/">there's just a set amount of complexity in a design</a>... good CSS won't make it go away, it'll just help you manage it.</p> <p>But I didn't like it. My gut feeling is that it feels very clinical - there's no notion of what exactly is <em>in</em> <code>random-component</code>. It's easy for a computer to read, but not for a human. Sure, it's easy to know that <code>h1</code> is probably the page title, but what about that <code><span></code> nested in the <code><p></code> - is that an inline name of a product, a code sample, contact information? I wouldn't be comfortable changing this SCSS quickly - because I don't know how limited in scope that <code>p > span</code> styling is - is used <em>only</em> for contact information, or for contact information <em>and</em> inline code?</p> <p>More technically speaking, is my concern that it ties our design specification and our DOM structure very tightly: we need a <code>main > p > span</code> in order to apply those styles. This might sound perfectly intentional, but what happens when you want to apply exactly the same styles in a <code>main > block quote > span</code> ? Do you copy-paste the code?. What happens if I add a wrapping <code>div</code>, <code>caption</code>, or another <code>span</code> before the actual for-real <code>span</code> that we want to give a background colour of <code>#f1f1f1</code>? Suddenly our implementation, i.e. our HTML/DOM structure, has changed, which has caused the need for our stylesheet to change.</p> <p>At the root of these problems is a lack of abstraction between design, i.e. visual metaphors and language we're trying to show our users, and the implementation, i.e. the HTML code we're rendering into a web browser. When you're a small team, or when everyone has good functional knowledge of all the technologies involved, this is perhaps favourable - the code communicates to your audience. But what happens when someone more specialised in design, HTML accessibility, or responsive layouts comes in and starts changing things? The strict coupling of design and implementation could either a) slow down effective change, or b) cause unintended visual changes or regression.</p> <p>This raises alarm bells in my little engineer brain: a change in HTML structure should not cause a breaking visual change. <strong>The structure of the DOM is largely for computers</strong>: to include the right information in the right format (an image, a header, a table) - and then let the browser render that out, allow accessibility tools to correctly understand it, and even allow other software to parse it to extract data.</p> <p><strong>Design, however, is entirely and selfishly for humans</strong>. We style on the web to make them clear and understandable to the human being who is viewing that document. There are, of course, a million other reasons why you'd style something: increase legibility, brand consistency, pure aesthetics, and so on. And when you look at some of the most widely used CSS philosophies, e.g. <a href="https://bradfrost.com/blog/post/atomic-web-design/">Atomic Design</a>, <a href="http://getbem.com/introduction/">Block Element Modifier (BEM)</a>, or <a href="https://github.com/stubbornella/oocss/wiki">Object Oriented CSS</a>... they're about creating opinionated names.</p> <p>When I design, I am designing entirely for humans. I am creating visual metaphors, rhythm, conventions, and predictability which is linked to the content of the website, the structure of the page, the intended audience. The same applies to when I am writing CSS: I am trying to write verbally consistent, and mentally clear CSS. <strong>But I have never designed or written CSS for HTML elements</strong>.</p> <p>When I design, I am asking questions like:</p> <ul> <li>What kind of data are we showing the user here?</li> <li>Do we show this data anywhere else in the application?</li> <li>How can the user interact with this screen, and how would I <em>like</em> them to interact with the screen</li> <li>Where can the user go from this screen?</li> </ul> <p>Things I am <strong>not</strong> thinking about include:</p> <ul> <li>How can I trim the user's name so there's minimal whitespace in this <code>a</code> tag?</li> <li>Will this <code>p</code> tag by <code>flex-grow: 1</code> ?</li> <li>Does this <code>div</code> tag need to inherit <code>display: none</code> from its parent?</li> </ul> <p>I think of design more as a framework than a library. In technical terms, a library is smaller, focused, single-purpose bit of code or tech that does one thing. There is typically one way to do one thing. A framework, however, comes with more opinions and scope: it's possible to have a "right" and a "wrong" way of doing things (sometimes called the "blessed path").</p> <p>There are definitely more framework-esque approaches to design. Tailwind CSS and other atomic- or utility-first CSS libraries are increasingly popular. And also incredibly useful or clear for a lot of people. However here we see the CSS classes bundled together into a single <em>component</em> to encapsulate the complexity - you're making a framework based on Components, not CSS class names.</p> <p>I see a lot of my role as a designer as taking various bits of tech and an understanding of a business context, and using both to create frameworks, and their associated mental models. <strong>I think that in-house design benefits when it comes with its own mental models</strong>. They're bigger, they're tied to a specific business/product - so they're not really sharable or useful to anybody else. But that's okay - because they're <em>very</em> useful to the people who need them.</p> <p>So that's what I've been thinking about this week: how some SCSS files made me realise that my role as an engineer and designer is to create mental models and frameworks, sometimes using tiny libraries.</p>]]></description> </item> <item> <title><![CDATA[Things I learned this week #11]]></title> <link>https://thomaswilson.xyz/blog/2020-10-23-things-i-learned-11</link> <guid>https://thomaswilson.xyz/blog/2020-10-23-things-i-learned-11</guid> <pubDate>Fri, 23 Oct 2020 00:00:00 GMT</pubDate> <description><![CDATA[<ul> <li><strong>This thing about how we sleep</strong>: In Western Europe, about 35% of young adults sleep with a soft toy every night, and about 44% of people keep hold of their childhood soft toy. It can be especially helpful for people with low self-esteem, or higher anxiety to sleep with a soft toy, apparently. As someone who's kept firm tabs on their childhood bear (though I'd say we sleep adjacent, not together), it shocks me that over half of people would throw their teddybear away. (<a href="https://www.theguardian.com/global/2020/jan/05/bears-lifeline-adults-who-sleep-with-soft-toys">source</a>).</li> <li><strong>This older-than-expected coffee machine</strong>: The Nespresso capsule, those little pods of coffee grounds that you put in the coffee machines to get a single serving of espresso-based coffee, was initially invented 40 years ago by a rocket scientist. Eric Favre came up with the idea in the 1970s while in Rome, when he saw how one cafe in particular (Caffe Sant'Eustachio, if you're curious) was more popular than all the others around it. He noticed that the baristas would aerate the coffee, and extract it for longer under higher pressures - to give it a stronger flavour, and more <em>crema</em>. In 1986 Nestle released the first version of the Nespresso machine and capsules to the public, but it took a while to take off, because the public didn't want it - they were happy with their instant coffee (can you imagine being happy with instant coffee?). It took 30 years, but the brand is now worth over $4 billion.</li> <li><strong>This children's book author</strong>: In the late 20th Century, a 13 year-old Walter Crane was apprenticed to a master woodcarver-cum-political-activist (us millennials think we own the "slash" in occupations and side hustles). Crane got involved in the Arts and Crafts movement, which held that art has the power to educate and inform tastes, and also that "art" doesn't just mean paintings - rather it means anything crafted. Arts and Crafts' most recognisable output is probably William Morris' floral patterns. Crane took a special interest in <em>Toy Books</em> - i.e. those made for young children learning to read. In 1899, in his 20s, Crane illustrated <em>Steps to Reading</em>, which was written by Nellie Dale. Dale was a teacher who pioneered a new (at the time) method of teaching children to read: pairing of words with pictures to convey the same meaning. When you write "Jack plays cricket" - you pair it with a nice illustration of a young boy (probably called Jack) playing cricket. At the time, most other books took a phonetic approach: showing each letter and having children say the letters out loud. Crane's illustrations, and understanding of the required manufacturing process (wood engraving apprenticeship, remember?), produced delightful and detailed illustrations for Dane's book, which caused them to remain popular long after more refined teaching methods were discovered. I would highly recommend checking out the images in the <a href="https://blog.nationalarchives.gov.uk/the-art-of-learning-to-read-with-walter-crane/">source</a>.</li> </ul> <h2>What I've had on Rotation</h2> <ul> <li><strong>Something New</strong>: <em>Zephyrus</em> by The Old Hellos (Folk). I've mentioned this band before, and for good reason. I love their riotous folk vibes, which they've still managed to create during 2020. True, a year full of actual riots, but also a year full of not gathering in groups. (<a href="https://songwhip.com/the-oh-hellos/zephyrus">links</a>)</li> <li><strong>Something Old</strong>: <em>Animal Magic</em> by Bonobo (Instrumental/House). Bonobo's come a long way in the production of his music - his newer music feels so clean and refined, but I've enjoyed rediscovering the simple/rawer sound of his older stuff this week. It's still beat-centric, makes you want to move, and doesn't quite fit in any genre. (<a href="https://songwhip.com/bonobo/animal-magic">links</a>)</li> </ul> <h2>Cool Articles</h2> <ul> <li><a href="https://www.theverge.com/2015/2/23/8069825/everything-i-know-about-a-good-death-i-learned-from-my-cat">Everything I know about a good death, I learned from my cat</a> by Elizabeth Lopatto for <em>The Verge</em>. For a while now I've been thinking about dignity in dying, and this article is a really great exploration of some of those ideas, but in the context of Dorothy Parker, a cat with cancer. It's a touching article, with some well written points.</li> </ul>]]></description> </item> <item> <title><![CDATA[Tiny thought: Writing for recipe cards]]></title> <link>https://thomaswilson.xyz/blog/2020-10-24-writing-for-recipe-cards</link> <guid>https://thomaswilson.xyz/blog/2020-10-24-writing-for-recipe-cards</guid> <pubDate>Sat, 24 Oct 2020 00:00:00 GMT</pubDate> <description><![CDATA[<p><em>Tiny Thoughts</em> are little (500 word) essays. They're concise.</p> <p>I've spent the past three months consciously trying to write and read more. I want to improve my ability to refine and communicate thought, and doing it in public helps motivate me to produce work.</p> <p>One of the hardest problems I find myself addressing frequently is my desire to over-explain or provide too much information. I have read many times that good writing is about being concise. Being direct and undistracted help you get your point across. You're not tiring the reader, and you're not brining in unnecessary information. Being concise is good.</p> <p>A few weeks ago I was listening to the JS Party podcast, a show I subscribe to but often skip. I picked up this episode because its title, <em><a href="https://changelog.com/jsparty/141">Content is Queen</a></em>, seemed relevant. I don't see my writing as content, but I know other people view theirs that way - and so I listened it.</p> <p>Something that came from that episode, which I really liked, was the idea that <strong>you should write like you're creating a small recipe card</strong>. It's a good analogy, and it implies the following things to think about when you're writing:</p> <ol> <li>Realise sometimes you're trying to get to a point or a result, you're not trying to be witty or identifiable in your writing style.</li> <li>Identify and sign-post the most important steps in a process, or points in an argument.</li> <li>Figure out how to your points reproducible, undeniably clear, and re-usable.</li> <li>Condense your points down to as small a number as possible, you're writing for a small recipe card.</li> </ol> <p>I don't know how well these items hold for longer pieces, or opinion pieces. Sometimes you want to let your personality shine through in your writing, and sometimes you can let yourself wander. That said, I've been working a lot harder on <em>deleting</em> sentences, rather than adding them in, for the past month or so. I think that's, at least in part, because of this little realisation.</p> <p>You can see the full transcript for the episode on the<a href="https://changelog.com/jsparty/141"> episode page</a>, but the original quote comes from <a href="https://www.stephaniemorillo.co/">Stephanie Morillo</a> that sent me on this thought is:</p> <blockquote> <p>You know the recipes you get with a Blue Apron or a Sun Basket subscription? They fit on a card, right? And they're not superfluous and they're not using all these great words. Every word there is there for a reason, and they're not gonna give you the back-story and all that fun stuff. They are "You've gotta do this, you've gotta do this, you've gotta do this." But the great thing is that as a result, you pretty much don't mess up the recipe.</p> </blockquote>]]></description> </item> <item> <title><![CDATA[Things I learned this week #12]]></title> <link>https://thomaswilson.xyz/blog/2020-10-31-things-i-learned-12</link> <guid>https://thomaswilson.xyz/blog/2020-10-31-things-i-learned-12</guid> <pubDate>Sat, 31 Oct 2020 00:00:00 GMT</pubDate> <description><![CDATA[<ul> <li><strong>This high fat diet</strong>: Whales, like dolphins but also humans, are mammals. This means they feed their young with milk. As you would expect, the blue whale has the largest mammary glands on Earth – each is about 1.5m long and weighs as much as a baby elephant. Blue whale mothers can produce 200 litres of milk per day, with a fat content of 35-50%. For reference, double cream is about 48% fat. It's no wonder blue whale calves gain about 90kg of weight a day for the first year of their lives.(<a href="https://www.discoverwildlife.com/animal-facts/marine-animals/how-do-whales-breastfeed-underwater/">source</a>)</li> <li><strong>This 100 year old word</strong>: "Robotics" is 100 years old this year, although it was first published by Czech writer Karel ÄŒapek in a play, <em>R.U.R. (Rossum's Universal Robots)</em>, the author credits his brother, Josef ÄŒapek, as the <em>actual</em> inventor of the word. Either way, the word itself derived from the Slavic word <em>robota</em> which means slave or servant, and originally referred to artificially manufactured humans who could be mistaken for real (organically manufactured?) humans, <em>a la</em> Blade Runner's (or Phillip K Dick's) Android.(<a href="https://en.wikipedia.org/wiki/Robotics#Etymology">source</a>)</li> <li><strong>This reason behind a medieval punishment</strong>: In the 1500s, Queen Mary, England's first Queen who wasn't just the wife of a king, gained a reputation as "Bloody Mary". Mary was a deeply Catholic woman, which is especially surprising given her father, Henry VIII, formed the Church of England and had a real thing for getting divorced. During her reign, Queen Mary worked hard to stomp out the Protestant faith, electing to burn a lot of its public practitioners. There were numerous, surprisingly socially acceptable, ways to execute someone in Tudor England, but being burnt alive was chosen purposefully. It was supposed to give the victim a taste of the hellfire which was about to overwhelm their soul for all eternity - and a last chance to accept Catholicism and therefore prevent this. (<a href="https://getpocket.com/explore/item/the-myth-of-bloody-mary">source</a>)</li> <li><strong>This Twitter Holiday</strong>:In April 2011, Ed Ball, the now retired British MP, simply tweeted his name. It turns out he was trying to search for articles about him on the site, but instead he just ended up tweeting two words: "Ed Balls". At the time he didn't know it was possible to delete Tweets, but even since learning he could, he's left the Tweet up. Every April 27 some people now celebrate "Ed Balls Day" - which strikes me as as a joyfully silly holiday. Back in 2011 it was slightly more noteworthy for politicians to tweet absurd things. (<a href="https://www.bbc.co.uk/news/blogs-trending-39744431">source</a>)</li> </ul> <h2>What I've had on Rotation</h2> <ul> <li><strong>Something New</strong> <em>New Ruins</em> by Indian Wells (Contemporary Electronic). I'm not 100% sure what genre Indian Wells fits in - it's beat-heavy, synth-tactic, melodic, and rhythmic. It's good music to work to, but I also enjoy it if I'm out on a run. This EP, released a few weeks ago, has been really great to put on when I need to focus in on something. (<a href="https://songwhip.com/indian-wells/new-ruins">links</a>)</li> <li><strong>Something Old</strong> <em>All Eyez On Me</em> by 2Pac (Old School Hip Hop). Man, 2Pac gets a lot of recognition and for good reason. He put this album out in '97, and it's two hours long - two hours of lyrically detailed, flow-heavy, classic gangsta rap that honestly still stands up in its own right over 20 years later. (<a href="https://songwhip.com/2pac/all-eyez-on-me-1996">links</a>)</li> </ul> <h2>Cool Articles</h2> <ul> <li><a href="https://www.theatlantic.com/family/archive/2020/10/people-who-prioritize-friendship-over-romance/616779/?utm_source=pocket-newtab-global-en-GB">What if Friendship, not marriage, was the centre of life?</a> by Rhaina Cohen for <em>The Atlantic</em>. I like this article because it's able to point at something we hardly consider, e.g. that the most important and significant relationship in your life will be your romantic one, and ask why that is. I'm not proposing we all try and label someone our platonic soulmate and buy a plot of land in the south of France together (but that would be fun for a bit), but rather ask why we don't have the words or cultural role models to explain this kind of relationship.</li> <li><a href="https://www.bbc.co.uk/news/newsbeat-54646324?utm_source=pocket-newtab-global-en-GB">Quest Sprout: 'The most wholesome thing on the internet'</a> by Michael Baggs for the BBC's <em>Newsbeat</em>. I saw these cartoons popping up on Reddit every now and again, and they lifted my heart. Quest Sprout is the creation of a a New Zealand-based artist and games tester (and all round nerd) who was trying to spread more positivity. Quest Sprout is a tiny, floral character who just loves going on quests but, like the rest of us, is scared sometimes. Quest Sprout is wholesome and reminds us to be kind to ourselves and others. Go and read the article and feel better on the inside.</li> </ul>]]></description> </item> <item> <title><![CDATA[Why are you like this JavaScript? JavaScript Runtimes and Engines]]></title> <link>https://thomaswilson.xyz/blog/2020-11-01-js-runtimes-and-engines</link> <guid>https://thomaswilson.xyz/blog/2020-11-01-js-runtimes-and-engines</guid> <pubDate>Sun, 01 Nov 2020 00:00:00 GMT</pubDate> <description><![CDATA[<p>Sometimes you keep hearing words but you're not actually sure what they mean, but you're too afraid to ask and keep forgetting to Google it. For me, two of those phrases have been "JavaScript runtime" and "JavaScript engine". I've never studied Comp Sci at uni, and I've never practically needed to be able to define either of them.</p> <p>If that sounds similar to you, then buckle up cowboys and cowgirls because you're about to go "oh, yeah, cool" a lot at some pretty basic distinctions that you probably intuitively knew but didn't have the words for.</p> <p>I think there's innate value in understanding more about where and how your code actually runs. It's rarely directly applicable, but at some point in writing a large-enough app in JS, especially if it's full-stack, you're going to need to know these things. It'll also help you understand why Node.JS and client-side JS are different, and appreciate the overall portability (if not the performance) of JS in the wider context of software engineering. Or throw it out there in your next engineering interview and sound smart and informed, and hope they don't ask any deeper questions 🤷â€â™€ï¸</p> <h2>TL;DR</h2> <p>The JS runtime is the place where JS (or its machine-readable counterpart) is actually run. The browser is a runtime and it's how JS has access to things like the <code>window</code> object. Server-side JS runtimes also exist, like Node.JS.</p> <p>Engines are the bit of software which take our source code, e.g. the human-readable JS code, and transform them to computer-executable instructions. There are a number of ways that engines can do this, some of them use Just in Time (JIT) compilation, but JS is an interpreted (i.e. non-compiled) language.</p> <h2>JavaScript Runtimes</h2> <p>I just assumed that the JS runtime was the browser or server where the JS actually ran, i.e. where the commands (like <code>console.log('hello')</code>) were executed. And I was right, but there's a little more detail to this answer.</p> <p>JS runtimes get a bit of flack for causing bad performance, whatever that generic term means. Take this <a href="https://sebastiandedeyne.com/going-deep">critique from Sebastian De Deyne</a>:</p> <blockquote> <p>We're adding heavy runtimes to support multiple platforms instead of staying close to the metal, and we pay the price in performance.</p> </blockquote> <p>This criticism brings us a little closer to a useful definition of a Runtime: it <strong>includes the libraries and frameworks which act as the intermediary between the code you've written, and the operating system it is running on</strong>. So if we take this mental model a little further, a runtime is the abstractions that sit between the bare metal and the running program (<a href="https://softwareengineering.stackexchange.com/questions/304427/what-really-is-the-runtime-environment">StackOverflow source</a>).</p> <p>Programming languages haven't always needed, or come with, a runtime. Some of the earlier languages, like FORTRAN and COBOL have such a limited set of features and syntax that the language <em>is</em> the runtime (at least conceptually). The difference between the source code (i.e. the code written by an author) and the machine-executable compiled code which are created from the source code, is pretty minimal in these languages. The code you write details explicit manual control over memory allocation, garbage collection (and a bunch of other features) that the source code doesn't need to bring in anything else. The computer can run that file just fine by itself. Obviously this shifts the role of a program from not only its intended computation, to include also the memory allocation and logistics around these computations.</p> <p>The C programming language is a good example of when we bought in runtimes. C came with the ability to call other libraries or functions to achieve certain things. For example, the <code>malloc</code> function allows an author to allocate memory and get a pointer to its location. <code>malloc</code> is defined in <code>stdlib</code> of C - in a separate C file to the one the author is currently writing. The <code>stdlib</code> library defines exactly <em>how</em> memory is allocated through and the correct address is returned. This allows us, the authors, to focus on the logic of our code specifically, and not to have to re-write a memory allocation function in pretty much every bit of C code we write. This speeds us up, reduces errors, creates conventions... all good things in software engineering at scale.</p> <p>That means that if we were to write a simple C script which invoked <code>malloc</code>, when we came to execute our code it would need to also have some way of gaining it access to the <code>stdlib</code>, as <code>malloc</code> is defined there, not in our code. The <code>malloc</code> function is <em>not</em> syntax in the language, in the way that <code>if</code>, <code>char</code>, and <code>static</code> are. The runtime of our C script would include access to the <code>malloc</code> function. These libraries would need to be <em>linked</em>.</p> <p>Subsequent languages, famously Java and C#, came with a very heavy runtime - their Virtual Machine (VM). This is what allows both languages to boast portability between architectures and OSs - the source code runs inside of a VM, and the VM abstracts away all the complexity of interacting with the bare metal.</p> <p>To return to JavaScript briefly, this is how browser-executed JS has access to objects like <code>window</code> - which we never define, and which wouldn't be defined if we ran our JS in a non-browser like environment (e.g. Node.JS). <strong>The runtimes of browser Javascript provide our source code with access to these APIs and libraries. They're not part of the core JS language</strong>, like <code>Function</code> and <code>Object</code> are.</p> <p>When we talk about JavaScript runtimes we're talking about the environment in which the executing code lives and works.</p> <h2>Javascript Engines</h2> <p>A JS engine is what gets us from the human-readable JS code into a computer-interpretable set of instructions. E.g. <code>const name = 'Thomas'</code> isn't an instruction that an operating system or browser would understand. Instead, we need some way of letting our program find and manage memory, link things together, etc.</p> <p>Let's take a moment to just cover some technical terms:</p> <ul> <li><strong>Source Code</strong> is the original code in JS, e.g. written by a human author. It may also be valid JS which has been minified by a build step.</li> <li><strong>Machine Code</strong> is a set of instructions for CPUs for loading memory, performing specific tasks etc. Machine code is not human readable (<a href="https://en.wikipedia.org/wiki/Machine_code">wikipedia</a>)</li> </ul> <p>Different JS engines go from source code to machine code in different ways, which vary with their target environment and can affect the performance of a script. For examples, the <a href="https://v8.dev/">V8</a> engine compiles to machine code, whereas <a href="https://developer.mozilla.org/en-US/docs/Mozilla/Projects/Rhino">Rhino</a> compiles JS to Java classes. Let's not talk about the implications of this - just assume that they're comparable but different... ya know?</p> <p><strong>The JS engine is what lets our JS code just... run</strong>. Engines are responsible for several low-level machine operations which are necessary on the journey from source code to machine code. They load the script into the computer's memory, link all the necessary libraries together so all parts of the program have access to each other (remember runtimes?), and then find the entry point (i.e. the instructions in the <code>index.js</code> file) and start executing those.</p> <p>Unlike Java or C#, JavaScript is not a compiled language. Compiled languages are transformed to machine-readable code <em>before</em> the program is started or executed. Instead, <strong>JS is an interpreted language</strong>. This means that the code isn't compiled or prepared ahead of execution. It's building the runway as it takes off. The role of the JS interpreter is to take the source code and call the instructions on the processors and CPU of the computer where the code is running.</p> <p>This is the source of one of the most defining "features" for novice and experienced JS authors alike, the <code>cannot read property X of undefined</code> error, caused by the fact that we have tried to access a property (<code>X</code>) of something which does not exist (<code>undefined</code>). This is a classic kind of error which a compiled language may be able to catch - by checking for potentially undefined variables. But we're getting off track.</p> <p>With that said, the highly performant V8 engine uses Just in Time (JIT) compilation of JS to machine code. This means the JS source code <em>is</em> compiled, but as close to its execution as possible. I'm not going to go into JIT compilation here because it's a little long, but <a href="https://hacks.mozilla.org/2017/02/a-crash-course-in-just-in-time-jit-compilers/">Mozilla have a great summary on it</a>.</p> <p>So yeah - the engine is what takes our <code>.js</code> files, and allows a computer to do the relevant computer-y things with them. And here we all are, trying to remember which way round the Boolean logic works on <code>filter()</code>.</p>]]></description> </item> <item> <title><![CDATA[Things I learned this week #13]]></title> <link>https://thomaswilson.xyz/blog/2020-11-07-things-i-learned-13</link> <guid>https://thomaswilson.xyz/blog/2020-11-07-things-i-learned-13</guid> <pubDate>Sat, 07 Nov 2020 00:00:00 GMT</pubDate> <description><![CDATA[<p>WHAT. A. WEEK. It feels the entire western world has had their eyes on the US presidential election, and it's been exhausting. Not exhausting in the way that the last 12 months have been for the US, but exhausting in the way that nothing in 2020 has lead us to expect anything good to happen. As I write this, Joe Biden and Kamala Harris have just been elected as president- and vice president-elect. It's not the start of a revolution, the structure of the US political system prevents power being torn too far one way or another (or at least intends to), but it's a collective sigh of relief from me, and a lot of the people in circles I follow.</p> <ul> <li><strong>The reason behind this saying</strong>: I recently heard the phrase "A good wine needs no bush" for the first time - it captures the notion that a good product doesn't need advertising. The origin of the saying comes from the centuries-old practice of vintner hanging a sprig of ivy, or other trees, outside the entrance of taverns to indicate they sold the wine. The idea being that a good wine doesn't need to be advertised in order for people to know it is available. (<a href="https://wordhistories.net/2017/12/02/good-wine-needs-no-bush/">source</a>)</li> <li><strong>This Swedish ritual</strong>: It is a cultural institution in Britain to stop work (or chores, or study, or anything) at some point between 1-5pm, to make a cup of tea and have a sit down with some biscuits. In Swedish culture they have <em>Fika</em>, where the focus is on taking a break for coffee and some kind of (ideally home-baked) cake. Socialising with your friends or colleagues, and slowing down are central to this ritual.(<a href="https://www.swedishfood.com/fika">source</a>)</li> <li><strong>This bit of Joe Biden's medial history</strong>: Joe's been attacked for being old, and it's true, when he get inaugurated he'll be 77 and the oldest US president. In 1988 Joe almost died from having two aneurysms, and later the same year he had a pulmonary embolism. That's wild - those are two things (or three) that could really easily kill a man, but here we are, 30 years later.</li> <li><strong>These emojis coming in 2021</strong>: I love emojis, I love that they're tiny cute works of art which represent parts of our culture and society better than words easily can. I love that anybody can submit an emoji proposal. Because of the coronavirus, some emojis have been delayed for 2021, but as things stand we can expect to see bearded men and women, some new faces, and 200 new skin tone combination for couples and kissing emojis. (<a href="https://blog.emojipedia.org/217-new-emojis-in-final-list-for-2021/">source</a>)</li> </ul> <h2>Cool Articles</h2> <ul> <li><a href="https://www.theverge.com/2013/9/3/4660216/is-technology-scrambling-my-babys-brain">Is technology scrambling my baby's brain?</a> by Ben Popper for <em>The Verge</em>. I hear a lot of descent for exposing our children to screens at a young age - Tim Cook, the CEO of Apple famously said that he wouldn't let his child use an iPad. Popper takes a serious look, as both a parent and a tech-lover and -journalist, at our collective obsession with forbidding technology to our children, and asks if maybe we've gone too far. It's a well-balanced article on a subject that I think a lot of people are very touchy about.</li> <li><a href="https://www.jakeworth.com/essays-on-programming-i-think-about-a-lot/">Essays on Programming I Think About a Lot</a> by Jake Worth on their personal blog. If you develop software for a living, or work with teams who do, Worth highlights a lot of one-liners from essays by other software architects and engineers. There's a lot of wisdom in there, and links to the original sources. It's not something I suggest digesting all at once, but better as a slow burn.</li> </ul> <h2>What I've had on Rotation</h2> <ul> <li><strong>Something New</strong>: Positions by Ariana Grande (pop). No, you don't need anyone else talking about or recommending this album, but it's a good album. I love Ari's self-confident, sex positive, self-loving new album. It's a good take. (<a href="https://songwhip.com/ariana-grande/positions2020">links</a>)</li> <li><strong>Something Old</strong>: effloresce by Covet (instrumental). I don't know what genre this music is, it's like jazz meets acoustic guitar meets softer elements of metal rhythms. I don't know - but I do know that Yvette Young (the lead guitarist of Covet) has a talent that you should listen to. (<a href="https://songwhip.com/covet/effloresce">links</a>)</li> </ul>]]></description> </item> <item> <title><![CDATA[Things I learned this week #14]]></title> <link>https://thomaswilson.xyz/blog/2020-11-13-things-i-learned-14</link> <guid>https://thomaswilson.xyz/blog/2020-11-13-things-i-learned-14</guid> <pubDate>Fri, 13 Nov 2020 00:00:00 GMT</pubDate> <description><![CDATA[<p>Happy Friday 13th. I hope it's spooky and magical.</p> <ul> <li><strong>This Roman Beverage</strong>: I'd imagine the Romans were pretty thirsty. The Mediterranean is warm, and you'd work up quite the thirst inventing a whole number system, apartments, a calendar, and like a million kinds of war machinery. Not that I'd know. The Romans bloody loved <em>posca</em>: a mix of vinegar and water (or diluted wine), seasoned with herbs and salt. It was incredibly popular in both the military and with citizenry an. The acidic nature probably helped sanitise the water at the time, but unfortunately we're not 100% sure exactly how it tasted - recipes, ingredients, and proportions having changed some over the last 500-2,000 years. I personally don't love the idea of mixing wine, water, and fennel seeds but maybe that's why I've never built a trebuchet (<a href="https://getpocket.com/explore/item/my-favorite-beverage-is-a-2-000-year-old-energy-drink-from-ancient-rome">source</a>)</li> <li><strong>These hunter women</strong>: Growing up my understanding of our women in prehistoric times was that they gathered and gossiped - which is some of the reason language and social bonds are so ingrained in us as humans, and why caring and communicating are typically seen as 'feminine' traits. A recent study of some 400 bodies from over 100 sites across the Americas, dating 6-12 thousand years in age, repeatedly found women buried with large-game hunting tools. Previously, when we'd found women with these kinds of tools, we just assumed that they were used for scraping or cutting - not hunting. But the study found women buried with projectiles and large stones - so they were either grinding some big root vegetables, or hunting big game. Just a reminder that sexism here and now projects onto things in the past (<a href="https://bigthink.com/sex-relationships/warrior-women">source</a>)</li> <li><strong>This reason they're called Roses</strong>: It's pretty established that Roses, the Cadbury's variety box of chocolates, are <em>the</em> taste of Christmas. Maybe they're not quite a bougie as Celebrations, but at least they're not Quality Streets. If you think Quality Streets are better than Celebrations then you should take a look at yourself and ask why you're so poor at judging chocolates. Anyway, here's the fact: did you know that Roses are called Roses after the name of the machinery which wraps the chocolates? (<a href="https://en.wikipedia.org/wiki/Cadbury_Roses">source</a>)</li> <li><strong>This word</strong>: Milquetoast, which means timid or weak or feeble. The meaning comes from the 1920s cartoon character Caspar Milquetoast. The character's name is based on the American dish Milk Toast - which is toast served in warm milk. So a character was given a name after a dish which represented his weak character, and now we use a gallicised version (we Frenched it up a little) of that dish to describe those characteristics. Isn't language cool?</li> </ul> <h2>What I've had on rotation</h2> <ul> <li><strong>Something New</strong>: Some Kind of Peace by Ólafur Arnalds (Contemporary Classical). I've always found Arnalds' music incredibly peaceful. This new album is pleasantly organic and calming, and doesn't sound exactly like anything he's made before. (<a href="https://songwhip.com/olafur-arnalds/some-kind-of-peace">links</a>)</li> <li><strong>Something Old</strong>: Eagles by Eagles (Rock and Roll). I've been digging into classic rock and roll figures over the past couple of weeks. Eagles are one of my dad's favourite bands, so it feels nice to be among my musical heritage. (<a href="https://songwhip.com/eagles/eagles-2013-remaster">links</a>)</li> </ul> <h2>Cool Reads</h2> <ul> <li><a href="https://99percentinvisible.org/article/labors-of-love-the-hidden-burdens-of-a-romantic-love-padlock-tradition">Labors of Love; The Hidden Burdens of a Romanic "Love Padlock" Tradition</a> by Kurt Kohlstedt for <em>99% Invisible</em>. The first time I ever went to Venice, there was a brigade of men in high-vis jackets cutting the padlocks off some of Venice's famous bridges. This article covers some of the practicalities involved with this phenomena of engraving your name in a padlock, then locking it to public property and throwing away the key.</li> <li><a href="https://www.theguardian.com/lifeandstyle/2020/nov/01/car-free-neighbourhoods-the-unlikely-new-frontline-in-the-culture-wars">Car-free neighbourhoods: the unlikely new frontline in the culture wars</a> by Tim Lewis for <em>The Guardian</em>. As an avid cyclist and London-resident my gut reaction is that we should get rid of all the cars we can. Ban 'em. Burn 'em. We don't need them. I've had a bike totalled and another one run over by cars. Lewis does a good job at introducing the counter arguments to this way of thinking - a reminder that cities are shared spaces, lived in by many</li> </ul>]]></description> </item> <item> <title><![CDATA[Introducing Figma Variants with 5 Components that aren't Buttons]]></title> <link>https://thomaswilson.xyz/blog/2020-11-19-figma-variants-without-buttons</link> <guid>https://thomaswilson.xyz/blog/2020-11-19-figma-variants-without-buttons</guid> <pubDate>Thu, 19 Nov 2020 00:00:00 GMT</pubDate> <description><![CDATA[<p>Figma recently introduced Variants - a way of extending and varying your components. Components in Figma, and in modern web development, are reusable and encapsulated elements of a design - with the classic examples of a Button or a Card.</p> <p>Variants add new flexibility, and utility, to components in Figma by introducing properties and values to them in a programmatic way. If you have experience writing modern web applications, these variants and properties are like a specific subset of props which you pass to a component. I say subset, because some things will still need to be manually edited within an instance of a component - like the text in a card. Other things, like a "variant" or "type" be be edited (e.g. <code>info</code>, <code>danger</code>, or <code>primary</code>) which in turn could switch the accent colour, and the icon used (from an <em>i</em>, to an <em>alert</em>, to a <em>logo</em>). Think about all the common variations of a component you make for different use cases - variants are a way to define those before you come to use them.</p> <p>Variants were released relatively recently, and I think they're cool. While they require more conscious work to create, they make it much easier to compose a mockup or design using an existing design system. Additionally, the need to create a set of names for both your properties, and their possible values, forces you to develop a verbal language around your design.</p> <p>In this piece I'm going to give five examples of where variants have helped me, in the last couple of weeks. I'm not going to use the Button component as an example - because that's a tired workhorse, and I'm definitely a bit sick of it.</p> <h2>Component Examples</h2> <p>Don't bury the lead, here are some components to show how variants in Figma can be used. None of the are Buttons (did I mention that?), but they are all components I've used in the past couple of weeks. Where I didn't make the component myself I've linked out to the original author.</p> <p>I've standardised on <strong>Variant</strong> as a property name for a generic "type", "context", "kind", or "variety" in components. This is the same language as <a href="https://material-ui.com/">Material UI</a> uses to describe this property and variation. I personally don't like to use <code>Type</code> - because it's already a word loaded with meaning in typed language. <code>Context</code> also has a meaning in React. Naming these kinds of properties is hard, but you have to stay consistent.</p> <p>Shoutout to <a href="https://www.uiguideline.com/components">UI Guideline</a> for providing inspiration and starting points.</p> <h3>#1: Toast</h3> <p>Toasts are those little alerts that pop up or down into a screen with a transient messages. Often you want to vary the accent colour, or icon, depending on the context of the message. There's only one property here (<code>Cariant</code>) which controls this accent colour.</p> <ul> <li><code>Variant</code>: success, warning, danger, info</li> </ul> <p><img src="/assets/blog-images/2020-11-18-component-0-toast.png" alt="An illustration of of the toast component"></p> <h3>#2: Note or comment</h3> <p><a href="http://eduard.io">Eduard Giménez</a> released a set of comment components into the Figma Community. The <a href="https://www.figma.com/community/file/905932037239721740">Note This</a> file contains a set of sticky-note-like component which teams can use to annotate their designs in Figma.</p> <p>Eduard has used two properties on his variants: <code>Color</code>, which describes the accent colour of the icon and top of the note, and <code>Dark</code> which is a boolean for if the note should be in a dark mode.</p> <ul> <li><code>Color</code>: Yellow, Peach, Coral, etc.</li> <li><code>Dark</code>: true, false</li> </ul> <p><img src="/assets/blog-images/2020-11-18-component-1-note.png" alt="An illustration of of the note component"></p> <h3>#3: Calendar Day</h3> <p>I've recently been using the <a href="https://eva.design/">Eva Design System</a> as the starting point for a design language. As part of this, I've been working with calendars and date pickers - which have turned out to be a classic example of hidden complexity.</p> <p>Calendar days represent a single day within a week or month view, often used in the date-picker component.</p> <p>Eva broke them down across three properties, each a boolean flag:</p> <ul> <li><code>Selected</code>: true, false. Used to show if the day has been selected by the user (or by default), and is indicated with the box surrounding the day.</li> <li><code>Has events</code>: true, false. Indicates if there are additional details, events, or context on a specific day. Visually this is represented by the small dot underneath the number.</li> <li><code>Disabled</code>: true, false. Let the user know that the day cannot be selected or clicked. Visually greys out the day and reduces contrast between background, border, and content.</li> </ul> <p><img src="/assets/blog-images/2020-11-18-component-3-calendar-day.png" alt="An illustration of of the calendar day component"></p> <h3>#4: Card or Modal</h3> <p>I've been building a number of screens and modals recently (as part of my design work at <a href="https://www.oxwash.com/">Oxwash</a>), and Variants have let me use a common component as the background on each of these instances.</p> <p>The Card component typically represents the background and container for some content, e.g. a product in a product list. A Modal, however, is normally overlaid on the screen, as if it had a higher Z axis value (i.e. it pops out of the screen). Visually they are very similar, but conceptually they are quite different.</p> <p>I found by adding or removing an icon in the top-right (e.g. to close a modal) - both were pretty much identical.</p> <ul> <li><code>Platform</code>: mobile, desktop. Depending on the size of the viewport, you may wish to change padding, but also reduce/increase the size of touch targets.</li> <li><code>With Button</code>: true, false. Place a button in the bottom right of the card, for a primary action.</li> <li><code>With Close Button</code>: true, false. Place an icon in the top right of the card which acts as a touch target to close a modal.</li> </ul> <p><img src="/assets/blog-images/2020-11-18-component-4-card.png" alt="An illustration of of the card or modal component"></p> <h3>#5: Tooltip</h3> <p>I've also been using Tooltips at Oxwash - tooltips are little containers of text that appear on hover (or tap, for mobile) to offer some additional information.</p> <p>Technically, tooltips are quite complex, but in terms of design I've kept them simple, with just a couple of properties:</p> <ul> <li><code>Colour</code>: light, dark. To switch between a global light or dark mode UI.</li> <li><code>Anchor Position</code>: bottom left, bottom right, etc. Which indicates where the little speech bubble anchor appears on the tooltip.</li> </ul> <p><img src="/assets/blog-images/2020-11-18-component-5-tooltip.png" alt="An illustration of of the tooltip component"></p> <h2>Wait, couldn't Figma do that before?</h2> <p>Erm, yeah, sorta? Previously you could use naming conventions of components to help organise related components and then swap them out with siblings/cousins/grandparents. You did this with the naming conventions of the component, e.g. you could organise your three different types of <code>alert</code> component by calling them:</p> <ul> <li><code>alert/warning</code></li> <li><code>alert/info</code></li> <li><code>alert/success</code></li> </ul> <p>This works when you've only got a couple of variations of a component. Specifically it works when your components only vary along one dimension, e.g. the accent colour of the alert. What happens when we have a couple of aspects the component can vary by? What if we want different components for mobile, for dark mode, for actionable alerts (e.g. with a button or link)?</p> <p>All we've got is a single string, so we absolutely have to i) maintain <strong>strict naming conventions</strong> of both the possible values of a property, and ii) <strong>identical order of properties</strong> in those strings. For example, the following components both parse well to a human, but would be structured very differently within figma:</p> <ul> <li><code>alert/mobile/warning/dark/withButton</code></li> <li><code>alert/dark/noButton/warning/mobile</code></li> </ul> <p>This would make it hard to swap components out with the related ones. Figma essentially creates a directory, or folder, -esque structure so these kinds of inconsistencies eventually force you to move around a lot, or do a lot of searching. <strong>This will also make your components less discoverable</strong>, which is essential if you're a design team who shares Figma files to a wider organisation.</p> <p>Also it's just messy. I don't like non-productive mess.</p> <h2>Properties I have found useful</h2> <p>There are a couple of properties I have found myself reaching for, and finding useful - especially when you're trying to work out all the fiddly details in a specific design. These include:</p> <ul> <li><strong>Variant</strong>: Inspired by the material UI naming convention, this covers the possible contexts the component can appear in (<code>info</code>, <code>danger</code>, <code>warning</code>, <code>success</code>).</li> <li><strong>Platform</strong>: If you're designing the same screen across platforms and viewports you may need to adjust touch targets and font sizes (<code>mobile</code>, <code>tablet</code>, <code>desktop</code>)</li> <li><strong>Errored</strong>: If you're dealing with fields, forms, or processes - it's useful to know how we display a failure state and the related info (<code>true</code> or <code>false</code>)</li> <li><strong>Disabled</strong>: Useful if you're trying to show a certain form state is invalid, most commonly applied to Buttons (<code>true</code> or <code>false</code>)</li> <li><strong>Authenticated status</strong>: Who is the current user and what is their relationship to the page/component? Sometimes we want to show/hide certain actions depending on the authentication or authorisation status (<code>user</code>, <code>admin</code>, or <code>no-user</code>)</li> </ul>]]></description> </item> <item> <title><![CDATA[Things I learned this week #15]]></title> <link>https://thomaswilson.xyz/blog/2020-11-20-things-i-learned-15</link> <guid>https://thomaswilson.xyz/blog/2020-11-20-things-i-learned-15</guid> <pubDate>Fri, 20 Nov 2020 00:00:00 GMT</pubDate> <description><![CDATA[<p>"Isn't it getting dark early ?" - how I've started at least half of the conversations I've had this week.</p> <ul> <li><strong>This thing that spreads like a disease</strong>: Look, I was a germaphobe before it was cool. I was very aware of how one thing can spread from person to person. However this contagious model of disease doesn't just apply to problems caused by bacteria/virus/any other vectors. Obesity can spread like disease, where if your friendships mostly comprise of obese people who normalise a sedentary lifestyle, or poor diet, you're nearly about 170% more likely to be obese than if you weren't in these friendships. (<a href="https://www.sciencemag.org/news/2017/02/should-we-treat-obesity-contagious-disease">source</a>)</li> <li><strong>This gossip circle</strong>: In Europe and North America in the 1800s-1900s we used to have a tradition called 'Telling the Bees' where people saw it as incredibly important to keep the bees up to date with what's going on in your little provincial circles. Were there any deaths, marriages, children, etc. Though especially they were seen as a sign of mourning, with some people even bringing bees to a funeral. I'm glad that we've stopped doing that bit, but anything which helps us pay more attention to the wonders of bees is good - they're adorable <em>and</em> useful - how many of us can say that?. (<a href="https://daily.jstor.org/telling-the-bees/">source</a>)</li> <li><strong>This obligatory Covid thing</strong>: I took some time this week to ask why and how Covid actually spreads and how we trace that. Given the criticism of the track-and-trace system here in the UK, I wanted to know more about what they're trying to do, and why it's hard. It turns out the majority of new Covid cases are caused by a minority of people. A study in India found 8% of people with covid cause 60% of the secondary cases, with 70% of people not passing it on to anyone. Since the beginning of the pandemic we've been focused on <em>Super Spreaders</em> and this kind of evidence suggests we should continue to maintain that focus. Well done to the 70% who effectively isolate, let's bump that number up. (<a href="https://vis.sciencemag.org/covid-clusters/">source</a>)</li> <li><strong>These rules for artists</strong>: In 1960s America Sister Corita Kent, a teacher and artist, taught a creative class. She brought these ten rules to the classroom and encouraged students to internalise them. They're not just good for students, or young people - they're wonderful reminders about how to live, and ended up being very popular among artists. They contain little wisdoms we'd all benefit from: "Consider everything an experiment" and "Be happy whenever you can manage it". These rules were later attributed to John Cage, so go and read them and attribute them to Sister Corita Kent. (<a href="https://www.brainpickings.org/2012/08/10/10-rules-for-students-and-teachers-john-cage-corita-kent/?mc_cid=2193b8fd0b&mc_eid=f6fbd62869">source</a>)</li> <li><strong>This old meaning</strong>: Did you know eye rolling was once a flirtatious gesture? Now it's used to express sarcasm or exacerbation, but go back a hundred years or so and all of a sudden you're making bedroom eyes 🙄 (<a href="https://en.wikipedia.org/wiki/Eye-rolling">source</a>)</li> </ul> <h2>What I've had on rotation</h2> <ul> <li><strong>Something New</strong> <em>Detroit 2</em> by Big Sean (Hip Hop). I've been a little late in listening to Big Sean - he got a shoutout from Eminem in <em>Kamikaze</em> - the album where not a lot of other artists got positive attention. This album is packed full of collabs and features - it's a big production hip hop album. It's definitely not my normal kind of Hip Hop but I've been bumping it this week. (<a href="https://songwhip.com/big-sean/detroit-2">links</a>)</li> <li><strong>Something Old</strong>: <em>Angles</em> by Dan le Sac vs. Scroobius Pip (British Hip Hop). This, alongside Em, was one of my first introductions to hip hop/spoken word/poetry in music. It showed me that music can be serious and fun at the same time, that it can be British, and can teach something. Being 16 when this album came out I learned some things from it but, you know, you've not <em>done</em> a lot when you're 16. Re-listening to it now (as a 28 year old) throws me back, but still speaks to me - which speaks to how truthful and personal the music is. (<a href="https://songwhip.com/dan-le-sac-vs-scroobius-pip/angles">links</a>)</li> </ul> <h2>Cool links</h2> <ul> <li><a href="https://www.neilburnell.com/gallery#/mysticalone/">MYSTICAL</a> by Neil Burnell (photo gallery). Burnell is a photographer, and this project is all about the beauty and mystery of ancient woodland.</li> <li><a href="https://theconversation.com/when-christmas-was-cancelled-a-lesson-from-history-149310?utm_source=pocket-newtab-global-en-GB">When Christmas was Cancelled: a lesson from history</a> by Martyn Bennett for The Conversation. With a very different Christmas and New Years on the horizon for a lot of us, which we've got the chance to really mishandle, this article takes a little look at how this might not be entirely unprecedented.</li> <li><a href="https://uicoach.io/">UI Coach</a> by Nero. This neat little site for improving your design skills generates you a challenge (e.g. "Design a goal management and sharing app"), provides you with a colour palette, font pairing, and icon/illustration set. I firmly believe (past the complete novice stage) we learn the nebulous design skills by <em>doing</em>. This is a great idea.</li> </ul>]]></description> </item> <item> <title><![CDATA[Tiny thought: On the separation of design and engineering]]></title> <link>https://thomaswilson.xyz/blog/2020-11-23-on-the-separation-of-design-and-engineering</link> <guid>https://thomaswilson.xyz/blog/2020-11-23-on-the-separation-of-design-and-engineering</guid> <pubDate>Mon, 23 Nov 2020 00:00:00 GMT</pubDate> <description><![CDATA[<p><em>Tiny Thoughts</em> are little (500 word) essays. They're concise.</p> <p>I make user interfaces, and I often participate in, or lead, the process of designing these interfaces. For a while I thought I wanted to transition fully into a design role. Ultimately I am drawn to the certainty and craft of engineering. However, the the mental models, sensibilities, and philosophies of design still appeal to me. I can like both, and businesses need both.</p> <p>Separating design and engineering is a false dichotomy: design can benefit from the implementation-details of engineering; and engineering benefits from the non-linear and multi-faceted process of design thinking. It's symbiotic.</p> <p>A while ago I got the chance to work in an environment where the two <em>were</em> separated. The design process and design thinking were both absent, and there was no appetite to bring them in.</p> <p>During this time the mentality was to copy the UI of an existing, similar, already-successful product. A lot of people on the frontlines of tech have been told "just copy company <em>X</em>" where <em>X</em> is AirBNB, Twitter, LinkedIn, Pinterest, whatever. "Just make the UI look like that".</p> <p>At first glance, the thinking is sound: we don't have the money or time to invest in design, but this other company has. Let the whole design team over at Instagram/Reddit/Uber do the hard work, and we'll just steal from them.</p> <p>At a personal level, I did not like working in this environment, because I felt alone. At a professional level, the working process was constrained, and the resulting software generic and left behind when the source material changed.</p> <p>Some software has to be boring: I wouldn't want a whacky or zany bank app, menstrual cycle tracking app, government app, or crisis support app. There is a place for boring UI. Borings UI also removes a layer of difficulty in how the product is built. [^1: I would argue that it's not actually <em>that</em> much easier to build an app with a Boring UI - UI is just one part of any software.].</p> <p>Behind a lot of boring UIs is a team of individuals who have thought an awful lot about their business, users, and problems. They have considered information architecture, interactions, users, and outcomes.</p> <p>Just because the end result is boring, does not mean the process of designing it was short and simple.</p> <p>When you copy <em>just</em> the final product, even a boring one, you diminish your entire business's ability to iterate, and any insight into the <em>why</em> of the UI are lost. You have limited your engineering team. Sometimes this limitation is significant (a client-facing product), sometimes it is not (an infrastructure service).</p> <p>The product of engineering should not exist without the process of design. The discussions I have had, facilitated, and witnessed when deciding on UIs have made me a better engineer, and have made the product better.</p>]]></description> </item> <item> <title><![CDATA[Things I learned this week #16]]></title> <link>https://thomaswilson.xyz/blog/2020-11-27-things-i-learned-16</link> <guid>https://thomaswilson.xyz/blog/2020-11-27-things-i-learned-16</guid> <pubDate>Fri, 27 Nov 2020 00:00:00 GMT</pubDate> <description><![CDATA[<ul> <li><strong>These Tattoos</strong>: In the late 1880s, a man called Sutherland Macdonald became the UK's first professioanl tattoo artist. Although he was already an artist, he started the tattoo craft after a trip to the South Pacific. Macdonald is the reason we have the word 'tattooist' (a portmanteau of <em>tattoo</em> and <em>artist</em>) - because the Post Office had to create a new category to place an advert for his services in. He also patented an electric tattoo gun in 1895, and created the first 'safe' green ink which did still contain lead so... (<a href="https://mymodernmet.com/sutherland-macdonald-tattoo-history/">source</a>)</li> <li><strong>This unconventional translation</strong>: In 1900, a newspaper in Reykjavik, Iceland, serialised Dracula - the classic horror novel by Bram Stoker. The translation, entitled <em>Powers of Darkness</em>, took some rather strong decisions in the translation. They shortened some parts, adding a deaf-mute handmade to the Count's castle, added some police investigations, completely omitted the fact that the Count drinks the blood of his victims, and removed the original ending by finishing the novel early. So they essentially took Dracula, riffed on it and did a little workshopping (more "yes and"), rewrote the book in another language, gave it the same name and author, and then just presented it like it was the original, just translated (<a href="https://en.wikipedia.org/wiki/Powers_of_Darkness">source</a>)</li> <li><strong>These new bodies</strong>: This week, the details of two new remains of a master and slave were release at Pompeii - the Roman city that was famously wiped out when a volcano erupted nearby in 79AD. The pair consisted of an older (30-40) and a younger (20s) man who had been preserved in ash for the last two thousand years. I'm just going to repeat that once more: two thousand years ago a volcano killed two men, their flesh and muscles were burned away, and then we found their very well preserved bodies in the ash. (<a href="https://www.ancient-origins.net/news-history-archaeology/pompeii-remains-0014574">source</a>)</li> <li><strong>This historical insight</strong>: We know that the nature of religion and spirituality has changed a lot. Way back when we were more hunter-gather, our spiritual views were pretty Shamanistic and Animist: places and things had their own spiritual essence. Then at some point we moved to more mono-, and sometimes, poly-theistic place where we had spiritual entities distinct from worldly places or things. And also we started having Organised Religion. We used to think that this transition happened alongside the move from tribe to central metropolitan areas. It makes sense - if religion is (among other things) a way to teach and enforce morals, it helps to have an "eye in the sky" that sees you if you steal, have sex sex with your neighbour's spouse, or murder. God Is Watching, even if the entire village/town/city is not. However, it actually seems that we evolved as a society and <em>then</em> spiritually. So for a while we had these older religions, as humans moved to larger and more complex settlements and cultures. The link in the source is interesting, go and check it out - it asks what role religion has played, does play, and could play as our socieities become more complex and geographically dispersed. (<a href="https://getpocket.com/explore/item/big-gods-came-after-the-rise-of-civilisations-not-before-finds-study-using-huge-historical-database">source</a>)</li> </ul> <h2>What I've had on rotation</h2> <ul> <li><strong>Something New</strong>: <em>Because I Wanted You To Know</em> by Matilda Mann (Singer Songwriter). These songs are feminine, and cute, and well produced. This little EP is the feeling of seeing someone cute somewhere and the nerves of talking to them, then hoping they actually text you. (<a href="https://songwhip.com/matildamann/because-i-wanted-you-to-know">links</a>)</li> <li><strong>Something Old</strong>: <em>Eyes Open</em> by Snow Patrol (Sad Pop?). This album takes me back so quickly to being 16 - and also makes me very sad to listen to, but also I really like the music? Genuinely I had to stop listening to it a few times this week because it was just making me too sad. But I kept coming back to it, so... (<a href="https://songwhip.com/snow-patrol/eyes-open">links</a>)</li> </ul> <h2>Cool Articles</h2> <ul> <li><a href="https://www.theguardian.com/books/2020/nov/20/jan-morris-historian-travel-writer-and-trans-pioneer-dies-aged-94">Jan Morris, historian, travel writer and trans pioneer, dies aged 94</a> by Richard Lea for <em>The Guardian</em>. I only learned about Jan's life, work, and passing on the radio earlier this week. Jan sounded like a really lively, passionate, and sparkly person. If you've never heard of her either, I'd advise reading a little bit about her amazing escapades, and wondering how amazing it would have been to run into her at a pub.</li> <li><a href="https://www.nytimes.com/2020/08/19/health/resilience-overrated.html">Is Resilience Overrated?</a> by Jami Attenberg for <em>The New York Times</em>. It can feel like we live in a culture which celebrates overwork and exhaustion. Attenberg talks about how "You're so resilient" can be code for "You're on your own, sorry". It's not enough to acknowledge difficulty and admire those who go through it, but instead we should be doing what we can to reduce human suffering - which can, at times, involve us getting our own boots dirty.</li> </ul>]]></description> </item> <item> <title><![CDATA[Things I learned this week #17]]></title> <link>https://thomaswilson.xyz/blog/2020-12-05-things-i-learned-17</link> <guid>https://thomaswilson.xyz/blog/2020-12-05-things-i-learned-17</guid> <pubDate>Sat, 05 Dec 2020 00:00:00 GMT</pubDate> <description><![CDATA[<p>It's time of year again: Spotify have released their <em>Rewind</em> - showing you what you listened to throughout this year. After the <em>year</em> (or decade, or complete non-year, whatever helps you) that 2020 has been, I think a lot of people have looked to music for a bit of refuge, or good news, or distraction. Go and check yours out, it's a cool little use of data, presented in a really nice way. In other news, the UK has approved the Pfizer/BioNTech vaccine, and the first people should receive their doses in the next couple of weeks. Things are starting to look up, we may be over the hump of this.</p> <ul> <li><strong>These Different Ingredients</strong>: I remain a staunch defender of the Brussels Sprout. They're a seasonal, nutritional, deeply flavoured winter ingredient that goes beautifully fried in butter with garlic, baked in roast tins, or as part of any winter curry. They get a bad wrap, but there's a chance that even over the last 5-20 years we've bred our sprouts to have different (e.g. stronger, or less bitter) flavour profiles than we had before. So the sprouts that gave a bad name to their brethren may no longer be around. Go on - give them a go. (<a href="https://www.npr.org/sections/thesalt/2019/10/30/773457637/from-culinary-dud-to-stud-how-dutch-plant-breeders-built-our-brussels-sprouts-bo?t=1606677046048">source</a>)</li> <li><strong>These COVID-affected Amazon Reviews</strong>: One of the symptoms of COVID-19 is a loss of smell and taste. One consequence of this, especially in the US which is handling this pandemic quite badly, is that people can't smell their scented candles. This is causing an increase in low-scored reviews of scented candles on Amazon, with more people mentioning that the candle has no scent. Whereas, in reality, people could be losing their sense of smell but not recognising it as a COVID symptom. (<a href="https://twitter.com/kate_ptrv/status/1332398737604431874">source</a>)</li> <li><strong>These Best Mince Pies</strong>: Over the past couple of years I've become increasingly aware of the competitive, and critically important, world of Mince Pie judging. Mince pies taste of Christmas, and I'm personally a fan of having them hot (though I'll have a cold pie if the mood takes me). The real question we want to answer every year, though, is "which supermarket does the best mince pie?". Well, this year ASDA and Iceland are both leading the charge for both quality and value for money. Avoid Sainsbury's, though - they're not great and overpriced. (<a href="https://www.theguardian.com/lifeandstyle/2020/nov/19/budget-mince-pies-from-asda-and-iceland-top-which-taste-test?utm_source=pocket-newtab-global-en-GB">source</a>)</li> <li><strong>This Cartoon Trivia</strong>: You know how, in Disney's 1991 <em>Beauty and the Beast</em> his castle is oddly full of weird grotesque sculptures? Like, inside <em>and</em> out? Anyway, a lot of those sculptures are actually based off of previous concepts for Beast that the animators and artists created before arriving on how he would actually look. (<a href="https://disney.fandom.com/wiki/Beast%27s_Castle">source</a>)</li> <li><strong>This Origin Story</strong>: Fun fact: snow globes are man-made, they don't just grow in the wild. I mean, I didn't think they grew on trees but I can imagine that someone would. Again, that someone definitely wouldn't be me. Snow globes were invented in Austria in 1900 by Erwin Perzy, a medical repair man who was trying to invent a brighter light, for use in medical settings. He experimented with water-filled bulbs, in the hope that maybe if he filled it was water and a reflective material - more light would be reflected in the operating theatre. What he actually stumbled on was something that resembled snow, and so he gave up all hope of helping the medical profession and started selling gimmicks.</li> </ul> <h2>What I've had on rotation</h2> <ul> <li><strong>Something New</strong>: <em>in Florescence</em> (EP) by half•alive (Indie). This little EP is four orchestrated versions of some of half•alive's previous songs - and it's really great. It's light and magical, the vocals really shine through, and the original tone of the pieces is still there. (<a href="https://songwhip.com/halfalive/in-florescence">links</a>)</li> <li><strong>Something Old</strong>: <em>Yesterday's Gone</em> by Loyle Carner (Hip Hop). I've been really getting into Carner's music over the past couple of months - his unique mix of British and American influence is pleasing to me. He's right on the lyrical, poetic, and melodic end of hip hop, and this whole album strikes as very true to himself and his upbringing. His mum has a track on the album, which is just so great. (<a href="https://songwhip.com/loyle-carner/yesterdays-gone">links</a>)</li> </ul> <h2>Cool articles</h2> <ul> <li><a href="https://getpocket.com/explore/item/why-religion-is-not-going-away-and-science-will-not-destroy-it">Why Religion Is Not Going Away and Science Will Not Destroy It</a> by Peter Harrison for <em>Aeon</em>. This is an interesting piece which looks at how a fanatical belief, in either secularism or religious-ideals, are not conducive to finding a middle ground. Instead they can lead to further conflict and bad-opt</li> <li><a href="https://www.nature.com/articles/d41586-020-03441-8?utm_source=pocket-newtab-global-en-GB">The UK has approved a COVID vaccine — here's what scientists now want to know</a> by Heidi Ledford, David Cyranoski, and Richard Van Noorden for <em>Nature</em>. The past month has been abundant with really great vaccine news for COVID-19. This is a massive step towards getting us closer to our pre-2020 lives. There's a still a lot we're uncertain of with the vaccines, like if people can still transmit the disease if they have been vaccinated; how long do people remain immune for?; or exactly effective are they in certain demographics (primarily age and gender)?</li> </ul>]]></description> </item> <item> <title><![CDATA[Things I learned this week #18]]></title> <link>https://thomaswilson.xyz/blog/2020-12-11-things-i-learned-18</link> <guid>https://thomaswilson.xyz/blog/2020-12-11-things-i-learned-18</guid> <pubDate>Fri, 11 Dec 2020 00:00:00 GMT</pubDate> <description><![CDATA[<p>I took a four day week last week, so managed to spend this week with all the energy that only a 3-day weekend can give you. That said, I've found myself incredibly busy this week. This is the first evening (Thursday) where I've managed to find some time to myself without something pressing. Lockdown continues, Brexit talks and COVID vaccine are competing for media attention, but also I bought two (2!) new types of coffee beans this week sooooo.</p> <ul> <li><strong>This fitness advice</strong>: Now that it's winter (and also a lockdown), I have to make my yearly switch from cycling to running as my primary form of cardio exercise. I've been looking into training advice to make sure that I don't ruin my body in the long term, and I came across the following rules-of-thum: if you run, aim for less than 20 miles a week, run 3-4 times a week, and stay below 8mph (~13km/hr). (<a href="https://www.active.com/health/articles/why-too-much-running-is-bad-for-your-health">source</a>)</li> <li><strong>This cat fact</strong>: Cats purr for a number of reasons, not just when they're happy and content. Some people have made the argument that the kitty vibrations can help heal them, or strengthen their bones. This is perhaps why cats typically seem to be fine with jumping (but never falling, ever) off of high things. They also purr to comfort themselves if they're feeling stressed, which is 10/10 adorable. I can relate strongly to the second of these two purposes, I grew up with an <em>incredibly</em> loud purring cat <em>waaaay</em> before the ASMR trend came to light. (<a href="https://www.wired.com/2015/05/why-do-cats-purr/">source</a>)</li> <li><strong>This Tweet</strong>: "You eat sausages your whole life but you refuse vaccine because you don't know what's in it." It's not really a thing I learned but I love the drama. (<a href="https://twitter.com/julianpopov/status/1329726890307891205?s=12">@julianpopov</a>)</li> <li><strong>This early herbal pioneer</strong>: Elizabeth Blackwell lived in Scotland during the early 18th century. In 1737 she published <em>A Curious Herbal: Containing Five Hundred Cuts of the Most Useful Plants Which Are Now Used in the Practice of Pyysick</em> - perhaps not the most catchy title. But it contained 500-some full-colour paintings of local plants used in medicine, at a time before we had even begun to categorise plants thoroughly. Blackwell produced each of these drawings while taking care of her young child, while her husband was locked up for money he owed his debtors. The images are striking and classically beautiful, but also gave information for each plant's medical use (<a href="https://www.brainpickings.org/2020/01/29/elizabeth-blackwell-curious-herbal/?mc_cid=32daffc59e&mc_eid=f6fbd62869">source</a>)</li> <li><strong>This bardic AI</strong>: Deep-speare is an AI trained to write sonnets, <em>a la</em> actual Shakespeare. The researchers fed a deep-learning algorithm nearly 3,000 sonnets and then asked it to write its own. Unsurprisingly, the algorithm was able to spot (and reproduce) the structural patterns in a sonnet (14 lines, the rhyming patterns), but it was also able to pick up on the syntactic and language itself: posing problems, comparisons to nature, the rhythm of writing. Take the following example of a quatrain (four-line section): <em>shall i behold him in his cloudy state; for just but tempteth me to stop and pray; a cry: if it will drag me, find no way; from pardon to him, who will stand and wait</em>. It's oddly poetic but maybe a little abstract. This all came before the more recent GPT-3, which has produced consistent, intelligible, long-form writing in the past few months. (<a href="https://spectrum.ieee.org/artificial-intelligence/machine-learning/this-ai-poet-mastered-rhythm-rhyme-and-natural-language-to-write-like-shakespeare">source</a>)</li> </ul> <h2>What I've had on Rotation</h2> <ul> <li><strong>Something New</strong> <em>Something to Feel Good About</em> by Will Joseph Cook (Pop, 2020). Spotify decided to pass this album to me last week and it's cute. It's very cute. (<a href="https://songwhip.com/will-joseph-cook/something-to-feel-good-about">links</a>)</li> <li><strong>Something Old</strong>: <em>Backbone</em> by Roam (Pop Punk, 2016). I remember this album coming out and playing it (responsibly) loud on the speakers in my car as I was driving around. It's got great teenage summer energy. (<a href="https://songwhip.com/roam2/backbone">links</a>)</li> </ul> <h2>Cool Articles</h2> <ul> <li><a href="https://www.theatlantic.com/family/archive/2020/11/covid-19-pandemic-births-baby-bust/617149/?utm_source=pocket-newtab-global-en-GB">Here comes the COVID-19 Baby Bust</a>. COVID-19's had a couple of effects on family life, with a lot of couples making big decisions about marriage/divorce and children/no-children. This piece takes a look at the likely dip in birth of (American) babies, and how we might expect to see that self-correct over the next couple of years.</li> <li><a href="https://99percentinvisible.org/article/real-talk-behind-the-music-with-99pi-composer-sean-real-on-her-new-album/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+99pi+%2899%25+Invisible%29">Real Talk: Behind the Music with 99pi Composer Seal Real & Her New Album</a>. If you don't listen to the <em>99 Percent Invisible</em> podcast, you should. If you do, then you probably know how beautiful the soundtrack is, and how well it fits the story and pacing of the piece. This piece shines a light on Sean Real, 99PI's composer, and their process of creating, and recently releasing, music.</li> </ul>]]></description> </item> <item> <title><![CDATA[Things I learned this week #19]]></title> <link>https://thomaswilson.xyz/blog/2020-12-18-things-i-learned-19</link> <guid>https://thomaswilson.xyz/blog/2020-12-18-things-i-learned-19</guid> <pubDate>Fri, 18 Dec 2020 00:00:00 GMT</pubDate> <description><![CDATA[<ul> <li><strong>All of these species named after David Attenborough</strong>: The man's a living legend (he's also like 94 - he was a teenager in the 1930s which was <em>before the second world war</em> - this isn't the fact by the way, this is just some incredible side-facts). The collective scientific community has named over 20 species of animals and plants after him, including <em>Attenborosaurus</em> - the marine dinosaur, <em>Pristimantis attenborough</em> - a Peruvian frog, and <em>Acisoma attenboroughi</em> - a dragonfly. (<a href="https://www.atlasobscura.com/articles/heres-every-living-or-extinct-creature-named-after-david-attenborough">source</a>)</li> <li><strong>This naval rule</strong>: I recently came into some <em>Navy Strength</em> gin (60% lol), and I wondered why something would be called Navy Strength. It turns out that The Royal Navy used to require a certain amount of gin on board, to give out in rations to their sailors. This went on until the mid 20th century, by the way. To make sure that the gin was strong enough, they used to burn it to make sure it had a high enough (and pure enough) alcohol content. (<a href="https://www.craft56.co.uk/blog/post/what-is-navy-strength-gin/">source</a>)</li> <li><strong>These tiny drivers</strong>: In a study to look at how an enriched environment can improve the ability of rats to learn and acquire new skills, some researchers at the University of Richmond TAUGHT SOME RATS TO DRIVE. Yes, they built tiny little cars for them, and encouraged them to drive towards treats. Yes, that's right, these tiny bastards got to drive adorable tiny cars <em>and</em> got treats. Ugh, what a life they're living. Unsurprisingly, the researchers found that rats who lived in a more social and enriched environment learned to drive much quicker than those kept in smaller numbers in bare cages. Check out the video in the linked article to watch tiny animals drive tiny cars. (<a href="https://arstechnica.com/science/2019/11/these-rats-learned-to-drive-tiny-cars-for-science/">source</a>)</li> <li><strong>This early cultivated food</strong>: I thought that the first crops we started cultivating and harvesting, about 10,000 years ago, were grains/grasses like wheat. However, maybe 1,000-1,500 years before that we were selectively breeding and harvesting figs, so they may have been one of the first plants humans looked at and thought: "That's delicious, and I bet I can improve that". (<a href="https://science.sciencemag.org/content/312/5778/1292.1">source</a>)</li> <li><strong>This way that we actually learn programming</strong>: A lot of people who do software engineering have drawn parallels learning a programming language and human languages, maths, and music. I've always been a little skeptical of these analogies - the foundations of recognising rules and patterns aren't unique to software engineering, they're generic problem solving skills, and language acquisition is like... a whole thing. Recently, some people at MIT took some programmers, put them in an FMRI machine and showed them snippets of code and asked them to predict the output of the code, in order to examine which parts of their brains were involved in the processing of the information. The study found that parsing the code activated the <em>multiple demand network</em> - a cross-cortex region of the brain involved in many processes, and not specialised especially to language or mathematics. As a result, learning code isn't <em>exactly</em> like learning maths or a language, and while we can maybe draw generalities in the way we teach it, we shouldn't be dogmatic about it. (<a href="https://news.mit.edu/2020/brain-reading-computer-code-1215">source</a>)</li> </ul> <h2>What I've had on Rotation</h2> <ul> <li><strong>Something New</strong>: <em>evermore</em> by Taylor Swift (Singer Songwriter). Taylor dropped her second album of 2020 last week, which is good. Law of averages says that we have to have something good come from this year. This is a sister album to <em>folklore</em>, which she dropped over summer. The production quality, lyricism, and collaboration on this albums bring it true to her country/folk roots - it's earnest and true, but knows when to be tongue in cheek or when to crack a wry smile. While nothing will ever replace <em>Red</em> in my heart, <em>evermore</em> is genuinely a fantastic album that surprised me with how much I loved it. (<a href="https://songwhip.com/taylor-swift/evermore">links</a>)</li> <li><strong>Something Old</strong>: <em>Cole World: The Sideline Story</em> by J. Cole (Hip Hop, 2011). Y'all know I love hip hop, and when your favourite rappers call out J. Cole as one of their favourites, you know he's worth a listen. I've been diving deep into his older, early albums this year. <em>Cole World</em> has jazz keys, samples, and lyrical hooks everywhere, but it also starts to bring in some of the more electronic/synth elements that are more familiar to modern Cole and hip hop in general. I can see entirely why he's rated by other rappers: he's good, he's sharp, and he's versatile. (<a href="https://songwhip.com/j-cole/cole-world-the-sideline-story">links</a>)</li> </ul> <h2>Cool Articles</h2> <ul> <li><a href="https://www.theatlantic.com/family/archive/2020/05/new-relationships-coronavirus-pandemic/612352/">The New Relationships That Fizzled Out in Quarantine</a> by Ashley Fetters for <em>The Atlantic</em>. The COVID-19 pandemic has been a wild, wild time for anyone single and dating. My experience as a young metropolitan who, pre-pandemic, was in the dating scene is that a lot of people would go on a lot of dates with a lot of other people. A lot of the guidelines and laws around social distancing seem to ignore anyone who's not cohabiting with their partner, and I've seen and heard of people feeling as though they've completely lost a year of their dating life. People in pre-existing relationships have had to go through a whole other set of problems. As someone rapidly approaching 30, this isn't necessarily a year in dating that I feel I could lose easily. I think this situation is going to bring about a very particular set of personal and romantic issues in the next 24 months as people re-start dating. Fetters does a great job of bringing some case studies to light around this, from earlier in the pandemic, as dating changed suddenly and rapidly.</li> <li><a href="https://aeon.co/essays/how-empathy-and-creativity-can-re-humanise-videoconferencing?utm_source=pocket-newtab-global-en-GB">Zoom and Gloom</a> by Nigel Warburton for <em>Aeon</em>. I've heard a lot of people declaring how 2020 has shown all of us how unnecessary the office is, or conversely how completely irreplaceable the office is. At the same time, we're learning how the tools we have in place for remote work are largely inadequate. Something has to give here. In this piece, Warburton looks at the need to design tools which place human empathy above all else, especially in a time where we've suddenly pushed pretty much all video-conferencing tools to their natural limits. This is a great reminder that things don't have to be the way they are, and that, although I think we need a blend of online and in-person work time, we shouldn't write off either type of experience given what we've all gone through this year.</li> </ul>]]></description> </item> <item> <title><![CDATA[How are we going to write about 2020 from 2022 onwards?]]></title> <link>https://thomaswilson.xyz/blog/2020-12-20-how-are-we-going-to-write-about-2020</link> <guid>https://thomaswilson.xyz/blog/2020-12-20-how-are-we-going-to-write-about-2020</guid> <pubDate>Sun, 20 Dec 2020 00:00:00 GMT</pubDate> <description><![CDATA[<p>2020 has been a terrible year in so, so many ways for so, so many people. At the very least, the Covid-19 pandemic has stolen a year from us all. I would say most of us have gone through a personal and collective trauma this year.</p> <p>I do not believe this year will be a turning point for us as a society. I don't think this will be the moment people stopped flying transatlantic for a 2pm lunch meeting in LA. In 2025 people in offices are going to be just as much a victim of presenteeism as they are now. We're not going to value our independent artists or our local pubs any more, we're going to frequent franchises and chains. We're not going to pay healthcare staff more and politicians less. We're not going to have a meritocracy in government and purely data-led policy. We're not going to learn all the lessons we need to learn to stop anything like this from ever happening again - because our collective memory is short, and because our minds are excellent at rationalising our actions to ourselves.</p> <p>I do believe that this is going to be a cornerstone in the life of everyone over the age of 14. This will be a comparison point for every freedom of movement we make, even if it's a fleeting memory as we board a plane or check into a hotel in 2050. We will remember the impact of distance in our relationships, and recognise the luxury of being inattentive to them. We will justify ordering aperitifs and dessert at restaurants. We will remember not being able to leave the house before we bid on a house with barely a fist full of dirt, or which is distant form our loved ones. We will consider it as we walk home, head-fizzy-drunk, from a friend's dinner party. The muscle memory in our hands and fingers will surface countless washings after getting home from any shop.</p> <p>As individuals we are going to remember this year, and a culture we are going to try and move on from it.</p> <p>How are we going to write about, and talk about this year in 2022?</p> <p>Other than the inevitable trend of clinical and popular postmortems and retrospectives; of memoir from political and healthcare staff; in coded language from press-releases (<em>due to the global health situation</em>) - how do we relay what this year is and has been? Are we going to want to pretend it never happened, or will it crop up in books, plays, music, movies, or series? Will it be examined, blamed or credited, or will it become kind of harmless shorthand which takes the sting out of the year?</p> <p>What are the analogies and comparisons you can draw on to explain this year? I have never experienced anything so physically and mentally stifling. There is no analogy for the drawn out uncertainty, the frustration, and the limited personal freedom, the conjuring of temporary hope and imagined futures almost solely to get us through a now which extends certainly backwards and hazily forwards.</p> <p>I think I'm leaving the year stronger than I came into it, but there was a real dip in the middle there where things could have gone either way. Despite being better off, there is space left in my life from the friends and family I haven't seen in a year, by the art I haven't witnessed, the meals I haven't eaten, the texts I haven't artfully crafted or "accidentally" ignored, the wine I haven't drunk, the music I haven't heard crammed into tiny spaces with bustling strangers and distorted speakers, the sunsets I haven't seen, the taxis I didn't take, the impulse purchases I didn't make, the hands I didn't shake and the embraces I missed.</p> <p>If you're lucky, the horrific scenes of crammed hospitals, overflowing wards, and people dying alone were fed to us through the screen or told to us by others. If we are not, we have lived them, or love someone who has lived them.</p> <p>I have lost no one I know and I have managed to find and maintain fulfilling employment. I have been lucky, but I mourn the passing of this year from my life in a way that I don't know how to vocalise. I do not think I have regressed as a whole, but parts of my life have.</p> <p>Doesn't every mental struggle feel like this, though? As though it could not be pinned down and showcased in words? In my experience, the feeling of being <em>in</em> a storm and then describing it afterwards are two very different skills. Once you're far enough way from something you can see the shape of it, its limits and reaches, with more clarity.</p> <p>I can't do that for 2020 yet. I can't write a eulogy for this year which I desperately want buried and refunded. I am too close, and the loss feels too fresh and not yet finished - it is December 2020 as I write this and I know more will be taken from me, and more still demanded.</p> <p>How long will it take for us to feel finally, firmly, like we can judge our vantage point far away enough to have some kind of valid, or at least semi-unused, criticism? Something other than a reaction.</p> <p>I feel as though maybe in the last two or three weeks we have broken the back of the Covid pandemic. With three vaccines approaching, or already reaching, approval.</p> <p>But perhaps the thing I have had to learn, and have seen us all trying to learn, over and again from this year is how little we can grasp time, or how poor we are at understanding and processing problems of this scale. That's not to speak of the people who make no allowance for the collective good, only for hedonistic and short-term impulses.</p> <p>How often we have been six weeks away form this all being over? How the creation, approval, distribution, administration of a vaccine will solve anything - when in truth each is a herculean effort of knowledge, logistics, and finances. The world is going to have to produce billions of doses of vaccines. Billions. Each of which as to get into a person's bloodstream, and administered during a pandemic.</p> <p>This year has felt entirely like waiting just that little bit longer. Like hanging on until the daily deaths and cases get below a set limit. Like things aren't good now, but we'll accept it because they <em>will</em> be.</p> <p>How are we going to write about that feeling and that uncertainty? How can words do justice to successive realisations that both the problem and the solutions are so much more complicated than anyone was saying - because nobody wanted to be the one to say them, to reduce the substance of our hopes.</p> <p>This has been a year of loss and trauma. We don't understand the full limit of either of those things, and how are we going to talk about it afterwards? Because there will be an afterwards.</p> <p>How long will it take for these things to seep into our cultural and personal narratives? And how will we, in the future, draw from them? Will they become like war poems we read once a year, and become synonymous with charities and remembrance services? Or will they become briefly loved and adopted as a way for us to make sense, or something good, from all this?</p> <p>I am very interested in how future us will write about this once it's passed.</p>]]></description> </item> <item> <title><![CDATA[Things I learned this week #20]]></title> <link>https://thomaswilson.xyz/blog/2020-12-27-things-i-learned-20</link> <guid>https://thomaswilson.xyz/blog/2020-12-27-things-i-learned-20</guid> <pubDate>Sun, 27 Dec 2020 00:00:00 GMT</pubDate> <description><![CDATA[<p>This week's post comes a little lighter, on account of it being Christmas and all. I didn't want to break a streak, but also I want to get back to eating far too much and doing far too little. So let's get on with it:</p> <ul> <li><strong>This etymology</strong>: The word <em>apocalypse</em> comes from the Greek <em>apokaluptein</em>: to uncover, or reveal. This original meaning got adopted in bible translations in the context of <em>revelations</em> - which makes sense. Something have been revealed or uncovered. However, most of the revelations in the bible aren't... great news? So it started taking on a more negative, destructive tone. (<a href="https://www.etymologynerd.com/blog/apocalypse-now">source</a>)</li> <li><strong>These first festive TV advert</strong>: Having a heart-warming, mini-movie of a Christmas advert has become a staple in the past decade. My personal favourite is the animated woodland scene and accompanying Lily Allen soundtrack for <a href="https://www.youtube.com/watch?v=mer6X7nOY_o">John Lewis is 2013</a>. One of the pioneers of the British TV Christmas advert was OXO, the famous broth/gravy company, <a href="https://www.youtube.com/watch?v=EQXxbW7qYFQ">here's their 1984 advert</a>, in which our child protagonist tells of her "most wonderful Christmas ever". From across the pond, Coca Cola's 1995 <em>Holidays are Coming</em> <a href="https://www.youtube.com/watch?v=X13N-Bx17Oc">TV Ad</a> has now reached meme status, becoming synonymous with the festive season itself. From 2007, John Lewis started a trend of high production, narrative-driven adverts which I'm honestly really glad we have. (<a href="https://www.anthonygregg.com/insights/a-short-history-of-the-british-tv-christmas-advert/">source</a>)</li> <li><strong>This most popular nut</strong>: What do you think the most popular nut of Victorian England was? My gut reaction was peanut, all the other nuts seem a little too fancy or exotic for wide consumption. However it turns out that chestnuts were the most popular nut in Victorian England. So there's a nice bit of trivia for you, and also it's roughly festive themed. (<a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2442131/">source</a>)</li> <li><strong>This science of snowballs</strong>: You know how some snow makes excellent, compact snowballs which are perfect for throwing, but some is either a fine powder or ice which can't be thrown for love or money? It turns out that the underlying physics behind snowballs relies on the pressure of you compacting the snow together, with your delightfully mitten'd hands, allowing some of the snow inside the snowball to melt back to liquid water. Then when you stop compacting the snow, the lower pressure forces the water to refreeze into ice, and it acts like a cement or a glue to hold all the snow together. When it's too cold (and powdery snow), the pressure from your hands isn't enough to melt the snow, and if it's too warm then the. (<a href="https://www.wonkmagazine.co.uk/physics-of-snowballs">source</a>)</li> </ul>]]></description> </item> <item> <title><![CDATA[Things I learned this week #21]]></title> <link>https://thomaswilson.xyz/blog/2021-01-01-things-i-learned-21</link> <guid>https://thomaswilson.xyz/blog/2021-01-01-things-i-learned-21</guid> <pubDate>Fri, 01 Jan 2021 00:00:00 GMT</pubDate> <description><![CDATA[<p>Happy New Year 🎊🥳🾠It's been one hell of a ride, 2020, and I hope that I never know another year like you. This has been quite enough. We're at least six months from being slightly out of the woods, but we've made it through nine-to-twelve (depending on where you live) months of surprise pandemic. We can make it through another six. I don't care that 365 days or a rotation around the sun is arbitrary. Money is arbitrary and so is language and art - let it be arbitrary but celebrate. I hope your festivities were socially responsible, and served you. I hope your 2021 is better, and I hope we see in 2022 surrounded by people, live music, fireworks, champagne, and a general hustle and bustle.</p> <ul> <li><strong>These good boys</strong>: Across the world, several dog trainers and medical researchers have been trying to train sniffer dogs to identify people who are positive for Covid-19. One of the big problems with this disease is asymptomatic carriers who may unwillingly infect others without knowing. Having dogs who can sniff-out people who may be positive, especially in high-touch areas like airports or event venues, is a great tool. It's also pretty cool that a) there's a reliable Covid-19 smell, and b) dogs can identify it. This research is still in the early stages, but it's arguably looking promising, even if we're not quite sure <em>what</em> the dogs are sniffing out, exactly. (<a href="https://www.nature.com/articles/d41586-020-03149-9">source</a>)</li> <li><strong>This version of the English Language</strong>: E Prime is a version of language without the verb <em>to be</em>. Proposed by D. David Bourland, Jr. in 1965, Bourland believed that people rely too much on <em>to be</em> in English writing and that it weakens the impact or strength of a statement, or distracts the reader from the subject. The infamous non-apology "mistakes were made", for example, would simply not do. It was also an attempt to stop us comparing things that aren't comparable - for example can a candle <em>be</em> burning, or does the candle burn? Look, it's wild idea that would never take off, but it's a nice smell to look for in your writing. Try and be more conscious when you're writing things (<a href="https://simple.wikipedia.org/wiki/E_Prime">source</a>)</li> <li><strong>This Railway Dog</strong>: In late 1800s, Bob the Railway Dog, was adopted by the South Australian railway community at large. Conductors would let him hop up into the front of a train, where he would travel thousands of miles around the country. This lifestyle was a little dangerous for a small dog (as it would be for any human) and during this time he fell off trains, had his coat catch fire, and almost got caught under several moving carriages. (<a href="https://en.wikipedia.org/wiki/Bob_the_Railway_Dog">source</a>)</li> <li><strong>These letters from Santa</strong>: For twenty three years, up until 1943, JRR Tolkien wrote <em>Letters from Father Christmas</em> to his children. The letters feature a broad cast of characters, including his elf (naturally) secretary, and Polar Bear, a polar bear (naturally), who just keeps getting into mischief. The letters have Father Christmas chronicling some of his (mis)adventures around the North Pole. (<a href="https://en.wikipedia.org/wiki/The_Father_Christmas_Letters">source</a>)</li> </ul> <h2>What I've had on rotation</h2> <ul> <li><strong>Something New</strong>: <em>Be Slow</em> by Harrison Storm (EP, acoustic singer-songwriter). The last week of a year always feels like a little bit of a blur. In 2020, the preceding nine months have also felt a little slippery. Storm's five song EP contains the right mix of chilled and comforting songs for this time of year. (<a href="https://songwhip.com/harrison-storm/be-slow">links</a>)</li> <li><strong>Something Old</strong>: <em>Sign No More</em> by Mumford and Sons (Folk). This album is very good, though maybe a little overplayed in the early 2010s. Some distance has done it wonders, as has nine months apart from rowdy crowds. The lovely harmonies and chaotic instrumentals are delightfully timeless. Would recommend a re-listen. (<a href="https://songwhip.com/mumford-and-sons/sighnomore">links</a>)</li> </ul> <h2>Cool reads</h2> <ul> <li><a href="https://www.brainpickings.org/2020/04/16/mary-shelley-the-last-man">Seasons in a Pandemic: Mary Shelley on What Makes Life Worth Living and Nature's Beauty as a Lifeline to Regaining Sanity</a> by Maria Popova for <em>Brain Pickings</em>. A beautiful little tribute to Mary Shelly' semi-autobiographical <em>The Last Man</em>, a novel about a pandemic which one-by-one kills of humanity. Covid references aside, Popova lays out some of Shelly's personal traumas that lead her to write this book, and quotes some of Shelly's writing about the reassuring rhythm of nature's seasons. If you like well written and researched newsletters, you'll bloody love Brain Pickings, you can sign up for it <a href="https://www.brainpickings.org/">here</a>.</li> </ul> <h2>Fun things</h2> <ul> <li><a href="https://2020-ipsum.com/">2020 Ipsum</a>. You've heard of Lorem Ipsum, the placeholder Latin-looking text that you use as dummy text in design? This is that, but instead of Latin-esque words, it's 2020 buzzwords that are kind of like a stream of consciousness from a... year.</li> </ul>]]></description> </item> <item> <title><![CDATA[2021 Theme: The Year of Discourse]]></title> <link>https://thomaswilson.xyz/blog/2021-01-02-yearly-theme-2021</link> <guid>https://thomaswilson.xyz/blog/2021-01-02-yearly-theme-2021</guid> <pubDate>Sat, 02 Jan 2021 00:00:00 GMT</pubDate> <description><![CDATA[<p>Resolutions are dumb. They're unsustainable and you can fail at them. Humans are just awful at long-term behaviour or thought-pattern change. Instead, I like themes: broad ideas that only try to guide you, not dictate. They're not a single <em>thing</em>, they're like a north star, or a prompt for conversation and reflection when you pause for it. CGP Grey <a href="https://www.youtube.com/watch?v=NVGuFdX5guE">condensed his thoughts</a> on them into a neat little six-minute video. If you're more into it, or like podcasts, <a href="https://www.relay.fm/cortex/110">here's</a> an episode of Cortex to listen to.</p> <h2>A brief eulogy for 2020</h2> <p>Coming into 2020 I was hopeful. It was going to be the <em>Year of Making Space</em>, where I was going to trim away as many of the routines and commitments I had put myself in, to see what would happen. To see where my brain would go with this new time and opportunity.</p> <p>I had handed in my notice at a job I liked but didn't love any more, I was going to go freelance for a little while, and I was going to use this as a chance to find the things that I loved. I was in a contemporary dance company and we were actively producing a piece to be performed in May. I had the entire of February off, for a proper rest. I was maybe thinking about planning another long-distance cycle tour, after getting (most of the way) across France last year.</p> <p>I'll save the quips and the suspense - none of those things happened.</p> <h3>2020 pt.2: Year of Survival</h3> <p>Between March and April of 2020 there was a bloodbath. It's a vivid and morbid word to use. People were dying, and we were all scared. Large parts of the economy went into free-fall. Budgets were cut, people let go, customers canceled orders and subscriptions. Nothing felt safe or exempt. It was every person and every company trying to figure out how, or if, they could survive for the next one-to-six months. It was a bloodbath.</p> <p>It was a bad time to be the newest freelancer on a team. I don't want to talk about the specifics of the lessons I learned during this time, but I would summarise them as "good to know, but over-priced".</p> <p>My burning mental image from this year is one of trying very hard to keep my head above the water. It turned into the <em>Year of Survival</em>. I had to draw a card then play it immediately, and I'm grateful that I made it through.</p> <p>Things eventually worked out, as they are want to do. I found employment at a company with a great team and vision, I moved house, I got a haircut, I did a lot of Zoom Happy Hours, made bread, and I neglected some plants until they died. Pretty standard 2020 things. Now, it means I can come into 2021 with a few more liquid assets in my attention economy.</p> <h2>2021: Year of Discourse</h2> <p>I have decided that 2021 is the <em>Year of Discourse</em>. I am currently thinking about this in two parts:</p> <ol> <li>How do I present and communicate?</li> <li>What do I do with ideas presented by others?</li> </ol> <p>I would like to consider how I present myself, my work, hobbies, thoughts, ideas, affections... I would like to think about how the things I feel and know on the inside are shown on the outside.</p> <p>I want to balance this focus on self with a focus on others. While I don't feel I have ever struggled with accepting or facilitating feedback or information, I want to focus more on <em>doing something</em> with that it.</p> <p>I initially started with the <em>Year of Presentation</em>, which focused only on the first of these points, but the idea didn't fit. It felt too selfish. It also sounded a little synonymous with the <em>Year of PowerPoint & Keynote</em>, which I'm not ruling out.<sup><a href="#user-content-fn-1" id="user-content-fnref-1" data-footnote-ref aria-describedby="footnote-label">1</a></sup></p> <h3>Why ?</h3> <p>During this summer I was interviewing for new jobs. I ended up getting the one I really wanted, but one of the other companies rejected me on the basis that I did not have good self-knowledge or self-awareness.</p> <p>I was surprised by this feedback. I think it's the first time someone's levelled that criticism. In fact I've often heard the opposite: too self-critical and under confident. I try to keep a good tab on my shortcomings and this isn't one of them. I spoke this through with a few close friends and they agreed that it seemed a little out of character. Despite this, a group of people I did not know met me, interacted with me, and together agreed that this was appropriate feedback, so I do not want to dismiss it.</p> <p>They met the professional version of myself, who is wholly more confident and opinionated than my actual self. For the sides of my personality which I showcased, their feedback was probably accurate. I can't let my ego stop me from hearing valid criticism. I don't want to dismiss this feedback by justifying it or explaining it away - because that isn't going to lead to meaningful change.</p> <p>This is what gave me the initial idea for thinking about presentation and interactions, i.e. <em>Discourse</em>.</p> <h3>Cynical Everything (â„¢ï¸)</h3> <p>I am worried this could be the moment in my career where I turn into the Cynical Developer (â„¢ï¸). That person on the team who hates everything they don't like (or know). Who's not open to change or different ways of doing things, and who only has one moral framework (their own).</p> <p>I don't want my opinion to become inflexible, and I don't want that reputation. Nor do I want this to be the precedent that I set myself on the pathway to mastery of something. I don't want to be a Cynical Anything: cook, fitness person, artist, creative, friend, whatever.</p> <p>I want to remain open-minded and engaging, and obviously in love with the things I chose to do with my time. And if I don't love it, or care about it - don't hold opinions about it too tightly. Let parts of it go. The <em>Year of Discourse</em> is about opening that journey up, to share it and show it in an inviting and collaborative way.</p> <h2>Season #1: Winter 2021</h2> <p>I bloody love seasons. I fell in love first by eating with them, and then the Covid-19 pandemic made me fall in love with simply watching them. Time passes, the rhythms flow, and everything has its time.</p> <p>I want to spend the Winter of <em>The Year of Discourse</em> working on the implicit beliefs I have: recognising them and putting them into words. I'm hoping this will help me realise how differently I could be doing things, and potentially some of the things which are guiding my actions or decisions. I'm also hoping it will let me cut away anything which is holding me back.</p> <p>Some of this is going to look like writing, which could be public or private, professional presentations, and conversations with friends. I think the process of discovering these things and then refining them is the valuable part of the work. I do not think the product will have much value for others. I don't want to rush through everything with the intention of producing something sharable, or wrap-up-able.</p> <p>Hopefully I'll keep you updated 🤷â€â™€ï¸</p> <section data-footnotes class="footnotes"><sup class="sr-only" id="footnote-label">notes</sup> <ol> <li id="user-content-fn-1"> <p>Shoutout to <a href="https://prezi.com">Prezi</a>, who I'm surprised to learn have adapted pretty well to the death of Flash. <a href="#user-content-fnref-1" data-footnote-backref="" aria-label="Back to reference 1" class="data-footnote-backref">↩</a></p> </li> </ol> </section>]]></description> </item> <item> <title><![CDATA[Things I learned this week #22]]></title> <link>https://thomaswilson.xyz/blog/2021-01-09-things-i-learned-22</link> <guid>https://thomaswilson.xyz/blog/2021-01-09-things-i-learned-22</guid> <pubDate>Sat, 09 Jan 2021 00:00:00 GMT</pubDate> <description><![CDATA[<p>This week the UK Government has brought us <em>Lockdown The Third</em>, a threequel in the franchise after the straight-to-TV movie that was the November lockdown. Cases, deaths, and hospital admissions are at an all-time high in our country at the moment, with London in particular looking pretty scary. It might be the "the last push" like this (boy, I really hope it is the last push), but that doesn't help the healthcare workers being forced forward/backwards/downwards by this whole situation. So for goodness sake, just stay inside. Call out people who are making selfish choices. We're all making decisions for everyone else around us, it really is that simple. Arrange FaceTime calls, yoga sessions, happy hours, online games, book clubs, Netflix watch parties, and craft dates with people. Life isn't going to be normal for a while, but we're going to get through this together and then one day get irresponsibly drunk as we sit in or outside a pub until closing time with the people we love, and think about what life looks like now. Until then just... learn to crochet or cook or something.</p> <ul> <li><strong>This cat</strong>: Mike the Cat guarded the British Museum, who was "probably the most famed British feline of the 20th Century". Which seems like a narrow competition, but look, I don't want to detract from Mike's notoriety. After a decade's service, he passed away in 1929, and officials at the museum placed a memorial stone near the Great Russell Street entrance of the museum. (<a href="https://en.wikipedia.org/wiki/Mike_%28cat%29">source</a>)</li> <li><strong>This not-fireworks display</strong>: At Mariana Bay, Singapore, officials organised a light show performed (which feels like the wrong word) by five hundred drones. Just watch the video, it's mesmerising to watch them twinkle, form into animals, or just geometric patterns. (<a href="https://www.youtube.com/watch?v=r7Ul_EmHiJM">YouTube video</a>)</li> <li><strong>This over-qualified actor</strong>: Y'all have seen <em>Stranger Things</em>, right? The Netflix original 80's horror show which lives in my heart forever because I watched it during my Ph.D. with my housemate and like a whole bunch of popcorn. Mate, honestly it's so good. Anyway, there's this iconic scene right at the end of the third season where the world is about to end, and some of the characters are driving their iconic 80s car away from a world-consuming monster. The Duffer brothers took nearly three minutes of screen-time during this climax for an over-the HAM radio <a href="https://www.youtube.com/watch?v=6EiRjwjp30I">rendition</a> of the title theme from <em>The Never-Ending Story</em>. It's baffling and I'm amazed it got approval. Susie, the long-distance (previously almost certainly fictitious) girlfriend is played by Gabriella Pizzolo, played the title role in Matilda on Broadway in 2013. Pizzolo gets less than a minute's screen time but she rocks it. Bonus fun fact: the composers for the show (Kyle Dixon and Michael Stein), who produced the iconic synth-heavy score and title theme music weren't even told about this musical number until they turned to set one day. (<a href="https://www.hollywoodreporter.com/live-feed/stranger-things-season-3-finale-neverending-story-song-explained-1222689">source</a>)</li> <li><strong>This other Ancient Egyptian Script</strong>: We all know that ancient Egyptians wrote in hieroglyphs: the pictorial script of birds, plants, and other symbols which were ubiquitous in their crypts and monuments. However, after around 700BCE, most cultures in the Ancient Egyptian period had at least two scripts in use at any one time: hieroglyphs to record what was morally good and should endure for eternity (like holy texts and things you'd write on your culture-defining monumental tombs), and <em>demotic</em> (meaning popular) which was a more cursive script used for day-to-day things. That said, we estimate only about 1-5% of the Ancient Egyptian population were literate. The script survived in use until about the second century BCE, when it was replaced by <em>Coptic</em> - notably it wasn't replaced wholesale by Latin, as one might expect when the Roman emperors decided they owned the Nile now. (<a href="https://www.ucl.ac.uk/museums-static/digitalegypt/writing/hieratic.html">source</a>)</li> </ul> <h2>What I've had on Rotation</h2> <ul> <li><strong>Something New</strong> <em>In Sickness & in Flames</em> by The Front Bottoms (Rock/Punk, 2020). I only just discovered this rock/punk-ish duet, and I'm a little bit in love. It's like they're shouting poetry, or little truths, or little anecdotes that <em>are</em> connected most of the time, but sometimes it's a very loose connection. It's energetic, it's erratic, it's honest, and it's not so hardcore or edgy that it's exclusionary or difficult to listen to. Put it on when you next go for a walk sometimes. (<a href="https://songwhip.com/the-front-bottoms/in-sickness-and-in-flames">links</a>)</li> <li><strong>Something Old</strong> <em>A Moment of Madness</em> by Izzy Bizu (R&B, 2016). I was recommended this album as something to have on in the background if I needed to get something else done, and I really liked it. It's upbeat, soul-ish R&B that can stand its own as the centrepiece of music, or can hold into the background. It's gentle and doesn't demand your attention, but he clear voice and clean production doesn't wither under it. (<a href="https://songwhip.com/izzy-bizu/a-moment-of-madness">links</a>)</li> </ul> <h2>Cool Articles</h2> <ul> <li><a href="https://openai.com/blog/dall-e/">DALL·E: Creating Images from Text</a> by Open-AI. Isn't this a terrifying little read. The Open-AI team show how they trained an AI to generate images from free text prompts. For example they gave it the phrase "A storefront with 'Open AI' written on it", and the AI went ahead and made it. Trained on a corpus of labelled images, it was able to throw together these images on demand. Some of them are terrifying because they're so accurate - others are terrifying because they're 90% of the way towards making the image, and sit in the 'Nightmare Fuel' region of the uncanny valley.</li> </ul>]]></description> </item> <item> <title><![CDATA[An ode to note taking with markdown files]]></title> <link>https://thomaswilson.xyz/blog/2021-01-10-an-ode-to-plaintext-notes</link> <guid>https://thomaswilson.xyz/blog/2021-01-10-an-ode-to-plaintext-notes</guid> <pubDate>Sun, 10 Jan 2021 00:00:00 GMT</pubDate> <description><![CDATA[<p>This is based off a <em>sesh</em> (think <em>lightning talk</em>, but... cooler?) I gave at <a href="https://www.oxwash.com">Oxwash</a>, where I am a frontend software engineer. I wanted to give an overview for how I take notes in pretty much every area of my life, including my job but also for holidays, notes from books I am reading, and for writing posts like this.</p> <p>Over the past twelve months my thinking has converged towards the idea that plaintext files (like Markdown) are a great choice for note making and keeping. Please, let me explain why.</p> <p>I'm not going to talk about any particular software in this post, just explaining why I think plaintext is cool. God I love the internet.</p> <h2>What do I want in notes ?</h2> <p>The entire argument I am about to make relies on a couple of assumptions. The first is that you want some kind of personal productivity or knowledge management infrastructure in your life. You might not want any, or you might be okay with the default <em>Notes</em> and <em>Tasks</em> apps on your phone. That's fine.</p> <p>The second is that this is the kind of thing you can get down and nerdy about.</p> <p>Now that I've weeded out anybody remotely cool, let's talk note taking and productivity.</p> <p>No matter what tool I am using to take notes, I am trying to optimise for a couple of non-negotiable things:</p> <ol> <li>The <strong>speed</strong> of getting an idea out of my brain. My brain can get a little cluttered, and ideas can sometimes clamber over each other as they try to get out.</li> <li>The ability to <strong>find</strong> a note after I've written it. I don't care how it works, I can adapt, but normally at least one of the following things will stick around in my brain to let me find something: <ul> <li>A bit of the filename</li> <li>A rough time when I made the note</li> <li>A list of directories it's probably in</li> <li>I remember that I mentioned the file in another file</li> </ul> </li> <li>I am able to <strong>integrate</strong> my meta-work easily into my actual work, as: <ul> <li>A software engineer</li> <li>Someone who writes blog posts that no one reads</li> <li>Part of my ongoing professional development and research</li> <li>Reading / reviewing / keeping notes on books</li> </ul> </li> <li>A note can be <strong>deleted</strong> (or discarded) when I'm done with them, without impacting anything else.</li> <li>I want the reasonable ability to <strong>own</strong> my data and I don't want it to be in a <strong>proprietary format</strong></li> </ol> <h2>Atomic vs. Ecosystem productivity tools</h2> <p>I've gone through a lot of productivity tools and techniques in the past ten-ish years, where I've gone from undergraduate, to doctorate student, to software engineer in small and large companies. Right now, plaintext, specifically markdown (<code>.md</code>), account for maybe 90% of my productivity and meta-work. I rarely find myself needing to move outside of them.</p> <p>Previously, I flitted between two productivity ideals:</p> <ol> <li><strong>Atomic tools</strong> where one job is done by one thing - task managers for TODOs, spreadsheets for data, notes for... notes. I have previously used apps like <a href="https://bear.app/">Bear</a> (markdown-like notes), Google Sheets, and <a href="https://todoist.com/">Todoist</a> (task manager).</li> <li><strong>Ecosystem tools</strong> where one tool should contain everything: TODO lists should be aware of personal budgets, should be linkable to meeting notes and product designs. <a href="https://www.notion.so/">Notion</a> is the current Platonic ideal of this philosophy.</li> </ol> <p>I found atomic tools difficult to manage in practice, because you have to figure out how to tie multiple disparate systems together. You've also got to learn how multiple tools think about data and workflows.</p> <p>I didn't like ecosystem tools as much as I wanted to, because in practice they're trying to be a consumer-friendly operating system for information and workflows. As an engineer, I didn't like how ridged they are. Nor did I like how proprietary they are. I'm good to not put all of my valuable information onto a boat captained by an engineer out in San Fransisco who doesn't particularly want to resist the siren call of VC funding.</p> <p>Plaintext isn't an atomic tool, because it can contain a variety of different kinds of information. Nor is it an ecosystem, because it can't (ergonomically) contain every kind of information. Previewing tables and images in markdown is... not particularly user friendly.</p> <p>That said, plaintext notes are simple and accessible - every smart device I own can download files from the cloud, and has a way of editing them. Sure the editing experience is inconsistent, sharing external web pages or files into them is also a bit of nightmare, but the file format is present. And how much of success is just turning up?</p> <h2>Plaintext is kinda like Lego</h2> <p>The fact that plaintext is <em>just</em> text <em>is</em> a disadvantage. But plaintext still lets you put different kinds of information together in the same place. They're composable and combinable. One note can contain TODO lists, links to web pages, single-sentence thoughts, headings for structure in the document. That means I can have a file that represents a single day, a project, or a planned period of work - I don't have to divide everything off arbitrarily. And I can do this differently for every note.</p> <p>You can also link things together at the file level. By naming convention or location of the file, or just calling a file out - things can link together easily.</p> <p>A single plaintext note can easily support most things from infancy to adolescence. Some things, like data-heavy lists or tables, have practically no room to grow (at least not without software-based enhancements). Others, like a collection of notes and quotes from books I am reading, are able to expand almost infinitely. Most things, sit somewhere in the middle.</p> <p>Importantly, when something outgrows the medium of a plaintext document I am able to link the two. Even if this only a one way link, from markdown to a URL, or a copy-paste job from an e-mail. Is it perfect? No, but it's just plaintext. It's open source, it's human readable, and it makes sense to me. The computer doesn't need to understand everything I do and say, it just needs to remember what I say and let me do the figuring out.</p> <h2>Notes are a tool that serve you</h2> <p>Digital note taking brings together two very opinionated groups: people who think about software or digital systems, and people who work in research or communication. It is easy to find a lot of zealous doctrine online about what makes "good" notes.</p> <p>Take their ideas as inspiration. Or ignore them. They're not going to hunt you down to ask why you don't implement their note template, and if they do they're probably weak from sunlight deficiency and lack of social awareness.</p> <p>If you're serious about creating and then maintaining a habit, it has to offer some clear benefit to your life. Following an additional set of rules and guidelines for their own sake may work for some people who love following rules. <strong>You do not serve the monolith of your notes archive - it serves you.</strong></p> <p>If your notes are long and sprawling, that's fine. If they're short and clipped, cool.</p>]]></description> </item> <item> <title><![CDATA[Design Resource: Free Fonts from Awwwards (2021)]]></title> <link>https://thomaswilson.xyz/blog/design-resource-free-fonts-from-awwwards</link> <guid>https://thomaswilson.xyz/blog/design-resource-free-fonts-from-awwwards</guid> <pubDate>Fri, 15 Jan 2021 00:00:00 GMT</pubDate> <description><![CDATA[<p>Awwwards have put out a collection of free (or free-adjacent) fonts. You can find them <a href="https://www.awwwards.com/awwwards/collections/free-fonts/">here</a>.</p>]]></description> </item> <item> <title><![CDATA[Things I learned this week #23]]></title> <link>https://thomaswilson.xyz/blog/2021-01-15-things-i-learned-23</link> <guid>https://thomaswilson.xyz/blog/2021-01-15-things-i-learned-23</guid> <pubDate>Fri, 15 Jan 2021 00:00:00 GMT</pubDate> <description><![CDATA[<ul> <li><strong>These underwater drawings</strong>: Go back to 1860s and ask someone what coral reefs, or fish, or literally any marine life looked like. Go on. I bet they'd tell you they had no idea. How would they? Sure, we'd been sending people down there since the 1500s in these giant metal bells but those were more function-over-form. You couldn't really see out of them. Around the 1400s we maybe started sending people down with metal crates over their head and tubes attached to their suits to feed air to them. But what are they gonna do, take picture on their under-water cameras or pull out a little canvas to sketch the scenery. In the 1860s a guy did literally that latter thing, which is so metal. Eugen von Ransonnet-Villez designed a special 2 feet wide, 3 feet tall diving bell with glass viewing ports for light and the view. He sat in his little underwater cupboard and drew what he saw. He dangled his legs out the bottom so he could move around a little, which is perhaps my favourite mental image. A full version of his published work, entitled <em>‌Sketches of the Inhabitants, Animal Life and Vegetation in the Lowlands and High Mountains of Ceylon: As Well as of the Submarine Scenery near the Coast Taken from a Diving Bell</em>, can be found <a href="https://www.biodiversitylibrary.org/item/108743#page/22/mode/1up">here</a> (description of the underwater stuff starts on page 21). (<a href="https://www.atlasobscura.com/articles/underwater-illustrations?utm_source=pocket-newtab-global-en-GB">source</a>)</li> <li><strong>This coffee myth</strong>: I always assumed I had to drink extra water before/after coffee, because it dehydrated me. Turns out that's a dirty filthy lie. A study in 1928 found that increased coffee consumption was associated with higher urine output. That's right, some science was done at a time before we had invented the synthetic toothbrush bristles found that if you drink more coffee, you also pee more. And then we just carried on believing that coffee made you pee more (which I guess isn't a lie). Some 2016 research investigated caffein consumption and dehydration - finding no evidence that increased caffein consumption works against your hydration. It is worth remembering that coffee isn't just caffeine, however. Either way, don't worry too much about it. (<a href="https://www.livescience.com/55479-does-caffeine-cause-dehydration.html">source</a>)</li> <li><strong>This pilgrimage</strong>: Chartres Cathedral, near Paris, has a 42-foot single-pathed labyrinth pattern inlayed in their floor. We don't actually know who built it, or why, just that it came about in the early 13th century. Around the time it was constructed, it became impossible for Christians to make a pilgrimage to Jerusalem - because of political issues. Luckily we've spent the past eight centuries working together to overcome these woefully antique problems. The labyrinth arose at a time when people wanted, but were unable, to undertake an important journey, in every sense. Chartres Cathedral became a pilgrimage destination for European Christians - with the single winding path acting as a tool for meditation and therapy as the walker made their winding (but definitely small) journey. Single-pathed labyrinths actually have a long, and continuing, history as tools to help guide and sooth thoughts. These single-path labyrinths are still used in therapeutic and mindfulness contexts because they are seemingly complex but they don't let you make choices, and they always lead to successful completion. (<a href="https://www.atlasobscura.com/places/labyrinth-chartres-cathedral">source</a>)</li> </ul> <h2>What I've Had on Rotation</h2> <ul> <li><strong>Something New</strong> <em>Kokoro</em> by Stefano Guzzetti (Piano, 2020). This past week I've been doing a lot of deep work, which I like to do in silence. So when I come to have music on, I don't want anything that jolts or shocks my system. Guzzetti's <em>Kokoro</em> is a delightful hour of melodic, pleasing, and still complex-in-places piano. It's good for these rainy, dark days where really who wants to leave the house anyway? (<a href="https://songwhip.com/stefano-guzzetti/kokoro">links</a>)</li> <li><strong>Something Old</strong> <em>Murs 3:16 9th Edition</em> by Murs (Hip Hop, 2004). I absolutely love going back to find some of the great albums and artists of 21st century hip hop. This album has that timeless boombap style of productions: samples, synths, and drum machines. Murs' <em>Have a Nice Life</em> received a lot more critical acclaim, and deserved it (it's a maturer sound - I'll pick it some week), but this <em>3:16</em> gives a sense of perspective with its relative immaturity, anger, and hard-stances. Love where you've come from, as well as where you're going - and that's what this album reminded me of. (<a href="https://songwhip.com/murs/murs-316-the-9th-edition">links</a>)</li> </ul> <h2>Cool Reads</h2> <ul> <li><a href="https://2020.stateofjs.com/en-US/">State of JS 2020 Results</a>. If you're a software engineer who writes for the web, you should read this article. It breaks down responses from almost 25,000 software engineers, and gives State of the Union for frontend technologies, and highlights where things could head in the future. The <a href="https://svelte.dev/">Svelte</a> framework really shone through this year, and TypeScript continued its dominance in the wider ecosystem.</li> <li><a href="https://www.densediscovery.com/issues/120">Dense Discovery Issue #120</a>. I've mentioned Dense Discovery in previous editions of <em>things I learned</em>, but I want to give a shoutout to this week's edition in particular. It's such a well curated, thoughtful newsletter run by <a href="https://twitter.com/KaiBrach">Kai Brach</a>. I really advise <a href="https://www.densediscovery.com/">signing up for the newsletter</a>. This week's issue had the following quote which stuck out to me, as someone who has recently found themselves thinking "I really just should get my head down and finish this book", without considering my enjoyment of that book:</li> </ul> <blockquote> <p>... as a society we increasingly see reading as ‘mining' a text for information instead of it being an exercise of contemplation. He calls it ‘the Silicon Valley view of the mind' that treats brains like computers: the more effective the input and the data processing, the better and therefore more successful the output. There is a whole category of tech ‘innovation' that wants to make reading more efficient – from the many speed-reading apps to subscription services that give you the time-saving gist of annoyingly comprehensive books.</p> </blockquote>]]></description> </item> <item> <title><![CDATA[Things I learned this week #24]]></title> <link>https://thomaswilson.xyz/blog/2021-01-23-things-i-learned-24</link> <guid>https://thomaswilson.xyz/blog/2021-01-23-things-i-learned-24</guid> <pubDate>Sat, 23 Jan 2021 00:00:00 GMT</pubDate> <description><![CDATA[<ul> <li><strong>This fitness research</strong>: I've long been a fan of interval training to help improve my running and cycling speed. High intensity interval training (HIIT) is a method of training where you mix short bursts of intense activity (e.g. a 30 second sprint) between longer periods of low-intensity exercise (e.g. 90 seconds slow jog). It's time-efficient, evidence-backed, and makes me uncomfortably sweaty so it must be good. Our current guess is that by pushing through into very high intensity activity you trigger different physiological responses, compared to sustained moderate exercise. It turns out it might also be useful for less active, older adults - not just younger people and athletes. Some researchers at the University of Texas looked at a HIIT regime with just 4 seconds of exercise in a sixty second interval (4 seconds on, 56 seconds off), repeated fifteen times back-to-back. So fifteen minutes total, just sixty seconds of high intensity exercise. The researchers worked with both young adults (no age mentioned) and older adults (50-68 years old) and found that and found improvements to their strength and performance after three sessions a week over eight weeks. This is great news if you're looking to make the most of your exercise, but not great news if you hate running/cycling so fast you feel like you could be sick. (<a href="https://www.nytimes.com/2020/12/30/well/move/can-4-seconds-of-exercise-make-a-difference.html?utm_source=pocket-newtab-global-en-GB">source</a>)</li> <li><strong>These sheep</strong>: North Ronaldsay is a three-mile long island off the Scottish coast which used to be moderately populated (a couple of hundred people) and sustained by the seaweed which would wash ashore from the stormy North Sea. In the nineteenth and twentieth century we would burn seaweed for potash - a valuable industrial ingredient. We've moved on from burning seaweed for potash, so the while island is still populated by seventy two people, it's also the home to some pretty unique sheep. Sheep love to eat things, like peoples' crops, so in 1832 the residents of North Ronaldsay constructed a two-metre high drystone wall (also the longest single drystone wall in the world, by the way) to confine the sheep to part of the shore. Nearly two hundred years later, and the sheep have adapted to life on the coast of a tiny island in the North Sea - mainly by eating seaweed instead of grass (or peoples' crops). They remain some of the few pure English-bread sheep stock in the world, and also they look incredibly grizzly. Seriously, go look at some pictures of them, they totally look like an old haggard Scottish shepherd. (<a href="https://en.wikipedia.org/wiki/North_Ronaldsay_sheep">source</a>)</li> <li><strong>This vegetarian cereal inventor</strong>: John Harvey Kellogg (of Corn Flake fame), born in 1852 (i.e. twenty years after that dry stone wall), was one of America's early popular proponents of a meat-free diet. It's the reason he was dead keen on getting nutritional plant-based foods out there, despite his first recipes being incredibly bland and basically gruel. He wasn't vegetarian for the environmental or animal rights reasons that many associate with vegetarianism today. No no. He believed that a diet rich in meat was too full of fat and rich flavours (this is often <em>the</em> argument people give as to why they "could never go vegetarian", so maybe work on your marketing, John). Kellogg believes that these irresistible flavours were basically making us too horny. Meat increased our sexual appetite, and therefore eroded our moral fibre. These beliefs actually pre-date the man's cereal infamy, and he opened the <em>Battle Creek Sanitarium</em>, a sort of health retreat / rehab centre / healthcare facility - but two hundred years before the term "wellness retreat" really became popular. Here, he evangelised a plant-based diet and outdoor exercise. While there he ended up boiling some wheat, and thought "this bland mush is so boring but healthy I bet it's great for your soul and wouldn't make anyone horny" - or something like that. So yeah, now we have Corn Flakes and Cocopops. (<a href="https://www.smithsonianmag.com/smart-news/american-vegetarianism-had-religious-upbringing-180956346/">source</a>)</li> <li><strong>This CV of one of Parler's Founders</strong>: <em>Parler</em> is (was?, no wait, <a href="https://www.theguardian.com/media/2021/jan/19/parler-website-partially-returns-with-support-from-russian-owned-technology-firm">is</a>) a Twitter-clone social media for people on the right of the political spectrum. The appeal comes from years of claims that Twitter was suppressing free speech. It's not that spending four years posting increasingly inflammatory and violent rhetoric isn't inherently appealing to social media. No. Twitter is hiding your tweets. So Parler was founded by a software engineer (John Matze) and billionaire heiress Rebekah Mercer. Some fun facts about Mercer, and why you should definitely trust her to run a tight ship: i) she owned a bakery in New York in the mid 2000s (and apparently made awful cookies), ii) she never does public interviews, and iii) she (and her father) were invested heavily in Cambridge Analytica (that unethical, and arguably illegal, data mining company). No, I'm sure she's got all the <em>bona fides</em> to manage a social media company where "<a href="https://www.forbes.com/sites/abrambrown/2020/06/27/parlers-founder-explains-why-he-built-trumps-new-favorite-social-media-app/?sh=3be1bad25016">there are going to be no fact checkers</a>", and they can quickly handle the pivot after being de-platformed from the vast majority of the internet. (<a href="https://www.townandcountrymag.com/society/news/a9204/rebekah-mercer-donald-trump-transition/">source</a>)</li> </ul> <h2>What I've Had on Rotation</h2> <ul> <li><strong>Something New</strong>: <em>SUCKAPUNCH</em> by You Me at Six (rock/pop punk, 2021) . The band's seventh studio album is the first in a couple of years to make me feel like You Me At Six made me feel in 2013. The slightly electronic, punky, rocky vibe (<em>a la</em> their cohort Panic! At the Disco, All American Rejects, et. al) of SUCKAPUNCH has the high energy, and distinct Essex vocals of Josh Franceschi that make it lovable. (<a href="https://songwhip.com/you-me-at-six/suckapunch">link</a>)</li> <li><strong>Something Old</strong>: <em>Have a Nice Life</em> by Murs (hip hop, 2015). Last week I recommended Murs' 2004 album, and the difference in production and content between these two is notable. An altogether more mature and even sometimes humble album, that has an absolutely fantastic golden era classic beat production. This one's going on my list of classic. It's not surprising I love this sound, Murs is currently collaborating with Slug and Eligh - two of the first rappers I loved when I first discovered hip hop. Anyway, this album is really great you should listen to it. (<a href="https://songwhip.com/murs/have-a-nice-life">link</a>)</li> </ul> <h2>Cool Articles</h2> <ul> <li><a href="https://www.wired.co.uk/article/tech-predictions-2021">Here are some (entirely serious) predictions about tech in 2021</a> by Matt Reynolds for <em>Wired</em>. This delightful little satirical piece riffs on some of the zeitgeist/pop culture moments from 2020, which exist regardless of pandemics. My favourite is the prediction that in December 2021 we discover an asteroid on a collision course for earth, meaning that "existential panic can resume as scheduled". Very good.</li> <li><a href="https://getpocket.com/explore/item/longevity-linked-to-proteins-that-calm-overexcited-neurons">Longevity Linked to Proteins That Calm Overexcited Neurons</a> by Veronique Greenwood for <em>Quanta Magazine</em>. This is a neat little piece of science journalism covering something published in <em>Nature</em> in 2019: that mice and worms with higher concentration REST (a protein which slows neural firing) have longer lifespans. There's a couple of really nice mental models in the piece, which slightly re-framed the ageing process for me. Notably the idea that ageing is a process where the body loses the ability to maintain equilibrium. It is not able to respond to environmental (or social, or cognitive, or whatever) stressors and return to a baseline "normal" state.</li> </ul>]]></description> </item> <item> <title><![CDATA[Things I learned this week #25]]></title> <link>https://thomaswilson.xyz/blog/2021-01-29-things-i-learned-25</link> <guid>https://thomaswilson.xyz/blog/2021-01-29-things-i-learned-25</guid> <pubDate>Fri, 29 Jan 2021 00:00:00 GMT</pubDate> <description><![CDATA[<ul> <li><strong>This etymology</strong>: The word "peculiar" has come to mean odd or unique, so obviously its Latin root word (<em>‌peculium</em>) means somebody's cattle. Cows were pretty valuable assets back in the day: you can eat them, milk them, use them as work animals, so they became a symbol of wealth. Later, <em>‌peculiaris</em> evolved from this same root word to mean "of private property", i.e. belonging to one person. This link makes sense too - if cattle are the stereotypical idea of property and wealth, then they'll start to become synonymous. Sort of like how 'estate' mingles land and social status (sorry to introduce a second etymology here to explain the first, bad form, I know). This latter meaning, of private property, has more clear links to "unique" or "individual", a connotation which arose in seventeenth century Europe, and which remains dominant today. (<a href="https://uselessetymology.com/2019/11/12/the-etymoooology-of-peculiar/">source</a>)</li> <li><strong>This statue of Lenin</strong>: Hey remember back in the 1920s when Vladimir Lenin headed up the Soviet Union and shaped and popularised the communist ideal? As part of the zealous, world-domineering showmanship for the Soviet Union, Lenin had his face put on a whole bunch of things, including a lot of busts. I mean a <em>lot</em> of busts. Lenin's personal brand was so strong during his leadership that his face was put on stamps, posters, newspapers, crockery, and generally anything. That's not to mention the fact that entire towns, as well as buildings and streets, were named after him. In a show of undeniable rigour and commitment to science (and communism), in 1958 a bunch of scientists and explorers from the USSR trekked to the most remote part of Antarctica, called the 'pole of inaccessibility', and erected both a research station and a Lenin bust. Out there, in the most remote part of the Antarctic desert in a bust of Lenin, cast in a synthetic polymer because no one's quite stupid enough to take marble to one of the hardest to reach places on earth. Originally pointing towards Moscow, a bunch of American made their way to the research site and rotated him to face Washington. So in '66-67 another bunch of Russians went out to un-rotate him and point him towards his home land. Now-a-days, little plastic Lenin is being slowly buried by the inevitable snow, and in about ten years he'll likely not be very visible. (<a href="https://www.worldabandoned.com/pole-of-inaccessibility">source</a>)</li> <li><strong>This second largest bird</strong>: If I was an emu, I wonder if I'd feel self conscious about being second-rate to my taller, more famous cousin, the ostrich. But look, there are some wild things about the emu that I just did not know. For example, did you know that the male emus take responsibility for guarding and incubating the eggs. They'll not eat, and so likely lose weight, just to stay with the eggs and I don't think anything could make me want to do that. Another fun emu fact is the infamous 1932 <em>emu war</em> in Australia, where the animals such a nuisance (they kept eating the corn that humans wanted to eat) that the army tried to get rid of them but failed. Third emu fact: aboriginal Australians discovered that you could use emu oil (don't ask how it's collected, it's pretty sad and unpleasant) to oil and treat your tools. These days we use emu oil as a topical (i.e. on the skin) treatment for joint and muscle pain, as well as healing damaged skin. Last fun emu fact for now: they're the only bird with calf muscles. Because their bodies are so big, and wings are so small, the extra muscle allows them to move at faster speed, which is a clear evolutionary advantage. (<a href="https://en.wikipedia.org/wiki/Emu">source</a>)</li> <li><strong>This use for leaches</strong>: Imagine, if you will, that it is the 1800s and you need a way of detecting if a storm is coming. Imagine also that you happen to have a bunch of leeches lying around, because scientists in the 1800s had stuff like that. Oh, to be a rich white victorian scientist. George Merryweather was one such lucky soul, and he invented the <em>Tempest Prognosticator</em>. As the name suggests, it's a device which is able to alert you to when a storm is coming. It came about after Merryweather noticed that his leeches would become more active (i.e. wriggle more) before a storm hit. He surmised that leeches must be sensitive to changes in air pressure, and will want to seek shelter when a storm is coming. He used this new-found knowledge to build a contraption (which is totally the right word for what he built) which placed leeches in glass jars, attached strings to the sides of the jars, and then attached those strings to bells. So that when the pressure dropped, and a storm was coming, the leeches would writhe around and cause a "tinkle tinkle" of the bells. Merryweather never managed to successfully sell his Tempest Prognosticator to anyone, which is surprisingly because who wouldn't want to tend to a dozen jars of leeches every day? In an attempt to break into the luxury market, he constructed an ornate (i.e. hand crafted and artisanal) version for display at the 1851 <em>Great Exhibition</em> in London. (<a href="https://en.wikipedia.org/wiki/Tempest_prognosticator">source</a>)</li> </ul> <h2>What I've had on Rotation</h2> <ul> <li><strong>Something New</strong> <em>Kvitravn</em> by Wardruna (2021, ...Folk Rock?). I don't know how to describe this album. It's sort of metal, sort of rock, but definitely Celtic. Just listen to it, you'll know in the first few minutes if it's for you, or if it's some kind of medieval torture method. I personally find it earthy and grounding and moving. (<a href="https://songwhip.com/wardruna/kvitravn2021">links</a>)</li> <li><strong>Something Old</strong> <em>Invaders Must Die</em> by The Prodigy (2009, EDM). This album takes you all the way back to 2009, but it still stands up really well as an EDM album. It's the signature sound of The Prodigy, and it's got me through some runs/cycles over the past couple of weeks. Maybe it's got me a little too hyped, but is that really a bad thing? (<a href="https://songwhip.com/the-prodigy/invadersmustdie">links</a>)</li> </ul> <h2>Cool Articles</h2> <ul> <li><a href="https://www.youtube.com/watch?v=JzyE9hi912c">How Supergiant Secretly Launched Hades - Developing Hell #01</a> (video series) by <em>Noclip</em>. Noclip produce really high quality documentaries about video games on YouTube. They've got a multi-part series which covers the development of <em>Hades</em>, the most recent game from <em>Supergiant Games</em>. They cover the multitudinous efforts required to create a video game which is beautiful to experience and fun to play.</li> <li><a href="https://www.theguardian.com/lifeandstyle/2021/jan/15/experience-i-drink-more-than-50-cups-of-tea-a-day">Experience: I drink more than 50 cups of tea a day</a> by Yasmin Lee for <em>The Guardian</em>. I'm a super nosy person, so articles like this appeal to me. Lee gives an overview of what it's like to be a tea taster. I'm very unsophisticated with my taste for tea (much to the chagrin of my best friend) - but it sounds like a pretty cool job, to be honest with you. You get to make and taste delicious things 🤷â€â™€ï¸</li> </ul>]]></description> </item> <item> <title><![CDATA[Tiny Thought: Frontend Engineering is a Fullstack Problem]]></title> <link>https://thomaswilson.xyz/blog/2021-01-31-frontend-is-fullstack</link> <guid>https://thomaswilson.xyz/blog/2021-01-31-frontend-is-fullstack</guid> <pubDate>Sun, 31 Jan 2021 00:00:00 GMT</pubDate> <description><![CDATA[<p><em>Tiny Thoughts</em> are little (500 word) essays. They're concise.</p> <p>Hypothesis: Frontend engineering cannot exist in isolation from backend technologies.</p> <p>What sparked this: Thinking about building the next generation of web software at <a href="https://www.oxwash.com">Oxwash</a>.</p> <p>All software is either...</p> <ol> <li>Used by a human for a human-scale (i.e. nebulous and larger) task like updating a status on social media, download a bank statement, or send a message.</li> <li>Used by other software to complete some computer-scale (i.e. smaller and specific) task like upload a file to S3, compress an image, query a database.</li> </ol> <p>Frontend software is, by definition, the bit used by humans. Good frontend software makes the human user aware of what they can(not) do, and what's going on in the system. How many unread messages do I have? What class do I have at 4pm this Thursday?</p> <p>This information is communicated in the User Interface (UI). UIs are interpreted by humans. The metaphors and language developed during design then used in UI are intended solely to communicate and explain. Humans can bend, abstract, and change concepts or language. So although UIs <em>should</em> be consistent, they can not be. You can present your blog page as a "recent articles" page, and as a list view for the <code>posts</code> table in your database. Both are true, but have different ideas about how "computery" an app is.</p> <p>When a human tells the UI that they wish to <em>do</em> something, the UI then has to talk to another bit of software. Software cannot bend, abstract, or change its ideas. A blog post <em>is</em> a row in a database. Software has a pre-specified language of things it can do: the Application Programming Interface (API).</p> <p>Frontend engineering is about working with both APIs and UIs. The skill of a frontend engineer can be proxied by their ability to design one or both. It's a skill because if you make these languages too similar, you risk a UI which is too technical or an API which is too inflexible.</p> <p>A lot of engineers write code for engineers. I've seen (and written) "clean" code which prematurely optimised and abstracted. This does not guarantee a good Developer Experience (DX) when you actually <em>use</em> the API. Nor does it make the user experience or product quality inherently better.</p> <p>These are strong code smells if I'm building version 1, or the API only has one consumer.</p> <p>As a frontend engineers, we have to advocate for users and software, situation depending. We should make better interfaces.</p> <p>Recognising the need to design singular interfaces (APIs and UIs), and using a shared language is GraphQL's fundamental distinction from REST. GraphQL acknowledges that provider and consumer need to know about each other.</p> <p>If your product <em>is</em> an API you should think especially hard about clear concepts and language.</p>]]></description> </item> <item> <title><![CDATA[Things I learned this week #26]]></title> <link>https://thomaswilson.xyz/blog/2021-02-06-things-i-learned-26</link> <guid>https://thomaswilson.xyz/blog/2021-02-06-things-i-learned-26</guid> <pubDate>Sat, 06 Feb 2021 00:00:00 GMT</pubDate> <description><![CDATA[<ul> <li><strong>This heartening fact</strong>: Altruism, more specifically altruistic behaviour, is an action done (at cost) by an individual for the benefit of another individual. Why do humans, and other social animals, engage in altruistic behaviour? How does it makes sense on the evolutionary balance sheets? There is increasing evidence that altruism is an evolved, or more specifically <em>phylogenetic</em>, behaviour and that it is not learned. As social creatures, humans have an innate ability to empathise with each other. It's one of the psychological reasons behind what makes horror films scary and emotional films draining. We're not able to stop ourselves from identifying, and sharing, in the emotional turmoil and mortal dangers we see on the screen. Disney and Pixar have mastered making us feel things for non-human animated things, like toys, souls, and fish. We, individual humans, favour people who have been kind or altruistic to us and we neglect those who have not been. This gives an evolutionary preference to societies where cooperation and bonding is stronger or more common, and therefore where altruism is more prominent. (<a href="https://www.annualreviews.org/doi/abs/10.1146/annurev.psych.59.103006.093625">source</a>, and <a href="https://science.umd.edu/faculty/wilkinson/BIOL608W/deWaalAnnRevPsych2008.pdf">PDF Download</a>)</li> <li><strong>This cubic poop</strong>: The bare-nose wombat poops cuboid pellets. About one hundred little cubes every day - so they're like tiny geometric poop machines. Interestingly, the faeces of wombats in captivity are rounder than their wild-and-free counterparts. This could mean that poop shape is an indicator of overall health and wellbeing. The wombats are the only mammal that make not-round faeces, and to uncover how this even happens some scientists dissected a couple of wombats' intestines. Don't worry, at least one of them was accidentally killed by a vehicle, which makes me wonder if they had the study lined up first, or if it was an impromptu affair? Anyway, the cubic shape comes from the irregular thickness of the animal's intestinal lining. Faeces sits in the intestines for quite some time, while the gut compresses and compacts it to extract water and nutrients. Your guts do this too, by the way, which is cool but also gross to think about. What these wombats have that we (and every other mammal) don't, other than 10x cuter faces, is the ability to compact some parts of the poop harder and faster, and some parts slower and gentler. This difference, somehow idk, produces a shape which isn't a cylinder. Look, if you need some bleach for your mind, just google "bare nose wombat". Here, <a href="https://duckduckgo.com/?q=bare+nose+wombat&t=h_&iax=images&ia=images">I'll do it for you</a>. (<a href="https://www.sciencemag.org/news/2021/01/how-do-wombats-poop-cubes-scientists-get-bottom-mystery">source</a>)</li> <li><strong>This Italian cyclist</strong>: Gino Bartali won the Gira d'Italia (twice) and the Tour de France (once) before the Second World War, and then once again for each <em>after</em> the War. Because he was so well known, during the Second World War he was able to cycle long distances around Tuscany unmolested by newly-Nazi authorities who didn't want the bad press of arresting a local celebrity. Personally I think the Nazis could have made a couple of other, higher impact, decisions if they cared about their public image that much. During this time, Bartali ran messages, photographs for forged documents, and news of raids for the Italian and Jewish resistance groups in the area. In total, these groups helped about 800 Jews escape death, and Bartali himself hid a Jewish family in his cellar - allowing them to escape death. His pivotal role in the resistance at the time largely came to light after the death of Giorgio Nissim, a Jewish accountant from Pisa who died in 2000. Nissim kept details in his diaries. Bartali didn't speak openly about his role, even after The War ended. He's attributed the quote "The good is done, but it is not said. And certain medals hang on the soul, not on the jacket" (though unfortunately I couldn't track down the exact source). (<a href="https://en.wikipedia.org/wiki/Gino_Bartali#Rescues_and_Resistance_role_during_World_War_II">source</a>)</li> </ul> <h2>What I've had on rotation</h2> <ul> <li><strong>Something New</strong>: <em>Isles</em> by Bicep (2021, EDM). I've been stepping up my cycling training over the past couple of weeks. I'm back on the turbo trainer for interval and sixty-to-ninety minute training sessions three or so days a week. What I'm saying is there's a reason I've got more into EDM this past couple of weeks, despite the fact that we're <em>still</em> in lockdown. This is a great, upbeat (pun intended), electronic album which isn't monotonous but stays optimistic enough for when the going gets tough and the tough get sweaty. (<a href="https://songwhip.com/bicep/isles">link</a>)</li> <li><strong>Something Old</strong>: <em>When This Is Over</em> by Shad (2006, Hip Hop). This is a hip hop album with a heart of gold, full of good intentions, and little narratives. If you "don't like hip hop" then this might be an album to check out. There's little bragging, violence, or general gaucheness that some people associate with hip hop (not unfairly, to be honest). To me, Shad is more of a storyteller who chose Hip Hop music as his narrative. It was nice to rediscover this album a decade after I had it on heavy rotation circa 2011. Both myself and my taste in music have changed since then, but this stands up. (<a href="https://songwhip.com/shad/when-this-is-over">link</a>)</li> </ul> <h2>Cool Articles</h2> <p>This week I've found two beautifully designed, and well considered essays. Sometimes the stars align, and your inbox / random internet wanderings bring you some really beautiful pieces.</p> <ul> <li><a href="https://www.robinrendle.com/essays/newsletters">Newsletters</a> by Robin Rendle. I love newsletters and the independent web. The web should be more about allowing people to do weird, expressive, niche things <em>just because</em>. Rendle outlines this much better than I can/do.</li> <li><a href="https://stasaki.com/designer-as-writer/">Designer as Writer</a> by Stas Aki. (Best viewed on desktop). This is a stunningly designed essay/treatise on the similarities between design and writing. Namely that both are about communicating a clear message and understanding the reader/user. Aki riddles the article with quotes, photos, and examples. It's very good.</li> </ul>]]></description> </item> <item> <title><![CDATA[Website Design 2.0 Changelog]]></title> <link>https://thomaswilson.xyz/blog/2021-02-12-website-design-2-0-changelog</link> <guid>https://thomaswilson.xyz/blog/2021-02-12-website-design-2-0-changelog</guid> <pubDate>Fri, 12 Feb 2021 00:00:00 GMT</pubDate> <description><![CDATA[<p>I've redesigned the blog. This post just covers the technical whats and hows of it all.</p> <h2>What's changed ?</h2> <ul> <li><strong>New Dark theme colours</strong>: Look around. Look at this dark purply-grey. Look at the same brand-orange, and the deliciously crisp white text. New colours!</li> <li><strong>100% More Portfolio</strong>: I completely revamped the homepage so that it actually showcases my writing and my work. The content isn't hidden behind anything anymore.</li> <li><strong>50% Less Bio</strong>: I've shortened bios and text on the home page, they made the site feel a lot more static and like a placeholder site than I wanted.</li> <li><strong>Blog Series Highlight</strong>: I've highlighted, and made accessible, certain series on my blog (like my "Things Week I Learned" series). You can now filter for just these posts on the blog page.</li> <li><strong>Personal Brand</strong>: The site sizzles a little bit more with personal brand and little "moments" in the UI. It's a "website experience". This includes little self-aware UI labels which seem very post-modernist and bring me joy.</li> <li><strong>Tags</strong>: I added tags to blog posts. They don't do anything right now though lol.</li> </ul> <h2>Yeah but how?</h2> <p>I bloody love talking about workflows and processes. By brevity here is a mercy and a kindness:</p> <ul> <li><strong>Design</strong>: Any and all visual design was done in <a href="https://www.figma.com/about/">Figma</a>. I bloody love Figma.</li> <li><strong>Code</strong>: This site was, and remains, a static site built with <a href="https://www.gatsbyjs.org/">Gatsby</a> (and therefore on <a href="https://reactjs.org/">React</a> and <a href="https://graphql.org/">GraphQL</a>)</li> <li><strong>Deployment</strong>: <a href="https://www.netlify.com/">Netlify</a>, and they do a <em>stunning</em> job.</li> <li><strong>Writing</strong>: Everything is Markdown (<a href="https://thomaswilson.xyz/blog/2021-01-10-an-ode-to-plaintext-notes">markdown is cool</a>). I write with <a href="https://ia.net/writer">iA Writer</a> for longer pieces (like this) and <a href="https://ia.net/writer">Obsidian</a> for research and emergent writing.</li> </ul>]]></description> </item> <item> <title><![CDATA[Things I learned this week #27]]></title> <link>https://thomaswilson.xyz/blog/2021-02-13-things-i-learned-27</link> <guid>https://thomaswilson.xyz/blog/2021-02-13-things-i-learned-27</guid> <pubDate>Sat, 13 Feb 2021 00:00:00 GMT</pubDate> <description><![CDATA[<ul> <li><strong>This seventeenth century petition</strong>: In 1674 in England, a pamphlet was made and published, titled <em>The Women's Petition Against Coffee</em>. The women (or alleged women, we don't actually know who wrote this) were fighting against the new trend of coffee houses in London, which had arrived some time in the 1650s. These proto-cafés became political and intellectual hubs in London, just as they had in other parts of the world, where men would meet and discuss all sorts of dangerous things like politics and science. The result was a bunch of intellectual, babbling, effeminate, arty-farty, pull-yourself-together-and-get-in-with-it men who couldn't muster so much as an ounce of passion. Or so say the authors of the pamphlet, who lamented that when a wife of a coffee house attendee "approaches the nuptial bed, expecting a man that ... should answer the vigour of her flames, she on the contrary should only meet a bedful of bones, and hug a meager useless corpse". Ouch. Drinking coffee (unlike it's manly brother, ale) was wasting away their husbands. The chances that the monarchy at the time were trying to iron out the crinkles caused by a civil war several years previous probably has little or nothing to do with this desire to keep people away from places where ideas could be discussed openly. We also suspect that sex workers at the time found custom in coffee shops, so maybe your man's coming home already sexually satisfied and blaming it on all the heady ideas of democracy he's been ingesting with William and Frances at the pub. (<a href="https://www.smithsonianmag.com/smart-news/meet-pro-temperance-women-who-crusaded-against-coffee-180965039/">source</a>)</li> <li><strong>This maybe-gay-maybe-brothers Ancient Egyptian duo</strong>: About 4,500 years ago, during the fifth dynasty of Ancient Egypt Khnumhotep and Niankhkhnum were the royal manicurists. So I guess part one of this thing I learned is that four thousand years ago the kings of Egypt had chief manicurists who would oversee the lesser manicurist. The shared tomb of Niankhkhnum and Khnumhotep was uncovered in 1964. The fun fact here being "shared". Ancient Egyptians buried people together so they could accompany each other in the afterlife. Often families would be buried together, with their servants if they had any. Because obviously one mortal lifetime of servitude is but an entrée to an eternity spent at the beck and call of a rich Ancient Egyptian family. Niankhkhnum and Khnumhotep were both dudes, by the way, in case you couldn't tell from the names. Depictions of the pair found within the tomb suggest the two could have been lovers (they're embracing, face-to-face), which would have made them the oldest recorded same sex couple. Some historians have argued they were brothers, as both are depicted in some frescos with wives a children - all of whom sit forlorn in the background of the frescos, playing second fiddle to the men. Also having a wife and children doesn't mean they weren't... anyway. Honestly, we'll never know unless we all end up in the Ancient Egyptian afterlife, in which case I'll hunt down these guys, get my nails did, and get the tea. (<a href="https://en.wikipedia.org/wiki/Khnumhotep_and_Niankhkhnum">source</a>)</li> <li><strong>This Stuart Little Trivia</strong>: On one of the walls of the set for 2000's Stuart Little, a banger of a film about a family who adopt a talking mouse, there is a painting. <a href="https://i.guim.co.uk/img/static/sys-images/Guardian/Pix/pictures/2014/11/27/1417112053124/da55bcb8-cd42-4f13-861a-d346f664d344-540x324.jpeg?width=620&quality=45&auto=format&fit=max&dpr=2&s=02e425e654cdf4836312936b04506c6c">This</a> painting. When Gergely Barki, a researcher at Hungary's National Gallery, watched this film in 2009 (with his daughter at Christmas, or so he insists) he noticed this painting and nearly immediately recognised it as one which disappeared from the gallery in the 1920s. Barki had only ever seen it before as a faded black-and-white photograph from a 1928 exhibition, so props to this man for remembering something so well when I keep buying noodles as part of my grocery shop, forgetting I have three unopened packets at home already. The piece, Barki knew, was Róbert Berény's <em>Sleeping Lady with Black Vase</em>, an Avant-Guarde. Barki started sending e-mails off to set and production crew for the movie in a bid to find the piece. A meagre two years later, Barki heard back from a set designer who had purchased the painting for cheap at an antiques market in Pasadena, California, specifically for the Stuart Little set. After the wrap, she had taken the piece and hung it in her home before selling the painting to a private collector, who subsequently returned the painting to Hungary to give it back to the National Gallery there. I'm joking, obviously, it was sold at auction for €230,000. (<a href="https://www.theguardian.com/world/2014/nov/27/stuart-little-art-historian-long-lost-hungarian-masterpiece">source</a>)</li> </ul> <h2>What I've had on rotation</h2> <ul> <li><strong>Something New</strong> <em>Medicine at Midnight</em> by Foo Fighters (Rock, 2021). Dave Grohl, am I right? At only 30 minutes, this short album is punchy, with the distinctive vocals and sonic styling of Foo Fighters. I like the band, but I'm not an authority on them or the genre - so from a casual visitor to the Fields of Rock take a very uncontroversial opinion: this is a good album. (<a href="https://songwhip.com/foo-fighters/medicineatmidnight">links</a>)</li> <li><strong>Something Old</strong> <em>Donuts</em> by J Dilla (2006, Hip Hop). J Dilla was one of the most influential figure in early hip hop in Detroit, if not the world. He pioneered and pushed the boundary of sampling as a musical instrument, finding, shifting, and relaying musicality from samples. <a href="https://www.youtube.com/watch?v=SENzTt3ftiU">Vox did a superb video on him</a>. This album is a great way to connect with what was once the forefront of hip hop. J Dilla died three days after the release of this album (aged 32), and to think of the lost talent and beats is pretty heartbreaking. (<a href="https://songwhip.com/j-dilla/donuts">links</a>)</li> </ul>]]></description> </item> <item> <title><![CDATA[Swift Closures: Inline functions explained by a web developer]]></title> <link>https://thomaswilson.xyz/blog/2021-02-17-closures-in-swift</link> <guid>https://thomaswilson.xyz/blog/2021-02-17-closures-in-swift</guid> <pubDate>Wed, 17 Feb 2021 00:00:00 GMT</pubDate> <description><![CDATA[<p>Hi, I'm Thomas. I'm a frontend engineer who's learning swift. Let's talk about <em>closures</em> in Swift from a very (very) introductory level. I'm assuming you've got some familiarity with JavaScript. You should definitely check out <a href="https://docs.swift.org/swift-book/LanguageGuide/Closures.html">Apple's documentation on Closures</a>, it's <em>so</em> much better than this page but also, like, less funny?</p> <p>Closures are inline function definitions.</p> <p>We have inline functions all over the place in JavaScript. Callback functions, including those in promises, are often declared in JavaScript:</p> <pre><code class="language-js">// Ever written an express routers? router.use('/users', (req, res, next) => { .. }) // Ever write a promise? fetch("https://www.google.com").then((res) => { .. }) </code></pre> <p>Like JavaScript, Swift has functions as a first-class citizen. That means they can be passed around like any other variable. That's pretty cool, and if you come from a pure JS background you might not realise it. You might think it's pretty annoying. But it's not. Try filtering a dataframe into a subset in Python using Pandas without the <code>filter</code>-like function syntax (don't @ me).</p> <p>We use closures in Swift in exactly the same use case: when we need to pass a function as an argument to a function. For example, if we are passing a custom <code>sort</code>, <code>map</code>, or <code>sorted</code> function on an array.</p> <p>In the same mental model that React uses, a SwiftUI View is like a React component: it's fundamentally a function: <code>f(state) => ui</code> - UI is a function of state.</p> <p>Understanding Closures in swift will help you write, and read, SwiftUI examples.</p> <p>The name's a little confusing. In JavaScript a <em>closure</em> is the scope at which a function is declared and its relationship to the surrounding variables. Coming from JS, I had a little trouble getting my head around them.</p> <h2>Ground 0: Function Declarations</h2> <p>Defining inline, full-blooded functions in Swift is pretty standard, and could probably be intuited by any engineer with one or two languages under their hat:</p> <pre><code class="language-swift">func multiply(number: Int, by:Int) -> Int { return number * b } </code></pre> <p>It would be perfectly valid syntax to pass this function around by simply referencing its identifier (<code>multiply</code>).</p> <h2>Removing some syntax</h2> <p>But what if we don't want to have to declare named functions everywhere. Especially if we're literally just going to use it once?</p> <p>In JavaScript you define the function inline with the same syntax as you would anywhere else. BUT NOT IN SWIFT. Why? I don't know, friend, by let's explore the <em>what</em> not the <em>why</em> first.</p> <p>Swift comes with a set of <strong>syntactical sugar</strong> for declaring closures. Syntactical sugar is a way of making code shorter or more readable. Syntactical sugar often replaces boilerplate or verbose code, and results in identical functionality to its un-sugared sibling.</p> <p>This syntactical sugar looks like:</p> <pre><code class="language-swift"> { (parameters) -> ReturnType in // expression } </code></pre> <p>Let's give a <em>real</em> simple example. We're going to take an array of <code>Int</code> and convert it to an <code>Array<String></code>:</p> <pre><code class="language-swift">let strings: Array<String> = [1,2,3,4,5].map({ (n: Int) -> String in return "The number is \(n)" }) </code></pre> <h2>The <code>in</code> keyword</h2> <p>This syntax looked odd to me. The key (pun intended) to me grokking it was understanding the <code>in</code> keyword. Typically I have only seen this associated with iterators (in languages like python and JS):</p> <pre><code class="language-python"># This is Python code for name in list_of_name: print(f"Hello, {name}") </code></pre> <p>In Closures, in Swift, <strong>the <code>in</code> keyword signifies that we've reached the end of our parameter and return type. Everything after the <code>in</code> is the action function expression.</strong></p> <h2>Implicit Types for Even Less Syntax</h2> <p>You better believe that's not all the syntactic sugar. There's still stuff we're going to get rid of.</p> <p>Once we declare types in one place, e.g. in a variable, generic, parameter, then we don't need to duplicate that typing. We <em>can</em> but we don't have to.</p> <p>Swift is able to find the implied types elsewhere in the code, and therefore we can remove them in the closure.</p> <p>In the following example the <code>boastfulString</code> variable is declared as the <code>Array<String></code> type, so the map function doesn't need to be told twice:</p> <pre><code class="language-swift">let boastfulStrings: Array<String> = [10,20,30,40,50].map( { n in return "I have \(n) tacos!"}) </code></pre> <p>By using implicit types we can get rid of two redundant parts of the closure declaration.</p> <ul> <li> <p><strong>The surrounding parentheses for the parameters:</strong> <code>(n: Int)</code> becomes <code>n</code>). We can do the same with multiple parameters: Say we had an argument that took three parameters: <code>(name: String, age: Int, averageScore: Float) ..</code> could become <code>name, age, averageScore ..</code></p> </li> <li> <p><strong>The return type of the closure</strong>: We know the function needs to return us a <code>String</code>, it's in the variable declaration. So <code>(n: Int) -> Int in ..</code> can become <code>n -> ..</code></p> </li> </ul> <p>Swift is super ready for you to give it an <code>Array<String></code> and will actually get pretty mad if you dont'. You'll run into compile-time errors with anything else.</p> <h2>Implicit Returns</h2> <p>Man, talking of redundancies, that <code>return</code> doesn't look like it's doing much on that one line there. JS, Ruby, and Rust all have implicit return types - and so does Swift. That means you don't need to use the <code>return</code> keyword to tell Swift "this is the bed that the function should hand back".</p> <p>This is more syntactic sugar: we're choosing conciseness and simplicity over explicit and verbose. Having <code>return</code> or omitting it in this example does exactly the same thing. You don't have to like this, or us it in your code. It's your choice, but you should definitely know about it. Also it's probably useful in those scenarios where you <em>just need something to work</em>:</p> <pre><code class="language-swift">let boastfulStrings: Array<String> = [100, 150, 200].map( { n in "I have \(n) taco!" }) </code></pre> <p>Look how concise that statement is.</p> <h2>Shorthand Argument Names: spend those $</h2> <p>But we can be more concise.</p> <p>What else can we get rid of?</p> <p>That named parameter, <code>n</code>:</p> <pre><code class="language-swift">let regretfulStrings: Array<String> = [2,4,6,8].map( { "I ate \($0) too many tacos ):" }) </code></pre> <p>These are <strong>shorthand arguments</strong>. Where <code>$0</code> refers to the first argument in the function. <code>$1</code> to the second argument, <code>$2</code> to the third...</p> <p>Now we're <em>really</em> favouring conciseness over explicitness.</p>]]></description> </item> <item> <title><![CDATA[Things I learned this week #28]]></title> <link>https://thomaswilson.xyz/blog/2021-02-19-things-i-learned-28</link> <guid>https://thomaswilson.xyz/blog/2021-02-19-things-i-learned-28</guid> <pubDate>Fri, 19 Feb 2021 00:00:00 GMT</pubDate> <description><![CDATA[<ul> <li><strong>This collective noun</strong>: If I was to make a list of small-talk and first date conversation topics it would go something like this: food, the tube, podcasts or books, and then collective nouns for animals. How many times have I been told the words "a parliament of owls" in my life? I don't know, but I love re-remembering every time. This week I learned a new collective noun, and I'm sorry if you heard this one already: a scurry of squirrels. Of also a "dray" of squirrels. But I think "Scurry" is cuter and definitely deserves the headline. (<a href="https://www.quora.com/What-is-a-group-of-squirrels-called">source</a>)</li> <li><strong>This early gay selfie</strong>: This week I came a picture of some early gay rights activist. Two handsome Victorian looking gentlemen holding a sign which read "Not married but willing to be". Which is beautiful in sentiment and heartbreaking in reality. I think it popped up on one of my social feeds, and I hunted it down. It looks like the photo re-surfaced last year when Hugh Nini and Neal Treadwell published <em>Loving : A Photographic History of Men in Love 1850s-1950s</em> (<a href="https://www.hive.co.uk/Product/Hugh-Nini/Loving--A-Photographic-History-of-Men-in-Love-1850s-1950s/25003310">buy it on Hive (UK)</a>). The Guardian took some of the photos from this piece and published them with some nice art direction on their website. The two un-named gentlemen I saw were photographed circa 1900s in Provenance, USA. Also of note is a very early selfie, entitled "In the mirror" - it's a photograph of two men taken in a mirror with a simply darling 1900s camera on the table between them. In a time when they couldn't have photos taken or developed by anyone (what with homosexuality being illegal), it makes a lot of sense. (<a href="https://www.theguardian.com/artanddesign/gallery/2020/oct/16/men-in-love-from-the-1850s-nini-treadwell-in-pictures">source</a>)</li> <li><strong>This colour</strong>: The browser has some default colours, like <code style="color: black; background-color:white;">black</code> or <code style="color: blue; background-color:white;">blue</code>. Some of them are a little odd, like <code style="color: indianred;background-color:white;">indianred</code> or <code style="color: mediumquamarine">mediumquamarine</code>, but they're there. You can use whatever colour you want in the browser (and people do), but you have to define them with computer-readable code like <code style="color: #BD1A0F">#BD1A0F</code> or <code style="color:#0FBD7E;">rgb(15,189,126)</code>. So being a human-readable colour name isn't the usual or standard approach. CSS comes with <code style="color:rebeccapurple;background-color: white;">rebeccapurple</code>. This colour, which was the colour used in the original branding for Twitch, the online streaming platform, is named in memory of Rebecca Alison Meyer, the six year old daughter of Eric Meyer. Eric is one of the pioneers in standardising CSS, one of the three truly foundational and essential web technologies. This particular shade of purple was Rebecca's colour. After Rebecca passed away from brain cancer, this colour was added to the CSS standard, and so comes with every browser, as a beautiful little reminder and honorary to Rebecca. (<a href="https://medium.com/@valgaze/the-hidden-purple-memorial-in-your-web-browser-7d84813bb416">source</a>)</li> <li><strong>This French translation</strong>: You know pie charts? The worst form of data visualisation (@ me you cowards). In French these can be translated to <em>diagramme circulaire</em> (formal) or <em>camembert</em> (informal). Yeah, it's a funny joke: ha ha the French love cheese they saw a graph and saw cheese *twiddles moustache*. But we looked at exactly the same thing and saw pie. What does that say about us? Would you rather have a pie or some fresh bread with a baked camembert and garlic? Learning this fact made me happy, and then made me sad that my culture just doesn't love camembert like the French do. (<a href="https://www.quora.com/How-do-we-say-%E2%80%98pie-chart%E2%80%99-in-French">source</a>)</li> <li><strong>This health advice from Leondardo</strong>: One of the most famous figures of the Italian renaissance, Leonardo was one cool guy. He had a pretty varied mental diet: anatomy, fluid dynamics, natural science, art (obviously), inventing underwater breathing gear, optics, engineering, and so on. In one of his notes he detailed a mixture of mental and physical advice for staying healthy. Go and <a href="https://www.pbs.org/food/the-history-kitchen/leonardo-da-vinci/">read it</a>. The advice is surprisingly modern, reasonable, and holistic. He advises to remain standing after eating, which is <a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3119587/">good advice</a> for weight loss. "Beware anger and avoid stuffy air", the latter of these points is something with a <a href="https://www.smithsonianmag.com/history/when-fresh-air-went-out-fashion-hospitals-180963710/">surprisingly detailed history</a>. Similarly he advocates to "rest your head and keep your mind cheerful". Leonardo understood well that our physical and mental health, our sleep, food, and physical activity all contribute to making us happier. That's not to say it's all good advice: he calls medicine "ill advised", says exercise shouldn't be "too strenuous" so as with everything, take it with a punch of salt. (<a href="https://www.pbs.org/food/the-history-kitchen/leonardo-da-vinci/">source</a>)</li> </ul> <h2>What I've had on Rotation</h2> <ul> <li><strong>Something New</strong>: <em>Dark Days</em> by Yard Act (2021, Indie Rock). This is a four track EP from a new-ish band from Leeds, UK. It's punk, and genuinely quite funny, painting a really rich portraits of characters in sometimes-singing-sometimes-talking tones. It reminds me a little bit of The Streets in the lyric/narrative blurred line. I am really excited to see the band drop an LP! (<a href="https://songwhip.com/yardact/darkdays">links</a>)</li> <li><strong>Something Old</strong>: <em>Bits of Naaz</em> by Naaz (2018, Pop). This fresh, clean pop sound sounds like happier times to me. It's lovely songwriting and and pleasing melodies. I'm always a fan when someone contrasts obviously drum-machine beats over more organic samples and Naaz does that nicely throughout this album. (<a href="https://songwhip.com/naaz/bitsofnaaz">links</a>)</li> </ul>]]></description> </item> <item> <title><![CDATA[Opinions from 48hr on Clubhouse]]></title> <link>https://thomaswilson.xyz/blog/2020-02-20-opinions-from-48hr-on-clubhouse</link> <guid>https://thomaswilson.xyz/blog/2020-02-20-opinions-from-48hr-on-clubhouse</guid> <pubDate>Sat, 20 Feb 2021 00:00:00 GMT</pubDate> <description><![CDATA[<p>Clubhouse is a new audio social network platform for iOS. It's basically like having a moderated voice-only Zoom call. The entire network is largely three entities:</p> <ol> <li><strong>Users</strong>: Human beings who use the app. Clubhouse have taken a pretty hard line on non-human (e.g. business) accounts.</li> <li><strong>Rooms</strong>: Pre-scheduled or impromptu virtual rooms that users can go in. Rooms are where the conversation happens. Only users on the stage can speak to the room. One or many people can be speaking in a room at any one time. Rooms are moderated by a user, who can add or remove users from the stage. Their role is to keep the conversation on track and civil. Everyone else in the room can hear the person/people speaking on the stage. If you're not on the stage, you can't be heard.</li> <li><strong>Clubs</strong>: Are groups of users. They're like Facebook groups or group DMs.</li> </ol> <p>For the past couple of days I've been dipping into some clubhouse rooms. I've heard discussions on sustainability between small UK businesses, startup advice for new founders, large investors talking about the ecosystem, hiring fairs, language learning, news discussion, and random chats.</p> <p>The audio-only format is interesting and unique. It's part podcast, part zoom call, part audio-only Twitter thread. I have really enjoyed the relaxed, low-effort format of this. It feels alive and human, but maybe that's my socially-deprived Covid brain talking. I've been very impressed by people's civility (it is indeed still early days and invite only), and I've seen moderators do a good job of keeping people on topic, and stopping spam. I do worry that there's potential for spam and un-civility.</p> <p>I don't know where this new audio-only format, or Clubhouse specifically is headed. It may very well be a flash in the pan.</p> <p>I have been <em>so</em> impressed by people's generosity. People have offered sincere and useful advice to startup founders, posed interesting questions, and disagreed with (at least some) civility and generosity.</p> <p>I wonder how much of this is because the format is new and the audience is self-selecting. I think there <em>is</em> something about the medium:</p> <ol> <li><strong>It's engaging</strong>: Humans are social creatures. We're wired to like the sound of conversations and storytelling. It's how we learn and remember a lot of information. Having the voice of the person making the statement, and not a plaintext tweet (and maybe gif or emoji) does draw attention, and is just easier to interpret.</li> <li><strong>It's low activation energy</strong>: Having a conversation is the natural and easy thing in the world, so I think people are willing to give more, and more detailed, information. You can't stop to double-check and research (and you're not expected to), and you're not backspacing over your replies to make</li> <li><strong>It's synchronous</strong>: Twitter, Instagram, and Tik Tok will always bet here with content to present you when you're back. If you miss something on Clubhouse it's gone. When life returns to not-lockdown, this might be incredibly impractical. For the now, a world without meet-ups and informal gatherings, it does a surprisingly good job of re-creating these feelings.</li> <li><strong>It can be on in the background</strong>: If I'm working on something monotonous which requires my attention sometimes but not always (re-plotting plants, inbox clearing, unclogging my shower drain) Clubhouse has been great to have on the background. My previous go-to here would be Podcasts, but I've become increasingly selective about what I'm listening to and why. There isn't that pressure with Clubhouse.</li> </ol> <p>I'm interested to see where this goes. It does have the feel of a side hustle. It's not low maintenance like Tik Tok or Instagram - they'll put videos in front of you and just ask you to swipe up and down. Will it become like LinkedIn, or will it become something a bit freer? Is it the right time for audio social media, is it even a good idea? Vine failed in the 2010's but TikTok is bloody huge now.</p> <p>With everything, it comes down the quality of the content. That requires there to be excellent club and room moderation tools. If the team want growth, they'll need to work on discoverability: finding people, clubs, and rooms with certain areas needs to be easier.</p> <p>I've been doing this for two days, so I'm sort of an expert.</p>]]></description> </item> <item> <title><![CDATA[Things I learned this week #29]]></title> <link>https://thomaswilson.xyz/blog/2021-02-26-things-i-learned-29</link> <guid>https://thomaswilson.xyz/blog/2021-02-26-things-i-learned-29</guid> <pubDate>Fri, 26 Feb 2021 00:00:00 GMT</pubDate> <description><![CDATA[<ul> <li><strong>This lineage of cats</strong>: Chartwell House, in Kent, England, was the home of Winston Churchill. It's now owned and operated by the National Trust, a British institution, allowing visitors to see the gardens and houses. During Churchill's life, he had a marmalade (white and ginger) cat, called Jock. A few months after Chartwell House was handed over to the National Trust by the Churchill family, the family made the request that there always be a marmalade cat with a white bib and four ginger paws. Presently, Jock VII (<a href="https://nt.global.ssl.fastly.net/images/1431875523698-8.jpg&crop=16:7">picture</a>) reigns the house, while Jock VI (<a href="https://nt.global.ssl.fastly.net/images/1431772588870-jock-on-steps-website-size.jpg&crop=16:7">picture</a>) is living in a peaceful retirement with one of the house's staff. The public life wasn't befitting the older gentleman, so the sprightly Jock VII has taken the public-facing duties, allowing his predecessor to take the rest he deserves. (<a href="https://www.nationaltrust.org.uk/chartwell/features/jock-vii-of-chartwell">source</a>)</li> <li><strong>This fact about smartphones</strong>: Smartphones are hella distracting, y'all. Over the past couple of weeks, I've been making a special effort to reduce how much I allow myself to be distracted during work (and other time). We all know that deep work requires uninterrupted time and concentration but that's so... boring. So not fun. And our phones <em>really</em> want our attention. Or to be more accurate, some of the biggest and richest companies in the world are employing some of the cleverest people alive to make us want to spend more of our time, more often, on apps and platforms. And it's working, Instagram is very relatable. In some research which examined the effect of even being <em>near</em> your phone, the researchers found a 10% reduction on working memory (i.e. how many things can you hold in your immediate attention and memory) and Fluid Intelligence (your ability to solve novel problems, independent of previously acquired skills). This was when the participants left their phone in their bag, and were uninterrupted by it, compared to when they were asked to leave it in another room. (<a href="https://www.sciencedaily.com/releases/2017/06/170623133039.htm">Summary link</a> and DOI: 10.1086/691462)</li> <li><strong>This board game</strong>: CoraQuest is an adorable co-op fantasy tabletop game for up to four people. It was created by a father-and-daughter duo Dan and eight-year-old Cora during the Covid lockdown in the UK. It initially started as a homework project, which allowed Dan to encourage his daughter to do art, creative writing, maths, and computing but evolved into a fully fledged game. If I can step in here a minute and preach the importance of project-based learning... guys it's important and it's practically the only kind of learning we do once we leave school so why is it never really done in school? Dan, who has been a gamer and D&D enthusiast, was able to offer support and guidance to the team, and shared it with other play testers and families during the development. Both families and other game developers ended up pitching in advice, feedback, and even some artistic assets. How encouraging this must have been for Cora! The end result to all this is a Kickstarter campaign which raised £130,000 more than its £12k target, being supported from over 5,000 individuals. This is such a wholesome story, my goodness. (<a href="https://www.dicebreaker.com/games/coraquest/news/coraquest-board-game-kickstarter">source</a>)</li> <li><strong>This fourteenth century witchcraft accusation</strong>: Alice Kyteler was the first person in Ireland to be condemned of Witchcraft. The accusations against Alice ran from spiritual (denying the Christian faith and attempting to overpower the church) to corporal (murdering three husbands) to somewhere in between (having a sexual affair with a demon). I'm actually pretty sad Kyteler didn't leave a memoire behind. Alice's only real sin seems to be a particular taste in men, specifically rich money lenders: she just kept marrying them until they died. Which they did, three times with three separate men. And then she'd marry another one (who also died, more likely than not). What I will say is that at some point around the untimely death of your second and very rich husband, people are going to start getting suspicious. Especially in small town Ireland in the the 1320s. By the time her fourth husband started falling ill, people were pretty suspicious and so naturally accused her of witchcraft. Nothing so fortunate may happen to a woman who is not a witch, so the church said. What followed was a protracted and political attempt to convict Kyteler. Given that she had become so socially prominent (and rich, because of those dead husbands), accusing her and taking her in for questioning was a very difficult affair. Like impeaching someone. The bishop in charge of convicting her was waylaid and even imprisoned while he tried to make the formal accusations. Say what you like about Kyteler (like "this woman is trying to corrupt good Christian men by selling them love and hate potions", true story) but she wasn't a powerless fool. After several months, the church kidnapped and tortured one of Kyteler's servants (Petronilla de Meath), who confessed to witchcraft and implicated Kyteler in the acts. Let's not ask how using torture to extract (almost certainly fake) confessions gives you the moral upper hand. It was a simpler time. Kyteler high-tailed it out of the historical records after that, so it was likely that she was never caught. If she was captured and killed the church would have gloated all over the historical record. She may have fled to England, what a story! (<a href="https://en.wikipedia.org/wiki/Alice_Kyteler">source</a>)</li> </ul> <h2>What I've Had on Rotation</h2> <ul> <li><strong>Something New</strong> <em>Super Monster</em> by Claud (2021, Pop). I don't know where this new wave of pop has come from. I'd like to say Covid's had us all making music in our bedrooms for the past year but I think we're starting to hear from people who've been making music in the bedroom for the last 4-5 years. Gen Z. I'm talking about Gen Z. I'm new to Claud, their music has a fresh light pop vibe, which is great as we're coming into spring. They're also signed to Phoebe Bridger's Saddest Factory record label, which is a good thumbs up for me. (<a href="https://songwhip.com/claud-3/super-monster">links</a>)</li> <li><strong>Something Old</strong> <em>Poverty's Paradise</em> by Naughty by Nature (1995, Hip Hop). It's old school hip hop, and the intro skit track starts with the sound of a live crowd which we all miss. It even gets better from there, which is great too. This is a real '90s New York Hip Hop vibe, drum machines, reverb, and Nas-style horn sample sequences. They rhyme "everybaaaaady" with "paaaaaahrdy" and tell you to clap your hands but still have a gritty quality to them. (<a href="https://songwhip.com/naughty-by-nature/povertys-paradise">links</a>)</li> </ul> <h2>Cool Articles</h2> <ul> <li><a href="https://twitter.com/weetabix/status/1359074254789165059?s=20">This tweet from weetabix</a>. A light-hearted tweet that I think did the rounds a few weeks ago. Truly horrifying, I'm not okay.</li> <li><a href="https://thistooshallgrow.com/blog/mindful-notifications/">Shit's Broken: Why we need mindful notification and how to design them</a> by Clo S for <em>This Too Shall Grow</em>. The attention economy is a good way to think about, and make better decisions in, the modern world. It's easy to forget about because people and companies are designing things to stop you thinking about it. Sorry to get all tinfoil hat here. This article was a nice reminder about understanding what is important when all our apps and platforms are telling us that they alone are important. I particularly like this quote from Clo, which I think summarises the problem nicely: "the LinkedIn announcement that someone you don't know started a new job, are given the same importance as an email from your client saying they accepted your budget". The author goes on to talk about how you can just go ahead and turn off anything that isn't important. And if you're involved in making products, design <em>mindful notifications</em> that align the urgency and prominence of a notification with that of its content.</li> </ul> <h2>Fun Things</h2> <ul> <li><a href="http://imissmybar.com/?utm_source=densediscovery&utm_medium=email&utm_campaign=newsletter-issue-126">I Miss my Bar</a>. It's a dark-noise style machine but with bar sounds. Put it on and pretend you're outside your own house.</li> </ul>]]></description> </item> <item> <title><![CDATA[How to run Xcode tests for a SwiftUI iOS codebase with GitHub Actions]]></title> <link>https://thomaswilson.xyz/blog/2021-02-27-github-actions-xcode-tests</link> <guid>https://thomaswilson.xyz/blog/2021-02-27-github-actions-xcode-tests</guid> <pubDate>Sat, 27 Feb 2021 00:00:00 GMT</pubDate> <description><![CDATA[<p>Tl;dr</p> <ol> <li>Make sure you've got a repo on GitHub.</li> <li>Make sure you've got at least one set of tests in your Xcode codebase.</li> <li>Create the file below in <code>yourproject/.github/workflows/main.yml</code>:</li> <li>Replace the <code>yourproject</code>s and <code>YourProject</code>s with your file name</li> <li><code>git add .github/workflows/main.yml && git commit -m "Add test GitHub action" && git push</code></li> </ol> <pre><code class="language-yml"># Run My App's tests whenever someone pushes to `main` or creates a PR into `main` name: CI on: # Triggers the workflow on push or pull request events but only for the main branch. push: branches: [ main ] pull_request: branches: [ main ] # We're only going to have one job, `test` but you can add this jobs: test: runs-on: macOS-latest steps: # Checkout the code to the working directory - uses: actions/checkout@v2 # Install xcbeautify so the logs are human-friendly - name: install xcbeautify run: brew install xcbeautify # Run the tests - name: Run the xcode tests run: xcodebuild clean test -project YourProject.xcodeproj -scheme YourProject -destination "platform=iOS Simulator,name=iPhone 12" | xcbeautify </code></pre> <h2>What are Github Actions</h2> <p>They're bits of code you write which are executed whenever <em>something</em> happens on your GitHub repo. These bits of code can do whatever (they're just functions that run on a container), like:</p> <ol> <li>Run the tests in your repo (what we'll be doing today)</li> <li>Build an artefact from source code then publish that to a directory</li> <li>Send out an e-mail or hit a web-hook whenever something happens</li> <li>Build your static site and upload it to S3, GitHub pages, or wherever.</li> </ol> <p>If you've used other tools, GitHub actions are like TeamCity, CircleCI, Jenkins, or any other CI/CD pipeline tool, but built right into GitHub. If you've not heard of, or used those tools, <a href="#do-it-locally">I explain a bit more about it below</a>.</p> <h2>The working parts</h2> <p>We don't actually write "actions", we write <strong>workflows</strong>, which contain one or more <strong>jobs</strong>, which contain one or more <strong>steps</strong>.</p> <p>The details for a single workflow is written in <a href="https://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html">yaml</a>, as common plaintext format used by a lot of DevOps tools.</p> <p>We put the yaml file in <code>yourproject/.github/workflows/workflow-name.yml</code> where <code>yourproject</code> is the root directory of your project and <code>workflow-name</code> is the name you wish to give the workflow.</p> <p>There are three root-level yaml properties we're going to set:</p> <ol> <li><code>name</code> Is the human-readable name for the entire workflow. Call this "CI" or "Run all tests" or "Send e-mail".</li> <li><code>on</code> configures what exactly needs to happen for this workflow to run. By default, every job and step will run on every event.</li> <li><code>jobs</code> Is a list of the jobs we'll be doing. In this example there's just one: running the tests</li> </ol> <pre><code class="language-yaml">name: CI on: # Triggers the workflow on push or pull request events but only for the main branch. push: branches: [main] pull_request: branches: [main] jobs: test: runs-on: macOS-latest </code></pre> <p>Not how we're telling the <code>test</code> job that we're going to run on <code>macOS-latest</code>. Github gets us a container running that environment, which is cool.</p> <h3>Checking out the code so we can access it in our tests</h3> <p>By default, a job in a GitHub action just gives us an empty container, so we need to tell it to copy the code into our current working directory.</p> <p>There's an easy way to do that: the <code>checkout</code> action is a third-party GitHub action that checks out our current working branch to the current working directory. <a href="https://github.com/actions/checkout">Here are the Checkout docs</a>.</p> <p>By adding the following we make sure we have access to our code:</p> <pre><code class="language-yaml">jobs: test: runs-on: macOS-latest steps: # Checkout the code to the working directory - uses: actions/checkout@v2 </code></pre> <h3>Installing xcbeautify</h3> <p>The default Xcode logs are horrible: they're verbose and unintelligible. Xcbeautify is a CLI tool that formats them to give us more readable useful information.</p> <p>Luckily the <code>macOS-latest</code> platform comes with homebrew, the MacOS package manager, already installed, so we just need to tell our <code>test</code> job to install it:</p> <pre><code class="language-yaml">jobs: test: runs-on: macOS-latest steps: # Checkout the code to the working directory - uses: actions/checkout@v2 - name: Install xcbeautify run: brew install xcbeautify </code></pre> <p>This step in our job has two things:</p> <ol> <li><code>name</code> is a human-readable name, useful for us and the UI in GitHub</li> <li><code>run</code> is the thing you want to type onto the CLI. When that's done, the job will move on to the next step</li> </ol> <h3>Run the Test</h3> <p>The last step in the job is to run the tests using the <code>xcodebuild</code> CLI tool. This is actually pretty easy and simple, just make sure you clean-up the names and details in the script below.</p> <p>Node how we're <strong>piping</strong> (i.e. the <code>|</code> character) the results from <code>xcodebuild</code> through the <code>xcbeautiful</code> command. That's a unix-ism, it's pretty powerful (or so I'm told, I'm just a frontend engineer here).</p> <pre><code class="language-yaml">jobs: test: runs-on: macOS-latest steps: # Checkout the code to the working directory - uses: actions/checkout@v2 # Install xcbeautify so the logs are human-friendly - name: install xcbeautify run: brew install xcbeautify # Run the tests - name: Run the xcode tests run: xcodebuild clean test -project YourProject.xcodeproj -scheme YourProject -destination "platform=iOS Simulator,name=iPhone 12" | xcbeautify </code></pre> <h3>Commit, baby</h3> <p>You're good to go, let's add the file we made to our git repo, make a single commit and push it up <code>git add .github/workflows/main.yml && git commit -m "Add test GitHub action" && git push</code></p> <p>(We're assuming the <code>main.yml</code> file is the one you made, if you called it something different, change that).</p> <h3>Go check GitHub</h3> <p>Go to your GitHub repo, click the "Actions" tab, and watch with glee.</p> <h2 id="do-it-locally">Why can't I just run these things locally?</h2> <p>You can. If you already know why, you can skip this section.</p> <p>I come from a frontend engineering background, where having test coverage has typically been difficult or different to the backend world. So answering this question is as much about learning facts/words as it is about understanding that the software design, development, and deploy process can be different. I know. I'm sure some engineers are tutting or shaking their heads at me. TUT AWAY, FRIENDS I'm standing in my truth here.</p> <p>GitHub's actions are part of a broader practice of CI/CD (continuous integration and delivery) in software. The idea of CI/CD is to commit code frequently, and have automated processes in place to detect the introduction of errors to the codebase.</p> <p>CI/CD can also automate any other previously manual processes, like building, deploying, or publishing software. The roles of CI/CD and automation can grow and expand as your team or product become more complicated. In this example we're just using it to run tests because <strong>well written tests give you confidence that your code does what you think it does</strong>.</p> <p>As teams grow, having actions run automatically means that institutional and team policies (like having all tests pass before anything goes into <code>main</code>, formatting code, running a smoke-test before publish) are adhered to without manual intervention. This reduces the barrier to actually publishing code.</p> <p>Integrating the CI/CD pipeline right where your code is hosted is different to having a third-party service watch your git repo. It's first-party and also probably cheaper (maybe).</p> <p>GitHub actions are versatile "something" that triggers these bits of code to run can be:</p> <ol> <li>Someone pushes to your <code>main</code> branch</li> <li>Someone opens, closes, or comments on an issue</li> <li>Someone creates a PR from any branch to any branch</li> </ol> <p>For a full list, see Github's <a href="https://docs.github.com/en/actions/reference/events-that-trigger-workflows">full list of events</a> that can trigger a workflow.</p>]]></description> </item> <item> <title><![CDATA[Things I learned this week #30]]></title> <link>https://thomaswilson.xyz/blog/2021-03-03-things-i-learned-30</link> <guid>https://thomaswilson.xyz/blog/2021-03-03-things-i-learned-30</guid> <pubDate>Wed, 03 Mar 2021 00:00:00 GMT</pubDate> <description><![CDATA[<ul> <li><strong>These no longer fictional bridges</strong>: You know the bridges on the Euro notes? There are seven of them total (notes and bridges) which represent seven different architectural styles. They were originally designed in 2002 and were (at the time) fictitious bridges which didn't exist anywhere - so that no country felt special or left out. Robin Stam, an architect from the Netherlands, has gone ahead and designed and built them all irl, for cyclists to use. The money willed these bridges into existence, which is cool. <a href="https://www.atlasobscura.com/places/euro-banknote-bridges">source</a></li> <li><strong>This mis-attributed quotes on 2021 coins</strong>: The Royal Mint is releasing a set of £2 and 50 pence pieces in 2021 with quotes from Lewis Carol's famous <em>Alice in Wonderland</em>. It turns out that the people who chose the quotes didn't check their sources, and ended up using quotes from adaptations and derived work. They went onto Goodreads and copy-pasted, so from what I can tell The Royal Mint is run by thirteen year olds who left their homework until the last minute. I support the notion that we should never let a fact get in the way of a good story, so I think this is marvellous on one level. Maybe it'll be like the bridges and a Dutch architect will come and re-write Lewis' work for us. There you go, there's your coin trivia and your callback gag - this one's a twofer. (<a href="https://www.theguardian.com/books/booksblog/2021/mar/01/off-with-their-heads-why-are-lewis-carroll-misquotes-so-common-online">source</a>)</li> <li><strong>This Geocache</strong>: I know about geocaching, but I don't <em>know</em> about geocaching. I don't get it. The idea is simple: hide something somewhere (public or out of the way), then tell a select few people on the internet where to find it. You can also go find the things that people have hidden. It's like Pokémon Go but with real things (lame). One of the engineers who worked with the Perseverance rover (who has now landed safely on Mars, which is pretty cool) is into geocaching. As an homage to this, the team have printed a Geocaching tag (like a unique identifier) on the calibrating tools for the rover's equipment. When Perseverance gets to mars, it will take a picture of this equipment and send it back to earth - and that's the code people can use to tag/find/achieve (I don't know the lingo, sorry) the little cache. The question for me is if this is still geocaching, an not marscaching (marcaching?) (<a href="https://www.geocaching.com/blog/2020/07/geocaching-and-nasa-head-to-mars-with-the-perseverance-rover/">source</a>)</li> <li><strong>This heartening panic fact</strong>: Although mass panic and hysteria <em>did</em> define the early reaction to the Covid-19 pandemic, at least in the UK (couldn't get flour or toilette paper anywhere), panic isn't actually the common or expected response to disasters. It's fun to stereotype and be pessimistic but the social normals that have emerged during Covid have been around patience, space, and understanding. The language we use can be direct (there is a pandemic wear a mask) or indirect (things are tough at the moment), but these qualifiers are normally followed with "so let's do something good". Yeah, we all get a bit annoyed sometimes and some people can't seem to understand making the slighted accommodation for others, but if you think about it - we've done an alright job (except for the bit where we caused and then did not contain a pandemic). The interesting question here is actually why people act so generously, cooperatively, and altruistic during a disaster (like a pandemic, fire, or other natural disaster). From a purely game-theory perspective, acting in your own self interest during a crisis or resource shortage <em>does</em> make the most sense. Social creatures that we are, we're likely to copy these behaviours when we see then, but why are these norms short lived, not sustained? That's the interesting research angle from this crisis, I think. (<a href="https://www.nature.com/articles/s41562-020-0884-z.#Sec7">source</a>)</li> </ul> <h2>What I've Had on Rotation</h2> <ul> <li><strong>Something New</strong>: <em>Bach: The Cello Suites - Recomposed by Peter Gregson</em> by, err Peter Gregson (2018, Classical). Bach wrote some banging cello suites, you definitely recognise Cello Suite 1 (famously in G Major). Gregson takes on the ambitious task of reinterpreting Bach's cello suites, and I don't know enough to explain why, but this album is stunning. It feels fuller, more harmonic, and less performative than the originals. Where the originals might be a spectacle, this album is immersive and surrounds me when I'm listening. It's a good album to write to, and also a wonderful way to justify any expensive headphones or speakers you've bought yourself. (<a href="https://songwhip.com/peter-gregson/bach-the-cello-suites-recomposed-by-peter-gregson">links</a>)</li> <li><strong>Something Old</strong> <em>10 Things I Hate About You Soundtrack</em> various artists (1999, rock?). I recently re-watched <em>10 Things</em> which is genuinely a really good film and everyone should (re)watch it. I was taken by much I loved the rocky soundtrack. Ugh, Barenaked Ladies, Spiderbait, Letters to Cleo... it's nostalgic and grungy. Just listen to it (<a href="https://open.spotify.com/playlist/1nEkyAwvRpjWeCTl1Vdn0x?si=fpnAu3J5TiGkSm_dcLeHDA">Spotify playlist</a> and <a href="https://www.youtube.com/watch?v=4fYAy7CLj0c&list=PL5CF9943C2ACF125B">YouTube Playlist</a>)</li> </ul> <h2>Cool Articles</h2> <ul> <li><a href="https://www.youtube.com/watch?v=1Evwgu369Jw">Brené Brown on Empathy</a> (VIDEO). A really nicely illustrated reminder about empathy. A little ABC but also a good thing to be aware of. Be kind, y'all.</li> <li><a href="http://www.paulgraham.com/taste.html">Taste for Makers</a> by Paul Graham (San Francisco and Silicon Valley darling). I've been asking the questions "how do I design a good product" lately. It's a hard question to answer, and one of the fundamental (but un-actionable) points is about taste. Ira Glass' famous quote <a href="https://www.thisamericanlife.org/extras/the-gap">The Gap</a> covers similar ground.</li> </ul> <h2>Cool Things</h2> <ul> <li><a href="https://doodad.dev/">doodad.dev</a>. If you're a software engineer or web design geek this is a very pleasing collection of utilities. I love the early Mac callback.</li> <li><a href="https://www.iosicongallery.com/">iOS Icon Gallery</a>. A collection of iOS App Icons, for design inspiration or general perusing. Some of them are very pleasing.</li> </ul>]]></description> </item> <item> <title><![CDATA[The Frustrating Mismatch of Design by User Journey but Build with Components ]]></title> <link>https://thomaswilson.xyz/blog/2021-03-06-design-workflow-build-components</link> <guid>https://thomaswilson.xyz/blog/2021-03-06-design-workflow-build-components</guid> <pubDate>Sat, 06 Mar 2021 00:00:00 GMT</pubDate> <description><![CDATA[<p>How do you design a good app?</p> <p>It's a charmingly amateurish question, but I've spent the past five years primarily trying to design and build web apps and I don't know the answer.</p> <p>I regularly get sick of looking at my current and old designs and ask "why don't these look like a competent adult made them, and can I make them actually good?". I'll typically then do two things:</p> <ol> <li>Go to Dribbble and meander around until I find things that look vaguely like what I want and then get frustrated that these mockups are so simplified and informationally un-dense they're only partly applicable to my current situations, and</li> <li>Do a web search for "how to design good UI", then get given countless "seven tips to improve your UIs" and "UX fundamentals for UI design" that will tell me that a UI is basically just colour, spacing, and typography which, yeah true, but is incredibly unhelpful in the abstract.</li> </ol> <p>These are two vastly different types of data: one is a finished product for an often fictional or simplified use case, and the other are abstract design principles. Mushing those things together to understand, critique, and then be able to produce your own design <em>is</em> the skill of becoming a better designer. It's not intuitive or easy and you can't just search for the answer on the internet.</p> <h2>Build in Components</h2> <p>But as an engineer I want to, because that's how I find a <em>lot</em> of my answers. That and doing it wrong the first time.</p> <p>Being an engineer I build web, and more recently mobile, interfaces. Both of these technologies have been moving towards the component-model: building self-contained little <em>things</em> or <em>widgets</em> that are composed together to make bigger things, like screens and applications. React, Vue, Svelte, and Angular all use this model. SwiftUI introduced it for iOS and Swift, and Jetpack Compose (seems) to do the same for Android and Kotlin.</p> <p>This component model is declarative. I'm not 100% convinced I actually know what <em>declarative</em> means because I am not a clever man, but broadly I think of it as <code>f(state) => ui</code> - which is to say that the UI is a function of state. Given some data, this is what the UI will look like. You get to say "when the data looks like this, do that with it". For example if an item in a list is selected, make sure this text is underlined, or this string in the cart should be the total cost of every item in the cart with the <code>£</code> character put in front of it.</p> <p>Components as a first class citizen in building UIs lends itself really well to encapsulation: a component should care only about the data that it needs to present information to the user, and contains the complexities of any internal interactions or logic. It doesn't need to be aware of anything else.</p> <p>Let's illustrate this with a button (I'm sorry, I know it's tired and over-worked, but it's simple). Imagine we have a Button component that only takes two bits of data (like a prop, or an input, or an argument): a <code>label</code>, the text that goes in the button, and an <code>onClick</code> function to describe what happens when a user presses/clicks the button. The benefits of encapsulation work for everyone:</p> <ol> <li>The button only has to do what it needs to do. It doesn't care if a label comes from an internationalisation (i18n) file, a database, or generated dynamically when the user does something (like added above £100 worth of products to their cart).</li> <li>The page / larger component (like a molecule in Atomic Design) doesn't need to contain boilerplate code about rendering and event-handling for buttons. If I had four buttons on a screen (which, let's just be clear, <em>would</em> be madness) the page they're on doesn't need to worry about anything but finding a label and an event handler.</li> </ol> <p>These are really great benefits for the engineers building UIs and web software. They can make code easier to understand, more consistent throughout the codebase, and more separated. These are not guaranteed (I can make any code into spaghetti, honestly it's a super power) but they are easier to achieve with this component-first idea of software architecture.</p> <h2>Design in User Journeys</h2> <p>But that's not how the user of a UI thinks about buttons at all. Nor is it helpful when you're trying to design your app. The buttons on a screen let our users, guests, customers, patients, staff, <em>whoever</em> achieve something. And as a designer thinking about the specifics of the button is part of the job, but it can't be done in isolation to every other part of the web page.</p> <p>It's so easy to find good advice on building components in code. There are tricky conversations to be had about them, about how to extend them and manage them as the complexity grows, but that advice is pretty specific and concrete. It is so much harder to get someone's opinion on figuring out how a button integrates with the Sign Up page, a "buy now" button on a product card, a "add two factor authentication" button, or a "request help" button. These are questions about the purpose and intention of the app you are building.</p> <p>We are taught to build at the focused and specific level of components, but to design with with <em>so much more</em> information in our working memory. What screen am I on, how did I get here, and where can I go? How do I know if my data is saved or (in)valid? What does it look like if I'm browsing versus editing? If these questions aren't answered properly it creates this weird jilted UI and UX experience as I move around a product. Seeing a mocked up screenshot from a single state of a single page on Dribbble is never going to help me answer these questions, no matter how pleasing the curves, shadow, and pastel colours.</p> <h2>The Frustration</h2> <p>I have experienced (and witnessed) the bike shedding meets deer-in-the-headlights moment of designing a new app or website where you're terrified to make decisions about the label placement on your forms. It genuinely stops me from making decisions and moving forward, especially at the beginning, when your app is an idea and a mostly blank Figma file.</p> <p>The form inputs aren't important, but they are when they represent 50% of the screens you have currently designed. I have been terrified to move on from designing my sign up screen until I have perfected the form and form input components. Because I was so aware that they're components: they'll be used everywhere. They are perfect lego blocks and if I get them wrong here <em>everything</em> will look terrible.</p> <p>My fixation (or obsession) with designing by components has limited my ability to focus on anything bigger. But as a user, my fixation on the flow through an application will stop me noticing anything smaller. Yeah, the onboarding was confusing, and I can't figure out how to access my profile page but <em>holy smokes</em> have you seen the border radius on the cards and the top navigation? They match perfectly!</p> <p>No matter how perfect your button is, it's not going to salvage an app with competing or confusing Calls to Action, with disjointed screen layouts, mixed metaphors, or obscured ideas. Similarly, the UX conventions of colour, spacing, and typography won't help you answer these questions. Yet if you don't build a system around these basic elements, the visual clarity and rhythm of your UI as a whole <em>will</em> suffer.</p> <p>Similarly, if you don't build your codebase with well encapsulated components, you're going to have a real hard time modifying and extending your app's code.</p> <p>Designing an app demands that we ask questions about the app, not the components, that we see the entire blueprint. Building components demands we exclude all thoughts about the app at large and focus solely on this little corner, this one detail. This is the titular frustration of having to build in components, but design by user journey and flow.</p> <p>That's it. That's the end of the article and I'm sorry I can't close with a unifying theory, or three step framework to build perfect UIs every time. I just want to build actually good apps, and it's difficult, ya know? The context switching between design and developer brain is hard.</p>]]></description> </item> <item> <title><![CDATA[Things I learned this week #31]]></title> <link>https://thomaswilson.xyz/blog/2021-03-13-things-i-learned-31</link> <guid>https://thomaswilson.xyz/blog/2021-03-13-things-i-learned-31</guid> <pubDate>Sat, 13 Mar 2021 00:00:00 GMT</pubDate> <description><![CDATA[<p>This week we celebrated International Women's Day. My love and support goes out to anyone who identifies with that label. Let's keep pushing for fair representation and pay, acknowledgement of domestic labour as work, and maybe some systemic government-backed support for domestic abuse victims and sex workers that doesn't involve the police where it's not necessary. Anyway, here's a funny <a href="https://www.youtube.com/watch?v=o3XxRrfoPYE">a bit by Iliza Shlesinger</a> that I love.</p> <ul> <li><strong>This hijab-wearing model</strong>: Halima Aden is a Somali-American model who first came into popular attention, aged 19, in 2017 when she walked at an event for Kanye West's <em>Yeezy</em> brand. She also won Miss Minnesota, and was the first hijab-wearing woman to do so. She was described as a "different beauty" and honestly, it's <a href="https://duckduckgo.com/?q=Halima+Aden&t=h_&iax=images&ia=images">easy to see why</a>. Earlier this year, Aden announced that she would be leaving the fashion industry after feeling like she was compromising her religious beliefs. Aden represented the figure head of "Modest Fashion", a recent movement by western fashion labels to design looser fits and bigger silhouettes, in line with some cultures' expectations of modesty in the way (mostly women) dress. There's a pretty difficult conversation to be had here about the western/European/American perception of modesty as oppression, and the religious foundation of modesty. Fundamentally though a woman (and any person) should be able to chose what they wear and how they would like to show/cover their body. That just seems like a human right. Aden is a cool example because she's standing by her beliefs, despite the success she was seeking and following (almost 1.5m followers on the 'gram). As a younger, and newer model, in a famously cut-throat and often problematic industry, it can't be easy to make those decisions, or to speak out. Good on you, Halima. (<a href="https://www.theguardian.com/fashion/2021/mar/04/the-pressure-is-to-appear-normal-the-crisis-in-modest-fashion">source</a>)</li> <li><strong>This reason to stop talking</strong>: I'm sure many other introverts can relate to the scenario: you're talking with someone you don't know particularly well, or maybe professionally, and there's a little voice in your head that's like "dude why are you still talking?". Well I hate to feed your insecurities but that voice has a point, y'all. In some research involving 252 strangers who were paired up randomly to talk (they were given some task to complete but told that they can chat for as long as they want before they started), a Harvard study found that only 2% of couples both agreed that the conversation was the right length. That's like two of the 126 couples. 69% of participants wanted the conversation to be shorter (preach, sis), and said that the conversation could have been about half the length. My advice from this research: wait until your new conversation partner is half way through a sentence and stand (if you're standing, try crouching suddenly) and say that it's been fun chatting but you don't want to bore them. In earnest though, don't be afraid to cut a conversation short if you feel it's dragging: the feeling might be mutual. (<a href="https://www.sciencemag.org/news/2021/03/when-should-you-end-conversation-probably-sooner-you-think">source</a>)</li> <li><strong>This reason to not give anyone any certificates</strong>: You can be motivated by two types of influences: internal or external. Internal motivations are ones you make yourself: you want to do something because you enjoy it. External rewards are given to you by others: you want to do something because you'll get paid, or get an award. Internal motivators are stronger that external ones, the presence or expectation of an external validation (like a certificate) isn't enough to make us want to do something as much as if we ourselves decided we wanted to do it. The distinction between these two things isn't clean, in turns out. By providing an external reward for a behaviour, even if it wasn't expected or explicitly stated, you can reduce someone's intrinsic motivation for that thing. In one study, children were asked to pick any activity they wished (like colouring in), and were later given a reward for it (a certificate with a gold seal and a bit of ribbon). After doing so, children were less likely to chose that activity freely (i.e. without expectation of an external reward). As one 1999 meta anlysis states, "even when tangible rewards are offered as indication of good performance", they typically decrease intrinsic motivation for interesting activities". Given how powerful internal motivations are in allowing us to live a fulfilled life, the authors suggest instead focusing on highlighting how completing or performing a task helps us feel fulfilled. Reminding someone of how they felt during, or after a task, for example. This is an almost counter-intuitive way of thinking about things, we're so keen to give feedback and praise and recognition (and scholarships and grants and jobs), where this could be damaging the processes that actually go into the performance. (<a href="https://pubmed.ncbi.nlm.nih.gov/10589297/">source</a>)</li> </ul> <h2>What I've had on rotation</h2> <ul> <li><strong>Something New</strong>: <em>Organ</em> by Dimension (EDM, 2021). This is a safe space and I need to not be judged. This is a pretty four-on-the-flour Electronic/House/DnB album which I just love. It's perfect for running and cycle training at the moment, especially as I'm trying to shed the sludge that comes from winter and my complete inability to resist Christmas chocolates and sweets. It's got that old 2007 Pendulum vibe that I remember listening to on my first MP3 players. (<a href="https://songwhip.com/dimension/organ">link</a>)</li> <li><strong>Something Old</strong>: <em>Temple</em> by Matthew And the Atlas (Folk, 2016). Matt Hegarty, the lead singer of this band, has a distinct voice with a lovely tomber. Hearing this album again brings me right back to 2016, and writing my Ph.D. There's also an unplugged/acoustic rendition of this album available, which I recommend heartily. They're a great mix of indie rock and folk, and the sister acoustic album means that it can fit every mood. (<a href="https://songwhip.com/matthewandtheatlas/temple">links</a>)</li> </ul> <h2>Cool Articles</h2> <ul> <li><a href="https://www.swiftjectivec.com/things-i-made-that-sucked/">Things I Made that Sucked</a> by Jordan Morgan. This little self-critique <em>slash</em> reflection from someone who's designed and built indie apps for a while is nice. It doesn't take itself too seriously, and isn't preachy, it feels honest. If you're a maker of anything, you too have made things that suck, and I like that articles, like this, can normalise things like that.</li> <li><a href="https://www.theatlantic.com/family/archive/2021/01/checklist-achievements-happiness-boxes/617756/">Stop Keeping Score</a> by Arthur C Brooks for <em>The Atlantic</em>. A nice short piece by Brooks which reminds us that we don't have to achieve our "30 things before 30" lists. A fact I find heartening because I've only got ten months left before I hit thirty and man this pandemic isn't going anywhere in that time. Anyway, a nice reminder that we can do our best work, be ourselves, and enjoy what we do without a prescriptive list.</li> </ul>]]></description> </item> <item> <title><![CDATA[Things I learned this week #32]]></title> <link>https://thomaswilson.xyz/blog/2021-03-20-things-i-learned-32</link> <guid>https://thomaswilson.xyz/blog/2021-03-20-things-i-learned-32</guid> <pubDate>Sat, 20 Mar 2021 00:00:00 GMT</pubDate> <description><![CDATA[<p>Following on from International Women's Day last week, news of Sarah Everard's body being discovered broke on the 10th of March, a week after she went missing from Clapham, London. There have been subsequent vigils (and protests) to remind us all that <a href="https://www.who.int/news/item/09-03-2021-devastatingly-pervasive-1-in-3-women-globally-experience-violence">violent and sexual crimes against women are under-reported and under-convicted</a>, and that any fair and just society needs to build systems that don't let people think (let alone know) that they can hurt or sexually assault another person and probably get away with it. It's a bit of a rough or tone-deaf transition, but let's look at some things I learned this week:</p> <ul> <li><strong>This charmingly pre-covid advert</strong>: I stumbled across <a href="https://preview.redd.it/7bip7x8yl5m61.jpg?width=960&crop=smart&auto=webp&s=861e8a1096d8b66130f925d70743c018b35e3afd">this advert</a> for Choices Hotels, which asked (presumably sometime in 2019) "What's your 2020 Vision". Imagine giving your 2021 answer to this question to anyone from 2019, it'd sound fifty shades of dystopian. My 2020 vision was mostly the inside of my house, and being genuinely excited when I could eat dinner outside or go for a walk (also outside). Anyway, what's your 2022 vision? Rats? Locusts? Black Mirror but it's real life? Personally, I'm hoping the dead rise and consume us all.</li> <li><strong>This surprise concert</strong>: Yo-Yo Ma, the famed American cellist, recently received the second dose of his vaccine (he's 65, which is pretty cool). He briefly set up shop in the waiting room of the vaccine centre for about 15 minutes, to play for the people waiting for their vaccines. As a classical musician, Ma has probably missed performing live to people, so I imagine this wasn't just a joy because he had received his vaccine. (<a href="https://www.youtube.com/watch?v=BWWzmha1_jE">Guardian video</a>)</li> <li><strong>This forbidden confectionary</strong>: It's illegal to buy or sell chewing gum in Singapore. You can buy prescription gum (like nicotine gum), but you have to get it from your doctor. Why is it illegal? Train vandals, that's why. In 1987, the government in Singapore funded a $5b railway system, and people kept vandalising the door sensors of these trains by sticking their gum to them. So the government looked around, at their gum covered pavements and train sensors and thought <em>enough is enough</em> and outlawed the buying and trading of chewing gum. The total ban was lifted, to allow for medical exceptions, in 1992 when Wrigley, of gum manufacturing fame, lobbied the United States government to explicitly name gum in a legal free trade agreement (the USS-FTA) between the two countries. Despite the country of Singapore having a population of some 3.2 million in 1992 (which would have been about half the population of New York City), the company defended their position. Likely because they didn't want any other country looking over at Singapore's infamously clean train sensors and asking if they should do the same. (<a href="https://en.wikipedia.org/wiki/Chewing_gum_sales_ban_in_Singapore">source</a>)</li> <li><strong>These wine merchant scales</strong>: Lord Byron was one of our first celebrities, namely a poet and a scoundrel. Byron as obsessed with his weight and would travel, sometimes multiple times a day, to Berry Bros. & Rudd, a wine merchant in Covent Garden, to use their scales to weigh himself. Berry Bros. & Rudd also happens to be the oldest wine and spirit merchant in the UK, being founded in 1698, by the way. It being the early nineteenth century these scales weren't the little box that you stand on and look down at, hope in your heart, but rather giant versions of kitchen balancing scales, used for weighing wine barrels. Byron's weight reportedly varied from around 9st to 13st, and he appeared to have yo-yo'd in weight for most of his adult life, starting at Cambridge University and up until his death (at age 36). With scales being so inaccessible, to know how much you weighed was itself a status symbol - and apparently, various members of the gentry (men and women) had their weights recorded in Berry Bros. ledger, though these records haven't all survived. (<a href="https://hekint.org/2018/10/05/lord-byron-and-his-strange-relationship-with-food/">source</a>)</li> </ul> <h2>What I've had on Rotation</h2> <ul> <li><strong>Something New</strong>: <em>Evering Road</em> by Tom Grennan (2021). Grennan's slightly gruff but clear vocals remind me of Dermot Kennedy or James Bay (in his first album). Evering Road is full of poppy ballads and I hope this comes to be one of my albums of Summer 2021. (<a href="https://songwhip.com/tom-grennan/evering-road">links</a>)</li> <li><strong>Something Old</strong>: <em>What's Going On</em> by Marvin Gaye (1971). My father actually recommended this one on his Facebook page and blog. This album is such a beautiful re-discovery, Gaye was just a talented man, the vocals, instrumentals, and production sit just right on this album. Seriously, the sax in <em>Wholy Holy</em>... my goodness. (<a href="https://songwhip.com/marvin-gaye/whatsgoingon">link</a>)</li> </ul> <h2>Cool Articles</h2> <ul> <li><a href="https://thejarren.com/group-messaging/">The Future of Group Messaging</a>. This is a really great piece about the UI and UX of modern group messaging. There's not a lot to distinguish between how we communicate these days, but various platforms bring their own ideas of what is (not) important. Some focus on instant messages (WhatsApp, iMessage), inboxes (e-mail), or group chats (Slack). Most of these paradigms result in a user experience which is either a) a 90's-style online forum, or b) iMessage/Messenger chat bubbles. These don't reflect the way we do group messages these days: where four people are having three conversations at the same time but one of them is important. As a persistent de-railer of conversations, I contribute to the chaos this post tries to solve, by arguing for a better (more first-party and actually useful) threading metaphor, to allow these conversations to happen in parallel.</li> <li><a href="https://thebulletin.org/premium/2020-12/the-edge-of-our-existence-a-particle-physicist-examines-the-architecture-of-society">The edge of our existence: A particle physicist examines the architecture of society </a>.</li> </ul>]]></description> </item> <item> <title><![CDATA[Dash Cycle #00 - The Beginning]]></title> <link>https://thomaswilson.xyz/blog/2021-03-21-dash-cycle-00-the-beginning</link> <guid>https://thomaswilson.xyz/blog/2021-03-21-dash-cycle-00-the-beginning</guid> <pubDate>Sun, 21 Mar 2021 00:00:00 GMT</pubDate> <description><![CDATA[<p>Hello. I'm building an app called Dash Dot, it's a native iOS app for interval training that is a) well-designed, and b) privacy- and utility-focused. This post covers the first (approx.) six weeks in designing and building the app.</p> <p>I've never made a truly native app before (I have written things in React Native before, though), nor have I ever successfully released a product to the world. Maybe this will be the time 🤷â€â™€ï¸</p> <p>I want to #buildinpublic so this is a proto-changelog for a product that I'm hopeful will exist one day.</p> <p><strong>Cycle?</strong> I don't like the "sprint" terminology that agile practices use to describe how features are developed. Nobody sprints all the time, that's ridiculous, and building a product is a long slow burn. Also, I don't have a product to iterate on, I'm currently working forwards from "wouldn't this be a good idea". I need longer than two-week springs to make a difference. In line with Basecamp's six-week "bets" and Linear's "cycles", I want to work in <em>cycles</em>, as in lunar cycle or life cycle: longer (six-ish) periods of work where I focus on broader goals.</p> <p>This cycle (#0) lasted seven weeks:</p> <ul> <li>Started: 2021-02-01</li> <li>Ended: 2021-03-21</li> </ul> <h2>What do I have right now ?</h2> <ul> <li><strong>An idea</strong> of what I want to build, how it offers value, and a route to monetisation</li> <li><strong>MVP Features</strong> that I want to build before I release (into Test Flight), and a rough shape for the functionality I want to add on after that.</li> <li><strong>A very messy Figma file</strong> that needs tidying up but <em>does</em> contain screens for a lot of the app: dashboards, timers, config pages, profile pages.</li> <li><strong>A working swift iOS app</strong> that lets you configure a timer and do some very primitive navigation</li> </ul> <h2>What have I done that I'm proud of?</h2> <ul> <li>Decided to make this app, don't overlook that</li> <li>Learned a <em>whole</em> lot about Swift and iOS development. I don't think I'd written any Swift code before 2021, and I've spent the past four years building predominately frontend web software in JS/TS, so I'm pretty proud of this.</li> <li>Visually designed and prototyped the principle workflow for creating a timer, completing it, and viewing your account</li> <li>Created code that travels the entire vertical stack (i.e. end-to-end) that allows a user to create, save, update, and delete a timer</li> <li>Toyed with JIRA and Linear for project management</li> </ul> <h2>What went well?</h2> <ul> <li>I actually built something, I have an idea of the product and I have the first few screens that make this a little bit closer to a reality. That's a cool feeling</li> <li>Rapid low and medium fidelity UI prototypes and iteration. I didn't waste too much time wanting to get the perfect UI done before I started, so I've built with a very Spartan UI in Swift, but have worked in parallel in Figma to know what the content (if not the presentation and layout) of my screens will be.</li> <li>I'm proud to be focusing on UX and UI that actually makes sense for humans. I tried a lot of competitor/existing interval timer apps and wow are they non-intuitive. They just expect you to poke around, do things without confirming them or making clear what they're about to do, and have unclear iconography and buttons. I'm happy to be building and designing an app that takes these things seriously.</li> <li>Early validation of the idea from discussing it with friends (which isn't real validation, I know)</li> </ul> <h2>What didn't go well?</h2> <ul> <li><strong>UI Design != software design</strong>. Although the two relate closely, I made the mistake of tying my initial software design to the UI/UX design. Although the two should be similar, they shouldn't be identical. I made my code too strict and tightly linked to the UI implementation. I have been working to combat this in more recent code design.</li> <li><strong>Better code design</strong> I should make more effort to design systems on paper <em>before</em> I start coding, not code > get stuck > design > delete & rewrite code. Obviously, you can't just plan to the exclusion of coding, but you can spend 10-15 minutes getting your ideas on paper, yeah?</li> <li><strong>TDD</strong>. Related heavily to the above: I tried to use test-driven development (TDD) from day 0, but it made it hard to prototype and change things. Maybe if I was a better engineer I would have designed a better system from the get-go, but my style of doing things is a little more "let's see what happens if I do this". - I ended up designing and building one system, then splitting it out, dividing it, and re-naming parts which made my tests redundant and all fail, so I'm basically going to have to go back and re-write tests for everything - This may not have been the best approach - slowly refactoring code and tests in parallel would probably have been a good idea, but I decided I'd rather just go ahead and write the code instead. If this was an established app in production I would definitely have done code and tests together.</li> <li><strong>Writing in a new language</strong>. I'm having to learn about both Swift and iOS development <em>as</em> I construct the app itself, so there have been several sizable re-shuffles and re-architectures</li> <li><strong>A messy Figma File that's hard to navigate</strong>. I haven't settled on a UI/UX design, there's been a lot of iteration - which means the business components exist but the UI components are <em>very</em> minimalist and industrial (read: bad)</li> </ul> <h2>What has been most challenging?</h2> <ul> <li>Learning a new language (Swift) for the development</li> <li>Learning and implementing the architectural patterns for iOS development (e.g. Model-View-View Model)</li> <li>Having to learn the entire vertical stack before building a feature: persistence, animations, layout & styling, etc. The process feels a lot more like full-stack engineering than frontend, despite thinking otherwise as I went into this.</li> <li>Shifting from the predominately functional style of building React applications to the more Object-Orientated way in Swift.</li> </ul> <h2>What do I do next?</h2> <p>In order, here are the things I want to do in the next cycle:</p> <ol> <li><strong>Finalise the current architecture and add tests</strong>: The code that lets you create and configure a timer is functional (it walks), but I can probably do some tidying. In fact I can definitely do some tidying. I absolutely want to have tests in my code, even if TDD didn't work out this time and I've had to write code <em>then</em> tests, that's still preferable to writing no test.</li> <li><strong>Solidify the design</strong>: I've got a lot of possible UIs and medium-fidelity prototypes, with various colour schemes and mental/visual metaphors in my current Figma file, I need to settle on the Colour Palette & Design Tokens so that I can build consistent UIs. I need to get rid of old ideas (I'll probably move them to some kind of 'Archive' part of the file so that I can go back to them later). This should create a consistent UI and UX across the various user journeys.</li> <li><strong>Allow someone to complete a timer</strong>: Design the architecture and UI that would allow someone to select a timer they have made, and actually complete it</li> <li><strong>Buy some domain names</strong>: I need to start thinking about the keywords and handles I'll be using online</li> <li><strong>Decide on JIRA vs Linear</strong>: How to manage software development? What an ever-turning wheel</li> </ol> <p>Note the lack of marketing and advertising here? I'm aware that this should start early but I don't want to do anything until I'm sure that I'll have something that I'd be happy letting someone else use.</p> <p>Hopefully, Cycle #1 will last from now until the beginning of May 2021, but I also expect it could last longer. Right now it's about making ideas solid and building code - and that happens when it happens.</p>]]></description> </item> <item> <title><![CDATA[Things I learned this week #33]]></title> <link>https://thomaswilson.xyz/blog/2021-03-26-things-i-learned-33</link> <guid>https://thomaswilson.xyz/blog/2021-03-26-things-i-learned-33</guid> <pubDate>Fri, 26 Mar 2021 00:00:00 GMT</pubDate> <description><![CDATA[<ul> <li><strong>This cassette revival</strong>: Last year's (2020's) sale of tape cassettes, the 90's mainstay of car sound systems and OG Walkmans (Walkmen?) were the highest they have been since 2003. An increase of 94% on 2019. Despite having inferior sound quality to CDs and vinyl, the medium is a lot cheaper and easier to produce which means a lower initial investment and potentially higher profits, which is great for indie musicians. Especially given how reluctant modern streaming services are to pay musicians and livable or useful fee for their streams. The global pandemic has made it a lot harder for musicians to tour, and a the related economic recession has made shifting merch a little harder. The sudden demand for cassettes is part of the "you can't hold a digital download" trend which has seen a resurgence in tangible, physical things. It makes sense, if you love music or artists, then you want things that resonate with that belief: band Ts, a vinyl collection, a feeling of belonging, ya know? (<a href="https://theconversation.com/audio-cassettes-despite-being-a-bit-rubbish-sales-have-doubled-during-the-pandemic-heres-why-157097">link</a>)</li> <li><strong>This money making chimp</strong>: Raven, who is a chimpanzee, is the most successful chimpanzee on Wall Street. In 1999, she created an index fund by throwing darts at a list of 133 internet companies. The fund saw a 213% return on investment, outperforming thousands of professional Wall Street brokers. So here's your reminder that humans like to construct stories and narratives around what is actually chaos, and like to believe that we have more control than we actually do. Anyway, yeah, Raven the chimpanzee. (<a href="https://www.guinnessworldrecords.com/world-records/most-successful-chimpanzee-on-wall-street">link</a>)</li> <li><strong>This paper computer</strong>: <em>Magic: The Gathering</em> is the oldest collectible card game, which had its first set of cards released in 1993. There are literally billions of <em>Magic</em> cards in circulation right not, which is cool. It's actually a really fun game, you should totally play some time. Anyway, <em>Magic</em> is technically Turing Complete, a term used to describe a machine that can take and perform any arbitrary computer algorithm, i.e. any set of arbitrary instructions. This means that (practicality be damned) <em>Magic: The Gathering</em> can perform anything that most programming languages could. The authors of the cited study acknowledge that using this technique might be possible but in practice "may effect an individual's ability to successfully execute the combo due to concerns about the sheer amount of time it would take to manually move the tokens around to simulate a computation on a Turing machine. This would not be a concern for two agents with sufficiently high computational power" so I guess we should just let the robots play the game for us now. (<a href="https://arxiv.org/abs/1904.09828">source</a>).</li> </ul> <h2>What I've had on rotation</h2> <ul> <li><strong>Something New</strong> <em>TIME</em> by Jess Gillam (Classical, 2020). Gillam is a classical saxophonist, and this album is a collection of modern classical pieces. It's all really beautiful. It contains the (rightfully) popular <em>On The Nature of Sunlight</em> (Max Richter) and <em>Dappled Light</em> (Luke Howard) which act almost like the gateway drugs for lesser known composers and arrangers, and the result is an album which really fills the space without ever feeling cramped. I am far from a classical music person, and definitely not a saxophonist, but Gillam comes across as crisp and precise, supported by her ensemble. (<a href="https://songwhip.com/jessgillam/time">links</a>)</li> <li><strong>Something Old</strong> <em>We The Kings</em> by We The Kings (rock, 2007). Oh wow, I didn't remember this album at all until it started playing and then suddenly it <em>was</em> 2007. This is peak in-ear headphone buds plugged into my MP3 player and walking to or around college. According to Spotify, the band is most popular in Chicago (USA), Jakarta (India), and Singapore (where chewing gum is still illegal btw) - I never would have guessed that combination of cities (and city states) in a million years. (<a href="https://songwhip.com/we-the-kings/we-the-kings">links</a>)</li> </ul> <h2>Cool articles</h2> <ul> <li><a href="https://pudding.cool/2021/03/love-and-ai/">Nothing breaks hearts like A.I</a> by Pamela Mishkin for Pudding. Pudding is pretty much everything I love about the internet: nerdy cool people making nerdy beautiful things. In this piece, Mishkin uses GPT-3, probably the most advance text-generating AI, to generate part of a personal romantic essay-cum-story. It blurs the lines about what's real: the details or the sentiment. The piece is also incredibly well produced and presented. You can tap to re-generate certain parts of the text, to rotate wheels. For example, half of this sentence was generated by GPT-3: "GPT-3 doesn't care about my friends. It doesn't care that I work at a start-up, live in a city, that I am quarantined in a house with two other people. It doesn't care that Omar and I didn't have the language to say what we wanted from each other, that we fought about his insecurity and my loneliness, that I felt like I was losing myself. It doesn't care which of my sentences are tired or stale or cliche." Could you guess which part? Which of that feels like it wasn't written by a human?</li> <li><a href="https://www.theguardian.com/lifeandstyle/2021/mar/17/mushrooms-as-houseplant">Why growing mushrooms at home is everyone's new pandemic hobby</a> by Adrienne Matei for The Guardian. This is such an odd piece, and I can't explain it but looking at pictures of mushrooms makes me deeply uncomfortable. They're so alien, and they're almost in an uncanny valley: my brain can't decide if they're alive or not. They're plants but they're not. Apparently there's been a boom in growing them indoors since the beginning of the pandemic, which is cool I guess but not for me. I love when people grow (and then eat) things. Matei also reports that some people have started growing mushrooms to trade for eggs and bread - so we've been in the pandemic long enough for an emergent goods-and-barter economy to arise.</li> </ul>]]></description> </item> <item> <title><![CDATA[Things I learned this week #34]]></title> <link>https://thomaswilson.xyz/blog/2021-04-02-things-i-learned-34</link> <guid>https://thomaswilson.xyz/blog/2021-04-02-things-i-learned-34</guid> <pubDate>Fri, 02 Apr 2021 00:00:00 GMT</pubDate> <description><![CDATA[<h1>Things I Learned #34</h1> <p>We've made it to the Easter weekend. Spring has arrived here in London, which is to say it was 20 degrees C earlier this week and this morning it was 0, windy, and overcast. This time a year ago, my mental state was dominated by COVID-19 (something I barely even think about now), but that also lead me to notice the beauty of spring for the first time. I'm normally more of an autumn person. My wildflower seeds have started to come up, my tomatoes have been sown, and I made an asparagus risotto this week (largely so I could drink white wine while cooking, <em>al la</em> my middle-aged housewife dream).</p> <ul> <li><strong>This product search duopoly</strong>: I try and keep things pretty fun and light hearted here. Find some irreverent fact about a victorian butterfly hunter, you know. But I'm also interested in tech and business as a force for good and change (and therefore also as a point of stagnation of source of moral evil). The past couple of years have seen increasing calls for big tech firms, like Amazon and Google, to be disassembled. They have so many resources available to them that they stifle market forces and creativity by being able to undercut any competitor, and subsidise initially unprofitable efforts in some areas (e.g. logistics) through their massive profits in others (e.g. cloud computing and advertising). As a case-in-point, approximately 60-70% of people who need to find a product online will start their search at either Amazon or Google. The problem for small businesses then becomes about discoverability and visibility: how do people find them. So they go to advertisers. Who are the advertisers: Google & Facebook (and most commonly, Amazon). Amazon will allow businesses to advertise on their platform, and compete against their own products. This hardly seems fair or right, but it does sound hella profitable. (<a href="https://www.emarketer.com/content/do-most-searchers-really-start-on-amazon">source</a>).</li> <li><strong>This Victorian butterfly collector</strong> Margaret Fountaine (1862–1940) lived in England and was a wealthy and independent woman who amassed a collection of some twenty-two thousand butterflies, and a million pages of personal journals. Despite her immense contribution to entomology (the study of insects) and lepidopterology (the study of butterflies) her contributions are largely noted as an assistant or amateur. This is, of course, entirely unrelated to the fact that she was a woman, and therefore unable to participate in the meetings of these societies. In 1897 Fontaine became a member of The Royal Society, though her contributions to science remain largely under-appreciated and rarely spoken about, namely because they are neither professional nor amateur. If you get the chance, read about the life Fontaine read: travelling across Europe (and the British Empire) to collect samples and view other butterfly collections. (<a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4321127/">source</a>)</li> <li><strong>This imaginary designer</strong> Nikolay Ironov is a Russian designer but is also an AI. Ironov had created static and animated logos and logos for various clients (here's their <a href="https://www.artlebedev.com/nikolay-ironov/">portfolio of work</a>): they're a real mix of geometry and typography. I quite like them. The AI was created and maintained internally within the Art. Lebedev Studio, but kept completely isolated. That's why it was given a human name, and was introduced to the team as a remote employee - even getting its own employee page. It's quite a cool concept but also a little terrifying - I'm sure all of Ironov's colleagues weren't super pleased to find their work has been outsourced to an AI. (<a href="https://www.rbth.com/science-and-tech/332370-russian-ai-graphic-designer-fooled">source</a>)</li> </ul> <h2>What I've had on rotation</h2> <p>-<strong>Something New</strong> <em>Justice</em> by Justin Bieber (pop, 2021). After 2020's frankly insulting <em>Changes</em>, this new album from Bieber is a breath of humanity and honesty. The album doesn't rush but it's poppy, it's perhaps a bit laboured in its expression of love and gratitude for his wife but it's a good album. (<a href="https://songwhip.com/justin-bieber/justice">links</a>) -<strong>Something Old</strong> <em>Ocean Avenue</em> by Yellowcard (pop punk, 2003). I went back this week to try and find some good grunge and rock from the ‘90s but ended up getting stuck on this album. I'm not regretful, and Nirvana can wait for me. Probably related to my We The Kings re-listen that I mentioned last week. I'm not even really sorry, early ‘00s emo music is in my bones. (<a href="https://songwhip.com/yellowcard/oceanavenue">links</a>)</p> <h2>Cool articles</h2> <ul> <li><a href="https://squarknotes.substack.com/p/squarknote-7" title="Squark Notes #7">Squark Notes #7 (newsletter)</a> by Susan Fowler Rigetti. Rigetti is a writer and refugee from tech (she's the woman who ousted allegations of sexual abuse from Uber's CEO). She posts a newsletter every six-to-eight weeks, and it's worth a subscribe. This edition contained the advice to write more than one thing at once. Or, if you're any kind of creative: always have multiple songs, poems, paintings, side hustles, whatever. I can butcher her sentiment, but she does it far more justice: "when someone has <em>one</em> thing and only one thing is that nothing ever happens with it. Sometimes it's because that one thing simply isn't good. Sometimes that one thing is really amazing, but it's not the right time or place and things just don't come together in the right way"</li> </ul>]]></description> </item> <item> <title><![CDATA[How much is just-enough system design for new apps and software?]]></title> <link>https://thomaswilson.xyz/blog/2021-04-08-just-enough-software-design</link> <guid>https://thomaswilson.xyz/blog/2021-04-08-just-enough-software-design</guid> <pubDate>Thu, 08 Apr 2021 00:00:00 GMT</pubDate> <description><![CDATA[<p>I wrote this because of a paralysing problem in coding: how much should I design my new app's architecture before I dive into code if I can only learn about my app's architecture by coding it?</p> <p>I'm building Dash Dot, an interval timer iOS app from scratch, and this is the problem I've been facing this month.</p> <p>The temptation is to answer all possible questions about your app before you start coding it, but you have to resist. It's good to have an awareness of what parts make up the whole of your system. If you don't, you're going to have to refactor and restructure your code frequently, especially at the beginning. But if you wait too long, if you <em>only</em> answer questions, then you've got only theoretical answers.</p> <p>The issue is keeping your code and your design in-step with each other. If your code gets ahead of your design, it's a mess and you've got to refactor and wrangle chaos. If your design gets ahead of your code, you've got a monotonous boring slog to just implement (potentially over-engineering, or outdated) solutions to changing problems.</p> <p>Code <em>is</em> discovery.</p> <p>Design <em>is</em> discovery.</p> <p>But they're different kinds of learning, and you need them both. You can split the things you know about your software into two buckets:</p> <ul> <li> <p><strong>Obvious</strong>: These are properties that you can glean, or deduce relatively quickly, just by thinking through your code. Your core business entities need to be persisted, so you need a way of talking to a persistence layer, and you need a way of communicating data from your persistence layer (like a database) to your code's logic (like an Entity). You need something to manage the publishers in your system, and you need a way for your other components to subscribe to these publishers.</p> </li> <li> <p><strong>Emergent:</strong>: These things become clearer or more important as you start coding. You might notice that your Entity class has reached 400 lines in length, and realise you need a Factory class to take away some of that logic. You realise that you're passing around data through a lot of initialisers - does it need to be centralised somewhere?</p> </li> </ul> <p>As you become a more experienced software engineer and architect, more things are in the Obvious bucket, and less things are in the Emergent.</p> <p>The problem with Emergent Properties is that they are often Unknown Unknowns. Of course, this is a spectrum too. The more you deal with software architectures, the more you know the kinds of boundaries that become problematic.</p> <p>Building the code means we learn more, but not knowing enough means the code we write is less useful. There are some lessons we can learn without coding. My advice? <strong>Do just enough design so that you can maximise your learning by building</strong>. How do you know how much is "just enough"? That's the whole problem, mate.</p> <p>I've been working on the meta skill of asking myself "is this enough design to get going?", and then accurately answering myself. That's what I want to share and talk about.</p> <h2>The Takeaways</h2> <p>We're all busy, here's what I'd recommend:</p> <ul> <li><strong>Work over dogma</strong>: Get the app building and working. Want to list restaurants near you: get that webpage running, that map rendering, and that database queried. It doesn't matter how beautiful your abstraction if you can't show your user a list of nearby taco vans.</li> <li><strong>Design and develop with your brain in mind</strong>: I know that I like to do. I like to dive in and get started, so I have to train myself to wait and think things through for a bit before I start. You might be paralysed by the need to perfect the architecture before you even open your text editor. Whatever technique works for you, use that.</li> <li><strong>Good systems change fast</strong>: The code you're writing at the beginning of an app will either a) live forever, or b) live for the next three days. Make sure new code can be, refactored, renamed, extended, and divided easily. If it's hard to change, you'll do bad things or workarounds because it's easier than doing the right thing.</li> </ul> <p>## Swinging the pendulum</p> <p>My thoughts and approaches to building a new codebase have swung quite a bit over the last two months. I have been developing <em>a la</em></p> <ol> <li>Test-driven development (TDD): build all code from the ground up with tests first. The satisfying red, green, refactor cycle is very rewarding.</li> <li>Interpretive movement development: do what feels right in the moment, just validate with the UI, man.</li> <li>UML-driven development: spent <em>literally</em> hours creating classes, methods, and relationships to understand the system.</li> </ol> <h3>TDD</h3> <p>TDD was my first approach. It's how I learned Rails back in the day (or at least how I was encouraged to). I have often bemoaned a lack of <em>any</em> testing in a lot of the professional projects I've worked on and I thought to myself "this app will have flawless testing. I will be the jealousy of the town".<br> Why was I doing TDD? Because I liked the idea of the finished product. I liked having a codebase which I <em>knew</em> worked, it was inarguable. I had green ticks on my CLI, and the knowledge that a particular ticket or branch were complete.</p> <p>I spent a couple of weeks heavily pursuing this goal. However it fell apart. When you're building early systems and foundational code it is <em>highlly</em> likely that things will change. In fact, I'd say it's certain. If you're writing perfect code on day 1 then bully for you but boy am I not that kind of engineer.</p> <p>"But Thomas, write your tests first to help design your API". Yeah, actually good criticism. I agree - I think having code <em>and</em> tests consume the API of a class forces you to think about abstraction early. It forces you to decouple things. However, <strong>you don't know everywhere your code is going to be consumed</strong>, especially on day 1. You don't know when certain parts of the codebase are going to grow in complexity and size (and reduce in readability) and need to be split out. And now you've doubled the work required in a refactor: you can't quickly and easily move code about, chop it up, rename it, etc.</p> <p>"But Thomas, the tests mean that your API surface remains stable so that even when you do that kind of refactoring, the end result still acts as expected". Right again, in theory. This is great when there is other code in your project which already depends on the stuff you're refactoring, and you want absolute certainty that what you're doing won't break a consumer. But that's just not what's happening here. This is the first step of whittling away the wood to let the sculpture emerge, I don't have to be delicate everywhere. I really wanted TDD to work for me here, and maybe if I was more intelligent and could preemptively know my API it would work. Or, if I was further into the project, it would let me know that I'm doing okay with my refactor.<br> As a tool for writing the first bits of a new project, TDD just did not work for me.</p> <h3>Interpretive movement design</h3> <p>Talk about a kickback reaction. Freed of the expectations of TDD and of the need to really write atomic and comprehensive tests, I just went about doing the thing every engineer loves to do: write code. I created classes, and modules and methods and functions and utilities and it was lovely. I named things in a way that made sense in the moment and things felt right. I wasn't constrained by anything and could get my ideas onto the screen quickly.</p> <p>This is a great example of where the "software engineering as a craft" argument gains credibility. This was a swing too far away from discipline and rigour, and towards creativity and reactive-ness. There was no structure to wrangle my code into readable, clear ideas.</p> <p>It didn't force me to notice similarities in my codebase. <strong>It didn't encourage me to make similar solutions for similar problems, and I ended up writing code which was tightly coupled to its context</strong>. Code should be decoupled. The canonical example for this was when I found myself with three Entity classes (the ActiveRecord-like classes which wrapped several persisted entities, like a "timer") and three drastically different approaches to similar behaviours. I had different APIs and implementations for how I validated, persisted, updated/deleted my data - I stored different bits of information about them and under different names.</p> <p>This was a bad approach - I had let myself get too excited with the joy of writing code, and hadn't taken a step back. "But Thomas, couldn't you have exercised a little bit of self-restraint?". Look. Yes. I have known for a <em>very</em> long time that I, as a person and professional, would much rather learn and discover while and through doing, rather than plan and prepare beforehand. It's mixed-blessing. Self-knowledge isn't about trying to change these things but rather putting myself in positions where this isn't a problem (wisdom to know the difference, and all that).</p> <p>The interpretive-movement style of development was useful. It helped patterns emerged and it also helped me <em>do</em> a lot more than I did with TDD. The result was always on the output: I want to see this data on the screen, I want to be able to have these kinds of interaction. Unlike TDD I was thinking a lot more as a real-life human user of my software, not like a software user of my software. But it needed to be paired with a little more forethought, and something which would help me anticipate similarities before they occurred.</p> <h3>UML-driven development:</h3> <p>Does anything feel quite so engineer-y as drawing bloody giant UML diagrams. You know the ones, with the boxes and class names and methods and arrows. They're great. I started drawing these when I came to the next logical part of my app (i.e. how do I, as a user of the app, <em>do</em> a timer).<br> I sat down with the fantastic (and free) [diagrams.net] (formerly draw.io) tool to draft up the parts of my system, what they would be called, how they would communicate, what was similar and unifying, and what were the distinct parts.</p> <p>I immediately made the decision to use this diagram as a sketch or an outline. I didn't want to specify every method, every relationship, every movement. It was about the high-level system design, and not about the specifics. UML diagrams may feel productive, but at the end of the day they're not code.</p> <p>For me, facing myself to write this broad-outline UML diagrams was <em>just enough</em> design to make the code I was writing feel productive. It guided the direction and structure of the work I was doing, but it was vague enough that I could split things our and change implementation details. For example in a couple of places, I leaned heavily into the <em>Dependency Inversion</em> or <em>Inversion of Control</em> but these didn't need to be specified in the diagram before hand</p> <p><strong>I knew this approach was just-enough design because before I started writing code I noticed when too much responsibility was being put in one place, and when similarities between components started arising</strong>. Just like the frustration of UI/UX design - it was impossible to design a good system by focusing wholly on the components. Components should serve the system and architecture as a whole.</p>]]></description> </item> <item> <title><![CDATA[Things I learned this week #35]]></title> <link>https://thomaswilson.xyz/blog/2021-08-11-things-i-learned-35</link> <guid>https://thomaswilson.xyz/blog/2021-08-11-things-i-learned-35</guid> <pubDate>Sun, 11 Apr 2021 00:00:00 GMT</pubDate> <description><![CDATA[<p>The slightly cold-snap here in London continues. The optimistic sewing and sprouting that took place in my garden (such as it is in urban West London) have largely had to retreat to the comfort of the indoors. Covid-related deaths continue to fall in the UK, as we begin optimistically opening up after a <em>very</em> long winter. I've started to have more normal moments - more going into a (socially-distanced) office, going to (socially-distanced) gatherings of people outside of my household. With this spirit of early optimism (and copious tree pollen) in the air, let's begin:</p> <ul> <li><strong>This fact about parachutes</strong>: according to a study published in the British Medical Journal in 2018, the authors found the use of parachutes "did not significantly reduce death or major injury". Rather than a serious study into the efficacy of parachutes for people jumping out of planes (spoiler alert: parachutes will probably stop you from dying, not wearing a parachute almost certainly will not), the authors were taking a tongue-in-teeth approach to the double-blind randomised-trials — the gold standard in medical research. They argue that sometimes we aren't able to effectively control, model, or simulate real-life situations for the benefit of experimentation. This is important in fields like medical research, where areas of discussion range from deeply personal experiences (like mental health and trauma) to almost purely biomechanic discussions (like vaccine efficacy). Part of expertise and knowledge is (in my humble opinion) knowing what constitutes "proof" or evidence in your current area of study. (<a href="https://www.bmj.com/content/363/bmj.k5094">source</a>)</li> <li><strong>This (yet) another impact of the pandemic</strong>: I like bikes. I think they're cool. In 2019 I cycled across France on a bike (and I've not stopped talking about it since). Since the start of the pandemic, bicycle use in the UK has increased to 120% of its use relative to the year prior. It's up over 150% on weekends - suggesting that more Brits are getting out for weekend rides. I've noticed a much more diverse set of people out on rides during my spring training: it's not just <a href="https://en.wikipedia.org/wiki/Mamil">MAMIL</a>s - I've seen more women and partners of (presumably) pre-existing cyclists, more amateur groups and also a lot more international riders. The other week I was absorbed by a peloton of six-some Polish (I think) riders on a mix of hybrid and commuter bikes who seemed to be enjoying South London's cycle superhighways rather a lot. Comparatively, tube and rail use are both down 70%, and cars about 15%. So-called "active travel", like cycling and walking, is an essential part of meeting carbon emission goals. A journey made by bike represents about 30x lower CO2 emissions than a fossil fuel-burning car, and 10x lower than an electric car. (<a href="https://theconversation.com/cycling-is-ten-times-more-important-than-electric-cars-for-reaching-net-zero-cities-157163?utm_source=labnotes.org">source</a>)</li> <li><strong>This hat piracy</strong>: Benjamin Hornigold was a pirate in the 1700s, and you've probably not heard of him. His second in command was Edward Thatch, who went by "Blackbeard". Hornigold and Thatch ran a thirty gun ship, the most heavily-armed ship in the area at the time, around the Bahamas in the 1700s. Piracy was rife as the Spanish Succession war had come to an end, leaving a lot of sailors and soldiers out of jobs. With no successful re-skilling plan in place, a lot of them too to looting merchant ships around Jamaica and the Bahamas. My favourite story from Hornigold's time as a pirate is the time he and his crew (about 350 men) got rip-roaringly drunk and threw their hats overboard during the night. The next day they attacked a merchant ship, stole the crew's hats, left their goods untouched, and carried on. Hornigold later turned pirate-hunter (job title goals), a position at which he was pretty much entirely unsuccessful. (<a href="https://www.thevintagenews.com/2017/07/07/notorious-pirate-benjamin-hornigold-once-attacked-a-merchant-ship-only-to-steal-the-crews-hats/">source</a>)</li> </ul> <h2>What I've had on rotation</h2> <ul> <li><strong>Something New</strong> <em>The Wind</em> by Balmorhea (2021, Contemporary Classical). A couple of really beautiful classical albums came out this week but this is the one I've been drawn to. This is the first album in a while which has been produced largely by just Rob Lowe and Michael A. Muller - the original duet of Balmorhea. This shows - there are moments that are so typically <em>them</em> in their sound and composition. Apparently, it was recorded in the same studio as Nils Frahm records, and it has the same acoustic reverence as Frahms can bring. (<a href="https://songwhip.com/balmorhea/the-wind">links</a>)</li> <li><strong>Something Old</strong> <em>The Resistance</em> by Muse (2009, Rock). I don't know why I completely ignored Muse while they were pumping out albums like <em>The Resistance</em>, so I've gone back to give them some time. The musicality on this album is lovely, the production does feel a little dated in places but there are some real timeless moments. This isn't so much a rediscovery as a "getting round to it" discovery. I'm still very glad that I did. (<a href="https://songwhip.com/muse/the-resistance">links</a>)</li> </ul> <h2>Cool Articles</h2> <ul> <li><a href="https://www.youtube.com/watch?v=Iwpi1Lm6dFo">How to avoid death by PowerPoint</a> by David JP Phillips for TEDxStockholm. Everybody hates giving presentations. Everybody hates watching presentations. With these things in mind let's at least work to make them at least a little bit more focused and usable. Phillips focuses on very actionable and psychology-focused tips for improving your PowerPoints. They're essentially around limiting the number of things you audience has to focus on. That comes from the visual design as well as the overall structure of your presentation. Give it a watch, it's a little masterclass in giving good presentations, like watching Steve Jobs introduce an iPhone.</li> </ul>]]></description> </item> <item> <title><![CDATA[Dash Cycle #01: (re)organising]]></title> <link>https://thomaswilson.xyz/blog/2021-04-12-dash-cycle-01-reorganising</link> <guid>https://thomaswilson.xyz/blog/2021-04-12-dash-cycle-01-reorganising</guid> <pubDate>Mon, 12 Apr 2021 00:00:00 GMT</pubDate> <description><![CDATA[<p>I'm building DashDot: a privacy-focused interval training app that doesn't suck. The second cycle of development lasted March 15 - April 12. Let's look at where we are.</p> <h2>Goals</h2> <p>Here are the things I wanted to achieve in this cycle:</p> <ol> <li>✅ Finalise the code architecture and restore tests</li> <li>✅ Allow someone to complete a (timed) timer</li> <li>✅ Focus on the persistence of timers and workouts. Make sure that relationships between these entities are persisted.</li> <li>✅ Buy domain names (for app and company)</li> <li>✅ Decide on ticketing / management software and method. JIRA vs. Linear</li> <li>âœï¸ Solidify and scale-back the UI design</li> <li>🙅 Make the UI nice</li> <li>🙅 Continue with TDD and high test coverage</li> </ol> <h2>Designing Code Architecture</h2> <p>This cycle I started running into the limitations and assumptions of my previous software architecture. Four weeks ago I did not have any strong opinions or experience on architecture for a SwiftUI app, but now I do. I wrote about my experience with this <a href="/blog/2021-04-08-just-enough-software-design">pretty extensively</a> elsewhere. In summary, I've taken a very Rails-esque approach to the design: splitting my software into models, views, view models, and interfaces. Dividing by function rather than domain model will make some people mad, but it's actually really helped keep everything clear in my head.</p> <p>I ended up doing a pretty major refactoring of the architecture, which mean that a lot of my previously-written tests were no longer useful, and had to be deleted. I was only attached to them via the sunk-cost fallacy, so away they went.</p> <p>I also got to draw some pretty gnarly, sprawling UML-style diagrams in this process to help me really flesh out my thinking. That was cool.</p> <p>I've still not reached the same level of test coverage as I had before, but I <em>do</em> have a much more readable and consistent code architecture so I think the pros outweigh the cons.</p> <h2>Allow someone to complete a timer</h2> <p>Creating a timer and doing a workout are the two core workflows in DashDot. This cycle I focused on that user journey: letting someone select a timer they wanted to complete and then start doing it.</p> <p>There are a couple of complications here (obviously) but this workflow now functions. In DashDot you can now select a pre-existing timer, and start <em>doing</em> it. The app will persist your progress and process as you go, and progress you through the intervals, etc.</p> <p>So far you can only complete timed intervals (not distance). That'll be one of two focus points for Cycle#02.</p> <h2>Persistence and relationships</h2> <p>I spent a good few days really getting into CoreData, managed object contexts, and the ORM-like way of managing relationships between entities.</p> <p>DashDot now persists records of your activities, your workouts, and your timers - all without any fuss. This is an essential feature and I'm glad it's done</p> <p>I have created an Active Record-like pattern for my business entities, as I didn't like the idea of manually modifying the generated classes from CoreData. This allows me to have some helper methods on my models to access related data, and to treat what's in the persisted CoreData layer as DTOs. This is definitely my web influence coming through: treating the data persistence as dumb and largely stateless objects. I'm not sure if this is the best, or most Swifty, way of doing things - but it's the way that lets me move faster.</p> <h2>Purchase domain names</h2> <p>I needed domain names for both the app and for the company I'd be publishing it under. I've purchased both of those and I'll share when there's actually something on them.</p> <h2>Project management: JIRA & Linear</h2> <p>I had previously been using JIRA to manage my tickets and things to do. I discovered Linear (I think because someone on <a href="https://www.relay.fm/radar">Under The Radar</a> mentioned it).</p> <p>I've completely switched to Linear for managing my tasks. I like it because:</p> <ol> <li>It has a native app, even if it's just an Electron wrapper, it feels surprisingly native</li> <li>It's free (for me a one-person team)</li> <li>Phenomenal keyboard shortcuts that let you move between tasks and screens, update and create tickets, and do all sorts.</li> <li>Their idea of "cycles" fits almost perfectly with how I want to think about software development. They're essentially four-week sprint-like phases. You pick a four week period, acknowledge what you can/not get done during that, and make sure things stay in scope.</li> <li>Nice integration with GitHub - generating branch names for tickets and tracking their progress through PR to merge status. Even working as a one-person team, this helps me focus on "one things at a time".</li> </ol> <p>Using Linear comes with a lot less friction than JIRA.</p> <h2>Scale-back the UI</h2> <p>I had a bloody massive Figma file with a whole bunch of screen prototypes and idea exploration. By the time I had spent four weeks doing more code-heavy tasks I had lost track of what was where, what I liked and didn't like. There was too much in the Figma file and things were too hard to find.</p> <p>So I copy-pasted everything into an "archive" tab in the file, and largely started from scratch. I used a more simple and iOS-like design. It's a lot more boring, yes - but it's also a lot more achievable.</p> <p>Every now and then I go back to the archive and look to see if I had any interesting UI ideas, bits of data, or conventions that I'd like. In general however I am trying to stick to a <em>very</em> simple and limited UI. No fiddly bits or tricky bits, I want to get something out there.</p> <p>I have started this process of redesign, and it'll continue into Cycle#02. The UI I have in the app at the moment is... not good or consistent, but it is functional for testing. So I need to improve it.</p> <p>I've become a lot more involved and aware of the iOS-specific design scene. Reading a lot of app reviews and listening to podcasts so I can get a better sense of "what makes a well-designed app".</p> <h2>Make the UI Nice</h2> <p>I wanted to have a fully redesigned and implemented UI by the end of this cycle. That did not happen, I had other things to do. I'm working on it though.</p> <h2>Continue TDD</h2> <p>I wanted to continue to develop with tests are the forefront, however the severe refactoring and reorganisation I've done have left a lot of my old tests useless, and I decided to move with greater speed by not having as many tests before I commit code.</p> <p>This decision will come back to bite me, I'm sure, but I want to focus on producing something usable and interactable. The code is not the message, the code is the vehicle.</p>]]></description> </item> <item> <title><![CDATA[Things I learned this week #36]]></title> <link>https://thomaswilson.xyz/blog/2021-08-11-things-i-learned-36</link> <guid>https://thomaswilson.xyz/blog/2021-08-11-things-i-learned-36</guid> <pubDate>Fri, 16 Apr 2021 00:00:00 GMT</pubDate> <description><![CDATA[<p>The cold snap in London is teasing us. Is it over? hopefully. But it will still be ~1C at night so don't get too complacent. Still, the days already feel long. I can hardly remember it being dark at 4pm but I'm sure I'll remember as soon as October comes. There's a lot of spring, summer, and autumn between now and then though. Here's some things I learned this week</p> <ul> <li><strong>This Breaking Bad character</strong>: Mike Ehrmantraut is one of my top three characters in Breaking Bad (Walter and Gus, in case you're wondering). He almost wasn't a significant character at all. Bob Odenkirk, who plays Saul, was needed on set during the filming of season two of Breaking Bad, and so the show writers Brough Mike's character in to act as a go-between for information in the episode. It's one of those happy little accidents that remind us that if we roll with an unexpected change or limitation, the we can create something lovely. Maybe it's different to what we imagined at the beginning, but it can still be good. (<a href="https://screenrant.com/how-met-mother-breaking-bad-connection-mike/">source</a>)</li> <li><strong>This one book</strong>: Lord of the Rings, the famous and seminal work for fantasy fiction by JRR Tolkien was written as one book. It was published as three, presumably because someone said to him "John, these four hundred and eighty thousand words will not fit in one book, you need three books or we'll need to sell a magnifying glass to everyone who buys a copy" and then I presume John answered first with a poem or song and then gave his actual answer. Oh, he didn't? Because that's not how people speak? Sorry, sometimes I forget myself. Tolkien considered what we now now as "books" as simply "volumes" in the story. The crazy part about this fact is that Tolkien wrote every word of Lord of the Rings before he published them, and here I am in 2021 waiting for like a dozen fantasy authors to write book #2 or 3 in their trilogy. (<a href="https://scifi.stackexchange.com/questions/47419/is-lord-of-the-rings-a-trilogy-of-books-in-tolkiens-opinion">source</a>)</li> <li><strong>This demographic fact</strong>: About a third of new-born babies in the UK have at least one parent from outside the UK. London is a very multi-cultural city, and we're carrying this figure heavily: 69% of babies are born to at least one parent from outside the UK here, with Newham topping out at 86%. I think that's cool - the more children that grow up seeing people from different places, seeing different cultures to the one they're surrounded by immediately… that's only a good thing. In a very left-wing-can't-we-all-just-get-along way: I'm happy to see this. (<a href="https://fullfact.org/immigration/parents-born-outside-uk/">source</a>)</li> </ul> <h2>What I've had on rotation</h2> <ul> <li><strong>Something New</strong> <em>King's Disease</em> by Nas (2020, Hip Hop). This album won the grammy for best hip hop album and I hadn't heard that it even existed before. Whoops. Nas, of Illmatic fame, is undoubtedly one of the fathers of modern hip hop. Though, to quote Jay Z on Blueprint: he did put out one good album in ten years. Luckily it was good. Unfortunately I meant I had him written off as a forebear without being an active artist. <em>King's Disease</em> is good. Like, actually good - not just good because I want it to be good. The beats are slick the vocals and tight, the themes are good. Having two good albums over several decades isn't a great hit rate. As if I've not said enough to crucify myself in the eyes of the real Hip Hop Heads: this album reminds of Common in places, and that's a good thing to me. (<a href="https://songwhip.com/nas/kings-disease">links</a>)</li> <li><strong>Something Old</strong> <em>Summer Suite, Vol 1</em> by Chad Lawson (2010, Classical). I go through phases of working in silence and to music. I'm emerging from a more silent phase at the moment, but the light and upbeat vibe of this album is a perfect transition piece for that. Pop it on when you don't think you want sound but silence doesn't feel right either. (<a href="https://songwhip.com/chad-lawson/summer-suite-vol-1">links</a>)</li> </ul> <h2>Cool Articles</h2> <ul> <li><a href="https://www.irishtimes.com/news/world/greta-thunberg-it-just-spiralled-out-of-control-1.4528477" title="Greta Thunberg: ‘It just spiralled out of control'">Greta Thunberg: ‘It just spiralled out of control'</a> by Leslie Hook for <em>The Irish Times</em>. A few years ago, Greta was fully in the limelight - very publicly active and outspoken. She's recently turned eighteen and is back at school in Sweden, studying full time. In this piece, Hook gives a humanising account of Thunberg's current beliefs and attitudes. I was interested to learn that she doesn't actively talk about solutions to the climate crisis, seeing that as the job of others with more knowledge and expertise. She's reluctant to give answers to the big questions, which I have mixed feelings about. Give the article a read, Greta's a cool person and I think we could all take a bit of her urgency.</li> </ul>]]></description> </item> <item> <title><![CDATA[Things I learned this week #37]]></title> <link>https://thomaswilson.xyz/blog/2021-04-24-things-i-learned-37</link> <guid>https://thomaswilson.xyz/blog/2021-04-24-things-i-learned-37</guid> <pubDate>Sat, 24 Apr 2021 10:24:00 GMT</pubDate> <description><![CDATA[<p>This week I've been focusing on perspective and gratitude. It's harder than it sounds if you feel things are unfair and not in your favour. But, to quote about a million throw cushions on Pinterest: you can't control life, only how you react to it. So this week I am choosing to react by being grateful. Even if it has to start out feeling like a very pointed lie, or jibe to my less patient self. Anyway here are some things I learned this week:</p> <ul> <li><strong>This misunderstood emperor</strong>: Nero (AD 37-68) was the last roman emperor to be descended directly for Caesar Augustus, the first Roman Emperor. Nero has a reputation for being a little… callus. He's the one who "fiddled while Rome burned" during the Great Fire of Rome in AD 64, and had his mother and (maybe) both of his wives murdered. But apparently much of what we know about him came from biased and vilified accounts of him and his life, which were pushed after he "committed suicide" (if you're forced to commit suicide it's more spiritually aligned to murder, I propose) and a new emperor came to power. And then three others after the first, all within the space of a year. When Nero tragically killed himself independent of any political pressures or personal accusations, the power-vacuum left by him had to be filled by other ambitious men. Taking the Roman Empire from stable and long-lasting (normally) emperors into this rocky period required some careful PR work, and a lot of work was done to legitimise and justify the need for his death and the change. Hence much of the accounts and writing left about him are vastly anti-Nero. Our knowledge is largely influenced by the survivorship bias: the things which have survived (like official records and accounts by historians of the time) are obviously walking the party line. However, evidence from graffiti and the common folk, reveal that Nero was actually pretty liked by people, and our image of him as a tyrant is maybe undeserved. He competed in the public games, and acted on stage… He was probably a well-known and well-liked figure at the time. Scandelous though it may be to have an emperor perform on stage and race a chariot. He did still kill his own mother and wives though, let's not forget that. (<a href="https://www.artlyst.com/previews/notorious-roman-emperor-nero-explored-new-british-museum-show/">source</a>)</li> <li><strong>This health benefit of tea</strong>: Coffee will forever remain my first love, but as I mature into a young gentleman, I'm looking for any excuse to eat biscuits at about 4pm. Tea is one such excuse, but I ended up catching feelings for tea. Coffee gets a bad wrap for being full of caffein though, and although there are no negative health effects of chronic caffein consumption, I don't want to be dependent on it. Tea, although containing caffein, is thought to boost our mood and calm us, despite caffein's tendency to lead us towards jitters if we get a little over-buzzed. For instance, a study on South Korea found that adults who regularly drank tea were 21% less likely to develop depression over their life - the same effect as about 2.5 hours of exercise a week. It's unclear if this is because of individual or mixed chemicals in tea (like epigallocatechin gallate or l-theanine), or the ritual of preparing and then consuming the tea itself. Don't underestimate the fact that simply taking 5-10 minutes out of a day to sit down and not be stressed is probably good for us. Nevertheless, it does appear that drinking tea (and not a placebo) does help people a) feel more relaxed, and b) produce less cortisol (the stress chemical) - so in reality, it is likely some combination of the two. (<a href="https://www.nature.com/articles/d41586-019-00398-1">source</a>)</li> <li><strong>This bee weapon</strong>: Bees are cool and really useful. Did you know that they create their own air-circulation system? To keep the temperature in a hive a comfy ~30C, the bees beat their wings to circulate air around the hive. Unfortunately, bees are also under attack sometimes, and not just from cartoon bears with a hunkering for honey. One way that bees can defend themselves from invasive species, like wasps or hornets, is to gather around the invading individual and focus the hot air at the new guest. This essentially cooks them, or overheats them. That's pretty hardcore, bees. (<a href="https://ideas.ted.com/bees-can-remember-human-faces-and-7-other-surprising-facts-about-these-important-insects/?utm_source=pocket-newtab-global-en-GB">source</a>)</li> </ul> <h2>What I've had on rotation this week</h2> <ul> <li><strong>Something New</strong> <em>Wake</em> by WVNDER (2021, Pop Punk). It feels a little like cheating to call a seven-song twenty-four minute CD an "album" but I'll take it. WVNDER not only have great album artwork (I had a little poke around and couldn't easily find the credited artist). This is a tight little pop punk/emo pop album with clean vocals and lovely moments. (<a href="https://songwhip.com/wvnder/wake">links</a>)</li> <li><strong>Something Old</strong> <em>Perotin</em> by The Hilliard Ensemble (1989, Choral/Classical). This is one to listen to with headphones, or a good surround-sound. The medieval-era vocals are wonderful to work, walk, and exist to. (<a href="https://songwhip.com/the-hilliard-ensemble/perotin">links</a>)</li> </ul> <h2>Cool articles</h2> <ul> <li><a href="https://www.brainpickings.org/2017/05/25/christof-koch-consciousness-qualia/">Neuroscientist Christof Koch on How the "Qualia" of Our Experience Illuminate the Central Mystery of Consciousness</a> by Maria Popova for <em>Brain Pickings</em>. Popova has a gift for merging the scientific and the poetic, though this is slightly easier where the two meet naturally. The study of consciousness is like that: we're yet to have any functional answers. Instead it's an area of science where interpretations reign supreme. If I was a cleverer man when I was sixteen years-old and chasing my studies, I would've chosen subjects that would let me into neuroscience. In this piece, Popova introduce's the <em>Romantic Reductionist</em> approach to studying consciousness, adopted by Christof Koch. Koch is a currently-active academic in the realm of consciousness, and his approach merges the reductionist ("things can be explained as a system of discrete and interacting parts") and romantic ("things are beautiful and not the sum of their parts").</li> </ul>]]></description> </item> <item> <title><![CDATA[Excommunicate your ideas]]></title> <link>https://thomaswilson.xyz/blog/2021-04-27-excommunicate-your-ideas</link> <guid>https://thomaswilson.xyz/blog/2021-04-27-excommunicate-your-ideas</guid> <pubDate>Tue, 27 Apr 2021 20:55:00 GMT</pubDate> <description><![CDATA[<p>Your side-projects deserve a decisive, merciful death at your hands. You dragged them into this world, you'll fling them out. And do it quickly.</p> <p>I want to talk about killing our much beloved side-projects, and why this is totally a good idea. Then I want to talk about why this could be a terrible idea. I'm not here for resolutions.</p> <p>There are two parts of my personality, plucked from the universe-scale D&D Players Manual, which make the question "should I carry on with this side project?" difficult to answer:</p> <ol> <li>** I like to flip-flop** - just because you made a decision in the past doesn't mean it's the best decision, or that you owe your current time your past self. Your past self was probably dumb and optimistic anyway. What do you know now that you didn't know when you made the choice? Do you know that you're not enjoying yourself, that you don't have the money, that it's not worth the time or investment? Cool, just put your tools down. This kind of thinking got me out of working freelance, a decision I thought I would love but actually did not. <em>Vive l'empoi</em>.</li> <li><strong>I like to commit</strong> - if you're going to make a decision, act like you've made the decision. Sometimes that's about writing a blog post about random things you learn every week even when you don't want to. Sometimes it's about finishing puppy school (with your dog, obviously), or building an MVP of that website you've wanted to build since 2014. Inaction is a choice. Relaxation and space are a choice. You can commit to restoring some inner peace and spend every night for four months in silent meditation, or watching Netflix, or going on dinner dates with different friends. Or you can commit to learning a new language, reaching a new fitness goal, whatever. I really don't care what the goal is, but I like to achieve goals.</li> </ol> <p>These two make for often uneasy bed fellows. Not quite sitcom-worthy misanthropes, but the two can make it difficult for me to feel confidently happy or fulfilled. Second guessing? That's a lot easier.</p> <p>I am a front-end and full-stack software engineer by trade and craft. For the past several months I have been building DashDot, an iOS app for interval training. I started this project because it solves an actual problem I have, and because I wanted to try building something for a different platform.</p> <p>I'm going to stop building that app. I'm not going to caveat that sentiment with "for now" or "at the moment". I have excommunicated it from my life, and I have no intention to pick it back up, or open that Xcode project. I might do those things, sure. I might try again in the future. I just don't think I will within the next lunar cycle, and I'm not setting any expectation to myself that I will, either.</p> <p>The minute I made that decision, I felt lighter. I was free from doing something that I had increasingly come to resent. I'm not going to go into all the nerdy details about why I didn't like iOS development - but the short of it is that I do not want to do it. So I won't.</p> <p>Maybe I'm weird and this is totally natural to some. Maybe some people love giving things up and can do so without nary a backward glance. You'll know we're similar people if hearing that you can do this, that you can simply <em>stop</em>, is a gleeful relief or reminder, not an obvious re-statement. Got a side project that simply isn't worth the investment any more? Great, kill it. No one's going to come looking for the body.</p> <p>Though the <em>killing</em> metaphor is satisfyingly dramatic, I think excommunication is the better analogy. The idea of the project isn't dead, I can still go back to it. You can start building your ideas again whenever you want. Instead, I've made the choice to have no interaction with it: I'm not going to design, build, refactor, or plan anything else to do with this project. It's going to take up no more of my mental time and energy. It has been banished from my kingdom of effort and attention.</p> <h2>You might be ready to excommunicate when…</h2> <p>You ever catch yourself, mid-activity and think "wait why am I doing this". How might you know when it's time to excommunicate that project from your life? Here are some smells I've been looking out for</p> <ul> <li><strong>Does it spark joy?</strong> - 2019 internet meme aside, Marie Kondo <a href="https://www.youtube.com/watch?v=9AvWs2X-bEA">has a good point</a>: how does your body respond when you think about, or work on the project? Are you excited by what you're doing or could be doing? Is it heading in a good direction? Or are you just a little weary?</li> <li><strong>Is it worth it?</strong> - is all this time, money, and mental energy you're putting into the project actually giving you something back? Investment and returns aren't just money: does it feel like a good use of your time and attention? If you're finding it hard to justify to yourself, think about why?</li> <li><strong>Where is this going?</strong> - follow through the thought process for "what happens next" for the next weeks and months. One of the last straws for me and my most recent side project was realising that even if things become wildly successful and people love the app, the thought of having to build, improve, and support an iOS app just did not feel like a good reward. And then if things went badly I'd have to do active work to get more users so that I could support an app I didn't want to support. Is the project leading me closer to the life I want to live? No?</li> </ul> <h2>But what if I just keep picking things up and putting them down?</h2> <p>I'm worried about being that guys who gets a new personality-defining hobby every other month. I don't want to be telling my friends how great it is to feel the wet clay between your fingers, and then eight weeks later consider my chances as a professional oboe player. There's nothing wrong with that, you have to pursue your own happiness in this life, but there's more than that.</p> <p>I worry sometimes that I jump between things, never finishing them or accomplishing anything with them. But also, massive spoiler alert, no matter how long your streak on Duolingo, you're still going to die. If you can wring joy from the scarce few hours we have on this giant hunk of space rock then, by all means, flit between things. Flit away. Keep flitting. This is <a href="https://plato.stanford.edu/entries/hedonism/">hedonism</a>, which I think gets a bad wrap and has a lot less to do with Roman orgies that you'd think.</p> <p>However, if you only ever get a few steps down a road, or you only do something when it is interesting or enjoyable - we miss out on something.</p> <p>Vasari, the first art historian and also debut biographer of Leonardo, <a href="https://academic.oup.com/brain/article/142/6/1842/5492606">wrote in reference</a> to the famous renaissance artist, architect, natural scientist, and polymath: "if he had not been so variable and unstable, for he set himself to learn many things, and then, after having begun them, abandoned them". Leonardo was a flitter.</p> <p>If you've got the mental horsepower of Leonardo (which I certainly don't), then the curiosity does us benefit. Even with his almost mystic mental capacity, and despite working in one of the most productive and talented eras of artistry in European history, Leonardo left behind very few finished paintings. He left behind a lot of notebooks, with questions and observations, and he undoubtedly pushed a thousand tiny journeys forward, but he rarely reached "done" in his work.</p> <p>There are no more than eighteen surviving paintings which can be attributed to Leonardo (if you ignore all credible questioning on many of these works). Though to be fair his portfolio includes things like <em>The Last Supper</em> and <em>Mona Lisa</em>, possibly two of the most recognised pieces of western art. This is compared to the literally <a href="https://en.wikipedia.org/wiki/List_of_paintings_by_Raphael">dozens of paintings by Raphael</a> (who died at 37, a full thirty less life years than Leonardo), or Michelangelo who painted (or supervised) the _entire ceiling of the Sistine Chapel _, which accounts for over 500 squared metres and then also he sculpted <em>David</em>. To be fair, Michelangelo was probably a bit too dedicated, and maybe could have loosened up a bit.</p> <p>Unfortunately, no one's really doing anything comparable to painting the Sistine Chapel anymore. I don't know why, maybe we're all too remarkable to be remarkable anymore, or maybe we've become numb excellence. You're not sacrificing an era-defining oeuvre so you can go to an introductory macrame class or get three pages into your bullet journal before never opening it ever again. But I do still think we owe it to ourselves to commit a little before abandoning ship. The process of mastery and craft run deep in us, I think.</p> <p>That's because new hobbies or side projects are both themselves (i.e. making a clay pot, writing a book), but they are also meta-projects: the process of planning how you will dedicate your time and attention around them. The ability to engage with the terrible, awful imitation you have made and the shining exemplar you were trying to reproduce, and asking yourself "how did I get this so wrong?". This is another time to mention <a href="https://vimeo.com/85040589">The Gap</a> by Ira Glass.</p> <p>If you hang around for long enough, you notice the transition from a project as itself, to a project as a meta-project. I think there's something inherently valuable in going through that, and I don't think you can force it.</p> <p>To give an example from my domain, when I dip into a lot of forums for web developers I see piles of novice engineers asking ill-formed, basic questions which either have a one-line answer ("how do I get data from an API in python?") or no answer ("which JS framework should I learn?"). But a lot of the conversations I see happening between experienced engineers, or at talks from engineers - these are more philosophical or ideal. Broad, cross-technology approaches, team and inter-discipline management or integration. Once you have reached conversational fluency with the details, you can go one level higher. I really enjoyed learning the basics as an engineer but I am <em>really</em> enjoying the work of a journeyman.</p> <p>Similarly, with writing I deeply enjoy the feeling of <em>having</em> written, I dislike much of the reality of writing consistently. I love having a blog where I've written consistently for nearly a year, but I hate the Saturday morning fear that this might be the week I don't write a blog post about things I have learned. I love organising thoughts after they lay strewn in a text document, having stumbled over each other in a rush to get out of my brain. I love that I nearly always have a conversation starter or something to mention when I'm out at the pub. Or if I was out at the pub and there wasn't a pandemic.</p> <p>Some of these things are about the actual act of writing but others are, more broadly, because I write. And I think I have only come to enjoy these things, and to even <em>see</em> them in the first place, because I have committed to a regular writing practice. I don't think I would have got there if I decided to flit between ideas, or if I had committed to only writing when I feel like it or when something comes up. I do not know if I would even think to write something in the first place if I hadn't.</p> <p>Ultimately, it still doesn't matter, obviously. I'll be dust in a hundred years and no one cares if I do or don't commit to things, so long as I seem happy. But there is hope among all the fatalism. But I think the things you gain, and the muscles you exercise at the beginning of something are different to what's necessary when the motivation runs out and you're looking to improve. **If those are the muscles you want to build, stop flitting.**All this, of course, if you're able to healthily bare the cost of getting there.</p> <p>Sometimes the answer is a resounding and valid "no", "I really don't want to" or "I hate this". If it is, excommunicate the project from your life. Put it deep in that freezer.</p>]]></description> </item> <item> <title><![CDATA[(Not) Things I learned this week #38]]></title> <link>https://thomaswilson.xyz/blog/2021-05-01-things-i-learned-38</link> <guid>https://thomaswilson.xyz/blog/2021-05-01-things-i-learned-38</guid> <pubDate>Sat, 01 May 2021 10:24:00 GMT</pubDate> <description><![CDATA[<h1>(Not) Things I learned this week #38</h1> <p>This week seems to have really flown by. I've decided to take purposeful and intentional time for rest and personal recuperation this week. I'm not feeling burned out, but I could certainly smell some distant smoke on the wind. So here's to taking evenings to get around to those household repairs I've been putting off, to that growing pile of unread books. I said 2021 was my <em>Year of Discourse</em> and as we transition from winter to spring, I'm checking in with myself. I'm observing the change of weather, daylight, and flowers. If you get 15 minutes to just sit in a public park, I would strongly recommend.</p> <p>Because of that I've not been browsing the internet as much this week, so instead I'm just popping in with some music and reading recommendations.</p> <h2>What I've had on rotation</h2> <ul> <li><strong>Something New</strong> <em>if I could make it go quiet</em> by girl in red (2021, Pop). I've been listening to girl in red's singles since the algorithm started pushing her to me. The algorithm was right, guys. I love the mellow, low-key sad but energetic vibe of this album. The production makes you want to bop in some places and listen carefully in others. (<a href="https://songwhip.com/girl-in-red/if-i-could-make-it-go-quiet">links</a>)</li> <li><strong>Something Old</strong> <em>Blink-182</em> by Blink-182 (2003, Pop Punk). <em>I Miss You</em> came on a shared speaker this week and everyone in the room knew all the words, and also how to mimic the winey American grunge accent. I got this album in physical when I was in the last year of primary school, or early secondary school (I can't remember anything, dude). It's a great album from a seminal pop punk group who are still influencing the genre. (<a href="https://songwhip.com/blink-182/blink-182">links</a>)</li> </ul> <h2>Cool articles</h2> <ul> <li><a href="https://www.theverge.com/2021/4/27/22406673/basecamp-political-speech-policy-controversy">Breaking Camp</a> by Casey Newton for The Verge. Indie tech darling, Basecamp, really messed up this week. In a company-wide memo they initially banned "societal and political" discussions at work, before backtracking a little, and clarifying that they meant "just not on the work chat". To me this strikes of peak tech-bro culture where rich white men believe they can divorce themselves, and exist entirely independent of politics. Unfortunately, running a large, outspoken and (broadly) successful company is inherently a political act. I get the impression that DHH and Jason Fried (the two men at the helm of the company) didn't see the value in doing the work to create a company which actively combats racism/sexism in the workplace. I mean, I get it, it <em>is</em> work but also for some people simply surviving somewhere where they don't feel welcome is also work. As I write this, about 25% of Basecamp's employees (including the heads of marketing and design) have resigned. Unfortunately, I can't help but shake the feeling that this is what Basecamp wanted, given that they offered a six-month severance package to employees who wished to leave (if they had been there longer than a year). They'll now be creating an ideological silo with low diversity of opinion and/or representation. What happens now? I honestly don't know.</li> <li><a href="https://www.bloomberg.com/news/features/2021-04-14/qanon-daily-stormer-far-right-have-been-kept-online-by-nick-lim-s-vanwatech">A 23-year-old coder kept QAnon online when no one else would</a> by William Turton and Joshua Brustein for Bloomberg. Some of the biggest modern questions, which came to a undeniable and ugly head in January 2021, are about free speech, access to platforms, the responsibility and role of social media platforms in relation to their content. It's a concern that "free speech" is becoming coded language for extreme and polarised speech. It's worrying that individuals and groups are able to find willing audiences to listen to at-best-grey-area rhetoric, and at worse false and actively damaging speech. The authors of this article look at someone who's making hundreds of thousands of dollars a year by providing technical services and platform to these damaging figures. Perhaps my favourite quote from the article is:</li> </ul> <blockquote> <p>Lim argues that the real political crisis facing the U.S. is not extremist violence but erosion of the First Amendment. He says that restrictions on online speech have already brought the U.S. to the verge of communist tyranny, that "we are one foot away from 1984." After a moment, though, he offers a sizable qualifier: "I never actually read the book, so I don't know all the themes of the book. But I have heard the concepts, and I've seen some things, and I thought, ‘Whoa! That's sketchy as f---.'"</p> </blockquote>]]></description> </item> <item> <title><![CDATA[[LinkedIn Post] Being so customer-centric your customers think you're a robot]]></title> <link>https://thomaswilson.xyz/blog/2021-05-05-customer-centric-like-a-robot</link> <guid>https://thomaswilson.xyz/blog/2021-05-05-customer-centric-like-a-robot</guid> <pubDate>Wed, 05 May 2021 20:07:00 GMT</pubDate> <description><![CDATA[<p>(This is a cross-post of <a href="https://www.linkedin.com/pulse/being-so-customer-centric-your-customers-think-youre-robot-wilson">a short article I wrote on LinkedIn</a>)</p> <p>Stop me if you've heard any of these: "your call is valuable to us"… "on a scale of 1-10 how would you rate our…", "at {companyName} we care deeply about our customer experience…"</p> <p>Have you literally ever believed anybody when you've heard or read these things? I have not. Not even once.</p> <p>But we should care. I know Oxwash does. We care a lot that people send us their wedding dresses, bedding, favourite band Ts and home team jerseys. It's one of the top three reasons I decided to work at Oxwash - everyone genuinely cares 💙 I'm a front-end engineer, I make software that real customers use every day, and I care that they have a good experience. At very least I care that we should know if our software is confusing our new customers.</p> <p>👇 The good news is, it's actually really easy to stand out. Literally all you have to do is act like you're a human being who cares. So I'm bringing <strong>four tips on how to talk with your customers like you're a human who actually cares about them</strong></p> <ol> <li>🕵ï¸â€â™‚ï¸ <strong>Focus on who you want to talk to</strong>: You're not going to be able to talk to everybody all of the time. You have other things to do. I started talking to first-time Oxwash customers. It's enough that I'm fielding e-mails every day, but they're not banging down my door. I think it's really important your software is understandable to first-time users. If they don't stick around long enough to learn the…quirks of your system then there's a problem. You might care about your longest customers, or those in a certain age range or who work in a certain sector. Start small, you can always go bigger.</li> <li>🤖 <strong>Automate (but not too much)</strong>: How many e-mails in your inbox were hand-crafted and delivered by artisanal humans? Probably less than half. Use automation services to send-off e-mails based on database and software events. Use snippets (shoutout to TextExpander and SuperHuman) so that certain thing (like instructions on how to update your version of the app in the App Store) aren't hand typed every… single… time. But always, <em>always</em> put something hand-crafted into a reply, especially when someone's taken the time to send you useful feedback.</li> <li>🎠<strong>Share your findings</strong>: We now run monthly reviews with product, strategic, and technical staff. Every single bit of feedback (critical and complementary), every suggestion, every point of contention is brought up and discussed with real humans so that we can do something with that information.</li> <li>â³ <strong>Respect people's time</strong>: Every e-mail I send asking for feedback always gives people the chance to reply with "1", "2", or "3" (which stand for "good", "bad", "I'm too busy at the moment"). I'd love a considered and detailed response from every customer, but I'll settle for more data overall, if it means sacrificing a bit of depth. Trust me, people love telling you what could be improved, but rarely care to gush about your software to you.</li> </ol>]]></description> </item> <item> <title><![CDATA[The Weekly #39 (or #1, whatever)]]></title> <link>https://thomaswilson.xyz/blog/2021-05-06-weekly-39</link> <guid>https://thomaswilson.xyz/blog/2021-05-06-weekly-39</guid> <pubDate>Thu, 06 May 2021 19:44:00 GMT</pubDate> <description><![CDATA[<p>I'm going to stop writing my "things I learned" blog posts. They don't serve me in the way that they used to. As <a href="/blog/2021-04-27-excommunicate-your-ideas">I wrote recently</a>: kill your ideas and side projects, gladly and without delay.</p> <p>Death is more of a transition, though. The <em>things I learned this week</em> post is becoming simply _The Weekly.</p> <p>I'm not sure what I'm going to use it to write about, I'm going to take a few weeks to try some new formats out. Starting next week. This week I had to kill an old(-ish) friend.</p> <p>Thirty seven weeks ago (in August of 2020) I started writing a weekly blog post with a collection of random tidbits I had learned that week. I'd also put music recommendations and any cool articles I had come across. It was a great way for me to justify the time I spent on random corners of the internet, and share my love for the world. There's just so much cool stuff going on. Bees cook their enemies, authors write seminal science fiction books over a summer in an Italian villa with other famous poets, some dudes stop millions of pounds worth of books from Gatwick airport.</p> <p>But I don't browse the internet as much anymore. If you keep looking at your screen the algorithms will keep serving you up content and it felt a) distracting, and b) like you would never reach the end of it. The algorithms are much less inclined to serve you up random historical facts, and much more inclined to show you snappy videos and hot takes. This is the problem with advertiser-driven models of business. But I digress.</p> <p>I hate homework, and browsing the internet, fighting against the gain of <em>The Feed</em> , started to feel like homework. The knack to a healthy side project is tricking your brain into thinking that it's not homework (it definitely is though).</p> <p>So I was doing something I didn't enjoy or want to do because I felt I had to. That's disingenuous. I don't want to be disingenuous and I want to spent my time on projects that fulfil me (even if I never do ship them).</p> <p><strong>What now?</strong> I want to keep doing weekly posts. I get a lot from it. For the past two weeks I've put out a post nearly every 2-3 days. I obviously don't need the impetuous to write this week. But some weeks I do. As much as I bemoan "it feels like homework", sometimes we need that homework. Delayed gratification and all that.</p> <p>So I'm going to continue writing weekly, and call them <em>The Weekly</em>. I've got a few ideas about the kinds of thing I'd like to write about, most entirely in the realm of non-fiction, but still distant enough from my day job that I'm not just a software engineer all day every day. But hopefully something with a little more overlap to other areas in my life. Something where the algorithms of content can keep their tentacles away from.</p> <p>I'm uncertain if I would like to write timely or evergreen content. I see the benefit in both. I have written both. Let's see.</p> <p>This <em>is</em> the The Weekly #39 (or #1 depending on how you count). It's taken me a few days to decide this was the best idea, and I don't much fancy trying to whip up something entirely new in the next two days. Accept this apology or don't.</p> <p><strong>You should write</strong> If you are reading this don't write anything but think you might like to, or would simply like to write more, do it. Weekly. First thing on Saturday morning or last thing on Friday, pull up a chair to your kitchen counter, pour yourself a mug of something hot or a glass of something fun, and start writing. No one's going to read it anyway.</p>]]></description> </item> <item> <title><![CDATA[The Weekly #40: Garlic & The Ancients]]></title> <link>https://thomaswilson.xyz/blog/2021-05-15-weekly-40</link> <guid>https://thomaswilson.xyz/blog/2021-05-15-weekly-40</guid> <pubDate>Sat, 15 May 2021 10:11:00 GMT</pubDate> <description><![CDATA[<p>Okay let's learn us how over the past 3000 years garlic has been espoused by healers and spiritual leaders to ward off disease and evil. It'll take you down a rabbit hole of medical advice, social segregation, and spiritual prohibition.</p> <p>Garlic (<em>Allium Sativum</em>, of the<em>Allium</em> genus) has set its roots deep in the human story. And let's get one thing straight: garlic is bloody great. It's scientifically categorised in a group of foods called "please don't take these away from me". Smash it, chop it, then fry it. Or top-and-tail the bulb and put it in camembert. Pop whole cloves in with your salmon, soy sauce, and lemons. It's versatile. Tell me you're not drooling a little bit, you liar.</p> <h2>The Ancients</h2> <p>Records of our obsession with this tiny <em>Allium</em> starts some three thousand years ago, with the Ancient Egyptians, and continue upwards through Europe and Asia.</p> <h3>The Egyptians</h3> <p>Here's what we know about Ancient Egypt's relationship with garlic: i) It made up a massive part of the lower class' (i.e. slaves') diet, ii) they recognised it medically, iii) Tutankhamen was buried with some.</p> <p>The Egyptians knew it was an excellent nutritional supplement. It went alongside some probably very bland (but calorific) grains. Porridge and gruel with a side of garlic. Humans will find joy and love near anywhere, but I'm sure it's a little harder to find when it's 30+ degrees, you're building a pyramid, and everyone else around you smells almost exactly like they've not bathed for well over a month, and have only eaten porridge and garlic.</p> <p>This wasn't just random guesswork from the Egyptians to keep their slaves alive longer. The Ebers Papyrus is one of very few surviving full-length (about twenty metres all-in, not a joke) hieratic documents. It's a medical treatise largely about herbs, dating from some 1550 BC. It recommends garlic as a treatment for abnormal growths. As a fun aside, it also tells us that the Egyptians recognised the heart at the centre of a super important circulatory system.</p> <p>But if garlic was a to medical and nutritional supplement, it's odd that a couple of bulbs ere found in Tutankhamen's tomb. It would be like burying the queen with some chia seeds. Of course, it's always possible that it was left there by a careless labourer on their lunch break, but it could also have been so that the emperor would have something to keep him going in the afterlife. Or it could have been that he just really liked it (my personal favourite theory).</p> <h3>Medieval Europe</h3> <p>Some two thousand years later, medieval Europe saw garlic as a nutritional or medical plants. It was given to relieve constipation and prevent heat-stroke. Just like the Ancient Egyptians, it was consumed by manual labourers to stave off heat stroke.</p> <p>Medieval healers weren't messing about: they recognised its medical properties and were bullish on eating it raw. Specifically this advice comes from the writings of Abbess Hildegard of Bingen (1098-1179), who was canonised in 2012. Hildegard was a polymath and advocate for scientific observation and method <em>way</em> before it was cool for anybody (especially a woman) to do those things.</p> <p>To her, our physical and spiritual selves were natural. In general, Hildegard sounds cool: she had prophetic visions of the end-of-days and wrote poetry and composed music. She also left behind medical writings (insofar as medical writings had come in the twelfth century). In these, much as in her spiritual writings, she oriented her attitudes of what was good in terms of <em>viriditas</em>, a Latin word meaning "greenness", as in lushness and growth. Though she didn't create the term, or really use it consistently, Hildegard saw a lot to be admired and emulated in nature.</p> <p>To medieval doctors, garlic was "hot food", to be consumed during winter. I don't mean hot as in heated, I mean hot as in "this food will affect your heat humours". Medieval science understood our body in terms of humours (hot/cold, wet/dry, sweet/bitter). Hildegard recommended we consume garlic in moderation, lest it make our blood too hot.</p> <h3>Judaism</h3> <p>This idea of garlic as a hot food isn't unique to Europe. It spread to the middle-east, back to Egypt. The <em>Talmud</em>, the central text of Rabbinic Judaism, refers to Jews who celebrate Shabbat (Sabbath) as "Garlic Eaters". Despite this culturally-identifying level of garlic love, not all Jewish figures advocated for it.</p> <p>Maimonides (1138-1204) was a Sephardic Jewish philosopher who omitted all favourable mentions of garlic from his texts - advising minimal consumption, especially during the summer months.</p> <h2>Garlic is a spiritual force</h2> <p>Garlic wards off evil. Although we've moved on from understanding garlic as a "hot food", in many places garlic is seen as a ward against malign spirits.</p> <p>It goes without saying that garlic can ward off a vampires. We use to hand wreathes of it on our house and over doorways to ward off the evil eye. Allegedly King Henry IV was baptised in garlic water.</p> <p>The Ancient Greek goddess Hectate (goddess of crossroads, night, magic, and witchcraft) favoured offerings of garlic. They were seen as a way to ward-off evil.</p> <p>In certain religions (Jainism, Brahman Hinduism, Buddhism) the consumption of garlic is prohibited. Jains believe its harvesting is too harmful for the plants, but other eastern religions see it as too stimulating, and to interfere with our spiritual wellbeing.</p> <p>I don't think there are many other plants so beloved and feared across the world. To be seen as associated with witchcraft and night, and as worth burying alongside your beloved emperor king. Garlic has touched the collective human story, and it's cool that so much history lives in something so commonplace</p> <h2>Bibliography</h2> <ul> <li><a href="https://en.wikipedia.org/wiki/Garlic">Wikipedia - Garlic</a></li> <li><a href="http://powo.science.kew.org/taxon/urn:lsid:ipni.org:names:528796-1">Kew Gardens - Allium</a></li> <li><a href="https://academic.oup.com/jn/article/131/3/951S/4687053?maxto..">Historical Perspective on the Use of Garlic</a></li> <li><a href="https://www.phcogrev.com/article/2007/1/1-7">Historical, chemical and cardiovascular perspectives on garlic: A review</a></li> <li><a href="https://www.academia.edu/download/45254705/Plant_offerings_from_the_classical_necropolis_of_Thasos.pdf">Plant offerings from the classical necropolis of Limenas, Thasos, northern Greece</a></li> </ul>]]></description> </item> <item> <title><![CDATA[The Weekly #41: Productivity is a daily ritual]]></title> <link>https://thomaswilson.xyz/blog/2021-05-21-productivity-is-a-daily-ritual</link> <guid>https://thomaswilson.xyz/blog/2021-05-21-productivity-is-a-daily-ritual</guid> <pubDate>Fri, 21 May 2021 20:32:00 GMT</pubDate> <description><![CDATA[<p>The Weekly is a 1000-word-or-less essay on something I've been thinking this week. Let's talk about how productivity is (basically) a scam and how daily and weekly rituals are the backbone of any sane person's productivity.</p> <p>I once had the goal to move to Paris. I didn't achieve it (there was a pandemic). I had a goal to learn Italian (laziness). We've all got visions of our future where we're cleverer, skinnier, more intelligent, or in my case simply the same person but somewhere else.</p> <p>But we don't <em>do</em> visions. We reach them. But actually we don't reach them because the <a href="https://en.wikipedia.org/wiki/Hedonic_treadmill">Hedonic Treadmill</a> keeps us all both in motion and stationary at the same time.</p> <p>I'm going to put the tinfoil hat on properly in about 500 words, but I genuinely don't think productivity people want us to be productive, and "productivity" isn't a thing. It's a thing only because businesses and organisations need way to quantify the impact they're having.</p> <p>You are not a business. You are an individual. You do not have to justify yourself economically to anyone. You are whole, you are complete, you are enough.</p> <p>But we all want to be just a little bit…<em>more</em>.</p> <p>The secret to doing that little bit extra is in ritual. Every day you've got to wake up and do the hard work of redefining what "being productive" looks like. One day it will be writing a eulogy for a family member, the next it might be six hours of visual design work, or a board meeting. Can you compare these things? Maybe, but what a waste of mental effort you could have spent <em>doing things you actually wanted to do</em>.</p> <p>I'm going to share what that actually looks like.</p> <h2>My ritual</h2> <p>There are two ways I store my productivity system: in my physical notebook (<a href="https://www.leuchtturm1917.co.uk/notebook-classic.html">the Leuchtturm 1917 Hardcover A5 with Dotted Paper</a>) and a digital Second Brain (<a href="https://obsidian.md/">Obsidian</a>).</p> <p>I use these to do two things:</p> <ol> <li><strong>Weekly Note</strong> — Every Sunday I dedicate a double-spread on my physical notebook to a list of things I want to do that week. They're grouped roughly by work (‘ship feature x'), personal (‘2 x Runs'), side-project (‘refactor below-the-fold section of landing page').</li> <li><strong>Daily Notes</strong> — Every day I have a double spread in my notebook and a daily file in Obsidian. One side of my paper has a list of high-level tasks (‘go for run'), and the other has a list of things I might have thought about (‘luck is about increasing your surface area'). The digital daily note is infinitely editable. I use it as a scratch pad for writings, or sub-tasks, or links to things I've done that day.</li> </ol> <p>Every week, before I create the next-weekly note, I review my previous week. I look at what I did during the days, I look at what I wanted to get done, and I index things: thoughts that came up, projects which might be important for long-term use.</p> <p>The entire process is vague and not-specific. But if I go into any more detail it's not going to be useful to literally anyone else. How many other people are working in a small laundry startup, building language-learning tools, and taking nerdy notes on a small subset of podcasts because one day maybe something will stick and I'll be able to sound insightful in a conversation. There are none.</p> <h2>/Puts on the tinfoil hat/</h2> <p>Despite not making it to an apartment in Paris (yet), I like to think that I am a productive person. I got a PhD and once knew a lot of French. A lot of people would like to think they're productive. Globally, the <a href="https://www.grandviewresearch.com/industry-analysis/personal-development-market">personal development market is valued at around $38b</a>. There's a lot of money to be made by helping people be more productive.</p> <p>A pessimist would say there's a lot of money in making people feel unproductive, and that you can make them productive.</p> <p>People will try and sell you a framework, app, or system that will solve all your personal productivity problems. For a long time I was very committed to time-chunking, task managers, and efficient email. I don't religiously adhere to these anymore.</p> <p>Or worse, there are the Vaynerchuck-esque "hacks" which promise, as <a href="https://www.ft.com/content/d4e5d722-d6d3-4cca-bc89-4e596821295f">Pilta Clark writes in the FT</a> puts it, "to transform useless, Solitaire-addicted sloths into hard-charging models of efficiency".</p> <p>Learning the click-baity <em>14 Must Know Tricks For Productivity From A Wall Street Manager</em> isn't going to help you.</p> <p>That's because knowledge isn't the problem. We don't have a knowledge deficit. We have abundance. An overwhelming abundance, things we want to do, or should do, or feel like we should want to do. If only we had the time to achieve them.</p> <p>When there's $39b dollars at stake, and you want to keep it there, there are two things you can do:</p> <ol> <li><strong>Keep everyone feeling unproductive</strong> — make everyone feel like they're underperforming and need to keep up. Tell them they are unproductive and that your book or consultation or software are the only way to change that.</li> <li><strong>Keep giving people new goals</strong> — as soon as you've achieved one goal, move immediately to the next. Or why even achieve it, just drop it and move on.</li> </ol> <p>Most worthwhile goals require sustained effort. Fat comes back, muscles decay, French words <em>disparaissent</em> , and your fingers will forget a G-minor scale very quickly.</p> <p>The modern personal productivity industry is selling you a solution to a problem it created to benefit itself. People started making money off that. Loss aversion keeps that idea alive.</p> <p>Productivity is a daily ritual.</p>]]></description> </item> <item> <title><![CDATA[The Weekly #42: Metaphors for Design - Brutalist Architecture, Gardens, and Video Games]]></title> <link>https://thomaswilson.xyz/blog/2021-05-28-the-weekly-42-metaphors-for-design</link> <guid>https://thomaswilson.xyz/blog/2021-05-28-the-weekly-42-metaphors-for-design</guid> <pubDate>Fri, 28 May 2021 18:14:00 GMT</pubDate> <description><![CDATA[<p><em>The Weekly</em> is a weekly essay on something I've been thinking about in the last seven days. They're less than a thousand words long. This week I want to talk about the metaphors we use when we talk about designing for the web.</p> <p>I read two (fantastic) pieces on the web this week:</p> <ol> <li><a href="https://manuelmoreale.com/thoughts/what-even-is-a-website-anyway">What even is a website anyway?</a> by Manuel Moreale, who cited,</li> <li><a href="https://cmhb.de/brutalist-web-design">Brutalist Web Design</a> by Carl Barenbrug</li> </ol> <p>Sometimes I have no time for Medium-style self proclaimed "think pieces" about the web and technology. They'll expound self-indulgently on non-actionable points, while the rest of us get on with the mundane tasks of building things. This is a criticism I throw un-ironically from the glass house of my personal website.</p> <p>The above pieces are good. Very good, actually. They remind you it doesn't have to be like this. We don't have to design and build websites and web apps against a feature list that never stands still. That we're building for <em>our</em> audience, not the public.</p> <p>When I started web development, I internally compared what I was doing to Google's work. Now it's Stripe's (their designers are ~ artists ~ though) and a milieu of other web apps. Every user, we tell ourselves, is expecting an experience which rivals AirBNB, and Reddit, and Etsy. Even when they land on our dinky little personal site.</p> <p>I don't think they are. I think we, the people who design and build things on the internet, are. Not every blog needs a load-balanced Elastic Search instance against it. Heck, not every website needs Card or a Menu component.</p> <p>You can build a feature complete website with maybe a dozen html tags and a single CSS file. Does it even need JavaScript? It'd be heckin' fast and SEO optimised to boot.</p> <p>It doesn't matter what other people are doing. Your website probably won't turn into the next Reddit or Tumblr. A website can be feature complete. A feature list can <em>not</em> grow.</p> <p>Barenbrug's piece (mentioned at the top) argues that we can see websites like Brutalist Architecture: created and inhabited by humans…</p> <blockquote> <p>Brutalist architecture not only reduces construction to its basic materials, but it also finds beauty in that simplicity.</p> </blockquote> <p>I like being reminded of this. I like the Brutalist Architecture metaphor.</p> <p>There are two other metaphors which I think about a lot when I step back from building.</p> <h2>That Garden Metaphor</h2> <p>I heard about <a href="https://www.goodreads.com/quotes/749309-i-think-there-are-two-types-of-writers-the-architects">this quote</a> this from George R R Martin, in the context of writing:</p> <blockquote> <p>I think there are two types of writers, the architects and the gardeners. The architects plan everything ahead of time, like an architect building a house. They know how many rooms are going to be in the house, what kind of roof they're going to have, where the wires are going to run, what kind of plumbing there's going to be. They have the whole thing designed and blueprinted out before they even nail the first board up. The gardeners dig a hole, drop in a seed and water it. They kind of know what seed it is, they know if planted a fantasy seed or mystery seed or whatever. But as the plant comes up and they water it, they don't know how many branches it's going to have, they find out as it grows.</p> </blockquote> <p>I like this metaphor because it is chaotic and unpredictable. It's non-committed and it changes. I think these are good qualities to have in technology, and life.</p> <p>Gardening acknowledges the life of a project is out of your control. Something you can guide, and give suggestions to, but eventually something that will thrive best when given good conditions and space.</p> <h2>The Video Game Metaphor</h2> <p>I can't remember where I heard this first. I found some <a href="https://evilmartians.com/chronicles/level-up-for-ux-design-lessons-from-videogames">good</a> <a href="https://www.nngroup.com/articles/usability-heuristics-applied-video-games/">articles</a><a href="https://www.invisionapp.com/inside-design/the-ux-lessons-i-learned-from-video-games/">on</a> it, though.</p> <p>Video games are expertly and intentionally designed. Everyone who designs things can learn something from them. I like the analogy for two main lessons:</p> <ol> <li>Your design needs to get out of the way</li> <li>Design can reduce friction, not make everything easy</li> </ol> <p><strong>Get out of the way.</strong> No one plays a game for the User Interface (UI) or Heads Up Display (HUD) design. But a bad design will ruin your experience as a player. Because it gets in your way.</p> <p>Nobody goes to QuickBooks because they just want poke around. People go to QuickBooks to make sure their receipts, invoices, and payroll are up to date then they <em>get the hell out of there</em>. Nobody opens the inventory in Diablo II to browse, you open it to check the stats on your fire staff and equip or sell it.</p> <p>I work at a laundry company. I agonise over creating the best user experience and interface elements I can. People don't go to our website because they want to look at a list of things they <em>could</em> get cleaned. They go there to get their things cleaned then get out. People don't want to notice my new Receipt component design.</p> <p><strong>Reduce friction.</strong> Video games are challenging. It makes them rewarding. Hollow Knight is maybe the most frustrated I have felt in 2021 so far and <em>we are in a pandemic</em>. Hades is so frustrating I could cry at times.</p> <p>If QuickBooks' goal was to remove all stress and difficulty from a user's life, they'd just say "pay us $1/mo and we'll do all your accounting and filing and you'll never have to worry about it". The business fails but the customer succeeds.</p> <p>Your website or app is one thing your user will do today. Then, if you're lucky, they'll forget about you completely, and move on. They're okay with the friction of the task at large. Taxes are annoying, bank statements are annoying. But you can't solve that unless you become a government or bank.</p> <p>Don't solve the puzzle, be a good puzzle piece.</p>]]></description> </item> <item> <title><![CDATA[The Weekly #43: Vision, problem, and action]]></title> <link>https://thomaswilson.xyz/blog/2021-06-05-weekly-43-vision-problem-action</link> <guid>https://thomaswilson.xyz/blog/2021-06-05-weekly-43-vision-problem-action</guid> <pubDate>Sat, 05 Jun 2021 10:16:00 GMT</pubDate> <description><![CDATA[<p>The Weekly is a weekly essay where I write about something I've been thinking about in the last seven days. They're under 1000 words, and this week I want to talk about vision and problems when you're building a new product.</p> <p>I'm building <a href="https://www.thelexicon.app">the lexicon</a>, where I am (un-ironically) trying to build the world's most useful language learning resources. I like Duo Lingo, but I don't think it helps you much in the real world â„¢ï¸. It's born out of my desire (and previous moderate success) to be come proficient in French. The pandemic slashed my French proficiency, though.</p> <p>Over the past few weeks I've been thinking more about this product idea. I think there's enough scope in the vision of "best language learning resources in the world" that I can meaningfully do something new. I think I know enough about computers and learning to do something impactful.</p> <p>The first thing I did? Set up a landing page with a sign-up form for a mailing list, and released two (free) sets of flash-cards with the most common words. If you want them, you know where to find them.</p> <p>None of these things (which took real time and energy) solve any of the core problems that I'm trying to solve, though. I've got a vision for the company, and these things move me generally in the direction of it. I can't sell anything if people can't find where to buy it.</p> <p>But I don't think I solved the high value problems.</p> <p>In his essay <em>how to get startup ideas</em> Paul Graham says:</p> <blockquote> <p>You should only work on problems that exist. And yet by far the most common mistake startups make is to solve problems no one has… The verb you want to be using with respect to startup ideas is not "think up" but "notice"… The most successful startups almost all begin this way.</p> </blockquote> <p>I created this vision because I noticed a problem: I want to learn a language in an efficient way, that gets me to real-world use quickly. Having a landing page does nothing to solve that particular problem.</p> <p>What Graham says is (probably) true, but I also think they miss out on another dimension of problems: the specificity / uniqueness of them.</p> <h2>Getting Specific: Flashcards</h2> <p>Let's get specific.</p> <p>I produced some flashcards sets. These keeps within the vision, but what problems do flashcards solve?</p> <ol> <li>Target-language translations of words (<em>être</em> âž¡ï¸ "to be")</li> <li>They decide what word's you're learning</li> <li>The can be used in <a href="https://en.wikipedia.org/wiki/Active_recall">Active Recall</a></li> </ol> <p>This list, broadly, runs from most generic to most opinionated solutions.</p> <p><strong>1. Bilingual translation</strong> Could you learn French with resources which <em>just</em> showed you the words in the target language. <em>Verser</em>, <em>manifestation</em>, et <em>vaccin</em>.</p> <p>Have you just learned <em>to pour/contribute</em>, <em>protest</em> (noun), and <em>vaccine</em> ? No. You maybe could have guessed the latter, though.</p> <p>To remove the bilingual elements of language-learning flashcards would be an unexpected feature. Maybe replacing them with image/sound <a href="https://link.springer.com/article/10.1007/s11145-018-9906-x">can help</a> (an auditory component for French â†”ï¸ English translations would be beneficial) but largely, you need the bilingual text. This isn't a high-value problem.</p> <p><strong>2. Decide what words</strong>What words should I learn? This is a more interesting problem. It's actually one of the core problems that lead me to think about the lexicon. I don't think we teach useful words to new language-learners.</p> <p>The problem of "what words do we learn, and in what order" is a problem worth solving. So I used data-backed findings to decide on the most common verbs. This is a higher-value problem.</p> <p>**3. Encourage Active Recall **Active Recall is, almost irrefutably, a core component of any language-learning practice. When you use flashcards, you should see the prompt and guess the answer (actually guess it, like, say it aloud) before viewing the answer. Anything else is passive recall or lying to yourself.</p> <p>Active recall is essential to any effective language learning practice, and I was leaving it as optional. "Here", I said, "are some flashcards. You know how to use them effectively, right?".</p> <p>A foolish assumption that was probably false (no one teaches these skills <em>de facto</em> in schools) which essentially let the user determine exactly how effective or useful the language-learning resource was going to be</p> <p>I had a chance to solve an important and unique problem (how to pair the "right" words with the "right" learning method) and I delivered it in static flashcards. I moved towards the vision without solving the particular problems: actually increasing your French vocabulary.</p> <p>I left the hard work of solving the problem to the customer. I shifted responsibility.</p> <h2>Visions are slopes, problems are places</h2> <p>I was guided by a vision, without thinking about the unique and important problems.</p> <p>A vision is like a slope. It's easy to know when you're heading up or down hill, and you can conform to a vision by degree: head directly down hill, or go diagonally.</p> <p>If a vision is a slope, a problem is a place. Or a least a region. The further away from the problem you are, the easier it is to head towards it. When you haven't started, doing almost anything will get you closer. Setting up a landing page and a mailing list, for example.</p> <p>But you get a bit closer and you've got to change bearing. You were heading east, but now you've got to head north-east. And then north-north-east. Anything other than that and you start veering away your destination. Maybe you'll find a different problem along the way (the infamous <em>pivot</em>) or maybe you won't.</p> <p>A mailing list, a landing page, and some static flashcards are not the world's most useful language learning resources. They're part of the vision but not the product,</p> <p>Set vision, solve problems.</p>]]></description> </item> <item> <title><![CDATA[The Weekly #44: Thinking about Conspiracy Theories]]></title> <link>https://thomaswilson.xyz/blog/2021-06-10-weekly-44-thinking-about-conspiracy-theories</link> <guid>https://thomaswilson.xyz/blog/2021-06-10-weekly-44-thinking-about-conspiracy-theories</guid> <pubDate>Thu, 10 Jun 2021 20:18:00 GMT</pubDate> <description><![CDATA[<p><em>The Weekly</em> is a series of essays under one thousand words where I write about something I've been thinking over the last seven days. This week I want to talk about misinformation and conspiracy theories surrounding Covid-19, and why they're more harmful than previous conspiracy theories. I've been a little busier than usual this week, so let's get into it</p> <p>Alongside the actual pandemic of Covid-19, the World Health Organisation (WHO) has declared an <a href="https://www.who.int/health-topics/infodemic#tab=tab_1">infodemic</a>: the "false or misleading information in digital and physical environments during a disease outbreak".</p> <p>The consequences of misinformation worsen the effect of a disease on a population (that's us). They can work directly by encouraging less-safe (i.e. less adherence to preventative measures, like wearing a mask or social distancing), as well as specifically dangerous (intentionally attempting to spread the disease) behaviour.</p> <h2>Compassion & Sympathy</h2> <p>Before I begin, I also want to add that over the past few weeks I have felt a lot more sympathy for those who believe COVID-19 misinformation. <a href="https://www.cambridge.org/core/journals/psychological-medicine/article/coronavirus-conspiracy-suspicions-general-vaccine-attitudes-trust-and-coronavirus-information-source-as-predictors-of-vaccine-hesitancy-among-uk-residents-during-the-covid19-pandemic/FEC34AA0D1972E3A761C784A39D26536">They are typically associated with</a> lower education, lower trust in the government, lower income, and lower scientific trust.</p> <p><a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC8083329/">An American study</a> which looked at adherence to social distancing measures in American citizens found that those who disregarded social distancing were more likely to to have great "pseudoscientific beliefs, lower governmental and institutional trust, lower risk perceptions, and [conservative political] affiliation".</p> <p>I used to think believing the conspiracies was a choice, and now I think it's much more a consequence of feeling unheard. Of seeing the world as unfair, and seeking a reason other than ignorance or a bureaucracy-over-people government.</p> <p>Believing these conspiracy theories is easier when you don't want the world to be unfair. When you don't want there to be a disease that doesn't threaten you, but does threaten others. So you have to sacrifice something for "nothing" in return . I'll touch on cognitive dissonance later, but I think we're retrofitting what we're seeing into what we want to believe.</p> <h2> Belief in multiple conspiracy theories</h2> <p>I'm near the end of R. Brotherton's <a href="https://www.bloomsbury.com/us/suspicious-minds-9781472915641/">Suspicious minds: why we believe conspiracy theories</a>. In it, they talk about how belief in conspiracy theories are often correlated. If you believe in one, you're likely to believe in another. Even when they're unrelated.</p> <p>Previously, this would mean believing that the Kennedy assassination was connected to 9/11. Or that the Freemasons secretly run our governments and plan our wars. But what do you do with that information? Trot it out at parties to a silence nobody feels comfortable filling, or share it among your co-conspirators to nods and disgruntled feelings?</p> <p>You might be (probably) wrong, but you're also (probably) not hurting anybody with your beliefs.</p> <p>The Wikipedia page for <a href="https://en.wikipedia.org/wiki/COVID-19_misinformation">Covid-19 Misinformation</a> runs several thousand words, and details at least ten broad categories of misinformation. These fall into a few groups:</p> <ul> <li><strong>The disease</strong>: e.g. the belief that COVID-19 was created and released by a secretive global organisation or government to control the global population; or that the mortality of the disease is not worth worrying about.</li> <li><strong>Medical and scientific responses</strong>: e.g. the belief that vaccines or medications are not safe or could even be designed to actively harm people</li> <li><strong>Social responses</strong>: e.g. the belief that some government or secret organisation are trying to make us obedient to their commands</li> </ul> <p>These are <em>massively</em> different types of arguments. But they all push behaviour in one direction: less adherence to public health policy. Less social distancing, less vaccination, more deaths and suffering.</p> <p>Separate among the conspiracy theories which have emerged are that COVID-19 was a virus invented as a weapon to control global population, as a trigger to get us to inject microchips into our brains for mind control or to impart our ability to reproduce, and as a way to get us used to wearing face-coverings to make us more obedient citizens.</p> <p>If you've got brain control, you don't need to persuade anyone. If you're trying to control population in a physiological way, why do you need wilfully obedient citizens?</p> <p>It's possible to hold conflicting beliefs in our head. Our brains will shape them until they're in-accordance with each other. We call that <a href="https://en.wikipedia.org/wiki/Cognitive_dissonance">cognitive dissonance</a>, and it saves us from a lot of distress and time wasted in examining everything we believe and do before we assimilate something new.</p> <p>Now, with COVID-19, even disconnected beliefs are pointing people's actions in a single direction. Belief a maligned global power set against the free will of the people, or corrupt medical researchers, or an evil foreign state all point towards the belief that adherence to public health behaviours should be ignored because COVID-19 is a) not-existent, b) not dangerous, or c) a weapon to control us, and should be ignored.</p> <p>Belief in one conspiracy theory makes you more likely to believe another, even when they're not related. Even when they're directly opposing.</p> <h2>Conspiracy theories fill a vacuum</h2> <p>We do not know everything about COVID-19. The origin and nature of the virus itself, our governmental and societal response to it. The chance that we, in June of 2021, know everything there is to know about a pandemic which is still happening are very low. We do not know everything. That statement is caution.</p> <p>This need for caution, of not overstepping our boundary or certainty, has left gaps in people's understanding of the disease.</p> <p>A theory with less evidence than the one it opposes shouldn't be able to dislodge one with more explanatory power. But they can. When they're more appealing or more conforming or more sensible to the people hearing them.</p> <p>We're already susceptible to these beliefs, and we don't have the infrastructure (legislative, technological) to stop them spreading. So they're spreading. And they're changing actions.</p> <p>So they're causing unnecessary deaths.</p>]]></description> </item> <item> <title><![CDATA[The infinite coast of problem solving]]></title> <link>https://thomaswilson.xyz/blog/2021-06-13-infinite-coast-of-problem-solving</link> <guid>https://thomaswilson.xyz/blog/2021-06-13-infinite-coast-of-problem-solving</guid> <pubDate>Sun, 13 Jun 2021 19:48:00 GMT</pubDate> <description><![CDATA[<p>I'm currently designing and building the lexicon, ambitiously explained as "the most useful language learning resources in the world".</p> <p>The problem is that there's a lot involved in that, you know? There's theoretical questions like "what does most useful mean?" and "how do humans learn languages"?</p> <p>Then there's small problems like "what is the shape of the JSON I send to the client?" and "how do I generate prompts & questions for language learning?".</p> <p>I've been thinking about these problems, in some capacity, for legitimately years. So it's no wonder that I come to them with so much gusto.</p> <p>A lot of the questions are nebulous. "Best" is subjective, and learning is a spectrum. Proposing theories and ideas is okay, but making something and finding out is even better.</p> <p>The questions are big, and important to me, and so I don't want an imperfect solution. The tech has to scale, the processes have to be automated, everything has to be <em>just so</em>. I'm building tools for problems I haven't encountered but know I will encounter. Or would encounter, if I just got on with the work.</p> <p>Problem solving is fractal. Every step you propose to get from A to B has a whole subset of steps if you look at it closely. If you're not careful it goes from A -> B, to A1 -> A2, to A1.i -> A1.ii.</p> <p>It's like how [the coastline has theoretically infinite length].</p> <p>What I'm saying is that this week I challenged myself: no code, just design. Just product problems and questions. No infinite coastlines, no cartography.</p> <p>So I made some designs. They're down below. This is what happens when I ask the question "what could the future of language education <em>actually</em> look like" and then demand a concrete answer from myself.</p> <p><img src="/assets/blog-images/2021-06-13/dashboard.png" alt="the lexicon dashboard"></p> <p><img src="/assets/blog-images/2021-06-13/guess-empty.png" alt="guessing a word"></p> <p><img src="/assets/blog-images/2021-06-13/guess-answers.png" alt="guessing a word with answers"></p>]]></description> </item> <item> <title><![CDATA[The Weekly #45: This is an old story]]></title> <link>https://thomaswilson.xyz/blog/2021-06-27-weekly-45-this-is-an-old-story</link> <guid>https://thomaswilson.xyz/blog/2021-06-27-weekly-45-this-is-an-old-story</guid> <pubDate>Sun, 27 Jun 2021 08:40:00 GMT</pubDate> <description><![CDATA[<p>The Weekly is a series of essays where I write on something I've been thinking about over the last seven days. They're under a thousand words. There's some stuff going on in my professional life (positive stuff, but still stuff, you know?) so it's going to be a short one this week. It's better to publish than not.</p> <p>I want to talk about old stories. I mean things that people have been experiencing for thousands or tens or thousands of years. I take a <em>lot</em> of joy from realising when I'm seeing, or involved in, and old story.</p> <p>There are some cliché old stories: sitting around a campfire, the smell of freshly cooked bread, hearing somebody sing or read a story out loud. There's a chance that literally everybody in your family tree for the last one hundred (or two hundred) generations has experienced these things. If humanity makes it another one hundred generations, they'll probably experience them too. These things are old stories.</p> <p>I take a special kind of joy in realising that I'm in the middle on an old story. Let me give an example. A few weeks ago my company held their Christmas/Summer party (lockdown had us delayed). We all got on a boat, and went up and then down the Thames for a bit. While on the boat, some people got a little too familiar with the bar. Some people got too drunk on a boat.</p> <p>People getting a little too drunk on a boat: old story.</p> <p>Watching somebody sweep the dust from their shop floor out on to the street: old story.</p> <p>Picking blackberries off the plant while passing by: old story.</p> <p>Noticing the summer solstice: old story.</p> <p>Old stories make the world feel richer to me. They bring me closer to the human experience, and away from the personal experience. They make me feel like I'm a part of something, and humbled. We've come really far in the last one hundred years, but some things have been the same for the past couple of thousand. And they'll stay the same. We're all still people.</p> <p>Try and keep an eye out for old stories, they're fun.</p>]]></description> </item> <item> <title><![CDATA[Out of office: summer 2021]]></title> <link>https://thomaswilson.xyz/blog/2021-07-08-out-of-office</link> <guid>https://thomaswilson.xyz/blog/2021-07-08-out-of-office</guid> <pubDate>Thu, 08 Jul 2021 15:47:00 GMT</pubDate> <description><![CDATA[<p>Summer has always been a time for <em>doing</em> and living. It doesn't feel right to force at least one piece of writing out of my brain every week. Discipline and routine are useful tools for living, but so is taking a summer break. I'm going out of office for the next couple of months, so I can focus on the latter. I want long cycles, solitary train rides, food eaten outdoors, and adventure. This is what summer is for.</p> <p>So there will be less writing in public, and more living in private for a little while. It's been a weird 18 months with a pandemic, but this year I feel I can have a more "normal" summer. So I'm going to do that. Shame that I won't be going to Florence, though.</p> <p>Take care and stay safe, I'll be back when the days start drawing in ✌ï¸</p>]]></description> </item> <item> <title><![CDATA[Back in office: summer 2021]]></title> <link>https://thomaswilson.xyz/blog/2021-10-11-back-in-office</link> <guid>https://thomaswilson.xyz/blog/2021-10-11-back-in-office</guid> <pubDate>Mon, 11 Oct 2021 07:16:00 GMT</pubDate> <description><![CDATA[<p>After a year and a half of very new normal, summer 2021 was pretty perfect. I mean, the weather wasn't summery, being around a lot of strangers (and even friends) felt odd, and there seemed an <em>awful</em> lot of pressure to make this The Best Summer Ever.</p> <p>I'm pretty grateful for a lot of small moments this summer.</p> <p>Here are some of those moments:</p> <ul> <li>Moved to Oxford and filled a moderate-sized house with an unwise number of plants</li> <li>Climbed Helvellyn and Haystacks in the Lake District</li> <li>Ate food outside with friends</li> <li>Ate food inside with family</li> <li>Watched campfires</li> <li>Drank gin on hot evenings and cold nights from between clinking ice and wedges of citrus</li> <li>Cycled through sunny mornings and afternoons</li> </ul>]]></description> </item> <item> <title><![CDATA[It feels like the handbrake has come off]]></title> <link>https://thomaswilson.xyz/blog/2021-10-25-the-handbrake-has-come-off</link> <guid>https://thomaswilson.xyz/blog/2021-10-25-the-handbrake-has-come-off</guid> <pubDate>Mon, 25 Oct 2021 18:11:00 GMT</pubDate> <description><![CDATA[<p>Over the past two months I have inherited leadership of an engineering team I have worked in for the last twelve months. In the last two weeks I've seen the speed of development go from not-slow, to almost inarguably fast (given current resource constraints).</p> <p>I've spent months slowly attempting to unpick the parts of the team and company which were bottlenecks. There's actually some very interesting conversations around what makes a bottleneck, and how do you spot one. But I want to talk about the feeling of not moving fast, and then all of a sudden moving quickly.</p> <p>The analogy I've been giving is that it's like I'm in a car facing down hill, and then the handbrake came off.</p> <p>At first I was like <em>ahhhhhh!</em>, but now I'm more like <em>ahhhh?</em>. Ya know?</p> <p>For the year before this I had been a member of a very small engineering team, where I had written or reviewed 90% of the code that went into production. I, broadly, knew all of the projects, and what was happening.</p> <p>Now, with a larger team (six) and some well-experienced hands in and incoming, things are starting to happen that I don't <em>fully</em> understand. Sure, I understand the what and the why, but the how isn't as in focus. I'm a frontend engineer by trade, dev-ops is... <em>hand-wavy</em> it works?</p> <p>This is the <em>ahhhhhhh!</em> moment. The fear that things are happening, decisions are being made, changes to passing, and I've had full visibility on the result but far less on the process. And that scares me because what if things start going wrong?</p> <p>I trust all the engineers in my team implicitly, you have to, but it's still scary. Things still go wrong.</p> <p>And the <em>ahhhhh?</em> ? That came when I saw the cadence of our releases going up, the quality and security of our software being cemented (test-driven development and refactoring), and both deeper and wider features being shipped.</p> <p>Yes, it's terrifying and I feel a little out of control, but it's been about two years since I've felt like I'm part of such a productive engineering organisation. It feels like the value proposition of engineering is apparent, not promised.</p> <p>There are lot of parts to this improvement, including but not limited to:</p> <ul> <li><strong>Test-driven development</strong> at unit, functional, and integration level</li> <li><strong>A simple git workflow</strong> for <code>main</code> -> <code>feature</code> -> PR -> <code>main</code></li> <li><strong>Pair programming</strong> for 10-50% of my day</li> <li><strong>Feature-driven tickets</strong>, by moving to a monorepo and unifying development & deployment, engineers ship an entire (cross-cutting) feature all at once</li> </ul> <p>I'd love to talk in detail on each of these, but for now I'll just say that I am confident each of these highly correlate to better developer productivity.</p>]]></description> </item> <item> <title><![CDATA[How to onboard new software engineers without paying high interest]]></title> <link>https://thomaswilson.xyz/blog/2021-10-28-how-to-onboard-new-software-engineers</link> <guid>https://thomaswilson.xyz/blog/2021-10-28-how-to-onboard-new-software-engineers</guid> <pubDate>Thu, 28 Oct 2021 16:03:00 GMT</pubDate> <description><![CDATA[<p>In the past four months I've hired about five software engineers (including interns). So I've been thinking about how we onboard new engineers to the team. This has been especially important because over half the engineers have never had an engineering job before, or even a job as a university graduate.</p> <p>This means that onboarding isn't <em>just</em> about introducing someone to the company or the engineering team, it's about bringing people into both their first "proper" job.</p> <p>It feels awesome that I can make someone's first experience as a software engineer so good. Or at least have the <em>potential</em> to do so.</p> <p>Tell you what doesn't feel super: the onboarding process. It takes a lot to introduce anyone to the way that professional software engineers plan, do, and think about work. It means that my time is spent teaching, not doing. And while teaching <em>is</em> doing, I definitely notice a loss of momentum and bandwidth in the (already quite small) team.</p> <p>A new engineer will land in your team anywhere between 0-90% ready to start contributing code to production. The goal of an onboarding process is to get that slider to 100%.</p> <p>I argue that slider is tending towards 0% unless you're effectively onboarding them. That is, if you bring someone onboard and then make cursory efforts to keep them get them up to speed, they'll slowly grind down to 25-50%.</p> <p>I also suspect it gets harder to move this slides close to 100% over time. Onboarding is like a high interest debt: if you're going to pay it, you'll pay less if you pay it quicker.</p> <p>In thinking about onboarding in our team, and in our company, there are a handful of insights that I think are worth sharing explicitly.</p> <p><strong>Cook from chilled not frozen</strong>: If someone comes into a new job knowing the bare bones of the job (anything that's in their contract, who their manager is, and where they'll be working) ten they're coming in frozen. There's been no progression between the end of the interview process, and the start of the working process. I (very purposefully) run a pretty high-touch interview process, and by the time a candidate receives an offer, there's been some good rapport built between us and them. Making sure that the candidate knows exactly when and where they're expected in on their first day is table-stakes. Defrost it even further by setting clearer expectations and timeframes. Bonus points if you can CC their colleagues into these emails.</p> <p><strong>Do it in person</strong>: we're a remote-by-default hybrid engineering team. Honestly I think that works great for us[^That's not to say it's easy. Remove work comes with its own challenges which are real and can slowly strangle a company or team] but onboarding should be done in-person, or as close to synchronously as possible. There are just so many little things, like using new Browser, using Slack not Teams, MacOS not Windows, that can make "simple" things deceptively hard. If you're doing something in person, or synchronously, you can put a real early stop to some rabbit-hole chasing. You also get the best feedback possible for improving your onboarding process.</p> <p><strong>Read from a script</strong>: Despite doing it in person, have a really clear (ideally ordered) checklist of things that need to be done on the very first day of onboarding (accounts to create, software to download). New starters should have access to the checklist, but the checklist is not the interface. You, a human being, are the interface. Allow someone to synchronously ask questions, send emails and messages on the new starter's behalf.</p> <p><strong>Have many checklists</strong>: I've written three lists for onboarding new engineers: accounts and software, a list of people they need to arrange meetings with, and the code deployment pipeline. Each of these have different time frames and purposes. Break things up, instead of having one big old long list.</p> <p><strong>Complete the checklist ASAP</strong>: Focus should be on getting a new starter to the end of all the lists ASAP. Accounts and software should be as as close to complete by the end of the first day. We aim to have an engineer go through the deployment of a bugfix/quickfix ticket in the first two days (sometimes three days), and by the end of their first week I want them to have events in their calendar to meet everyone they need to.</p> <p><strong>Force one-ones with the entire business</strong>: We're an engineering team in a highly ops-focused startup, and we're hybrid remote as a team, but distributed across three cities as a company. This means that the chance of water cooler chat is pretty low. I think there's incredible value in having engineers meet as many members of the team as possible, across as many functions as possible. This is especially important where internal staff are also users of the software you're building.</p>]]></description> </item> <item> <title><![CDATA[Ship the product, build the platform]]></title> <link>https://thomaswilson.xyz/blog/2021-12-12-build-the-platform-ship-the-product</link> <guid>https://thomaswilson.xyz/blog/2021-12-12-build-the-platform-ship-the-product</guid> <pubDate>Sun, 12 Dec 2021 17:21:00 GMT</pubDate> <description><![CDATA[<p>Imagine you're part of a new-ish, in-house engineering team working with a legacy codebase. How do you extend this codebase into new features while discovering and fixing Dark Patches on that same codebase's map? I actually don't know, and myself and the rest of the engineering team at Oxwash have been working hard to think about solving this.</p> <p>My thinking about shaping and prioritising this work first coalesced around one phrase: <strong>Build The Platform</strong>. This was shamelessly stolen from Steve Yegge's <a href="https://gist.github.com/chitchcock/1281611">Google Platforms Rant</a>. It's long and very good, and if you're leading an engineering team I think you should read it.</p> <p>I think engineering teams should be building the platform, or operating system, that runs a business. The platform should account for the objects/entities, and processes that comprise a business. Things like Orders and Users. A Platform can be thought of as a bunch of services, where each service has a single responsibility. Like letting users register and sign up, or like recording revenue.</p> <p>Platforms help company and public users interact with the business. We do laundry at Oxwash, so the platform is about helping us do more laundry, more efficiently. You'll be shocked to learn running a laundry isn't as simple as it seems.</p> <p>While I've found this a fantastic tool in technical and strategic discussions, it's not great when you're talking with end-users, internal or external. Computers and software are a means to an end for 95% of people. To those people you can't say "this sounds like we need to alter our internal scheduling engine". To these people you have to ask product-focused questions, like "what tools do you need to spread workload so that laundry can be done consistently without being overwhelmed?"</p> <p>This is product-level thinking. Behind the scenes we're building a platform. When we think about grouping, shaping, and prioritising work it's about choosing what's best for the platform. Front-of-stage, we're shipping a product. Many products, actually: internal and external tools, and even more if you think about tests and environments as features.</p> <p>This way the engineering team can think about adding value to the business by building products which are demonstrably useful to the people who need them. Separately, they can make the engineering team's life easier by helping more code be shipped faster and with more confidence that it's not going to go wrong.</p> <p>This addresses two core questions I find myself being asked a lot: the <em>what</em> and the <em>how long</em>. If you've got good answers to those questions, you're doing well (I think).</p> <p>I'm currently having to re-evaluate this beautifully simple distinction. That's caused where problems in the platform cause problems across products.</p> <p>A platform composed of separate, business-level services means that when something doesn't behave as expected, you don't always get clear and obvious signals. You might get reports of minor unexpected behaviour here-and-there, or some weirdness occurring in some edge cases.</p> <p>When these problems are in Platforms, not Products, it can make the <em>what</em> and the <em>how long</em> answers seem wildly disproportionate from a product perspective. How long to fix this tiny bug?</p> <p>And now you're relying on either a) engineering expertise, or b) trust to communicate the source of the problem. You're also going to have to use Platform factors in the prioritisation of fixing these problems, which adds another layer of complexity when translating Work In Progress at the engineering-product interface.</p> <p>Engineering is tough, yo.</p>]]></description> </item> <item> <title><![CDATA[Vibe Check #0]]></title> <link>https://thomaswilson.xyz/blog/2022-02-04-vibe-check-0</link> <guid>https://thomaswilson.xyz/blog/2022-02-04-vibe-check-0</guid> <pubDate>Fri, 04 Feb 2022 18:46:00 GMT</pubDate> <description><![CDATA[<p>January 2022 was a good month. It's weird how slow the start of the year feels, until it's over. The days get longer, and it feels like momentum is returning to my life, which is cool.</p> <p>Some highlights from this month include:</p> <ul> <li>Turning 30, taking the day off work, and sitting in the sun drinking a coffee, reading Marcus Aurelius. I've read <em>Meditations</em> a lot, but not for a couple of years. There are parts of it I'm proud to have internalised. There are other parts that are good to hear.</li> <li>Going for a Christmas dinner nearly five weeks post-fact. Or maybe forty-seven early. It was wonderful, but boy has the pandemic made it easy to forget that some people ironically eat dinner at 22:00. That's insane to me, I should be in bed.</li> <li>Taking my first outdoor road cycle of 2022. The days are short and the weather mild (if a little windy), my stamina has legitimately been shot, but it felt good to be out.</li> <li>The days are getting longer. It's now not dark when I finish work. I can take an evening stroll or run (so long as it's <em>immediately</em> after work) and it's not dark.</li> <li>I've seen a lot of robins.</li> </ul> <p>2022 feels as though it's off to a gentle start to me personally. There have been (good) growing pains at work, as product and engineering leave their infancy, and processes and people start to get put in place. It's been truly remarkable to return my attention to the design of accessible, clean user interfaces. There's a lot of dust in those books, or wastage in those muscles (depending on the harshness of your preferred analogy). It's good though - I love design, and I love some of the engineering conversations we've been having recently.</p> <p>This month I've been reading:</p> <ul> <li><a href="https://www.hive.co.uk/Product/Anthony-Horowitz/A-Line-to-Kill--from-the-global-bestselling-author-of-Moonflower-Murders/25942616">A Line To Kill</a> by Anthony Horowitz. This whole series (<em>Hawthorn and Horowitz</em>) is an absolute delight.</li> <li><a href="https://www.hive.co.uk/Product/Marcus-Aurelius/Meditations/356664">Meditations</a> by Marcus Aurelius.</li> <li><a href="https://www.hive.co.uk/Product/James-Clear/Atomic-Habits--the-life-changing-million-copy-1-bestseller/22336599">Atomic Habits</a> by James Clear. It's a cliché and I'm late to the party, but definitely worth reading.</li> <li><a href="https://www.hive.co.uk/Product/TJ-Klune/Under-the-Whispering-Door/26207314">Under the Whispering Door</a> by TJ Klune. It's a fiction book about death.</li> </ul>]]></description> </item> <item> <title><![CDATA[📖 Atomic Habits is a really good book]]></title> <link>https://thomaswilson.xyz/blog/2022-02-22-atomic-habits-is-a-really-good-book</link> <guid>https://thomaswilson.xyz/blog/2022-02-22-atomic-habits-is-a-really-good-book</guid> <pubDate>Tue, 22 Feb 2022 20:56:00 GMT</pubDate> <description><![CDATA[<p>I spoke to thirty founders, and they all do these three things before breakfast.</p> <p>My nine journaling prompts for other CEOs and founders</p> <p>One rule for flawless interviews.</p> <p>[and so on]</p> <p>Habit hacks are catnip to a certain kind of self-improvement/business-guru people. I actually got pretty involved in these kinds of articles earlier in my career, so it'd be wrong for me to judge.</p> <p>I think these kind of articles (or titles for articles) work because i) they make people feel smarter than other people, and ii) they promise great results with low input.</p> <p>Maybe three weeks ago I'd get snarky about how better results isn't a knowledge problem. I don't think knowing more equates simply to more and better work. "Keep running" won't unconditionally get anybody to the end of a marathon.</p> <p>After reading Atomic Habits (by James Clear), I was reminded of the best of these articles. Clear helped me remember the generous interpretation for why these articles get written, read, and perform so well on social media: little decisions, stacked and reliably repeated, make big changes about who we are and what we can achieve.</p> <p>The platonic ideal of good habits are tools that help us become the version of ourself we want to be, and produce the highest quality work we can.</p> <p>But still, the problem isn't knowing what three things to do before breakfast, it's programming yourself to do the activities over and over again.</p> <p>We all want that. And Clear dedicates a whole book to giving us the tools to get there. I want to surface the parts of Atomic Habits that resonated with me:</p> <ol> <li>The rules for forging and breaking a habit.</li> <li>Call out your automatic actions / lazy behaviours.</li> <li>Decide what kind of person you want to be.</li> <li>Monkey brain makes decisions but is easy to trick.</li> </ol> <h2>1. The Rules</h2> <p>Clear gives us four rules for making and breaking a habit. To make a habit we must:</p> <ol> <li>Make it obvious</li> <li>Make it desirable</li> <li>Make it easy</li> <li>Make it satisfying</li> </ol> <p>And to break, we invert:</p> <ol> <li>Make it invisible</li> <li>Make it undesirable</li> <li>Make it difficult</li> <li>Make it unsatisfying.</li> </ol> <p>The what and why of each of these rules is the whole point of the book. Read the book, you'll find helpful stuff in there.</p> <h2>2. Call out your automatic or lazy behaviours</h2> <p>Our laziness (and the purposefully crafted and endlessly revised systems devised by social media and engagement-driven advertising that take advantage of that laziness) mean that we do a lot of things without really thinking. Without even realising.</p> <p>Come home, sit on sofa, reach for the remote, and turn on the TV. Open a new tab, type <code>faceb</code> and have your browser take you to Facebook. Open your phone and check twitter. Walk into the kitchen, fill up the kettle for another pot of tea.</p> <p>Clear introduces the <a href="https://en.wikipedia.org/wiki/Pointing_and_calling">Pointing and Calling</a> method. A process where you literally point at something and say what it is.</p> <p>You might point at your kettle and say "I am turning this on because it is the morning and I drink coffee in the morning".</p> <p>"I am eating leftovers because they are on the side"</p> <p>"I am checking Hacker News because I don't want to start my next task"</p> <p>A lot of the time we're witnesses to our actions, rather than the conductor. I like Pointing and Calling because it can be done from the passenger seat, as a way to move you into the driving seat. "I have let YouTube autoplay into another vide" I say to myself, as my brain beckons in the firehose of intriguing titles and thumbnails.</p> <p>I've also been Pointing and Calling <em>before</em> I start doing something intentionally. "I am about to have a meeting with my colleague, I need their help because Y" I say to myself, out loud, alone, in my office, like an insane person. Or "We are talking about putting some more text on the UI because we think our software is confusing our customers", I explain to a colleague, as though they are a non-technical colleague and not, in fact, a skilled engineer.</p> <p>Hilarity aside: Pointing and Calling sets the scene. Unspoken mismatch of understanding is a staple for a sitcom, but also the reason for a lot of wasted time. State the problem, do the smallest amount of work to solve it, and move on to the next problem.</p> <h2>3. Decide what kind of person you want to be</h2> <p>This point is the least actionable, so probably least worthy of discussion.</p> <p>No amount of daily journalling, meditation, calendar apps, or dopamine detoxes is going to make you the person you want to be. Chances are that they're rain dances.</p> <p>You have finite energy and time, in which you can make finite choices. So make a decision about the direction you want to change in.</p> <p>Think about it and why you want it.</p> <p>The kind of person I want to be is someone more deeply engaged in thoughtful problems. The happiest periods of my life are when I've been like that. What are the kind of things people like that do?</p> <ul> <li>Engage and stay engaged</li> <li>Prevent disruptions or distractions</li> <li>Communicate thoughtfully and well</li> </ul> <p>What don't they do?</p> <ul> <li>Switch contexts or problems before reaching depth</li> <li>Avoid resistance or friction to difficulty</li> </ul> <h2>4. Monkey brain is tricky</h2> <p>Our brains are dumb, or at very least don't want the best for use. Very smart people are building enticing platforms that wholly rely on having your attention. Our poor brains are easily persuaded by others, and very persuasive to us - so that makes them a high value target.</p> <p>It's become weirdly normal to be distracted or give your attention to other things. Our brains rely on sight for information processing. We see a lot of attention-grabbing things every day, and we have to do active work against that.</p> <p>Understanding this is necessary for a) breaking habits around modern media consumption, and b) making habits that use the freed time and space that creates.</p> <p>Clear gave me three very useful reminders in this book:</p> <ol> <li>If you want your brain to forget about something, just hide it. Put your phone in the other room, remove the app from your home screen.</li> <li>Friction and perceived effort aren't proportional: adding a tiny bit of friction can make your brain think something is <em>way</em> harder than it actually is</li> <li>Make something tangible: a lot of difficult or important things don't have immediate tangible satisfaction. Cross something off, or write it down. Move lego bricks from one jar to another. Tear off a calendar page. Let your brain see or touch something.</li> </ol>]]></description> </item> <item> <title><![CDATA[Vibe Check #1]]></title> <link>https://thomaswilson.xyz/blog/2022-02-28-vibe-check-1</link> <guid>https://thomaswilson.xyz/blog/2022-02-28-vibe-check-1</guid> <pubDate>Mon, 28 Feb 2022 19:58:00 GMT</pubDate> <description><![CDATA[<p>It's basically March and the days are finally getting longer! On Sunday, the sun was up to greet me as I made coffee. Tiny sweet peas and strawberries bud on the window sill. The flow of spring into winter feels miraculous.</p> <p>It's getting lighter, but it's secretly the coldest, wettest month. That's how it feels, I've no idea what the data says.</p> <p>Things I've done this month which have brought me joy:</p> <ul> <li>Consumed a full Christmas dinner for the third month in a row. I cooked some of the best roast potatoes I've ever made, and introduced three other people to their first meat-free roast.</li> <li>Went for a two hour walk in the Chilterns, and discovered a feeling wholly like the green Downs of home. Walk was promptly followed by a Sunday lunch and glass of wine in a prop'r pub, complete with locals, dogs, and an outhouse.</li> <li>DM'd my first ever game of Dungeons and Dragons, and I loved every minute, baby.</li> <li>Took a four day weekend, for no reason other than "I had leave to take". The joy of taking an hour walk to read my book in a cafe, at two in the afternoon, while others worked. Simple joy.</li> <li>Discovered some <em>excellent</em> Columbian coffee from <a href="https://www.newgroundcoffee.com/shop/coffee">Newground</a>. Truly, it's like apple cherry coke.</li> <li>Made my first Spring meal of the year (Anna Jones' <a href="https://www.theguardian.com/lifeandstyle/2016/may/06/vegetable-fritter-recipe-anna-jones-the-modern-cook">Spring Onion and Pea Fritters</a>). My favourite Spring meal remains pea risotto, cooked while consuming white wine. Something to look forward to, brightly.</li> </ul> <p>We're now <em>in</em> to 2022. It's begun, and the peace and hope of New Year's have fallen away. I find my head more full of ideas and problems, of managing a maturing engineering team in a fast-moving organisation. And also of a semi home-brew D&D campaign. Routine and way-finding are butting heads (I should write horoscopes).</p> <p>To my delight, I find myself still reading. Highlights this month include:</p> <ul> <li><a href="https://www.hive.co.uk/Product/John-Gwynne/The-Shadow-of-the-Gods/25534879">Shadow of the Gods</a>, by John Gywnne. This is the first Norse-mythology book I've read (sorry Neil Gaiman), and right now I'm confused by all the names. I've got five hundred and fifty more pages to get familiar with it.</li> <li><a href="https://www.hive.co.uk/Product/Cal-Newport/Deep-Work--Rules-for-Focused-Success-in-a-Distracted-World/17808018">Deep Work</a>, by Cal Newport. Extremely good, tyrannically anti social media in places, though.</li> <li><a href="https://www.hive.co.uk/Product/Andrzej-Sapkowski/The-Last-Wish--Introducing-the-Witcher---Now-a-major-Netflix-show/24718223">The Last Wish</a>, after being somewhat baffled by <em>The Witcher</em> Netflix series, I find myself equally baffled by the odd dialogue in this collection of short stories. Am I supposed to just <em>know</em> what a Bruxa is, Mr Sapkowski?</li> <li><a href="https://www.waterstones.com/book/meditations/marcus-aurelius/gregory-hays/9780753820162">Meditations</a>, by Marcus Aurelius. It's not a book to devour.</li> </ul>]]></description> </item> <item> <title><![CDATA[Concentrate on Concentrated Tests]]></title> <link>https://thomaswilson.xyz/blog/2022-03-02-concentrate-on-concentrated-tests</link> <guid>https://thomaswilson.xyz/blog/2022-03-02-concentrate-on-concentrated-tests</guid> <pubDate>Wed, 02 Mar 2022 21:41:00 GMT</pubDate> <description><![CDATA[<p>The flavour of a test block lies in the calling of application code, and the assertions on its behaviour. Everything else (set-up, tear down, tidying, and side effects) dilutes a test. Work to prevent tests from being watered down.</p> <p>It should be as obvious to an incoming engineer exactly what part of the codebase is being tested, and exactly which parts of the testing-infrastructure (stubs, mocks, fixtures) are facilitating that.</p> <p>By contrast: a diluted test makes it hard to point to the grain of truth or value. Tests which are hard to understand are hard to change. Code which is hard to change won't get changed.</p> <p>If it's easier for an engineer to add a new test, rather than alter an existing one, they will. If it's unclear that a test already exists for something, that test will be duplicated.</p> <p>Diluted tests risk making your codebase bloated and brittle (too big and hard to change).</p> <p>Ask if you can make a test more concentrated by:</p> <ol> <li>Creating multiple unit tests to test previously-grouped functionality</li> <li>Removing tests which make no unique assertions on your application code</li> <li>Herding your testing infrastructure out of individual test files to isolate repeated patterns or necessary magic</li> </ol>]]></description> </item> <item> <title><![CDATA[Discover Complexity]]></title> <link>https://thomaswilson.xyz/blog/2022-03-13-discover-complexity</link> <guid>https://thomaswilson.xyz/blog/2022-03-13-discover-complexity</guid> <pubDate>Sun, 13 Mar 2022 10:10:00 GMT</pubDate> <description><![CDATA[<p>Code changes frequently, and good code is able to change easily. That means that code must be both simple for other humans to interpret (so that the code is changed, not duplicated or added on to), and anti-brittle (so that changes don't require rewrites, or re-considerations).</p> <p>An (understandable) response to this need for change is to predict the need for change by forecasting changes to customer, business, or engineering requirements.</p> <p>Discover complexity, do not invent it.</p> <p>Discovered complexity is unearthed in the actual use of the software by the intended user, in the intended use case. Do what you can to gather and distribute this feedback to everyone involved in designing, building, and releasing the product.</p> <p>Alternatively, complexity is invented. It does not come from real-world use. It is a guess. It is speculative. Pay attention to solving problems which <em>could</em> happen, because it dilutes focus on solving the <em>actual</em> problem.</p> <p>Invented complexity takes time and attention away from solving real, demonstrated problems now. It obscures the meaning or focus of the code you're writing, so you'll pay another cost when future engineers (inevitable) attempt to understand it.</p> <p>Solving for non-discovered complexity can lead to things like:</p> <ul> <li>Adding a lot of flexibility to functions, even though they're only used in one case</li> <li>Creating a lot of indirection in layers of software, even though there's only one actual path in use</li> <li>Naming things with less tangible names to accommodate future siblings, even though you're building an only child.</li> </ul>]]></description> </item> <item> <title><![CDATA[Vibe Check #2: GTD in the face of weathering and predators]]></title> <link>https://thomaswilson.xyz/blog/2022-04-03-vibe-check-02</link> <guid>https://thomaswilson.xyz/blog/2022-04-03-vibe-check-02</guid> <pubDate>Sun, 03 Apr 2022 07:37:00 GMT</pubDate> <description><![CDATA[<p>March 2022 has been a good month for me. December-January saw me feeling very mentally strained, in retrospect because we're seeing the remnants of covid restrictions lift. personal and professional obligations are changing, and as an introvert they're drawing from an already shallow well of extrovert energy.</p> <p>I've not felt drained in this way since the beginning of my professional career. I remember consuming <em>loads</em> of books and podcasts at that time around personal productivity and management, and I think it helped (I'm still in a similar career area now). I spent February-March re-discovering some of the things I've learned and since forgot.</p> <p>Early March saw the tentative adoption of a Getting Things Done (GTD) -inspired personal task management system, which I'm running through <a href="https://todoist.com/">Todoist</a>.</p> <p>To be a cliché: having a task management system has been liberating. Having a big old list of every actionable thing I need to do, is great. I know I've reached adoption because if I can't jot down a TODO after it popping into my head I get viscerally nervous.</p> <p>GTD has been paired really well with a reading of <a href="https://www.hive.co.uk/Product/Cal-Newport/Deep-Work--Rules-for-Focused-Success-in-a-Distracted-World/17808018">Deep Work</a>, by Cal Newport. Both Newport and Allen (GTD author) have hammered home that thinking is the highest value work I do, as a knowledge worker.</p> <p>"Thinking is important" is taken-for-granted simple. So it doesn't happen. In the same way we assume that we're not going to forget pay rent or stop work at five pm. Making sure that thinking happens, and that its quality is high, <em>is</em> work, and should be taken seriously. I'd forgotten that.</p> <p>Instead, I was allowing precious mental CPU cycles process the questions "is this thing I'm doing right now the thing I should be doing?" (Probably?); and "is there anything I should be doing but have forgot?" (more than probably).</p> <p>The next thing I need to conquer is some kind of ritualised review of my system. The Weekly Reviewâ„¢ï¸ in GTD-land.</p> <p>With zero dought, re-upping personal task management has made the single biggest quality of life change to my day-to-day in 2022. Feeling like I'm equipped to capture, prioritise, and then <em>do</em> the things I want to do to live the life I want to live... That's one of the load-bearing challenges of life, and also one that face constant weathering from the tiny stream of ordinary life chaos, but also an entire ecosystem of attention predators (Netflix, YouTube). Okay, soap box away, tin foil hat off.</p> <p>March is an unknowable month for weather, at least February is reliably terrible. Eighteen degrees one day, snow flurries three days later. I don't even think this one's good for the plants.</p> <p>Anyway, here are some things which happened in March 2022 which I think are worth talking about:</p> <ul> <li>Saw <a href="https://comefromawaylondon.co.uk/">Come From Away</a>, a fantastic musical. I loved it and you should go see it, it's a great example of the craft.</li> <li>Took a glorious Saturday morning cycle in the spring warmth. I saw lambs and sheep.</li> <li>Saw a university friend and went for a walk and a Wagamama lunch. Wagamama is a true champ among the highstreet food chains.</li> <li>Travelled first class on a train for the first time, and got complementary snacks for doing so.</li> <li>Got a tiny shed for the garden, painted it sage-green with white trimmings, and filled it with pots and garden whatnots.</li> <li>Got grumpy at the loss of an hour's sunlight in the morning and joyful at the expansive evening light.</li> <li>Went back to group exercise classes and did enough squats to make stairs a mortal threat.</li> <li>Saw my first live dance show since the start of the pandemic</li> <li>DM'd my second Dungeons and Dragons session (a player died lol)</li> <li>Crossed the 800th test in our CI-process at Oxwash. I think this means we've 10x'd the total test count in the last 8-12 months, which feels fantastic.</li> </ul> <p>The books I've been reading this month are:</p> <ul> <li><a href="https://www.hive.co.uk/Product/David-Allen/Getting-Things-Done--The-Art-of-Stress-free-Productivity/16501887">Getting Things Done: The Art of Stress-free Productivity</a>, by David Allen. I told you above how great this book has been to me. If you're looking to boot-up or freshen a personal task-management system just read this book, it's classic for a reason.</li> <li><a href="https://www.hive.co.uk/Product/Susan-Stokes-Chapman/Pandora--The-immersive-1-Sunday-Times-bestselling-story-o/26299209">Pandora</a>, by Susan Stokes-Chapman. A really beautiful, semi-mystical historic London urban fantasy loosely based on the Greek myth. A nice book, but I don't think one that I'll remember in a few months.</li> <li><a href="https://www.hive.co.uk/Product/John-Gwynne/The-Shadow-of-the-Gods/25534879">The Shadow of the Gods</a>, by John Gwynne. I switched from Audiobook to physical book on this one because the names were starting to pass me by a little too fast. I am absolutely smitten with this book, it is everything I love in fantasy: a loosely explained magical world, multi-character narrative, visceral hatred and storytelling.</li> <li><a href="https://www.hive.co.uk/Product/James-S-A-Corey/Leviathan-Wakes--Book-1-of-the-Expanse-now-a-Prime-Original-series/6888165">Leviathan Wakes</a> by James S. A. Corey. I'm too early in this one to pass comment.</li> </ul>]]></description> </item> <item> <title><![CDATA[Recognise and reduce risk]]></title> <link>https://thomaswilson.xyz/blog/2022-04-10-recognise-and-reduce-risk</link> <guid>https://thomaswilson.xyz/blog/2022-04-10-recognise-and-reduce-risk</guid> <pubDate>Sun, 10 Apr 2022 21:10:00 GMT</pubDate> <description><![CDATA[<p>Answering and executing the question(s) "what do we build and how do we build it?" is an existential challenge for small companies.</p> <p>What you build is probably more important than how you build it. But how you build it changes how well you can change it. And the what <em>is</em> going to change.</p> <p>Uncertainty and risk are the abstract problems here. Will an onboarding email sequence increase the number of customers who convert to a paid membership? Do our users care about keyboard shortcuts? Should we hire someone new?</p> <p>Dan McKinley's <a href="https://boringtechnology.club/">Boring Technology Club</a> introduces the the idea of the <em>Innovation Token</em>, a metaphorical token that we spend on "our limited capacity to do something creative, or weird, or hard". A team has very few innovation tokens, and each token spent increases risk.</p> <p>They increase risk because they make it hard to make a good guess about what will happen next. Good guesses are sometimes the only fuel that new companies and small engineering teams have. Longer-lived companies have experience or data to help.</p> <p><a href="https://basecamp.com/shapeup">The Shape Up methodology</a> gets it right: we're making bets.</p> <p>If you're an engineer you can make a bet more risky by building with newer technologies (frameworks or languages) or infrastructure (databases or cloud providers), relying on manual (not automated) testing or deployment, by prematurely optimising, by building in isolation from customers, and a hundred other smells.</p> <p>A product person can increase risk by not knowing or understanding their customers, attempting to solve an over- or under-ambitious problem, by pricing things wrong (or not at all).</p> <p>These types of risk are not separate<sup><a href="#user-content-fn-1" id="user-content-fnref-1" data-footnote-ref aria-describedby="footnote-label">1</a></sup></p> <p>If you know your customer is extremely price sensitive, then building a $99/yr subscription model is going to have risk that even the most boring technology stack (IMO: MySQL, Rails, Bootstrap, Digital Ocean) cannot address.</p> <p>Risk is risk. Risk from product (what) and risk from engineering (how) cannot be meaningfully separated once you take more than three steps backwards.</p> <p>Your job is to reduce risk for yourself, your boss, or your company. Build software that reduces overall risk for the people who use it.</p> <section data-footnotes class="footnotes"><sup class="sr-only" id="footnote-label">notes</sup> <ol> <li id="user-content-fn-1"> <p>I think we (I) separate the <em>what</em> from the <em>how</em> because they are often solved by a CEO and CTO. Just because a problem is solved by two people does not mean it is two problems. <a href="#user-content-fnref-1" data-footnote-backref="" aria-label="Back to reference 1" class="data-footnote-backref">↩</a></p> </li> </ol> </section>]]></description> </item> <item> <title><![CDATA['How did this PR get so big?' – Advice for separating aesthetic and functional changes in code]]></title> <link>https://thomaswilson.xyz/blog/2022-04-17-why-is-this-pr-so-big</link> <guid>https://thomaswilson.xyz/blog/2022-04-17-why-is-this-pr-so-big</guid> <pubDate>Sun, 17 Apr 2022 09:48:00 GMT</pubDate> <description><![CDATA[<p>A few weeks ago I was working on some change in our codebase. One thing lead to another and the diff I submitted spanned eighty-some files, and over a thousand lines of modified code (adds, removes, and modifies).</p> <p>The first question I was asked in the sync code review was "how did this PR get so big?". The short answer is that I mixed functional and aesthetic changes into the codebase:</p> <ul> <li><strong>A functional change:</strong> changes the behaviour of the system, by adding functionality or modifying existing behaviour. This might include adding a field to an API response, or some framework changes to database persistence.</li> <li><strong>An aesthetic change:</strong> changes how the code looks or feels, without altering functionality. This is refactoring, or ergonomic changes. It might look like renaming something, moving functions around.</li> </ul> <p>It's a good question, though ("why is this PR so big?"). It implies that smaller, more frequent changes to the codebase, and subsequent automated deploys, are the goal (they are) and that the natural enemy of this goal is large, many-file changes (it is). That's mostly because they consume human attention, which is finite and valuable.</p> <p>PRs (pull requests) represent a change the team wants to make to the codebase. It's common practice that you have someone double-check the changes to the code <em>before</em> the change goes to the <code>main</code> branch (a code review), and less-common, but higher value imo, to have someone double check your workings as you go (pairing / mobbing). I previously thought that PRs represented a feature, but I don't think they do anymore. I think they represent a safe change to the codebase in the direction of a feature.</p> <p>As a rule of thumb, more regular changes to the codebase is better. Big PRs make regular changes more effort, so probably decrease their frequency. The alternative is less diligent review (easy), or higher reliance on tests (hard).</p> <h2>So just make functional changes, then?</h2> <p>You can't just <em>not</em> do either of these kinds of changes, though. Either your code will never add new features (your product team and users hate you) or your code is horrible to work with and speed of iteration slows down (your engineers and users hate you).</p> <p>They're both parts of the code rainforest, like bugs and fungus. The problem is that aesthetic changes take quite a bit of human understanding and produce quite a bit of visual noise to a diff. If something's been renamed globally, there could be a lot of files affected. Likewise if you edit the arguments to a function, or move something from one place to another.</p> <p>In a visual diff (like you get on GitHub or BitBucket) these kinds of changes are given just as much visual weight as adding a function or changing its name. It's up to the human doing the review to recognise this as noise over signal.</p> <h2>Okay, so do them both but separately</h2> <p>I want to work on stricter segregation of functional vs. Aesthetic changes in a PR. Martin Fowler (<a href="https://martinfowler.com/books/refactoring.html">in his book <em>Refactoring</em></a>) would encourage us to i) plan the change, ii) refactor to make the change easily, and iii) make the change.</p> <p>Pragmatically, and I'm sorry, Martin, I find it easier to recognise a lot of the necessary aesthetic changes <em>while</em> I make the functional ones. That's why I code with a notepad in front of me, to write down things I need to change or things which pop up.</p> <p>This has the added values of:</p> <ul> <li>More immediate attention goes to solving the functional change than the aesthetic one.</li> <li>Conversely, if immediate attention cannot effectively be poured into solving the functional problem, you've got a strong signal that you need some aesthetic changes.</li> <li>Sometimes writing down a grievance with the code is enough to get my frustration out. I've said the thing's bad, I've recognised why, but I've got to move on.</li> <li>Putting time between thinking "I should refactor this" and "I am going to refactor this" filters out unimportant changes.</li> <li>You get a notebook full of largely indecipherable comments. I review this every morning and at the end of every week, to refresh the pains I felt and ideas I had.</li> </ul> <h2>What now?</h2> <p>You can separate out your work via commit or via PR. I'd advise by PR, because you can pick different reviewers for each. That can spread knowledge about your codebase, and about general refactoring principles. This can be really helpful for more junior engineers.</p> <p>When opening multiple PRs, you will have to address the visceral feeling of shipping a feature to production and leaving your little JIRA card in "in progress". I'm sorry. If you've got feature-focused product teams or management, you might also find this a politically difficult move. In which case: open a PR with changes stored by commit. You can encourage reviewers to review a PR by commit, and do a mob review if you want to share the knowledge.</p>]]></description> </item> <item> <title><![CDATA[Complicated and Maybe Not That Useful – Modern frontend tooling]]></title> <link>https://thomaswilson.xyz/blog/2022-04-26-complicated-and-not=-that-useful</link> <guid>https://thomaswilson.xyz/blog/2022-04-26-complicated-and-not=-that-useful</guid> <pubDate>Tue, 26 Apr 2022 06:03:00 GMT</pubDate> <description><![CDATA[<p><strong>Prologue</strong> Hi there, this is 🔮 Future Thomas 🔮 here. I'm re-reading this post while editing and, my friend, a lot of the first-draft of this post sounded like borderline heresy and also like the Remix framework and its team had personally wronged me. It's not and they haven't. I've taken out some of the spicier takes (but left in a few cusses, for flavour) - but a pinch of salt and a generous interpretation would be great on this one.</p> <hr> <p>Nearly ten years ago I was gifted a book called <em>Agile Web Development with Ruby on Rails</em> by a guy called Mark. That book was a gateway drug to an (ongoing) career in software engineering. About five years ago I left the Rails pen (wen off the rails?) in favour of building modern frontend applications, first in Angular and then in React.</p> <p>Stop me if you've heard this one: but I like Frontend Engineering because it gives me immediate feedback from building products and features. But I learned I just liked building products and features, which usually need a UI.</p> <p>I have a pretty good knowledge of these UIs. But now, in 2022, I couldn't use this knowledge, in its totality, to throw together a functioning side project of medium complexity in a few months. I'm a product engineer who couldn't build a product. Admittedly I had other things going on, but wow.</p> <p>I don't think I've been set up for success.</p> <p>A lot of modern frontend tooling is secretly platform tooling without the grizzled veneer of other platform tooling. Just replace yaml for json or .config.js files. Get Jest, TypeScript, WebPack, Prettier, and ESLint to play nicely together. These are some of the most popular tools in the ecosystem.</p> <p>As one engineer, very few of the tools I use and build (data fetching, client-side caching, systemic design) help me build and ship something meaningful. They're parts of a platform.</p> <p>I've never had more tools help me do less.</p> <p><em>Nah, software is just hard to build</em>. Nope, I think we made it too complicated. There's more to this than "man who learns frontend can't do backend", I promise.</p> <h2>Complexity!</h2> <p>I'm enjoying my time as a Serious FrontEnd Engineer(TM), I've built satisfying things that I am proud of. I've built design systems and product prototypes, I've become very fluent in TypeScript and JavaScript and even up-skilled new and mid-level engineers. I've helped teams think about product and design in a more serious way. I've grappled with Webpack and played spin-the-bottle with Package version bumps, I've set up mono-repos, minifiers, and css modules.</p> <p>How many of these labours are in service to an end user? And how many are in service of engineering? How much necessary complexity have I introduced but shifted around? How much unnecessary complexity have I introduced?</p> <p>I'm starting to think that some of the ways I've built software before is complex but not that useful. The UI-Server anti-monolithic architecture might not be the first place to start. It might not even be the second step after that.</p> <p>When I've seen the attempts to break apart a monolith, it's more often been because of the needs of the company or engineering team making the product - not the user.</p> <p>The structure of software mimics the structure of the organisation that creates it, that's <a href="https://en.wikipedia.org/wiki/Conway%27s_law">Conway's Law</a>.</p> <p>I think it's weird that the solution to product and organisational complexity is to create technical complexity. I think it's weird that I thought you had to <em>start</em> building as though you were a rapidly scaling team.</p> <p>I think there are more ground-level questions like "does this feature exclude any of our users?" or "how will we know if this feature fails?". I think we build software in service of our users <em>despite</em> this complexity. We might even be able to build better software without it.</p> <h2>I want to build something</h2> <p>These aren't just five-dollar words. Three months ago I became concerned that the thing that got me into being a software engineer (building cool shit) isn't something I do these days. Especially as one human engineer with a full-time job (doing work I enjoy with people I respect), and having a specialised knowledge of frontend tooling.</p> <p>The last side project I attempted in earnest was a native iOS app (RIP <a href="/blog/2021-04-12-dash-cycle-01-reorganising">Dash</a>) in which I learned that native development is <em>not</em> for me ("SwiftUI is production ready"). After that, I got a promotion (🎉), and after that I decided I might have the bandwidth to build something else.</p> <p>Recently I've been trying to improve my French proficiency (<em>la pandémie ne m'a encuragé pas de tout</em>). So let's build a tool I can use to help me do that. Something to help me track the word's I'm learning and then maybe even use them to test me. Nothing groundbreaking, stuff you do in your notebook. Bread and butter language learning tools.</p> <p>I figured that to do this I'd need:</p> <ol> <li><strong>UI/Client Side</strong>: A modern-looking UI built using standard(ish) web tools, which can handle moderate complexity (like comboboxes and interactive search)</li> <li><strong>Server Side</strong>: A server to run code which i) is secure, ii) can separate secrets/credentials from the client, iii) doesn't require me to reinvent the wheel for basic API conventions (versioning, routing)</li> <li><strong>Inevitable Integrations</strong>: things like transactional email, authentication stories, and media CDNs will always creep up on you.</li> <li><strong>Data</strong>: Persisted data storage, like a database</li> <li><strong>Infrastructure & Tests</strong>: Simple infrastructure and automated CI/CD, to run tests and automatically deploy. I'm too far gone into TDD-land, I need a good testing story.</li> </ol> <p>So I went looking for the tools or frameworks that could help me do that, while not completely disregarding everything I've learned (and got good at) recently. Surely I'll be more productive if I write software in the language I'm really fluent in?</p> <p>The problem is that a lot of very clever people and successful companies have demonstrated that divorcing client from server can result in some great tools and experiences. There's a lot of libraries and frameworks that'll do this for you.</p> <p>Anyway, I looked for a framework. A popular and easy choice for many would be a <a href="https://nextjs.org/">NextJS</a>. I used Next as a freelancer, and found the whole un-opinionated API route story an unsatisfying answer to a moderately complex server app and also to testing.</p> <p>After looking around, I found <a href="https://remix.run/">Remix Run</a>:</p> <blockquote> <p>a full stack web framework that lets you focus on the user interface and work back through web standards to deliver a fast, slick, and resilient user experience</p> </blockquote> <p>I gave Remix the college try. But things didn't work out between us. I've got a thousand-some opinionated words about it (which I might publish after the mind-dust settles).</p> <p>Tl;dr is that it didn't let me build things the way I wanted, but wasn't great at offering alternatives or forewarnings about what would/wouldn't work. There was a lot of "try it and see". Plus maybe having React as the <em>only</em> way to generate a DOM isn't an unconditional advantage.</p> <h2>Back to the Checklist</h2> <p>That technical / component checklist above could read the same for any medium+ complex application with a web-powered GUI.</p> <p>If you're a team of two or less, and you want to ship medium+ complex products at medium+ speed, then you need a framework to do it. Or a lot of patience. You can't just piecemeal solve each of these problems as they arise by smashing together different libraries. Because now you're building a web framework <em>and</em> a product and you're only a team of two.</p> <p>Any JS-backed framework invites people to add their favourite card to the house of cards. Which means some complicated build tooling to get 10+ years of JS to place nicely together. But complicated doesn't mean good or useful.</p> <p>If you want someone to make a decision faster and without regret, give them fewer choices and have them make their decision faster. If you want someone to make a better decision, make it the only decision they have to make and have them make it first. These are psychological truisms that help us design better products (and lives) but apparently we forget them in our own homes (in this metaphor, the codebase is my home).</p> <p>Diversity and optionality in open source software are so so essential to the ecosystem, but as an individual I have to ignore all but the 0.001% that I'm using to build my tiny thing. Which I have to use to clump together the same functionality everybody else is writing: authentication, routing, logging, etc.</p> <p>The JS ecosystem gives you so many options. I don't think lack of options is a problem in software in 2022. The problem is deciding what, <em>exactly</em> what, you're going to make 1% better today. If the answer is always something like "my state management library" then you should ask who's making things better for the user, because it might not be you.</p> <p>The energy I put into gluing pieces of the ecosystem together isn't energy I'm putting into building cool shit. It's the exact opposite, it's energy into building really boring shit.</p> <p>And that's why I've started exploring Rails again.</p> <p>Because nothing since Rails has made me feel so empowered as one person to build such a complete product. I'm sure people feel similarly about PHP and Laravel, or Python and Django. The opportunity and coolness cost is high, but I think it's worth it. Because it lets me build cool shit.</p>]]></description> </item> <item> <title><![CDATA[Vibe Check #3]]></title> <link>https://thomaswilson.xyz/blog/2022-05-06-vibe-check-3</link> <guid>https://thomaswilson.xyz/blog/2022-05-06-vibe-check-3</guid> <pubDate>Fri, 06 May 2022 21:08:00 GMT</pubDate> <description><![CDATA[<p>Three of the past four weeks have been a four-day work week. It's been wonderful. And yet still I'm posting this a week later than I'd like. The weather has been overcast, but everything in balance, even good weather. Still, <em>some</em> rain would be nice.</p> <p>To burden the spring metaphor further, April has often felt like it's in service to future things. Professionally, there's a lot of flow, with little turbulence (but high variation). Personally, I'm doing things which bring me joy. I don't feel a craving to have done something, but rather to be doing.</p> <p>I've re-started one-one French tuition with a woman on the internet living in the South of France, who doesn't speak much (any) English. But we converse happily enough for an hour a week while I stumble my way through understanding 15% of what's said to me. It's tough, but I think it's getting easier.</p> <p>I've read (mostly via audiobooks), and continued writing everyday. I've purchased more inks for my pens (after purging my collection 5+ years ago). Writing feels joyful.</p> <p>My task management system is being tested by a lot of things that need doing. It's the corporially-struggling canary in the mines of my productivity. I'm still undecided if the pressure of knowing the things I'm <em>not</em> doing outweighs the benefits of knowing the things I'm not doing. It's also okay to delete, defer, and re-schedule things. Past me was optimistic about what present me could do.</p> <p>While we're moaning, I've also cut down on snacking as much as I could. Nothing sweet before lunch, and no unintentional snacking between meals only. No boredom biscuits. I hate to say it, but I feel so much lighter during the day, and now I find myself less hungry less often. It took a few days to move past severe snack withdrawl. Your body isn't always your friend, it's just a <del>serviceable</del> good house.</p> <p>Highlights of the month include:</p> <ul> <li>Sewing some spring-themed cushions, to replace the Christmas themed cushions (it is May)</li> <li>Taking an adventure-themed staycation: climbing, canoeing, and cycling (plus a lunch after each) in a three day window. Day four was recovery.</li> <li>Being given Easter eggs and chocolate. I <em>love</em> chocolate (see snacking note above)</li> <li>Seeing a school friend for their thirtieth birthday, and regressing ~50% of my life away with people I've not seen in about as long</li> <li>Drinking red wine with a best friend while overlooking the botanical garden in Oxford</li> </ul> <p>Books I've read this month:</p> <ul> <li><a href="https://www.hive.co.uk/Product/John-Gwynne/The-Shadow-of-the-Gods/25534879">Shadow of the Gods</a>, by John Gwynn. Strong recommend for this book for anyone with even a passing interest in fantasy. Really fun, great concept, clearly written, there's a Rat God and a Dragon God. Yes yes.</li> <li><a href="https://www.hive.co.uk/Product/James-S-A-Corey/Leviathan-Wakes--Book-1-of-the-Expanse-now-a-Prime-Original-series/6888165">Leviathan Wakes</a>, by James S A Carey. Another strong recommend. It's a book with space ships, and I'm far more versed in dead gods and trees that fight (see above), but this sci-fi romp has great characters draped over an epic plot. I look forward to reading the entire series.</li> <li><a href="https://www.hive.co.uk/Product/Erica-Buist/This-Partys-Dead--Grief-Joy-and-Spilled-Rum-at-the-Worlds-Death-Festivals/26655491">This Party's Dead</a>, by Erica Buist. Picked this one up on a whim because I'm a sucker for a book about death. I wasn't expecting it to be so memoir-y, but I've not put it down yet so she's doing something right.</li> <li><a href="https://blackwells.co.uk/bookshop/product/Islam-Explained-by-Ahmad-Rashid-Salim-author/9781646113231">Islam Explained</a>,, by Ahmad Rashid Salim. After realising that I knew precious little about the core beliefs of one of the world's major religions, I thought I'd do the bear minimum and read an "introduction to" book. This book does exactly that, but sometimes with too much verbal padding.</li> <li><a href="https://www.hive.co.uk/Product/Ben-Aaronovitch/Amongst-Our-Weapons--The-Brand-New-Rivers-Of-London-Novel/26655429">Amongst our Weapons</a>, by Ben Aaronovitch. The latest in Aaronovitch's <em>Rivers of London</em> urban fantasy series, which is secretly a love letter to London but with river gods. This is the first one I'm reading while not living in London and it's exactly the same feeling, I love it.</li> </ul>]]></description> </item> <item> <title><![CDATA[Meeting Cost Calculator]]></title> <link>https://thomaswilson.xyz/blog/2022-05-22-mcc</link> <guid>https://thomaswilson.xyz/blog/2022-05-22-mcc</guid> <pubDate>Sun, 22 May 2022 14:48:00 GMT</pubDate> <description><![CDATA[<p>On a recent train from Oxford to London (and back again), I built a litte widget to help calculate the cost of a meeting. Or at least, the simple cost of the salary of people attending a meeting.</p> <p>You can find it <a href="/mcc">here</a> on my personal site.</p>]]></description> </item> <item> <title><![CDATA[Taking the test suite from 100 to 1,000 tests at Oxwash]]></title> <link>https://thomaswilson.xyz/blog/2022-05-27-one-thousand-tests.md</link> <guid>https://thomaswilson.xyz/blog/2022-05-27-one-thousand-tests.md</guid> <pubDate>Fri, 27 May 2022 19:17:00 GMT</pubDate> <description><![CDATA[<p>When I joined the company (2020) there were less than a hundred tests across three codebases. This week, we hit one thousand tests. We've increased the pathways in our code covered by tests from one in five (~20%) to one in two (~50%).</p> <p>Here are the five most important practices and beliefs that helped get us from 100 to 1,000 tests. These are things I believe as someone leading an engineering team, and also as someone writing code daily with seniors, mids, and junior engineers.</p> <ul> <li>Write tests (just start)</li> <li>Tests never don't run (or: tests always run)</li> <li>Measure tests by one metric (we picked % of branches reached)</li> <li>Writing and reviewing start at the tests (prove to yourself that it reads well, and works)</li> <li>Write code to help you write tests (if tests are hard to write or verbose to read, you won't do either)</li> </ul> <h2>But first, Tests?</h2> <p>Tests are bits of code that interrogate others bits of code. They've helpful because computers are famously ungenerous in their interpretation of our intentions (or we're famously bad at communicating our intentions). They make it undeniable that "when I do exactly this, you do precisely that".</p> <p>Tests give us a long list of things to double-check and let us say things like "I haven't broken these parts of the codebase". Even better: they give the computer a long list of things to double-check for us. When software gets to a certain point, it's easy to accidentally break something nearby or downstream.</p> <p>Tests also like a draft for writing software. You can tinker with your wording, or your ordering. They help clarify my thinking <em>while</em> I'm writing code.</p> <p>Tests are great. All production systems should have tests.</p> <h2>Write Tests</h2> <p>If you want to more tests, you have to write tests. Assume that if you don't do this then it won't get done. Do not assume divine intervention or accidental just-for-fun tests.</p> <p>Start wherever you are, or wherever is easiest. Just start now, and improve them later.</p> <h2>Tests never don't run</h2> <p>Your tests now always run. You're going to run them all the damn time. Or more specifically, a computer is going to run them.</p> <p>It was just a one-line fix? The tests are running.</p> <p>Just bumped a package version, or re-named one thing? The tests are running.</p> <p>Pushed a commit? The tests are running.</p> <p>Opened a PR? The tests are running.</p> <p>PR approved and code being built to deploy? The tests are running.</p> <p>Tests always run. They decide if the changes you made were important or erroneous.</p> <h2>Measure tests by one metric</h2> <p>Now you've got tests and they're running, how do we know how far we've come?</p> <p>We chose the percentage of branches in our codebase reached by at least one test. I really believe this is the best metric because:</p> <ol> <li>If an engineer is deciding to branch the code, it's important that <em>all</em> eventualities are explored in a test. Especially when we think "this will never happen".</li> <li>It's the right balance between too granular (lines of code hit by a test) and too fuzzy (functions/methods hit by a test)</li> <li>It was the lowest initial metric we had, and I'd rather artificially depress than exaggerate our test coverage</li> </ol> <p>Pick one number that you care about and use that to measure progress. What do you want from testing right now? A faster CI/CD process? More readable code? Go from there.</p> <p>Maybe it's total time to run tests, or total number of tests. If you're worried about the number being gamed, don't. Not yet.</p> <h2>Writing and reviewing start at Tests</h2> <p>Are you altering existing code? Start at the test for that part of the codebase.</p> <p>Can't start at a test because one doesn't exist? <em>Mazel Tov</em> you're bringing a test into the world.</p> <p>Think you understand the problem, but your brain hasn't got the concrete solution yet? Start making a code sketch, but in a test (ignore the red squigglies in your IDE).</p> <p>Are you coming in to review someone else's code? Go immediately to the tests. Everything else is probably re-arranging furniture. Start the conversation at the tests and ask</p> <h2>Write code to help you write tests</h2> <p>Your tests will bloat and become repetitive. You'll find yourself doing (near-)identical things in various places. Or worse, you'll find other people trying to do identical things in very non-identical ways.</p> <p>Tests that are hard to write don't get written, and tests which are hard to read don't get read, choices that are hard to make don't get made.</p> <p>Treat your tests like any other code, and carefully consider how you're going to:</p> <ol> <li>New up models or objects in your codebase (we use builders with some nice human-readable chaining methods)</li> <li>Replicate file- or network-based data storage in memory (we hanse't settled between spies and in-memory stubs)</li> <li>Mock external server APIs (custom-built mocks or HTTP-level spying and mocking)</li> </ol>]]></description> </item> <item> <title><![CDATA[Vibe Check #4]]></title> <link>https://thomaswilson.xyz/blog/2022-06-05-vibe-check-4</link> <guid>https://thomaswilson.xyz/blog/2022-06-05-vibe-check-4</guid> <pubDate>Sun, 05 Jun 2022 11:46:00 GMT</pubDate> <description><![CDATA[<p>Every year my brain tricks me. <em>June</em>, it says, <em>June is summer</em>. And every year around this time I get long daylight hours but seemingly endless wind, rain, and rarely-over-twenty temperatures. Some days have been beautiful, but many (like today) are unadventurous. I sit inside a cafe to write.</p> <p>The weather can do as it pleases (despite what we tell it to). Summer is a state of mind. I love how far we are from the long nights and dismal days, I love waking up when it's light and getting into bed just after it goes dark. I love the promise of summer holidays to come, and the days still getting longer (though not for long). The days feel expansive and my brain feels like it can really settle into something.</p> <p>This month I feel I've really progressed. I've spoken more French out loud in the last month than the year which proceeded it. I've <em>made</em> things with my sewing machine, things someone else would recognise as clothes. The spacecraft of code that keeps my employer's business afloat has had some cool maintenance work done, especially around some of the most unvarnished, exposed, edges. We're trying a new way of building the space ship.</p> <p>While we're talking about code and craft, the fellows over at the Shop Talk podcast discussed a few metaphors which resonated with me:</p> <ol> <li>Comparing your team members and working styles to D&D classes (clerics, paladins, rogues). I like this metaphor because it reminds you that people contribute in different ways, and often in ways which complement each other. (<a href="https://shoptalkshow.com/493/">Episode 493</a>)</li> <li>Building software isn't like building the plane while it's flying. I think this metaphor is common because it's funny and dramatic, not because it's true. It's not how airlines do their repair and maintenance work, they do everything they can to keep planes in the air and on flight. Maintaining and improving production systems is a balancing act of keeping all the flights on time and in the air, while gradually improving the planes in the air. (<a href="https://shoptalkshow.com/516/">Episode 516</a>)</li> </ol> <p>This month I've needed to slow down and focus so that I can enjoy the work. Normally I tell myself that so that I can <em>do</em> the work. Only one project at a time. Be present in the act of making. Write things down, even when you feel you don't have to.</p> <h2>Highlights from this month include</h2> <ul> <li>Intentionally writing with a lot of inks and pens (colours are cool)</li> <li>Sewing my first successful, whole garment (a dark grey-blue t-shirt)</li> <li>Seeing and hearing sky lark song</li> <li>Taking a five-hour cycle with a friend across the Oxfordshire countryside (and only one puncture between two people)</li> <li>Speaking French, out loud, weekly with a French person (who I pay to help me be better at French)</li> <li>The debut meeting of The Ex-Housemates' Book Club, a mere eighteen months after inception, to drink wine and talk books with dear friends (who are, indeed, ex-housemates)</li> <li>Eating the most amazing hake dish I've ever had, at a local restaurant by The Thames</li> <li>Going back to the exact same restaurant two times in three weeks (see above)</li> <li>Getting free ice cream after pushing the owner's car down a hill (her battery wouldn't start, it was helpful pushing)</li> <li>Three bank holidays in a month, including a four day weekend, courtesy of Her Majesty Queen Elizabeth II.</li> </ul> <h2>Books</h2> <ul> <li><a href="https://www.waterstones.com/book/calibans-war/james-s-a-corey/9781841499918">Caliban's War, by James S. A. Corey</a>. Holy shit I love space ships now. Blasting through this one on Audio Book. At this rate, I'm going for the whole series.</li> <li><a href="https://www.oreilly.com/library/view/peopleware-productive-projects/9780133440706/">Peopleware, by Tom DeMarco & Tim Lister</a>. Building software as a team is hard, so I'm reading books other people have written about how they do it. I'm not far enough into this book to comment deeply, but so far it seems pretty sensible.</li> <li><a href="https://www.waterstones.com/book/somebodys-daughter/ashley-c-ford/9781786581297">Somebody's Daughter, by Ashley C Ford</a>. This is a book recommended by John Green (one of my favourite living humans). I love a good memoir, and Ford sure has a way to fit words and experiences into a narrative.</li> <li><a href="https://www.waterstones.com/book/homegoing/yaa-gyasi/9780241975237">Homegoing, by Yaa Gyasi</a>. The book I read for book club. It made me google a lot of things I had no idea about, like the legal gymnastics the US went through to keep enslaved treated as property not individuals. Narratively, I wasn't taken or captured. It's told in a many-person-narrative style, which can make it hard to attach to any singular thing.</li> </ul>]]></description> </item> <item> <title><![CDATA[If simple is good, why do we add complexity?]]></title> <link>https://thomaswilson.xyz/blog/2022-06-18-why-add-complexity</link> <guid>https://thomaswilson.xyz/blog/2022-06-18-why-add-complexity</guid> <pubDate>Sat, 18 Jun 2022 18:18:00 GMT</pubDate> <description><![CDATA[<p>Five years ago when I was writing software I was working around the question "what should go in this file?". Now it's more often "what <em>thing</em> am I making, and where does it fit with the other <em>things</em>?".</p> <p>As a more experienced engineer, my decisions about what <em>things</em> we have, and where they live, start sticking around. Sometimes people do what I do because they're <em>good</em> ideas (my fave), sometimes because they're the <em>better</em> ideas (not ideal, but fine), and sometimes because they're <em>my</em> ideas (worst, do not do).</p> <p>I'm describing software architecture. The code garden ecosystem grows, from the helpful-est little utility functions to the scariest (wobbliest) experimental orchestrators. Software architecture is about naming and grouping things, acknowledging complexity and putting it in the right (least worse, most obvious) place, and making sure all the beautiful creatures play nicely and the earth-worms don't over-aerate the soil or whatever.</p> <p>I learned to do this by writing code with very thoughtful people, and reading books written by very thoughtful people. Do both. Do not do one without the other.</p> <p>Still, I make a lot of choices based on intuition, or smell. Some approaches smell right, others feel wrong and make me feel nervous. When a less experienced member of the team asks for an explanation when I raise these feelings, that's often all I can say: "this feels better".</p> <p>The most useful conversations happen when I say something like "I don't like the alternative".</p> <p>"The alternative", a lot of the time, is something more complex. Some layer of abstraction (<em>what if we had a <code>Currency</code> class that could format this string?</em>) or indirection (<em>what if this Uploader service called an S3 service which called the logging service, and we handled progress monitoring there?</em>).</p> <p>Simple architecture is better. If it's easier to explain to someone, it speeds up onboarding. If it's easier to keep in your head when you're writing code, it speeds up the individual/pair. If it's easier to spot a broken or misplaced <em>thing</em>, it speeds up debugging. If it's clearer where new code should be added, or existing code modified, work is faster.</p> <p>We have two phrases for when we forget that simple is better: Speculative Complexity and Premature Optimisation.</p> <p>Do whatever you can to recognise and prevent speculative complexity and premature optimisation. If you do not, you are committing your future self to more hours, and probably more suffering. You are increasing the amount of future work.</p> <p>Yet, when I arrive at an architectural points for discussion with a less experienced engineer, their gut reactions are often towards adding complexity. I'd put good money on it being at least 60/40 bad-good, with a higher frequency of bad choices when code is farthest from a feature.</p> <p>If simple systems are better, why are they something we have to learn? Why aren't they self evident, like weak coffee or bad paintings?</p> <p>I've had enough of these conversations now to recognise patterns. Knowing these patterns helps me guide conversations towards a resolution.</p> <ol> <li><strong>It makes us feel clever.</strong>. Honestly, who doesn't love a really gnarly, technical solution to a problem. This is prime form-over-function, or a belief that our job as engineers is to write code (not solve problems). <strong>Resolution:</strong> build a shared understanding of "good" as something which solves the problem, and is readable and comprehensible to other engineers.</li> <li><strong>Understanding the problem is hard.</strong>. If you're writing software to solve a problem, it's probably a non-trivial problem. Even worse, long-lived systems quickly become Edge Case Central (<em>what happens when the user is an admin using the same email address as a non-admin user where the non-admin user signed up first?</em>). <strong>Resolution:</strong> fingers off the keyboard immediately. Do whatever it takes for both engineers to internalise the problem, its cause, and its effects. Whiteboard, write a document, build a glossary, whatever you need to do. Once you've done that, fingers can approach the keyboard.</li> <li><strong>"It will help us in the future".</strong> This is the premature optimisation/speculative complexity case. It's easy when we're in the weeds to think "well this works now, but what happens when we have 100x the concurrent users?", and then build for that. The problem is: that world isn't the one we're in, and we don't know how fast we'll get there. <strong>Resolution:</strong> get data on the current state of play, e.g. how many concurrent users do we have now? Look at how (un)likely your supposed growth is, talking to a non-engineer if you need to. I've never had this conversation and realised "oh shit, we do actually need to buff this of 100x growth in the next two days".</li> <li><strong>It's easier to write than modify.</strong>. Reading someone else's (old, probably imperfect) code is hard. It is easier to add than it is to subtract or modify. Worse, engineers mistake imperfections and best-efforts as best-practices which can't be touched. <strong>Resolution:</strong> dig into the code around the current feature work from start to end (soup to nuts). Do not write anything except missing tests around existing functionality until you have done this. When you publish code you know is imperfect and early-draft, leave a comment and communicate to your team.</li> </ol>]]></description> </item> <item> <title><![CDATA[Vibe Check #5]]></title> <link>https://thomaswilson.xyz/blog/2022-07-06-vibe-check-5</link> <guid>https://thomaswilson.xyz/blog/2022-07-06-vibe-check-5</guid> <pubDate>Wed, 06 Jul 2022 20:38:00 GMT</pubDate> <description><![CDATA[<h1>Vibe Check #5</h1> <p>We're over half way through the year. Which is good. The second half of the year is definitely my favourite half, with late summer, autumn, and Christmas ahead.</p> <p>I'm gearing up for my personal summer out-of-office. During which I will be mostly in-office, but using all my my free time to enjoy the balmy but brief British summer breeze. Just like life, summer is too short to spend unintentionally, and with the days already getting shorter I'm on a timer here.</p> <p>Anyway, June 2022 has been a terrifying and exhausting month. It started with taking my partner to A&E, which moved quickly to some emergency surgery. This, followed by a (frustratingly) slow recovery, has taken near all of my mental energy and attention. Luckily they're really into their recovery now, and I'm walking out the last of the wobbles on myself.</p> <p>It's amazing how things like this can eat into you and narrow your vision. It's been good to get through some of these days.</p> <p>Other days have been less dramatic. And I've managed to find a pretty cool moments, like:</p> <ul> <li>Having an influx of deluxe chocolate into the household, by way of get-well-soon gifts. Finishing an evening meal with a nibble.</li> <li>Evening cycle rides where the sun is golden, and the air is warm but cooling and smells like earth which has been warmed all day.</li> <li>Taking an off-grid holiday with university friends, during which I did very little exercise, ate very much, drank sensibly, and played a <em>lot</em> of board games.</li> <li>Starting to sew my second type of garment: some shorts. I'm almost done making the toile and so far I've had to completely undo two things. Sewing is <em>really</em> hard, and the instructions are only clear once you've done it. Hopefully in July I'll find time to start making the real thing.</li> <li>Re-watching Stranger Things from the beginning (while sewing). It's a damn fine show.</li> <li>Eating meals outside, with bare feet touching grass.</li> </ul>]]></description> </item> <item> <title><![CDATA[Back in office Summer 2022]]></title> <link>https://thomaswilson.xyz/blog/2022-08-17-back-in-office</link> <guid>https://thomaswilson.xyz/blog/2022-08-17-back-in-office</guid> <pubDate>Wed, 17 Aug 2022 08:00:00 GMT</pubDate> <description><![CDATA[<p>Summer 2022 isn't over (take if from my red, sunburned hands) but I'm back from not thinking about writing. Everything in seasons, and taking active rest has been great.</p>]]></description> </item> <item> <title><![CDATA['Why is no one writing Object Oriented?']]></title> <link>https://thomaswilson.xyz/blog/2022-08-18-why-no-oo</link> <guid>https://thomaswilson.xyz/blog/2022-08-18-why-no-oo</guid> <pubDate>Thu, 18 Aug 2022 21:00:00 GMT</pubDate> <description><![CDATA[<p>I am leading hiring efforts for my small engineering team. We're looking for our third senior engineer (maybe five years of experience shipping code, and a little bit of time leading some technical or pastoral efforts).</p> <p>Our technical interview process runs some one-to-two hours and starts with a problem. Something invented but plausible for a small, operations-software hybrid company. We introduce the problem in fuzzy human-friendly words, and then spend the rest of the interview turning it into well-defined terms. We codify it. And then we code (some of) it.</p> <p>I'm looking to see if a candidate has built quality software, collaboratively. Have they made sure they understood the messy meatspace malaise, and can they can devise some precise presentable platonic solution. Did they use good people- and then computer-words to describe it.</p> <p>Because we give such a tangible problem, we really encourage our candidates towards using classes. Classes also happen to be really good at organising code together, so we also encourage them everyday in the engineering team.</p> <p>This is Object Oriented Programming (OOP), and it's an old term. You're going to come across OOP in theory, if not practice.</p> <p>Yet having candidates arrive at "this could be a class", and not "this would be good as a set of pure isolated functions procedurally chained together in this file" has been hard. Bewilderingly hard.</p> <p>Experience writing and managing software can give you a good box of tools, if you're actively looking around you. I'm interviewing experienced software engineers and asking them to model some entities and their behaviour, and they're not reaching for classes.</p> <p>"Yeah, I guess we can try to use a class" feels weirdly unsatisfying.</p> <p>In my darker moments I despair - why is no one doing OO?</p> <p>Why have a quasi-random group of web software professionals repeatedly resisted one of the oldest, most common enterprise application patterns? I don't know. But I could make some cynical guess at notions of:</p> <ul> <li>"my code should be able to handle any data, its the users job to do the sensible thing"</li> <li>"I don't want to couple my code too closely to the real world"</li> <li>"React uses functional programming"</li> <li>"OO is old and no one writes 'enterprise software' anymore"</li> <li>"it doesn't matter what I call things in my code or where I put them"</li> <li>"it's not cool enough?"</li> </ul> <p>Frameworks (Rails, Spring Boot), architecture patterns (MVC, MVVM), Books (Domain Driven Design, Clean Code/Architecture) all put Objects/entities/ models right <em>there</em>, obvious and near the centre.</p> <p>They're there because they add value. Not to fill pages or as homage to bygone software practices. Software engineering and computer science are a competitive ecosystem, and evolution would select against them if there wasn't <em>something</em> there.</p> <p>How is the industry producing young, competent, practicing professionals who struggle to model real world problems? Why is no one doing OO?</p>]]></description> </item> <item> <title><![CDATA[Explaining Test Driven Development]]></title> <link>https://thomaswilson.xyz/blog/2022-08-23-explaining-tdd</link> <guid>https://thomaswilson.xyz/blog/2022-08-23-explaining-tdd</guid> <pubDate>Tue, 23 Aug 2022 06:51:00 GMT</pubDate> <description><![CDATA[<p>Test Driven Development (TDD) is a way of writing software where the author writes a test first, and <em>then</em> writes the "actual" code.</p> <p>The "actual" code here is the bits of software which do the dirty work. They might process a payment and then send a receipt e-mail. Let's call this your <strong>Worker Code</strong>, because you can imagine it like a set of tiny robot workers going about their day and running your business.</p> <p>The "test" code are bits of software which tell your worker code to do something, and then check the output. If the tests don't get back the exact thing you told them to expect, then they fail. Otherwise, they pass. They're like little Quality Assurance robots, or little robot Miss Trunchbulls, or a room full of little robot NASA workers doing pre-flight checks.</p> <h2>TDD's Value</h2> <p>So there's a practice called TDD, where engineers are encouraged to write the test first, and then the worker code second. This might sound a bit arse-about-face, or like you're doubling the work to do a thing.</p> <p>Despite this, TDD is good because:</p> <ul> <li>Tests are good. They can guarantee your software does what you expect it to do.</li> <li>Writing test code is more valuable if you do it before the worker code.</li> </ul> <p>It's more valuable to test before because:</p> <ul> <li>It can put the "what" before the "how". It forces you to think about what your worker code should produce, without thinking about how it should produce it.</li> <li>By thinking about the "what", you have to think about the readability of your code. Computers execute code, but humans read it. Good code is human friendly.</li> <li>It can prevent speculative complexity. If the code you're writing doesn't get a currently-failing test into a now-passing test, then it's not necessary. Do only what you need to.</li> <li>You write a detailed, strict contract with your worker code.</li> </ul> <p>Worker code adheres to a strict, explicit contract is good because:</p> <ul> <li>When engineers arrive in an unfamiliar area they have tests as an in-code, up-to-date map. This includes describing edge cases and unexpected situations. Your team now spend less time attempting to get a lay of the land.</li> <li>When you run through every contract before every deploy you <em>know</em> you're not releasing rogue worker robot behaviours. Your business now spends less time fixing broken worker robots, and your customers spend less time interacting with them.</li> <li>When tests cover far-apart bits of the codebase, your team spends less time context switching to make sure behaviour in one area hasn't affected something far away. Context switching is very expensive.</li> <li>When fixing a bug, reproducing it within a test (and then fixing it) guarantees the bug has been fixed, and prevents it emerging again in the future (at least in the exact same form). Confidence is valuable, false confidence is dangerous.</li> </ul> <h2>Malicious Compliance & TDD</h2> <p>Tests aren't inherently good. Like all robots, your test code only does exactly what you tell it to do. Robots follow the letter of the law, not the spirit.</p> <p>Worst case scenario, your engineering team have spent their time time and attention (v. expensive) on a thing with no value to you as a business, or to your customers.</p> <p>Even worse, you can do this and show some nice quantitative metrics that everything's a-okay. Better than okay, thriving. Perfect. Industry leading.</p> <p>What you've got is an expensive way to look busy, where the business pays the cost. This is borderline malicious compliance.</p> <p>Malicious compliance is the natural predator of TDD's value.</p> <p>Good tests give orders to your worker code in the exact same way that a real world customer or user would. Bad tests give irrelevant or mundane orders.</p> <p>How can you tell these two things apart? How can you guarantee you're doing one, not the other? Not to be flippant, but that's the nuance in TDD. The discipline comes in over-valuing tests that act like real-life users, and devaluing tests for tests sake.</p> <p>I won't discuss it here - but it's something I'm working through in my head and with my team.</p>]]></description> </item> <item> <title><![CDATA[Listing all the Wainwrights]]></title> <link>https://thomaswilson.xyz/blog/2022-09-13-wainwrights</link> <guid>https://thomaswilson.xyz/blog/2022-09-13-wainwrights</guid> <pubDate>Tue, 13 Sep 2022 09:04:00 GMT</pubDate> <description><![CDATA[<p>On a recent holiday in The Lake District I wasn't able to find a complete list of the <a href="https://en.wikipedia.org/wiki/List_of_Wainwrights">Wainwright fells</a> online, in a concise way that I could use to track the height and location of the hills.</p> <p>A few hours in the morning later and I've compiled a list <a href="https://github.com/thomaswilsonxyz/wainwright-peaks">here</a> on GitHub. It gives you all 214 fells with their</p> <ul> <li>Name</li> <li>Height (Metres and Feet)</li> <li>Col & Drop heights (Metres)</li> <li>Location (Latitude/Longitude, Ordnance Survey Reference)</li> </ul> <p>enjoy !</p>]]></description> </item> <item> <title><![CDATA[Is it a bug, or do you just not like it?]]></title> <link>https://thomaswilson.xyz/blog/2022-09-24-change-failure</link> <guid>https://thomaswilson.xyz/blog/2022-09-24-change-failure</guid> <pubDate>Sat, 24 Sep 2022 11:09:00 GMT</pubDate> <description><![CDATA[<p>tl;dr Do everything you can to understand the bugs your software team introduce, and the cost of fixing them. If you over-index on bugs, things might get called a "bug" when it's not. Deploying a change to recently introduced features doesn't mean there was a bug, it might mean there was a wrong guess or idea. Responding to these quickly is healthy development. Have good words for this work, like "tweak" or "alteration".</p> <hr> <p>The more a team ships software (deploys a new version of software), the better.</p> <p>Some deploys are going to introduce bugs, i.e. problematic and unexpected behaviour.</p> <p>This is called <em>Change Failure</em>, because a change to the system was proposed but incorrectly implemented.</p> <p>Change failure <em>should</em> be 0%.</p> <p>Change failure will rarely be 0%, because designing and crafting software is hard.</p> <p>Change failure and deploy frequency are related, and do you want to trade off one for the other.</p> <p>Nevertheless, it's important to know how much of the work your team does releases bugs.</p> <p>So you need to know:</p> <ol> <li>how often the team ships, and</li> <li>how often the team ships bugs.</li> </ol> <p>Best case scenario: your team ships N times a day which includes 0 bugs.</p> <p>Worse case scenario, the team ships N times a day and introduces >N bugs (i.e. each deploy contains multiple bugs).</p> <p>Bugs are bad for users for obvious reasons.</p> <p>Bugs are bad for engineering teams because they take time to fix. Let's call the effort it takes to fix a recently introduced bug <em>Recovery Effort</em> (though time != effort != work != complexity).</p> <p>Change Failure and Recovery Effort should be low and/or trending down.</p> <p>Getting accurate figures for Change Failure and Recovery Effort rely on knowing what a <em>bug</em> is.</p> <p>When we define and measure terms like Change Failure and Recovery Effort, we incentivise people to make those numbers low.</p> <p>People can learn if you can something a "bug", they can get it through the pipeline quickly and seriously.</p> <p>Engineers might consider a bug anything which throws an unhandled exception.</p> <p>Product might consider a bug anything which deviates from the flow they imagined or documented.</p> <p>Users might consider a bug anything that deviates from their expectations.</p> <p>Strategy might consider a bug anything which doesn't align to macro business directions.</p> <p>Sometimes somebody turns over a rock and discovers a bug introduced two years ago. Is something a bug if it's been unreported and unproblematic for two years?</p> <p>Sometimes a customer might expect to see a confirmation toast pop up, but don't. Is this experienced ambiguity a bug?</p> <p>Sometimes a designer might report a bug that the shadow or shade of a certain card or button isn't the same as the mock up, but the engineering team were limited by their design system. Is this a bug?</p> <p>Sometimes product report the lack of an "undo" action as a bug, which they only realised after using the product. Is this lack of functionality a bug?</p> <p>The spirit of bugs, change failure, and recovery effort is something which <em>should</em> work, but did not.</p> <p>Bugs are undesirable in an unambiguous way.</p> <p>Some of the other examples above are unambiguous, but that's a fuzzy word.</p> <p>Some of the above can be framed as learning.</p> <p>We have learned something about the product, or about the process of building.</p> <p>Paired with rapid incremental deployments, and empowered team members - this learning is part of development nirvana.</p> <p>Development nirvana happens when a lot of people push the overall quality and reliability of final product uphill.</p> <p>Calling everything a bug isn't the way to get there.</p> <p>Make sure you have words in your collective vocabulary to describe these kinds of (necessary) changes. I've used the following:</p> <ul> <li>Tweak</li> <li>Alteration</li> <li>Feature iteration</li> <li>1% improvement</li> <li>Quality of Life change</li> <li>Missing feature</li> </ul> <p>I've not found any one of these to be especially good or resonant just yet.</p>]]></description> </item> <item> <title><![CDATA[Vibe Check #6]]></title> <link>https://thomaswilson.xyz/blog/2022-10-02-vibe-check-6</link> <guid>https://thomaswilson.xyz/blog/2022-10-02-vibe-check-6</guid> <pubDate>Sun, 02 Oct 2022 16:08:56 GMT</pubDate> <description><![CDATA[<p>It's been two months since <a href="/blog/2022-07-06-vibe-check-5">my last vibe check</a>. We've reached the bookend sub-seasons where morning, afternoon, and evening each require their own outfit. Three layers in the morning, one layer at lunch, then two layers in the evening. It's maddening.</p> <p>The more diminutive amongst the trees have already surrendered themselves fully to autumn. Tiny specks of yellow and orange dot the local parks. Their larger brethren require still more convincing. They'll break though.</p> <p>Summer feels natural in its endlessness, but the stretch from September to January feels natural in its change. Gradually shorter and cooler days, longer shadows, and the wind-rain combination that we all forget. Nothing in nature blooms all year round, and no</p> <p>A few weeks ago I got engaged. I am to marry the love of my life. The plan went off without a hitch and they were stunned (but agreeable). The fells overlooking Derwent Water will I hope hold a place in my heart as one of the fulcrums of my life.</p> <p>Next week will mark my second full year at Oxwash. This is my longest continual employment since my graduation. I am reminded often enough that I work with clever, kind, and caring people. I find the work I do engaging. How lucky am I to feel the above.</p> <p>Life continues, more than well enough for now.</p>]]></description> </item> <item> <title><![CDATA[Is it correct? Is it easy to use? Is it easy to change?]]></title> <link>https://thomaswilson.xyz/blog/2022-10-09-correct-use-change</link> <guid>https://thomaswilson.xyz/blog/2022-10-09-correct-use-change</guid> <pubDate>Sun, 09 Oct 2022 09:00:52 GMT</pubDate> <description><![CDATA[<p>Software is improved iteratively. Large changes come through in many small changes. Good software can flex easily.</p> <p>I like to think of the large changes as the brightest stars in the sky - they help you navigate the ship.</p> <p>You do not want to lose the brightest stars in the sky. Finding them again takes time and effort.</p> <p>You need to know what could make you lose the stars just like you need to know how to move towards them.</p> <p>You need to know what keeps the stars exactly where they are (what changes are not meaningful or important in the long term).</p> <p>The three stars I always care about are:</p> <ol> <li>Is it correct?</li> <li>Is it easy to use?</li> <li>Is it easy to change?</li> </ol> <p><strong>Is it correct?</strong> Does the software do what it's meant to, and what it says it will do. Nothing matters if the code isn't correct. Tests help you write (demonstrably) correct code.</p> <p><strong>Is it easy to use?</strong> Software is used by end-users, but also by engineers. Could a customer easily use the sign up form? Can an engineer easily fire a message into a queue?</p> <p><strong>Is it easy to change?</strong> How easily could an engineer alter an existing behaviour, or add a new one? Will a change in one place cause any unexpected changes elsewhere?</p>]]></description> </item> <item> <title><![CDATA[Making your software opinionated is maintenance++]]></title> <link>https://thomaswilson.xyz/blog/2022-10-22-maintenance-plus-plus</link> <guid>https://thomaswilson.xyz/blog/2022-10-22-maintenance-plus-plus</guid> <pubDate>Sat, 22 Oct 2022 12:18:45 GMT</pubDate> <description><![CDATA[<p>Good software adds value to the people who use it.</p> <p>So good software engineers make software that adds value to peoples' lives.</p> <p>People get value from what software does for them, not how it does it (obvious caveats about correctness aside).</p> <p>It's possible for highly valuable software to be terrible in quality.</p> <p>Valuable software can have a hard to navigate codebase, heavily duplicated or inefficient code, low test coverage, and a deployment process that sounds like "we have to use Terri's laptop but they're on holiday so we'll deploy in two weeks".</p> <p>A lot of engineers will tell you that poor quality software <em>is</em> low value software. I think this is most common in journeyman craftsperson (2-5 years). I've worked hard to stop being that person.</p> <p>It's a hard voice to not listen to because it's so righteous. I like things that are pure in concept and execution. I think a lot of engineers (and knowledge workers) feel this way.</p> <p>Anyway. Over time though, poor quality software will impact users. It is slow to change and has a higher-than-average chance of containing bugs.</p> <p>Over time, poor quality software can become low value software. It is our job to stop, or at least slow, this.</p> <p>The two words in my head for this are <em>Rot</em> and <em>Maintenence</em>.</p> <p><a href="https://en.wikipedia.org/wiki/Software_rot">Software Rot</a> was introduced to me by <a href="https://www.oreilly.com/library/view/the-pragmatic-programmer/9780135956977/f_0020.xhtml">The Pragmatic Programmer</a>. It's a sibling of the idea of "Technical Debt". Unlike deb, rot is always bad. Debt is a useful tool. Telling your venture captial backed start up that you've taken debt to move faster isn't going to convince them you did a bad thing.</p> <p>Rot is a more primal word. You sense rot.</p> <p>If you leave parts of your software alone for long enough, they will rot.</p> <p>Maintenance is the <strong>active</strong> process of preventing or undoing code rot. I think this really entered my mind in following an episode of the <em>Freakonomics</em> podcast, <a href="https://freakonomics.com/podcast/in-praise-of-maintenance/">Praise of Maintenance</a>.</p> <p>If you've ever taken care of a garden, machinery, or your body, you know maintenance <em>is</em> active. It means pulling things out of the ground, delimescaling, oiling, doing squats and stretching.</p> <p>Maintenance is what you'll spend the vast majority of time doing.</p> <p>Over the seasonal (quarterly) time period, maintenance isn't enough. There's a strong flavour of maintenance in my head that I'm calling <em>maintenance++</em>.</p> <p>Maintenance++ is the act making pre-existing bits of software more opinionated about the business domain.</p> <p>This can mean things like moving bits of code away from abstract or unopinionated locations and towards either a centre or an edge. It can mean using different words to describe things (<em>draft</em> and <em>archive</em>, as opposed to <code>isPublished</code> and <code>deletedAt</code>).</p> <p>If the source code of software doesn't mirror the business or problem domain, the software is not of good quality.</p> <p>You will learn more about a problem or process by writing the code. Code often does not come out of the oven with opinions.</p> <p>Unlike the above judgement from the journeyman developer ("software of poor quality is of poor value"), this is a judgement based on the software's wider place within a business.</p> <p>Part of maintaining software should be to introduce or refine business-level opinions within the software.</p>]]></description> </item> <item> <title><![CDATA[Communicate Clearly]]></title> <link>https://thomaswilson.xyz/blog/2022-11-05-communicate-clearly</link> <guid>https://thomaswilson.xyz/blog/2022-11-05-communicate-clearly</guid> <pubDate>Sat, 05 Nov 2022 17:08:10 GMT</pubDate> <description><![CDATA[<p>The hard thing about most ideas is arriving at them.</p> <p>Most ideas themselves are easy. For example:</p> <ul> <li>Many smaller changes to software reduces the chance that a single change can break things.</li> <li>People who exercise more are more likely to live longer.</li> <li>Everyday somebody is discriminated against because of where they were born, who they love, or what they believe.</li> </ul> <p>Always try to communicate clearly. This is especially true when you're communicating with other people.</p> <p>I am a recovering over-explainer.</p> <p>By always explaining and contextualising, I was communicating less clearly.</p> <p>For a long time I would say (or write) an idea alongside the journey of how I got there, or the consequences/next steps.</p> <p>I thought I was making my point clearer.</p> <p>I thought you always wanted to help someone think how you think, or understand why something is/not good/bad.</p> <p>Sometimes you can dilute an idea, suggestion, or observation by explaining it. It makes your point less clear.</p> <p>Other times, the explanation is just too unfamiliar, and <em>you</em> are the one with the expertise.</p> <p>Either way, the explanation of the thing you're trying to say probably isn't as interesting (or relevant) as the thing itself.</p> <p>Explanations can take up a lot of the air in a room. They take time to say, and energy to understand. That's time and energy that could be spent doing the thing you're saying.</p> <p>As you become more of an expert, people (rightfully or not) expect you to have made the explanation or assertion.</p>]]></description> </item> <item> <title><![CDATA[Vibe Check #7]]></title> <link>https://thomaswilson.xyz/blog/2022-11-06-vibe-check-7</link> <guid>https://thomaswilson.xyz/blog/2022-11-06-vibe-check-7</guid> <pubDate>Sun, 06 Nov 2022 08:26:11 GMT</pubDate> <description><![CDATA[<p>I got a Steam Deck in September (huge flex), and so October 2022 saw the resurgence of video games into my life.</p> <p>As a teenager I spent the normal amount of time playing games (thank you) and took a lot of pleasure from it. I wasn't a gapital-G-Gamer, but I have vivid memories of playing <em>Onimusha</em>, <em>Halo</em>, and others way past my bed time. I think for a while I imagined a career in games journalism.</p> <p>I slid off gaming when I hit 16-18, and for about a decade, never really had the urge to go back. Before the pandemic (early 2020) I got a Switch. Playing <em>Mario Kart</em> and <em>Overcooked</em> online with friends when we couldn't leave the house was excellent. Playing couch co-op games with my partner in the long winter months... also pretty cool. But I never got <em>into</em> gaming on the Switch. I poured some hours into <em>Breath of the Wild</em> and <em>Hades</em> (obviously), but it never felt like a thing I kept doing.</p> <p>For some reason, the Steam Deck has made games fun again for my brain. Maybe it's because the Steam library is <em>huge</em>, and I can find the games I love to play (<em>Stray</em> and <em>Deaths Door</em> were two great first discoveries). I'm taking delight from playing them, from the vibe they create, and also from the challenges they bring. I think I like games again now, and coming into winter, I suspect that will be very useful.</p> <h2>Wedding Chat</h2> <p>I'm now planning a wedding. Or more accurately, I am a member of a committee of two people that is planning a wedding. This month we made a lot of viewings, some fantastic and others awful (looking at you, <em>Martin</em>, who started the tour by saying "do not interrupt me or ask questions while I'm showing you around").</p> <p>We have a venue and a date for our wedding (Oxfordshire, summer 2024). This is very exciting. But also, this is very nerve-making. There's a lot of things to prepare for the day and then there's the rest of my (our) life after the day.</p> <p>Still, that feels cool.</p> <h2>Sewing chat</h2> <p>I've started making my first <em>real</em> shirt (after three muslin toiles). The folk over at <a href="https://www.freesewing.org">freesewing</a> have done a good job at making a (completely free and open source) tool to help me, a very novice tailor, draft and re-draft a pattern. I love the internet.</p> <p>I picked up some certified sustainable fabrics from <a href="https://www.offsetwarehouse.com/">Offset Warehouse</a> which turned out to be a little more summery than I was expecting. Perhaps not November-December style dress.</p> <p>I'm taking a lot of joy from seeing a garment come together, and while I'm still definitely far from being even an adept sewer or tailor, the thing I'm making is definitely a shirt. It's got a collar and cuffs and everything.</p> <h2>Work chat</h2> <p>In October I celebrated my second anniversary at my current job at Oxwash. This is the longest single job I have ever had.</p> <p>I spoke to a few mentors about the kind of work you could do at two-years, that you couldn't do earlier. It's inspired me to start digging into some of the <em>deep</em> problems in the codebase, and also within the organisation in general.</p> <p>Oxwash in late 2022 is <em>very</em> different to Oxwash in mid 2020 when I was interviewing for the position. The day-to-day operations of the business, the technical complexity, and the vision are familiar but not identical.</p> <p>So my thoughts go to how we can pull-out and clearly describe some things that seem "just the way it is", and then make them better. If you do this right, you help the whole business, not just engineering.</p>]]></description> </item> <item> <title><![CDATA[All Problems are People Problems]]></title> <link>https://thomaswilson.xyz/blog/2022-11-28-all-problems</link> <guid>https://thomaswilson.xyz/blog/2022-11-28-all-problems</guid> <pubDate>Mon, 28 Nov 2022 22:52:49 GMT</pubDate> <description><![CDATA[<p>As a novice software engineer I thought that problems were technical. Or that the hard or "real" problems were technical. I thought that they were about knowing which steps to take, or the magic words that the compiler/runtime wanted me to type.</p> <p>As a novice software engineering leader, I believe that all problems are actually people problems.</p> <p>People might not understand the reason why they're entering magic words into the computer. This can mean they write incomprehensible, insecure, or non-performant software.</p> <p>People might think you're not treating their work as importantly as they think it should be. They might start chasing for updates, or requesting lots of feedback.</p> <p>People might think the thing you're doing is too short-sighted. Or long-sighted. They might start asking for high-fidelity estimates or mock-ups before that work would be useful.</p> <p>There is a <em>low</em> chance that somebody will say "I don't think you're treating my work importantly enough so may I please ask for a list of prioritised work for the next three months". They might say or do other things. Or they might <em>say</em> nothing.</p> <p>If you want to understand a problem, do the work of understanding the people facing, fixing, or creating a problem.</p> <p>To understand people, talk with them.</p> <p>You should talk honestly.</p> <p>It is hard to talk honestly about some things. Or rather, it is easy to be dishonest about some things. Feelings, fears, and blame are some things I find it easy to be dishonest about.</p> <p>You should try to remove as much discomfort from dishonesty as possible. Or honesty should be the most comfortable state.</p> <p>Do things that invite or encourage honesty with people. This might look like asking someone if and why they feel frustrated.</p> <p>It might look like telling someone that it would feel uncomfortable to give them an honest answer.</p> <p>If something prevents you from understanding a person, it stops you from understanding (at least some of) a problem.</p> <p>When you fail to invite, encourage, or demonstrate talking with people in an honest way then acknowledge and apologise privately, and then as publicly as appropriate.</p>]]></description> </item> <item> <title><![CDATA[Vibe Check #8]]></title> <link>https://thomaswilson.xyz/blog/2022-12-04-vibe-check-8</link> <guid>https://thomaswilson.xyz/blog/2022-12-04-vibe-check-8</guid> <pubDate>Sun, 04 Dec 2022 21:59:53 GMT</pubDate> <description><![CDATA[<p>Winter came to Oxford in the last seven or ten days. The other day I stepped out of my house and got that <em>Winter in England</em> smell that I forget for six months of the year, and alternately resent and treasure in for the other six. It's the smell of cold air and slow-to-wake mornings where the dew can't make it off the ground yet.</p> <p>It's heating-on weather, and my uni student standards have only slipped a little in the past eight (!) years. I'm still young and able enough that the jumper/socks/tea/stubbornness quartet gets me quite far into winter.</p> <p>In November I worked hard at making wearable garments. Two shirts, to be precise. With a fifty per cent success rate.</p> <p>The first shirt (white muslin with a blue print) came out well, though a little baggy. My imprecise (one could say <em>slapdash</em>) alterations to the pattern produced a bulge-at-the-buttons and pinched biceps sibling (in an equally nice white-grey pinstripe pattern).</p> <p>I look like q tiny hulk, bursting out of a tiny shirt.</p> <p>I could have made a toile to test the alteration, but it would have been my fourth shirt toile in three months. I could scream from shirt making at this point.</p> <p>So on to trousers I go. I'll be mocking up the <a href="https://wardrobebyme.com/products/chino-pants-sewing-pattern">Wardrobe By Me mens Chinos</a> soon. This is the first trouser pattern I found that went down to a 28" waist (even down to a 26!).</p> <p>I toyed around with a Thread Theory pattern over summer, but they only go down to 30" waist. I loved my recent adventures in drafting and altering (thanks, once more <a href="https://www.freesewing.org">freesewing</a>) but I want something prefabbed to tweak, not something rough that needs shaping.</p> <p>Finding clothes that fit has always been hard for me. Ready to wear formal menswear is designed for larger (upwards, but also outwards) bodies. The skills to make, and then change, sewing patterns is a lot. It's been a year and a half since I picked up my first sewing machine and I'm still finding new things to trouble-shoot. They're smaller things, and I think I'm getting better at fixing them, but it's a lot of energy.</p> <p>Sometimes you want more immediate gratification.</p> <p>And so what if I have two more metres of beautiful shirting fabric in the post. I'll have to eat my words and make <em>another</em> shirt.</p>]]></description> </item> <item> <title><![CDATA[My favourite albums of 2022]]></title> <link>https://thomaswilson.xyz/blog/2023-01-01-2022-albums</link> <guid>https://thomaswilson.xyz/blog/2023-01-01-2022-albums</guid> <pubDate>Sun, 01 Jan 2023 21:46:10 GMT</pubDate> <description><![CDATA[<p>This is a list of my favourite albums of 2022. They're not the <em>best</em> records, they're my favourite.</p> <p>In 2018 and 2019 I made a real effort to create some (nicely art-directed) lists like this. Then I let them rot and for three years I didn't want to write another <em>favourite</em> post until the other ones were back online and beautiful.</p> <p>I don't have to resurrect those past pages to start at making another one.</p> <p>So this is a brutalist, small list of albums I loved that were released in 2022.</p> <p>Some of them stayed on rotation for months. Some of them I wanted to keep special, and only played them on the good speakers through my dad's vintage B&O hifi. Some of them are records that I found myself thinking about a lot. Some of them are records I struggle to recommend to people, but think they're just <em>good</em>.</p> <h2>The Albums</h2> <ul> <li>Underwater, Ludovico Einaudi. January 21 2022 (Classical, <a href="https://www.youtube.com/watch?v=zj5stEte5zI">YouTube link</a>).</li> <li>aubades, Jean-Michel Blais. February 4, 2022 (Classical, <a href="https://jeanmichelblais.bandcamp.com/album/aubades-2">Bandcamp link</a>).</li> <li>Cognition, Wilkinson. February 11, 2022 (Electronic, <a href="https://www.youtube.com/playlist?list=PLSvU1a-6HYLOhxaoWuid9BGcQtF1Noq1H">YouTube Link</a>).</li> <li>The Line is a Curve, Kae Tempest. April 8 2022 (Poetry? Hip Hop? <a href="https://www.youtube.com/playlist?list=PLZqsyBiYZFQ0g8_BXA8XV6Ck5vre0nTuF">YouTube Link</a>).</li> <li>Exercise Your Demons, CLIFFDIVER. May 6 2022 (Pop Punk, <a href="https://cliffdiverok.bandcamp.com/album/exercise-your-demons">Bandcamp link</a>).</li> <li>How To Be Alone, All Better. May 6 2022 (Pop Punk, <a href="https://allbetter.bandcamp.com/album/how-to-be-alone">Bandcamp Link</a>).</li> <li>Blue Hours, Bears Den. May 13 2022 (Folk/Rock, <a href="https://www.youtube.com/watch?v=S4Cs9PynKrA">YouTube link</a>).</li> <li>Kings of the New Age, State Champs. May 13 2022 (Pop Punk, <a href="https://statechamps.bandcamp.com/album/kings-of-the-new-age">Bandcamp link</a>).</li> <li>Sondar, The Wrecks. June 10 2022 (Rock, <a href="https://www.youtube.com/playlist?list=PLjGa9Rt2jeSjrjSJAkRQ5O-Ql7V0S-4Mn">YouTube Link</a>).</li> <li>Leap, James Bay. July 2022 (Singer Songwriter, <a href="https://www.youtube.com/watch?v=JFkuW2mN-jI&list=PLxA687tYuMWiw48ZFJAP14-RXLC2P5iYJ">YouTube link</a>).</li> <li>End of an era, Loveless. September 2022 (Pop Punk, <a href="https://www.youtube.com/watch?v=VGfWnluaTnQ&list=PLS4jAfE9d3aJePlld21jlZbB9qA2XCvC_">YouTube link</a>).</li> <li>hugo, Loyle Carner. October 21 2022 (Hip Hop, <a href="https://loylecarnerband.bandcamp.com/album/hugo">Bandcamp link</a>).</li> <li>Midnights, Taylor Swift. October 22 2022 (<a href="https://www.youtube.com/playlist?list=PLxA687tYuMWgXjGLvPvOWqXWgHEIA2JW6">Pop, YouTube link</a>).</li> <li>Into the Past, Driveways. October 28 2022 (Pop Punk, <a href="https://driveways.bandcamp.com/album/into-the-past">Bandcamp link</a>).</li> <li>King's Disease III, Nas. November 11 2022 (Hip Hop, <a href="https://www.youtube.com/watch?v=PSs0HeTG9cA&list=PLxA687tYuMWgdtdodLiBISjifKS2qsDYJ">YouTube link</a>).</li> <li>Tender, Lady Maisery. November 11 2022 (Folk, <a href="https://ladymaisery.bandcamp.com/album/tender-2">Bandcamp link</a>).</li> <li>NO THANK YOU, Little Simz. December 12 2022 (Hip Hop, <a href="https://www.youtube.com/playlist?list=OLAK5uy_nT7_vca0br-RmVk0vkc8yIp3iXtRROsmk">YouTube link</a>).</li> </ul> <h2>Albums I want to spend more time with</h2> <p>There are some records that came out this year that I want to spend a little more time with. I think I could really love them, but I've not given them the time yet.</p> <ul> <li>five seconds flat, Lizzy McAlpine. April 8, 2022 (Singer-Songwriter, <a href="https://www.youtube.com/watch?v=GFumHG4Wt1g&list=PL_u1w9wImcNCsAjqoxlQqwP3tBZZN7cYV">YouTube link</a>).</li> <li>Incase We Crash, Incase we Crash. July 15 2022 (Pop Punk, <a href="https://incasewecrash1.bandcamp.com/album/incase-we-crash">Bandcamp link</a>).</li> <li>Stick Season, Noah Kahan. October 14 2022 (Folk, <a href="https://www.youtube.com/watch?v=nJAiOSN5bnQ&list=PLfiMjLyNWxeZZYD6q1cAni5MzWQCywfHl">YouTube link</a>).</li> <li>Escape That, Sam Sweeney. October 21 2022 (Folk, <a href="https://samsweeney.bandcamp.com/album/escape-that">Bandcamp link</a>).</li> <li>worm food, Cavetown. November 4, 2022 (Singer-Songwriter, <a href="https://www.youtube.com/watch?v=dkd_pa3_DGg&list=PLxA687tYuMWhqR1I997DtR_OwnpPJisQX">YouTube link</a>).</li> <li>Conditions of a Punk, half-alive. December 2 2022 (Alt Rock?, <a href="https://www.youtube.com/watch?v=TspJmMZH_Os&list=PLmrKws9W-mZMcpsQ4ZOAcAyv7u5nm_zQQ">YouTube link</a>).</li> </ul>]]></description> </item> <item> <title><![CDATA[Vibe Check #9]]></title> <link>https://thomaswilson.xyz/blog/2023-01-01-vibe-check-9</link> <guid>https://thomaswilson.xyz/blog/2023-01-01-vibe-check-9</guid> <pubDate>Sun, 01 Jan 2023 15:02:04 GMT</pubDate> <description><![CDATA[<p>I welcomed in 2023 with a board game (Ticket to Ride, got my ass served to me wholesale by my fiancée) and a double dram of The Lake's Distillery Whisky Maker's Reserve #5, which I nursed lovingly for several hours. It was quite the quiet affair.</p> <p>I enjoyed observing the Winter Solstice this year. I lit a candle, observed solar noon and thought "this is as dark as it gets". Referring to the season (or year) - rather than the day.</p> <p>We made it through another winter, and we did it with family (chosen and given), food, and some damn fine drinks. The Snowdrops are up, and the bravest daffodils are thinking about it.</p> <p>Unlike last year, I met December 2022 on its own terms. I did not try to make it a restful, quiet time to mull over what the whole of 2022 was, or what 2023 will be. Instead, I leaned into it being the tour of social obligations.</p> <p>I think I enjoyed this festive period a lot more than last year's. I know there's a lot more joy in acceptance than resistance, but knowing isn't <em>knowing</em>.</p> <p>I'll find that restful, peaceful time - but it'll probably be when others are more distracted by the hubbub of normal routine.</p> <p>Even though I said in my last Vibe Check that I could "scream from shirt making", I made another shirt. This one's publicly wearable! Bringing my hit rate on shirts from 50% to 66%.</p> <p>It's a a delightful shirt and in black-and-white hand-woven cotton, sourced from the lovely folk at <a href="https://www.offsetwarehouse.com/">Offset Warehouse</a>. I scraped it into 2022 with hours to spare, and if I can be so bold, I think it looks fantastic. It's thick enough and long enough to make me look like a fine visual artist. If you get a moment, do look at the outfits that Pablo Picasso wore - if I get to be old in the Mediterranean sun, I'll take (visual, not lifestyle) inspiration from him.</p> <p>Next up is trousers. I tried to make some trousers early in 2022, but the results were bad. I'm not wearing any of them in public. I reckon I've learned enough about garment construction (if not fitting) in the last year that my next attempt(s) should yield something halfway decent. I've picked up some grey/tan wool, and some navy twill - both of which I really love. So I'm excited to have some me-made, semi-formal trousers to put into rotation.</p> <p>My thoughts at work have been largely turned to how bigger and wider (more people, more specialities) can work collaboratively but separately. With more of us building more things, and with shifting global economical outlooks (i.e. the oncoming recession) it's harder than you'd think to get a clear idea of what's <em>definitely</em> important, versus what <em>could</em> be important.</p> <p>It's also been fantastic to be more hands-on-the-clay with some software engineering. The last month saw me taking a real look at a performance bottleneck in our system, getting a proof-of-concept solution in, running a few benchmarking experiments, and figuring out what we were right about, wrong about, and what we didn't even consider.</p> <p>I spend a lot of time telling people to follow a hunch by doing something (anything) and then decide if you should carry on, shift, or eject. This was a fine example of how doing something small with the intention of learning can teach you a lot more about the actual problems and solutions you're working with. Everything else is just best guesses.</p> <p>I've some thoughts about long-running 2023 projects (one of which is "plan and finance 50% of a wedding"). I love the feeling of intentionally starting a project.</p>]]></description> </item> <item> <title><![CDATA[Little Project: Oddbox Scraper]]></title> <link>https://thomaswilson.xyz/blog/2023-01-12-2023-01-12-little-project-oddbox-scraper</link> <guid>https://thomaswilson.xyz/blog/2023-01-12-2023-01-12-little-project-oddbox-scraper</guid> <pubDate>Thu, 12 Jan 2023 19:59:32 GMT</pubDate> <description><![CDATA[<p>tl;dr : I wrote a serverless app (AWS, terraform) that scrapes the Oddbox "upcoming deliveries" page once a day, and sends me an e-mail with the contents so that I never have to check manually. <a href="https://github.com/thomaswilsonxyz/oddbox-scraper">Here's the github link</a>.</p> <p>For the past two years I've been an Oddbox customer. It's great: once a week a little box full of fruit and vegetables turns up at my door. It's food that farmers all over the world weren't able to sell through their usual channels, because there's too much of it, it looks weird (or <em>odd</em>), or there's too much to sell.</p> <p>One thing I didn't like about was how they let you know about upcoming deliveries. In order to know what would be arriving so I could, for example, plan my meals - I would have to do the same ritual every week: search for <code>oddbox upcoming deliveries</code>, and be taken to the <a href="https://www.oddbox.co.uk/box-contents">same page</a> on their website, have to figure out which of the two (identical) options was the one I wanted, and find a list of the fruit and veg. Then move that to my note taking / meal planning app <em>du jour</em>.</p> <p>So now a robot does that annoying dance for me. The code is JavaScript (built from TypeScript) that runs on a lambda, on a schedule (once per day). It goes to the web page and scrapes the HTML, determines what fruit/veg are coming. It uses DynamoDB to check to see if there's new data in today's scrape. New data is persisted in DynamoDB, and an e-mail notification is sent to me by SES. I also use SQS in there, but mostly because I was curious about queueing.</p> <p>All of the infrastructure is defined in Terraform (with sensitive information variablised) and can be deployed on AWS.</p> <p>Once again, <a href="https://github.com/thomaswilsonxyz/oddbox-scraper">here's the GitHub link</a>.</p>]]></description> </item> <item> <title><![CDATA[Seven Days with Terraform – Building Serverless Applications and their Infrastructure]]></title> <link>https://thomaswilson.xyz/blog/2023-01-15-seven-days-with-terraform</link> <guid>https://thomaswilson.xyz/blog/2023-01-15-seven-days-with-terraform</guid> <pubDate>Sun, 15 Jan 2023 19:45:37 GMT</pubDate> <description><![CDATA[<p>Earlier this month I wrote about a side project I built which tells me about my upcoming vegetable box delivery (<a href="https://thomaswilson.xyz/blog/2023-01-12-2023-01-12-little-project-oddbox-scraper">link</a>).</p> <p>99% of software I have ever deployed (non-professionally) has been monolithic. It has been a single process that spins up a web server (Rails, Express, Spring Boot). If they're not monolithic servers, they're monolithic frameworks that generate HTML, CSS, and JavaScript that ship to the user <em>somehow</em> (this site just generates then serves those files via Netlify).</p> <p>The Oddbox Scraper application makes it into the 1% of deployed code which isn't running inside of a monolith.</p> <p>I think it's the first bit of code I ever designed and wrote alongside the code that would deploy it. Previously I'd spin up a Digital Ocean or Render or Linode virtual machine and away I'd go.</p> <p>Why? Because it felt like a blind spot, and because there's a difference between knowing something and <em>knowing</em> something. One of those things you only learn by doing.</p> <p>I wrote the app for the AWS serverless environment, and managed the necessary infrastructure with <a href="https://developer.hashicorp.com/terraform/intro">terraform</a>:</p> <blockquote> <p>an infrastructure as code tool that lets you define both cloud and on-prem resources in human-readable configuration files that you can version, reuse, and share.</p> </blockquote> <p>Terraform has been happening around me for at least the last three years, but it's never been the right tool for the problems I'm facing. But I wanted to give it a go.</p> <p>I gave myself seven (non-consecutive) days to build and deploy <em>something</em> in a serverless/distributed way, without rushing past important AWS or Infrastructure decision/concepts.</p> <p>This post is a (tiny) tidy up of the log I kept during those seven days.</p> <h2>Known unknowns</h2> <p>I left this project with things that I now know that I don't know enough about:</p> <ul> <li><strong>Roles, Policies, Accounts, Permissions, and Assuming Roles in AWS</strong>. My intuitive understanding of these things, the way they're used in the docs, and the things I had to do to get something to work all felt very unfamiliar to me. And also very high cost: get this wrong and this (or a future) system could be vulnerable to exploitation.</li> <li><strong>Testing AWS Services</strong>: The core of this application is very simple: a lambda scrapes data, data is put on a queue, another lambda takes the data off the queue and sees if it's new. So much of the detail here relies on the <em>implementation</em> of the AWS services (like DynamoDB) which were developed/tested with a lot of manual (using human eyes and the AWS Console) to see if things had worked. I didn't like that.</li> </ul> <h2>Things I didn't do but would want to</h2> <p>I intentionally limited myself to seven days of working on this project. That meant there are things I didn't get a chance to do yet:</p> <ul> <li>CI/CD Deployment with GitHub: It would be great to do a dry run (and tear down) of the project in a test environment as part of every CI/CD push. This involved some account setup work that I didn't want to do, just yet.</li> <li>Find the specific day in a date range: the results for a specific delivery are given as a range (e.g. "11th - 17th January") but I know my delivery will always come on a given day (e.g. on the Tuesday between that range). So I would want to find that specific date in the range, and use that. <a href="https://github.com/thomaswilsonxyz/oddbox-scraper/issues/2">GitHub Issue Link</a>.</li> </ul> <h2>Day One: Terraform quick start</h2> <p>We mostly use AWS at work, so I got going with Terraform's <a href="https://developer.hashicorp.com/terraform/tutorials/aws-get-started">Get Started - AWS</a> guide.</p> <p>It takes you down the EC2 instance path, i.e. setting up a virtual server. If I wanted a virtual server I'd use Digital Ocean or Linode and deploy an Express or Rails application.</p> <p>So I immediately went about hacking together a Lambda, using Medium articles (many low quality posts), GitHub's co-pilot (some high quality suggestions), and GitHub examples (pretty high quality).</p> <p>By the end of an hour or so I had a function written in TypeScript (compiled to JS with esbuild), and deployed to AWS.</p> <p>I also had a lot of fun figuring how AWS credentials are stored locally, using <a href="https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html">AWS's docs on the AWS CLI</a>.</p> <h2>Day Two: Triggering the Lambda on a Schedule</h2> <p>Today I decided on <em>what</em> I would build: a serverless application which could (automatically) look to the upcoming delivery of Oddbox, the fruit-and-veg box provider who deliver me delicious food every week.</p> <p>I spent maybe twenty minutes creating a TypeScript (learn one thing at a time, Wilson) project, and wrote a script that used axios to fetch the HTML, and cheerio to parse and query it to get the data I wanted. I used esbuild to bundle typescript to self-contained JS files, suitable for a lambda.</p> <p>I spent a lot of today (hours) attempting to get a Lambda to trigger on a schedule by using EventBridge Scheduler. I wasn't able to, but was able to set up an EventBridge Rule with a Target of the Lambda.</p> <h2>Day Three: Lambda => SQS Communication</h2> <p>I managed to get the scheduled Lambda running in less than 20 minutes by using Cloudwatch Events. From what I can tell it's using EventBridge under the hood, but it was available in <code>eu-west-2</code> and also worked first time without complaint.</p> <p>My focus other of this day way getting the results from a web scraping operation into a known format, converting that to JSON, then sending that over to SQS.</p> <p>I'd then use another Lambda to process this object: check to see if it's new information or not (by checking some persistence layer, likely DynamoDB, but I'm delaying that decision).</p> <p>I then want to trigger some kind of notification (probably an e-mail, maybe a WhatsApp/Signal/Telegram message if I can get that working).</p> <p>I spent most of today learning about all the granular activities, like pushing and reading messages from an SQS queue.</p> <p>While reading around Terraform's docs I noticed they have a nice pattern for storing AWS Policy documents (bits of code that grant permission to a resource to do a certain thing, e.g. allow a specific lambda to read messages from a specific queue). They declare them as <code>data</code> objects (?) in terraform them, then JSON-ify them out in the resources (e.g.a <code>aws_iam_policy</code>). This felt a lot cleaner than defining inline JSON with <code>EOF</code> markers</p> <h2>Day Four: DynamoDB</h2> <p>In order to know if the result from a particular scrape of the Oddbox website was new, I needed some level of persistence. DynamoDB (AWS' no-SQL serverless database) seemed to be the most sensible place start start. It feels a little like using a race car to drive to the end of the road. DynamoDB can do <em>huge</em> volumes of data and staggering speed, and I'm popping some data in there once a day.</p> <p>This was the first day where I felt I had a clear mental model about deploying a particular kind of resource (a DynamoDB table), and how to use both AWS' and Terraform's AWS Provider documentation pages to get the information I needed.</p> <p>I learned that you cannot have multiple <code>aws_iam_role_policy_attachment</code> resources targeting the same IAM role (thanks, <a href="https://stackoverflow.com/questions/45486041/how-to-attach-multiple-iam-policies-to-iam-roles-using-terraform">StackOverflow</a>) so I got to do my first programatic for-each loop in Terraform, which was cool.</p> <p>It also felt pretty nice being able to debug the above problem by clicking around the AWS Console and actually being able to (intuitively) see what the problem is</p> <h2>Day Five: Lambda-SQS-DynamoDB-SES</h2> <p>This was the day I managed to get an end-to-end workflow for the software working (Lambda-SQS-Lambda-DynamoDB-SES). The software went to the Oddbox website, checked for upcoming deliveries, and sent me an e-mail about new ones. This is the motivating feeling of writing software: seeing a thing you <em>wanted</em> turn up in your e-mail inbox.</p> <p>Domain validation for SES (Simple E-mail Service), so that I could use <code>@thomaswilson.xyz</code> addresses, went super smooth. The new DomainKeys Identified Mail (DKIM) meant just adding some CNAME records against my DNS records, and within 15 minutes I got my first e-mail to send.</p> <p>I had some issues doing (an intuitively simple) query on DynamoDB to see if the data coming through from Oddbox was new or not. Once again: read the <em>whole</em> error message, The role I had set up did not have permission to read an index on a DynamoDB table. Granting access to a Table does not grant access to that table's indices.</p> <p>I also learned the difference between a Query and a Scan (<a href="https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-query-scan.html">official docs</a>) in DynamoDB. I found the <a href="https://www.dynamodbguide.com/key-concepts">DynamoDB Guidebook</a> useful for explaining some of the big words.</p> <p>DynamoDB is the least abstracted interaction I've had with a database. It's good to get exposed to some of these things.</p> <h2>Day Six: GitHub repo</h2> <p>I spent today getting the <a href="https://github.com/thomaswilsonxyz/oddbox-scraper">code onto GitHub</a>.</p> <p>This largely meant following <a href="https://developer.hashicorp.com/terraform/tutorials/configuration-language/sensitive-variables">Terraform's own docs</a> on removing sensitive information from the code, and variable-ising all of it.</p> <p>Getting rid of the worst of the hackiness from the code, and parameterising the sensitive information took as long as I expected, but it's easy to underestimate.</p> <h2>Day Seven: AWS IAM Identity Centre</h2> <p>More reading that coding today. I haven't quite grokked some of the core ideas around authentication and identity in AWS. I want to deploy this app inside of its own AWS account so it doesn't pollute one which I might end up using for other projects.</p> <p>The words I <em>see</em> used, but struggle <em>to</em> use are roles, policies, users, accounts, and credentials.</p> <p>So I dragged up the AWS <a href="https://docs.aws.amazon.com/singlesignon/latest/userguide/users-groups-provisioning.html">documentation on the AWS IAM Identity Center</a> and started reading.</p> <p>I also found the <a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html">Best Practices in IAM page</a> quite useful.</p> <p>The question in specific I wanted to answer was: could I create a completely separate <em>place</em> (account? environment?) for integration testing. I don't think I'll have time to address in the seven day countdown.</p> <p>I ended up creating a sub-account inside of my own Organisational Account/Unit, which seems to have done the job. The code deploys in a completely separate place than previously. Don't forget to blast out any cached terraform data in the directory, as switching the credentials and target AWS account caused some ruckus.</p>]]></description> </item> <item> <title><![CDATA[Eight days to build Sunrise, Sunset?]]></title> <link>https://thomaswilson.xyz/blog/2023-01-30-building-sunrise-sunset</link> <guid>https://thomaswilson.xyz/blog/2023-01-30-building-sunrise-sunset</guid> <pubDate>Mon, 30 Jan 2023 22:20:19 GMT</pubDate> <description><![CDATA[<p><a href="https://thomaswilson.xyz/blog/2023-01-30-sunrise-sunset">I recently wrote</a> about the <em>Sunrise, Sunset?</em> game. It's a Wordle-style daily game where you have to decide if a photo is a sunrise or a sunset.</p> <p>This is a (very rough) log I wrote while building that.</p> <h2>Day Zero: What ?</h2> <p>Over the festive break, someone (definitely not fiancée) mentioned (offhand, very non-consequential) that they could tell the difference between a sunrise and a sunset just by looking at a photo.</p> <p>I've previously used flash cards to learn vocab, and I have distinct memories of always getting sunrise/sunset photos the wrong way around... because it is impossible to say which is which from just a photo.</p> <p>This someone (again, definitely not my fiancée) doubled down on their conviction.</p> <p>So I decided to build a wordle-style once-a-day guessing game where each day it shows you a photo, and asks you one simple question: <em>Sunrise or Sunset?</em></p> <h2>Day One: Can I get some photos?</h2> <p>Step one is to get a list of pictures which are either sunrise or sunset. Not doing this manually, so went to the Unsplash API to see if I could automate the fetching of images.</p> <p>Shockingly, I can.</p> <h2>Day Two: Build the photo-fetching pipeline.</h2> <p>Build out the scripts for fetching (and saving) images from the Unsplash API.</p> <p>Type hinting syntax in Python seems pretty intuitive, huh?</p> <h2>Day Three: Filter out misleading photos or descriptions</h2> <p>Having taken a look (with human eyes) at the Data coming back from Unsplash, and it looks like sunset photos are coming back when I search <code>sunrise</code> (and vice versa).</p> <p>I'd imagine this is people spamming the keywords/tags (somethign I hadn't noticed until I took a proper look at the data, yet more proof that people probably can't tell the difference between the two).</p> <p>Still, I need a way of flagging pictures as suspicious, and with the relatively small amount of data I'm looking at, I'm okay to do this with my human eyes. So I need a way of flagging a specific search result as suspicious.</p> <p>It turns out this was affecting about 8% (22/254) of the pictures I had previously downloaded.</p> <p>I ended today with 215 photos, so enough for seven months of the game, which will do for now :)</p> <h2>Day Four: Make the photos accessible via API</h2> <p>Took all the data from yesterday and did some triple checking with my human eyes. Looks good.</p> <p>Next step is creating an API endpoint on my personal site that you can go to and say "can I have today's photo" - and it does it.</p> <p>Decided to go for <code>/api/sunrise-sunset-photo.json</code></p> <p>Now we need to make sure that that data is accessible from a web page. Let's stand up an API endpoint in Sveltekit</p> <p><img src="/assets/blog-images/2023-01/2023-01-24-sunrise-sunset.png" alt="An early screenshot of the Sunrise Sunset game"></p> <h2>Day Five: Creating the UI for guessing + showing results</h2> <p>Today was all about storing the user's previous guesses, and also about shamelessly stealing a colour palette from Dribbble (thank you <a href="https://dribbble.com/shots/17508382-Wordle-Redesign-Rebound">Brielle Killeen</a> for the orange and greys on this Wordle redesign).</p> <p>Adding little micro interactions on buttons (like making them brighter on hover, or dimmer when they're disabled) is something I still get a lot of joy from.</p> <p>Used LocalStorage to store previous performance, and Svelte's Writeable stores as very basic state management. Because this relies on the browser environment being present, have to do this on the mount of the component - which means getting a <em>little</em> jank, which never feels great.</p> <p>Only managed an hour or so today, so feels nice to take it from 1% to maybe 20% (after 0-1% yesterday).</p> <p><img src="/assets/blog-images/2023-01/2023-01-26-sunrise-sunset.png" alt="A screenshot showing updated styles of the Sunrise Sunset game"></p> <h2>Day Six: Creating a guessing micro-interaction</h2> <p>I wanted to add some basic interactions to the page. When you guess (right or wrong), I wanted a little pop-up notification to appear letting you know.</p> <p>I used Svelte's own Spring and Transition tools.</p> <h2>Day Seven: Design Details</h2> <p>Yesterday we got to a UI I'm 20% happy with. Today I wanted to take that to 40-50%.</p> <p><strong>(Gardening) Components.</strong> Behind the scenes I split out the components. A single giant component is good for prototyping, but I did some gardening to split it apart into various smaller onse. No visible change to the user, but much smaller files.</p> <p>I love how CSS variables are reachable by the child components - it made consistent theming on this page really nice.</p> <p><strong>Link Previews.</strong> In more user-facing things, I was sharing the URL of the page with a few people and hated that the preview in WhatsApp was so void. I went to MidJourney and generated a little image:</p> <p><img src="/sunrise-sunset-art.png" alt="Preview image for Sunrise-Sunset, generated by Midjourney"></p> <p>I popped this as the preview image, and added some basic meta tags (thanks <a href="https://metatags.io/">metatags.io</a>) for suggesting metatags, and <a href="https://opengraph.dev/panel?url=https://www.thomaswilson.xyz/sunrise-sunset">opengraph.dev</a> for letting me preview the link.</p> <p><strong>Reveal Animation.</strong> I also took some time to focus on the reveal interaction for your guess. I like how Wordle slowly reveals your answer to you, letter by letter - I wanted the animation to pop out slowly here too. So I paid a bit of attention to delaying the reveal of the result, to build a little bit of suspense.</p> <p>Lastly, I made the notification persist between sessions on a set day. So if you open up the window <em>after</em> guessing, it shows you if you were right or wrong.</p> <p><img src="/assets/blog-images/2023-01/2023-01-28-sunrise-sunset.png" alt="Sunrise Sunset notifications"></p> <h2>Day Eight: Current Streak Length</h2> <p>I want to wrap this up. But I absolutely need to know what the user's <em>current</em> streak is. That is: how many days in a row have they guessed correctly?</p> <p>I wrote this code out today (test-driven, thankfully), and this <em>really</em> feels like one of those problems that I just don't have the vocabulary to effectively solve. The fun part being that I record <em>all</em> the guessing history, so just have a list of days where the answer was right, and where it was wrong.</p> <p>Fun fact, while writing the above section, I realised I could solve the problem in a slightly more intelligent way, so I did.</p> <p>I think I'm ready to wrap up this Little Project for now :)</p>]]></description> </item> <item> <title><![CDATA[Sunrise, Sunset? A daily guessing game (and another 2023 Little Project)]]></title> <link>https://thomaswilson.xyz/blog/2023-01-30-sunrise-sunset</link> <guid>https://thomaswilson.xyz/blog/2023-01-30-sunrise-sunset</guid> <pubDate>Mon, 30 Jan 2023 22:03:41 GMT</pubDate> <description><![CDATA[<p>tl;dr - I made a daily game to guess if a picture is sunrise or sunset. <a href="https://www.thomaswilson.xyz/sunrise-sunset">Here's the link</a>.</p> <p>Over the festive break I got into a discussion (?) with my fiancée. She said that she could look at a picture and know if it was a sunrise or sunset. I said she's wrong.</p> <p>Don't @ me, you know I'm right. You think the tones of the photo make it obvious? Doesn't matter if people edit their photos. And also what colours? Gold? Orange? You're kidding yourself. You can't imagine not knowing what time of day it is, because you pretty much always know what time of day it is if you're outside.</p> <p>Look, whatever. So I built a Wordle-style (i.e. daily) guessing game where you're shown a photo of a sunrise or sunset, and asked "Sunrise or Sunset?".</p> <p>That's it. That's the whole game. <a href="https://www.thomaswilson.xyz/sunrise-sunset">Go and check it out</a>.</p> <p>If you guess it right six days in a row by March 2023 then I'll buy you a four pack of KitKat Chunkies - the single best chocolate bar to have with a cup of tea. You also have to be my fiancée. Good luck beating those 1% odds !</p>]]></description> </item> <item> <title><![CDATA[Vibe Check #10]]></title> <link>https://thomaswilson.xyz/blog/2023-02-03-vibe-check-10</link> <guid>https://thomaswilson.xyz/blog/2023-02-03-vibe-check-10</guid> <pubDate>Fri, 03 Feb 2023 07:16:41 GMT</pubDate> <description><![CDATA[<p>Everyone everywhere says last year flew by. Contrarian by nature, it 2022 felt like it took about a year. January 2023, however, felt like it took about a week. I'm looking forward to the next few weeks being a more eventful, more different, and (hopefully) passing a little more slowly.</p> <p>January is my birthday month, and so one of the best months. I had a great birthday, by the way. I took the day off work, made myself an almond orange drizzle cake (<em>dangerously</em> good, thanks Anna Jones), and played a new board game. It's nice to take a day to oneself.</p> <p><strong>Music and Film Recs</strong></p> <ul> <li><a href="https://songwhip.com/circa-waves/never-going-under">Never Going Under, Circa Waves</a> (Album, Indie Rock, 2023). I think I'm going through my indie rock phase, and that's cool.</li> <li><a href="https://songwhip.com/adele/302021">30, Adele</a> (Album, Pop, 2021). There's so much to love in this Album, Adele's just a great artist.</li> <li><a href="https://songwhip.com/you-me-at-six/take-off-your-colours">Take Off Your Colours, You Me At Six</a> (Album, Pop Punk, 2008). This album holds up to what sixteen year-old me loved.</li> <li><a href="https://letterboxd.com/film/the-menu-2022/">The Menu</a> (Film, 2022). This film popped up in a few (non-movie) podcasts I listen to as something you should watch, and that it's best watched with no prior knowledge. I'm very glad I watched it.</li> </ul> <p><strong>Photography.</strong> In December I rediscovered my enjoyment of photography. That's carried into this month. I cracked out my mirrorless camera, and bought an instant camera. I went for the <a href="https://instax.com/sq1/en/">Fujifilm SQ1</a>. I try not to get too lost in deep research over new-ish hobbies, in case I drop it four weeks later.</p> <p>The Instax Square film is a good size, unlike some of the other Instax ones, and didn't hit the £1.80/shot price tag of a Polaroid. It comes in at at about £0.60 / shot (that's 33% of the cost of Polaroid).</p> <p>I wanted to make an effort to capture the smaller every day moments of people, places, and things that make up daily life. Because one day I will look different and live somewhere else. I wish I had more photos of the everyday life of being a student, or even living in London.</p> <p>I like that you get one photo. Despite being only £0.60/shot, that's extortion to the cost of the iPhone camera. Did you blink, or move, or get the framing wrong? Is it <em>really</em> worth the extra shot, and the waste of throwing one away? Is the photo bad, or are you just not happy with it?</p> <p>I'm experimenting with putting these in journals and displaying them in a grid photo frame (<a href="https://www.etsy.com/uk/listing/1228774146/instax-square-multi-aperture-wooden">this one</a>, to be precise). I want the photos to be a living thing, part of life. But I want them to be preserved, not crumpled and faded. At very least I'd like them at the wedding (2024).</p> <p><strong>Sewing.</strong> I've also been busy learning to sew trousers, and how to use an overlocker. I've had some wildly varying results on the trousers. I made a toile (too narrow) which I adjusted (just right), then made a pair of simple cotton twill trousers, finding the whole thing rather too big: the waist 2" too wide and the seat 1/2" too low. <em>oh well</em>, they're still definitely trousers. I'm currently working through my first proper wool project (a grey-tan), paired with a lovely dusty salmon mosterra leaf print pocketing.</p> <p><strong>Other Projects.</strong> The creative ghost of new year ran through me this month, and I managed two make <em>two</em> little projects:</p> <ul> <li><a href="/blog/2023-01-12-2023-01-12-little-project-oddbox-scraper">Oddbox Noifier</a> - a scheduled web scraper that notifies me of my Veg Box's contents via e-mail.</li> <li><a href="/blog/2023-01-30-sunrise-sunset">Sunrise, Sunset?</a> - a daily game where you have to guess if a picture is sunrise or sunset.</li> </ul> <p>Something I found helpful when building these things was telling myself that I can only work on them for ten (non-consecutive) days. Time-bounding work is important, but I hate how much that could look like deadlines working.</p> <p>Whatever, I shipped some fun little side projects that made my life more joyful. Ain't that the whole point?</p>]]></description> </item> <item> <title><![CDATA[The exceptions are more interesting]]></title> <link>https://thomaswilson.xyz/blog/2023-02-13-the-exceptions-are-more-interesting</link> <guid>https://thomaswilson.xyz/blog/2023-02-13-the-exceptions-are-more-interesting</guid> <pubDate>Mon, 13 Feb 2023 22:29:48 GMT</pubDate> <description><![CDATA[<p>Edit: Ironically, this post is a little too generic. My thinking got a bit clearer in <a href="/blog/2023-02-19-the-meta-is-more-appealing/">The Meta is More Appealing</a>. Thomas 2023-02-19.</p> <hr> <p>I'm going to open with three buzzwords and a bland sentiment:</p> <p>Theories, policies, and frameworks are useful.</p> <p>Things like "do the uncertain things first" or "automate the process" are snappy little things that help us conquer problems by dividing, or sorting, or some other action.</p> <p>Left alone, people will pretty much always make a theory expand. They'll only do uncertain things, and automate all the once-a-quarter tasks they can find.</p> <p>Frameworks that do more, probably don't do it as well. Theories get fuzzier when they try to explain more. You cannot be specific and generic at the same time. Every "clarifying" <em>but only when</em> or <em>otherwise you should</em> shrinks the on-the-ground usefulness of a policy.</p> <p>Always be honest... except with children about some things.</p> <p>Judge people by their actions not their words... unless their words are hateful.</p> <p>You'll collect a lot of frameworks on your journey through apprentice to master. Keep them like every other tool: in a belt with their friends.</p> <p>Earlier in my career I loved the rules. I loved the certainty of knowing what to do, and when.</p> <p>Later in my career, my ears perk when I hear about exceptions to rules. Then I'll spend some time talking about them.</p> <p>I used to think this makes every framework or theory useless. I don't think that's true now. It's no more true than how money and laws and language are all made up. They all seem pretty useful.</p> <p>When something becomes an exception, you might have found the limit of your approach. You've found something you haven't accounted for, or something you cannot do.</p> <p>What you should not do, with this fresh exception, is ignore or massage or change it. That would be putting the solution before the problem.</p> <p>Say your proof-reading checklist works well for blog posts, but not an academic essay. Or your data analysis won't work on a sample size below 50. You've found a new problem.</p> <p>Everything has a limit to what it can help you with.</p> <p>Everything has a long tail of exceptions. Taken alone, these exceptions will feel like a one off. Taken together, they make up the majority.</p> <p>And left alone, a lot of people will simplify, and try to make a theory expand.</p> <p>But otherwise <em>all</em> we have is One Off Exceptions. I reckon we could group some of them into similar buckets, and stop re-inventing the wheel... "</p>]]></description> </item> <item> <title><![CDATA[Medium.com as my "a website can do that?" moment]]></title> <link>https://thomaswilson.xyz/blog/2023-02-14-medium-can-do-that</link> <guid>https://thomaswilson.xyz/blog/2023-02-14-medium-can-do-that</guid> <pubDate>Tue, 14 Feb 2023 22:31:08 GMT</pubDate> <description><![CDATA[<p>In the early 2010s, when I was a post-grad (not a professional), I started writing online. And my first blog was on Medium.com. And the writing experience there was <em>excellent</em>.</p> <p>I think that was one of my earliest "a website can do that?!" moments. I don't want to forget that feeling.</p> <p>The buttery spacious experience of writing and laying out your piece felt like what every WYSIWYG editor should want to be. The words <em>looked</em> beautiful and it did Just Workâ„¢ï¸. It wasn't clunky buttons, and impossible-to-escape-or-indent lists (looking at you Notion and JIRA).</p> <p>It's like the first time you <em>smell</em> fresh cookies coming out of the oven, or watch someone make music up close, or witness someone really <em>use</em> photoshop.</p> <p>It's one step before "I think I could make something like this".</p> <p>And it was a website. A website that didn't have Google money or Google brains. A website that wasn't just plain forms and tables.</p> <p>Medium might have tried to scale too far and fumbled the monetisation, discoverability, and editorial aspects. I might have left Medium and taken a hard stance on markdown as the One True Format. But that text editor was really fucking cool, and I hope all the folks who imagined that product into my browser in 2014 knew that.</p> <p><img src="https://help.medium.com/hc/article_attachments/360010397434/dropcap.png" alt="A screenshot of Medium.com's editor"></p>]]></description> </item> <item> <title><![CDATA[Will what drove you here drive you away from here?]]></title> <link>https://thomaswilson.xyz/blog/2023-02-15-tests-drive</link> <guid>https://thomaswilson.xyz/blog/2023-02-15-tests-drive</guid> <pubDate>Wed, 15 Feb 2023 20:37:35 GMT</pubDate> <description><![CDATA[<p>Tests should drive the development of software (<em>caveat caveat backtrack backtrack</em>). That means if you find yourself somewhere in the codebase making some kind of change, it should be because the test took you there.</p> <p>If you're not careful, you're somewhere because it was nearby and it looked or smelled off.</p> <p>Unfortunately, this looks an awful lot like tidying up after yourself or moving things around to make an incoming change easier.</p> <p>Tests give you a ride out of where you are. They give you a point of reference to understand, really, how far away from the path you are. By doing something as simple as re-running the test you're working on, you might be able to hit the ejector seat, or let the bungie cord pull you back up.</p> <p>Sometimes you're driven somewhere because without a clear answer to that question "when am I done?". What drove you there won't necessarily drive you back, at least reliably or directly.</p> <p>It's very easy to let a <em>this didn't quite feel right</em> feeling take you down the <a href="https://en.wiktionary.org/wiki/yak_shaving">Yak Shaving</a> route.</p> <p>Unlike my favourite theory of Software Engineering as a RuneScape Quest, when you're Yak Shaving you might not even be doing something that makes the next thing easier.</p> <p>You might be improving things, but it's happening by random sprawl.</p> <p>Tests are a vehicle that drive you, and they're also a tool to get you out.</p>]]></description> </item> <item> <title><![CDATA[Don't make it, make it good.]]></title> <link>https://thomaswilson.xyz/blog/2023-02-17-make-it-good</link> <guid>https://thomaswilson.xyz/blog/2023-02-17-make-it-good</guid> <pubDate>Fri, 17 Feb 2023 20:58:22 GMT</pubDate> <description><![CDATA[<p>Let's say there's two kinds of work:</p> <ol> <li>The kind where you take something not good and make it good.</li> <li>The kind where you take nothing, and make it into something.</li> </ol> <p>I have spent a lot more time doing the first kind of work, making something better.</p> <p>I have spent a lot less time trying to make something out of nothing.</p> <p>A lot of the things I have improved had a life afterwards. A lot of the things I created from nothing fell down as soon as I stopped holding the strings.</p> <p>There are exceptions, obviously. But they are not the rule.</p> <p>If it seems easier to start fresh than to make something better, something is wrong.</p> <p>It's easier to re-arrange the spices in your kitchen, than rearrange the entire food-storage situation. It's easier to add an extra kilometre to a run than start triathlon training. It's easier to cut down than to quit.</p> <p>I've been keeping my eyes out for this feeling at work. Because "the only way to fix this is revolution" doesn't feel healthy. Healthy cultures are not constantly in revolt, they are in evolution. Nor is "the only way to fix this is if everyone leaves me alone to do this thing". Cultures are emergent, they are not the sum of the single parts.</p> <p>This can mean a few things. If you're worried about your own work, <em>force</em> yourself into collaboration. Make it very hard to stray, and to start completely anew.</p> <p>If you're worried your cohort's behaviour, it can mean doing the silent to make gradual evolution the easy default, or doing the vocal work of dampening build-from-nothing, and making it the harder choice.</p>]]></description> </item> <item> <title><![CDATA[The Meta is More Appealing]]></title> <link>https://thomaswilson.xyz/blog/2023-02-19-the-meta-is-more-appealing</link> <guid>https://thomaswilson.xyz/blog/2023-02-19-the-meta-is-more-appealing</guid> <pubDate>Sun, 19 Feb 2023 19:33:01 GMT</pubDate> <description><![CDATA[<p>Earlier this week I wrote a piece, <a href="/blog/2023-02-13-the-exceptions-are-more-interesting">The exceptions are more interesting</a>. Tl;dr - unless you're extremely careful at work, ideas/advice/theories become platitudes, and therefore less useful.</p> <p>My brain isn't finished with the idea, I think the point I want to make is:</p> <blockquote> <p>It is tempting to prefer talking in generalisations. It feels more useful, because you can think-once-run-anywhere. It's easy to dismiss a criticism of an "in general" with the details of "just one" specific. But for any one given problem or situation, it's probably more useful to give specific advice - and <em>then</em> try to make it general.</p> </blockquote> <p>We've got a couple of new-ish projects going on at work. They are taking a lot of my time. Because they're new, there's a lot of ground-work to do as a software engineer. You've got to understand the way the current system works, how we want the future system to work, and where we can/not take shortcuts to get things done quicker.</p> <p>This means that a lot of the conversations at the moment have to be <em>really</em> specific. For example you might have to say "If you had to wait six weeks for two of these features, what's most acceptable" or "can we do a manual conversion of data here, instead of spending a week automating it?".</p> <p>I think some people see this level of specificity as a bad thing.</p> <p>There's an idea that generalisations or meta-level work is always more useful than talking about the specifics of an issue. Taking the examples above, they might respond "we need a rigorous, opportunity-cost approach to prioritising" or "we need a clean set of code tools for data input automation".</p> <p>Sometimes I'll try to bring conversations closer to the specifics and detail of a specific problem, and the response is to try to find generalities, or meta-conversations.</p> <p>Those things feel and sound useful, but they take every problem one step above where it is. Sometimes you really do just have to <em>do the thing</em>â„¢ï¸.</p> <p>There's a middle ground between the engineer who has to spend days-weeks in the weeds, and the product-person who spends time thinking about processes. But I think that meta conversations and grand theories-of-everythings can take the air out of the room for conversations of specific problems.</p>]]></description> </item> <item> <title><![CDATA[What is the anti-principle?]]></title> <link>https://thomaswilson.xyz/blog/2023-02-24-what-is-the-anti-principle</link> <guid>https://thomaswilson.xyz/blog/2023-02-24-what-is-the-anti-principle</guid> <pubDate>Fri, 24 Feb 2023 22:04:10 GMT</pubDate> <description><![CDATA[<p>Asking "what's the opposite?" is a question I use a lot when talking about problems and solutions. That means asking questions like "what does this person not need to hear from me?" or "what would the least useful version of this look like?".</p> <p>If you're stuck, paralysed by choice, or have a brain-itch that a conversation is heading off into the woods without packing a lunch – these questions can be <em>really</em> useful.</p> <p>I think Hacker News surfaced the blog post <em><a href="https://www.anup.io/p/invert-always-invert">Invert, always invert</a></em> (in turn inspired by <a href="https://fs.blog/inversion/">this Farnam Street piece</a>) to me about three years ago, and now I reach for Inversion almost daily.</p> <p>I also find that inversion can help combat vague platitudes (say, <em>strive for excellence</em>, or <em>keep it simple</em>). I think these hand-wavy big theories <a href="/blog/2023-02-19-the-meta-is-more-appealing">are appealing but not very valuable</a>.</p> <p>I think you can take the idea of Inversion in one hand, and a meta/generic/bland principle in the other - and you come back with an Anti-Principle.</p> <p>For example:</p> <ul> <li>"Design with the context in mind" becomes "Design with your quiet office and MacBook Pro in mind"</li> <li>"Measure what matters" becomes "Measure what's easiest to measure"</li> <li>"Actively resolve complexity" becomes "Preserve effort and prolong complexity".</li> </ul> <p>I had an experience recently where laying out principle/anti-principle next to each other helped a colleague recognise some things they need to work on. I don't think this would have happened if it was <em>just</em> the principles.</p> <p>I find anti-principles especially useful when human nature (or a company culture) pulls us heavily in one direction. For example it's very easy to feel anxiety when you don't understand something. Ignoring our ignorance is a natural response, and hard to acknowledge. But when someone clearly says to you that allowing complexity or uncertainty linger around a project or conversation is an anti-pattern, our actions (or non-actions) seem more obvious. We didn't fight against the uncertainty (because we didn't want to have a difficult conversation, or because we prioritised urgent unimportant work).</p> <p>When doing the right thing is hard, for whatever reason, the anti-principle acts as a nice little reminder. It's like when you open the biscuit tin and say out loud to yourself, alone in the kitchen "I shouldn't have a biscuit, I'm just bored". The acknowledgement is important.</p>]]></description> </item> <item> <title><![CDATA[Vibe Check #11]]></title> <link>https://thomaswilson.xyz/blog/2023-03-04-vibe-check-11</link> <guid>https://thomaswilson.xyz/blog/2023-03-04-vibe-check-11</guid> <pubDate>Sat, 04 Mar 2023 08:02:48 GMT</pubDate> <description><![CDATA[<p>The Vibe check is a series of monthly blog posts where I think back to the past month. Today I'm talking about February 2023.</p> <p><strong>Music and Film Recs</strong></p> <ul> <li><a href="https://letterboxd.com/film/cha-cha-real-smooth/">Cha Cha Real Smooth</a> (film; drama). This is the best film I've seen so far this year. Without being self serving or aggrandising, and without lying, it makes humans look kind and good. That takes <em>something</em>. It's a lot easier to be cynical.</li> <li><a href="https://letterboxd.com/film/good-luck-to-you-leo-grande/">Good Luck to You, Leo Grande</a> (film; screenplay?). It's about sex and pleasure and regret and getting old, and also about the most beautiful Irish-accented man. Emma Thompson is there. I left feeling hopeful, but I don't think I'll ever re-watch.</li> <li><a href="https://ukshop.rayeofficial.com/products/my-21st-century-blues">My 21st Century Blues, RAYE</a> (album; Gen Z; 2023). Generation Z are okay sampling vibes/aesthetics/style from a thousand places (this is one of approx. three things I know about them). This record shows that, and it is flawlessly produced. I recommend it.</li> <li><a href="https://oddisee.bandcamp.com/album/to-what-end">To What End, Oddisee</a> (album; hip hop; 2023) Oddisee has sat at the edges of the alternative/boom-bap hip hop that I love so much. This is another record with quality production, and some upbeat beats.</li> </ul> <p><strong>Hope and optimism</strong> But life is a thing that happens with us, not <em>to</em> us. It took a few frustrating weeks (unempowered?) but life feels now like I remember life felt at the end of my postgraduate studies, and when I first moved to London. It feels as though things are changeable, as though I can <em>do</em>. I'm not sure why I ever felt the opposite. Or if I just forgot. Either way, it's an undercurrent I feel very grateful to have.</p> <p><strong>Cycling</strong>. It is warm enough to cycle again. Not all the time. Sometimes it's too wet. It is actually quite cold, and a little windy. Being outside doesn't feel universally fantastic, but the blanket ban on prolonged outdoor activity is lifting. In February I managed (checks Strava) three cycle rides over 50k, and a good number of runs. Now that it's not dark at 2pm it's possible to do more in a day.</p> <p><strong>Magic: The Gathering</strong>. I spent far too much of my time at university sitting around student-accommodation-quality (and size) kitchens playing MtG with my house mates (one of whom was my Magic sherpa, guiding me into playing it).</p> <p>I've played on/off with housemates and friends since then. I hope I'm still playing Magic when I'm sixty, it is a deeply satisfying game that evolves a lot.</p> <p>This month I discovered Magic's <em><a href="https://magic.wizards.com/en/products/jumpstart">Jumpstart</a></em> sets. The idea is that you buy two twenty-card boosters and shuffle them together. Now you have a forty-card deck ready to go. This lets you skip the bit where you have to construct your own deck from individual cards (or a couple hundred random ones from boosters).</p> <p>Having played a few games of Magic recently, I'm really enjoying it.</p> <p><strong>Sewing</strong>. I finished a pair of lovely woollen trousers ! Grey with brown checks on them. They're too wide around the waist, and the seat's a little low, but I made them. I've worn them in public, and I am proud of them.</p> <p>My current project is a khaki cotton canvas top which is probably thick enough to camp in. I've some leftover fabric that I think will become shorts. It's going to be quite an informal shirt, and I've paired it with some delightful light-brown textured buttons.</p> <p>Sort-of-related, I went for a suit fitting (for a wedding (not mine)) and ended up having a grand time. It's the first time I've gone this bespoke, and the boutique one-one experience of the fitting was great. I love clothes.</p>]]></description> </item> <item> <title><![CDATA[The Savant Syndrome of ChatGPT]]></title> <link>https://thomaswilson.xyz/blog/2023-03-12-the-savant-syndrome-of-chatgpt</link> <guid>https://thomaswilson.xyz/blog/2023-03-12-the-savant-syndrome-of-chatgpt</guid> <pubDate>Sun, 12 Mar 2023 19:00:40 GMT</pubDate> <description><![CDATA[<p>As I write this (March 2023), we're (hopefully) past peak-hype for ChatGPT, and into the phase where we start to find the boundaries and limitations. Or at least temporary limitations before the next language model addresses them.</p> <p>As a very up-front statement of a dystopian future: large language models (like the ones OpenAI are wielding) might bring some fresh horror for our already technologically-hobbled society, and potentially end us (or cause us to end ourselves) because they let people bypass the barriers to access to worryingly dangerous information (like bioweapons). We really, really should be taking these things seriously.</p> <p>OpenAI's ChatGPT app (and now API) is insanely cool, but in a specific way.</p> <p>I've been using it to help with both technical and administrative tasks, and it does some things <em>really</em> well:</p> <ul> <li>It can sketch out code <em>super</em> quickly: an interface or class.</li> <li>It can iterate on those sketches really well: give it some feedback about a potential weakness, and it will address those.</li> <li>It can workshop ideas: if you describe a problem, and ask it to suggest a couple of alternative names for things.</li> <li>It can re-word (re-phrase, summarise) natural language: this is especially useful if you ever need to use corporate speak.</li> </ul> <p>At the moment, ChatGPT can do the first pass on these things faster than I can. Way faster. And get 80-90% of the way there, in maybe 10-100x the time, it's great. The breadth of knowledge is also stunning - it can suggest synonyms or related concepts.</p> <p>What's more, it can then explain that new idea or word to you... in the exact same place as it was introduced. It's ripe for rabbit holes. It's the lowest friction wikipedia journey you ever went on. You can keep asking "tell me more about that" and it just... does.</p> <p>However the deeper into a problem you, the more specifics you have - the harder it is to get useful advice. For example, I asked how I could get the first 100 users for a certain kind of app (say a Language Learning app), and it told me to:</p> <ol> <li>Ask my friends (good for very early feedback)</li> <li>Post on social media (sure, but what?)</li> <li>Partner with language learning schools (are enterprise customers good early customers?)</li> <li>Offer a special promotion (to who? The void of users I don't have?)</li> <li>Attend conferences (pretty good idea)</li> <li>Join online communities (spam strangers on the internet?)</li> </ol> <p>Acquiring your first 100 users is pretty hard, there are a lot of books and talks and opinions about it. It's also a pretty noisy signal: it's famously hard to know if someone's advice is true, or if they're just accidentally successful and doing a figurative rain dance. Some people succeed <em>despite</em> their early decisions, others <em>because</em>. Some people are just lucky. People get a lot of praise when they tell others how to become successful.</p> <p>People have spoken about Large Language Models' tendency to hallucinate (i.e. report something as true even though it never happened), or to be confidently wrong.</p> <p>This is like that, but different - there's a lack of awareness of wider context, but also a lack of awareness that there can even <em>be</em> a wider context that matters.</p> <p>This is <a href="https://en.wikipedia.org/wiki/Savant_syndrome">Savant Syndrome</a> - ChatGPT has exceptional abilities in some places, but lacks "basic" skills.</p> <p>A few times when I was co-designing some code with ChatGPT it would present me with some very specific code to the exact problem we were discussing. It wasn't able to confidently generalise some ideas, which meant that certain ideas were hard-coded into the code.</p> <p>Designing good software is all about designing code that can change in the future, and knowing where that can cause the most pain. That's the reality of being a software engineer, and it feels pretty fundamental to me.</p> <p>I found ChatGPT most useful as a tool to reduce the friction of resolving specific bumps along the way to solving a problem. If I needed a term defined, or needed a basic interface in TypeScript sketched out, or if I wanted some example scenarios - I was able to get them there-and-then.</p> <p>What's perhaps worrying is how similar this is TikTok's content model (a fire hose). Unlike TikTok's content, ChatGPT is very obviously computer-generated, which I think will encourage people to trust it more.</p> <p>Your mileage may vary, proceed with caution, use your common sense, so on and so forth.</p>]]></description> </item> <item> <title><![CDATA[You can build eight things a year (tops)]]></title> <link>https://thomaswilson.xyz/blog/2023-03-23-you-can-build-eight-things-a-year-tops</link> <guid>https://thomaswilson.xyz/blog/2023-03-23-you-can-build-eight-things-a-year-tops</guid> <pubDate>Thu, 23 Mar 2023 18:39:41 GMT</pubDate> <description><![CDATA[<p>If you could build something (start to finish) in six weeks, and worked worked evenly (and relentlessly) for all fifty-two weeks of the year, you would build about eight and a half products in a year.</p> <p>It is now (<em>checks watch</em>) nearly April (?!)</p> <p>Have you built those two things?</p> <p>This check is a useful tonic for when my optimism likes to tell me anything is possible.</p> <p>It's a useful selective pressure: Is the thing you're building now one of the eight things you want to talk about this year? Or one of the eight bullet points you can put on your CV? Or one of the eight things your customers will love?</p> <p>I think Adam Wathan first introduced me to this on the (sadly dormant) <em><a href="https://fullstackradio.com/">Full Stack Radio</a></em> podcast.</p> <p>A lot of conversations at work have pulled it out of my brain recently.</p>]]></description> </item> <item> <title><![CDATA[How are you responding to uncertainty ?]]></title> <link>https://thomaswilson.xyz/blog/2023-03-28-uncertainty</link> <guid>https://thomaswilson.xyz/blog/2023-03-28-uncertainty</guid> <pubDate>Tue, 28 Mar 2023 10:25:53 GMT</pubDate> <description><![CDATA[<p>There's a one-two combo with some kind of hard problems: you have to ask "what do I need to do?" and then "how do I know if that worked?".</p> <p>Surprise! It's actually a three-punch combo (<em>pow!</em>). It is <em>even harder</em> if you do something, but won't quickly or easily see if you did the right thing.</p> <p>Some big life examples are asking if you should buy property, move city/country, change careers, or marry a person.</p> <p>The more mundane ones might be deciding what book to read next, if you need to learn the new Tech Toy <em>Du Jour</em>, what to wear to dinner, or what cocktail to order.</p> <p>The eponymous <em>uncertainty</em> of this post is a greater-than-the-sum-of-its-parts mix of not knowing about what you will do, what you have done, and what you could do. It's sort of amazing we ever get anything done.</p> <p>I've seen a couple of archetypal responses to these problems:</p> <ol> <li>Over-prepare: double check your working, pre-define success and failure, record the metrics and plan your responses; or</li> <li>Do not prepare: treat the problem as though it was any problem and act as though it is not especially to un-do decisions.</li> </ol> <p>These are extremes, and I don't think they're that interesting to talk about in specific. In reality, people are a mixture.</p> <p>I think it's more useful to recognise when being uncertain about something makes it hard for you to move even a centimetre closer to certainty. It might be stopping you from trying something, or it might blind you to something you didn't think about.</p> <p>Ask yourself (and people around you) what's uncertain, and how you're reacting to the uncertainty.</p> <p>Fwiw, I don't think extreme above will strongly correlate with success or failure if you average it out over enough time. From a self-awareness point, I fall far into the latter: I think you'll learn more by <em>doing</em> than by preparing to do. But there are some things where you can't un-do or re-do easily, so better attention to detail and foresight will be a boon.</p>]]></description> </item> <item> <title><![CDATA[Vibe Check #12]]></title> <link>https://thomaswilson.xyz/blog/2023-04-14-vibe-check-12</link> <guid>https://thomaswilson.xyz/blog/2023-04-14-vibe-check-12</guid> <pubDate>Fri, 14 Apr 2023 20:33:52 GMT</pubDate> <description><![CDATA[<p>I find myself writing this a full two (2!) weeks into April. It's been seventeen days since I last wrote <em>anything</em>, which feels unusual. My brain feels it: I've taken more and more detailed notes (at work, in life) in the last five-or-so days. I wrote the notes for this piece on paper at an off-grid cottage in Wales (10/10, strong recommend).</p> <p>The singular feeling from March 2023 I would press into the hands of me-in-February is that of sunlight at seven o'clock in the evening. And of how quickly that change happens. The evenings don't end at five PM. The darkness doesn't take up all the space in the evening. It is marvellous.</p> <p>I've not watched a single movie this month, but I have enjoyed several series: Couples Therapy (if I was a ghost, I think I would haunt therapy sessions), Wild Isles (Sir David Attenborough and Great Britain at their finest), and Ted Lasso (finishing Season 2, now that 3 is released).</p> <p>I've found myself in a non-fiction place for books. For which I particularly recommend:</p> <ul> <li><a href="https://www.goodreads.com/book/show/60713379-a-fortunate-woman">A Fortunate Woman</a>, Polly Morland. An account of a country doctor, put so well how years-long acceptance and relationships make us better people and communities.</li> <li><a href="https://www.goodreads.com/book/show/59851731-super-infinite">Super-Infinite</a>, Katherine Rundell. Recounts the life of John Donne, a seventeenth century poet (new to me). In telling him and his story, Rundell shows us a complicated and unique man.</li> <li><a href="https://www.goodreads.com/book/show/35747076-accelerate">Acelerate</a>, Nicole Forsgren, Jez Humble, Gene Kim. A book about the benefits of Continuous Integration and Delivery as heartbeat practices for modern software teams. Please only read this if you find yourself in a position to influence the prioritisation and ways-of-working of software teams.</li> <li><a href="https://www.goodreads.com/book/show/52283963-the-mom-test">The Mom Test</a>, Rob Fitzpatrick. A book about asking good questions and framing business and product conversations. It's framed for business people but really, I think there's life advice in there. This was a re-read (from 2020, I think) - and I'm glad I did.</li> </ul> <p>When reading non-fiction, I find myself more interested in the world. By considering something, and how to tell its story to a stranger - it reminds my brain that the world is a place full of things worth paying attention to. That my culture, my craft are things I participate in, not things that just <em>are</em>.</p> <p>This has easily been my most socially busy time since Christmas. I've even some friends twice within one month. I've been careful to take care of body and mind - it's easy to add obligations and activity without making the requisite deductions from the balance sheet. I remain a working young professional (who's getting married).</p> <p>Which is also to say why little (no) progress of note has been made on any of my sewing projects. I have finished a trouser toile which came out a good inch too small around the waist (despite the last one coming out several inches too wide). I've started a pair of trousers in indigo wool (now we're talking about April, slow down, Wilson). I've already seen myself resume more careful focus of sewing.</p> <p>Look, that's it. Sometimes it's about making things short or never getting around to them.</p>]]></description> </item> <item> <title><![CDATA["I'm just trying to be a happy meat sack"]]></title> <link>https://thomaswilson.xyz/blog/2023-04-20-happy-meat-sack</link> <guid>https://thomaswilson.xyz/blog/2023-04-20-happy-meat-sack</guid> <pubDate>Thu, 20 Apr 2023 21:45:46 GMT</pubDate> <description><![CDATA[<p>I went for coffee with a friend today. We were talking about how to make sense of it all. The big stuff.</p> <p>We were talking about the things you should not burn: health, youth, relationships. Those things will, if sustained, sustain you. Or, more pessimistically, they are the things you will reassemble slowly if you discard them.</p> <p>Take the time and hone the tools to sustain them. It does not matter if they do not feel important on a Thursday lunchtime when the sun is out.</p> <p>We were talking about therapy being one such tool, and my friend stopped talking, laughed, and said "I'm just trying to be a happy meat sack".</p> <p>It's good. You're a biological machine that breaks down slowly (if you're lucky) over seventy-some years (if you're lucky) which will, if you're lucky, happen to your mechanical body before your neural one. You're also an exceptionally <em>wet</em> meat machine. We are wet, slowly failing degrading meat machines.</p> <p>You can be a happy meat sack, or you can be a sad meat sack.</p>]]></description> </item> <item> <title><![CDATA[Deep work is unnatural, real, and non-negotiable]]></title> <link>https://thomaswilson.xyz/blog/2023-05-11-deep-work</link> <guid>https://thomaswilson.xyz/blog/2023-05-11-deep-work</guid> <pubDate>Thu, 11 May 2023 20:48:10 GMT</pubDate> <description><![CDATA[<p>By nature I am very opinionated, so I try hard to make my opinions changeable. It's the least I can do for other people.</p> <p>There are a handful of beliefs that you shouldn't flex on. One such belief is that the kinds of problems I like working with demand deep work.</p> <p>I build software and (increasingly) teams that build software, I make clothes, I run/cycle.</p> <p>The quality of work that comes from uninterrupted, narrow, intense <em>thinking</em> needs to be treated as a particularly rare animal that you desperately want to live in the habitat of your life or your work.</p> <p>Unfortunately, deep work is not particularly natural, or urgent, or sturdy. The overgrown vines of life will push it out – a full calendar, messages/emails, an early appointment overrunning by five minutes.</p> <p>The cue for deep work is rarely self-evident or pressing, though we long dream of the empty calendar block.</p> <p>This means that culture, the people around you (who are not you), need to recognise deep work as a real and non-negotiable kind of work.</p> <p>I am trying to be that kind of colleague, that person who's pushing others re-prioritise (at least a little) deep work. I'm trying to pump up the Social Approval Dopamine, to counter the Replying To An Instant Message Dopamine that the deep work competes with.</p> <p>Because the deep work is so hard to attract, and then to keep around - I think having to convince others of its existence and benefits would be too much. It would be unwieldy, and twice the work.</p>]]></description> </item> <item> <title><![CDATA[Summer approaches]]></title> <link>https://thomaswilson.xyz/blog/2023-06-10-summer-approaches</link> <guid>https://thomaswilson.xyz/blog/2023-06-10-summer-approaches</guid> <pubDate>Sat, 10 Jun 2023 20:05:48 GMT</pubDate> <description><![CDATA[<p>It has been 29 (twenty-nine) days since I last wrote and published something . I have things I want to say but, even more, I have things I want to do.</p> <p>Here are some of the things I've been doing instead of writing:</p> <ul> <li>Planning a wedding (including building a bespoke website for the wedding)</li> <li>Planning a holiday for later this summer (Nantes, France)</li> <li>Watching one of my best friends got married</li> <li>Cycling (outside!)</li> <li>Sewing (wool trousers, a linen tunic shirt)</li> <li>Writing and journalling in my pen-and-paper book</li> </ul> <p>These all sound like a life being lived. The idea of pulling myself out to write on my computer has felt like a chore, so I haven't done it.</p> <p>But it's also broken a habit (or weakened a muscle, pick your metaphor). And I'd like to get better at recognising interesting problems by writing about them.</p> <p>Maybe I'll wait for the days to get shorter first.</p>]]></description> </item> <item> <title><![CDATA[Link: Always the same warning signs]]></title> <link>https://thomaswilson.xyz/blog/2023-06-14-link-always-the-same-warning-signs</link> <guid>https://thomaswilson.xyz/blog/2023-06-14-link-always-the-same-warning-signs</guid> <pubDate>Wed, 14 Jun 2023 19:29:00 GMT</pubDate> <description><![CDATA[<p>I came across a link to <a href="https://www.science.org/content/blog-post/always-same-warning-signs">Always the Same Warning Signs</a> (science.org) while browsing Hacker News.</p> <p>It goes over some of the warning signs around revolutionary (and lucrative) commercial science breakthroughs, like in pharmacology. Specifically, what if it seems too good to be true.</p> <p>The piece gives three warning signs which ring true in an engineering setting:</p> <ol> <li>Only one person can get this great stuff to work</li> <li>Legitimate questions are met with stonewalling</li> <li>Important data are missing or kept secret.</li> </ol>]]></description> </item> <item> <title><![CDATA[Vibe Check #13]]></title> <link>https://thomaswilson.xyz/blog/2023-06-16-vibe-check-13</link> <guid>https://thomaswilson.xyz/blog/2023-06-16-vibe-check-13</guid> <pubDate>Fri, 16 Jun 2023 13:06:37 GMT</pubDate> <description><![CDATA[<p>Summer's coming in, which is pretty great. I love the summer (old news and a lukewarm take).</p> <p>I've found myself fulfilled over the last eight-ten weeks. I have seen one of my closest friends get married, I've finished multiple sewing projects (I'm wearing a Snout Street shirt right now, a little linen number), and I've re-started French lessons (online).</p> <p>There have been some harder moments. The economy around Venture Capital is slow at the moment, and I work at a start-up. There have been some very difficult moments and conversations recently, which haven't been fun. I don't know enough to know if it's a fair comparison, but I didn't have to work through 2008's crisis, so this is the first one which I am a part of. From what I can see - it's not just me or where I am working.</p> <p>I took a minute away from reading and movies - throughout the winter-spring I was watching and reading a lot, and I'm honestly not sure what has filled that time. I expect it's planning a wedding and a holiday, and spending time outside. Ah, spending time outside.</p> <p>In the past few weeks I've found myself coming back to the practice/habit of reading. I've started Janina Ramirez's <a href="https://www.penguin.co.uk/books/442293/femina-by-ramirez-janina/9780753558263">Femina</a>, and blasted through RF Kuang's <a href="https://harpercollins.co.uk/products/babel-or-the-necessity-of-violence-an-arcane-history-of-the-oxford-translators-revolution-rf-kuang">Babel</a> and Angeline Jackson's <a href="https://www.queerlit.co.uk/products/funny-gyal">Funny Gyal</a> (the latter two of which are book club books - thanks book club!)</p> <p>I've also been looking at natural dyeing (<em>dye</em> and <em>die</em> being fun homophones). I bought myself a little starter kit and a few metres of linen (linen being <em>much</em> more expensive than you'd think) - and I'm excited to dye some garments, and probably some bunting too. There's a lot of fun crafts out there.</p> <p>So I guess to check on the vibes: the vibes are mixed. It's been stressful and scary, but the sun's out and life is still good. I'm not sure I can call life bad if I get to eat fresh cucumber satay noodles in the garden on just, like, a Tuesday evening.</p>]]></description> </item> <item> <title><![CDATA[Hours of tinkering has saved me seconds of toil (and I am very happy)]]></title> <link>https://thomaswilson.xyz/blog/2023-07-01-hours-of-tinkering-has-saved-me-seconds-of-toil-and-i-am-very-happy</link> <guid>https://thomaswilson.xyz/blog/2023-07-01-hours-of-tinkering-has-saved-me-seconds-of-toil-and-i-am-very-happy</guid> <pubDate>Sat, 01 Jul 2023 14:16:21 GMT</pubDate> <description><![CDATA[<p>In January, <a href="/blog/2023-01-12-2023-01-12-little-project-oddbox-scraper">I wrote about</a> a tiny bot that I built in a week which goes to the "Upcoming Deliveries" page on ODDBOX (a fruit & veg delivery company in the UK), does some simple HTML scraping to find what fresh food I can expect to have delivered, and then format that in an email to me. Once a week I get an email telling me to expect beetroot or whatever.</p> <p>I had to build this because despite receiving a weekly email from ODDBOX themselves, those emails would always redirect me to some marketing landing page, and I'd have to click around from there to find what I wanted. I'd have to do the same dance every week, where I would have to look at two unordered date ranges in my head and think about "wait, is this this week or next week? What date will next Monday be". It was 10 seconds once a week and it was maddening.</p> <p>I suppose there's a KPI somewhere for website engagement or conversion to other e-commerce services. Having someone land on your website means you can probably upsell them a little better.</p> <p>But I have a KPI in my life for "amount of time spent doing toil" and I want that to be basically zero. I wish to decide how to waist my own time.</p> <p>The great time wheel turned over within ODDBOX and they shipped a redesign on their marketing site. It looks okay, as these things go. But it broke my fragile path selectors. Won't some poor software engineering team member think of my fragile path selectors.</p> <p>I <em>guarantee</em> you that the time I spent debugging and fixing this far exceeds any time this bot has saved, but it didn't feel like toil. It felt like fun tinkering.</p> <p>Another thumbs-up for terraform here, too. I checked my README for the deploy commands, ran them, and they worked. IaC is cool. Anyway, I'm going to go resume waisting my time.</p>]]></description> </item> <item> <title><![CDATA[Vibe Check #14]]></title> <link>https://thomaswilson.xyz/blog/2023-07-19-vibe-check-14</link> <guid>https://thomaswilson.xyz/blog/2023-07-19-vibe-check-14</guid> <pubDate>Wed, 19 Jul 2023 18:33:50 GMT</pubDate> <description><![CDATA[<p>June 2023 was a pretty busy month. The company I work for went through a second round of redundancies and the software team (the team I lead) ended up being quite badly affected, and many of my colleagues were made redundant. I ended up doing a lot of mental and emotional labour going through that process with, and for, the people affected.</p> <p>It feels (and felt) indecent to turn any of that into public content. To make a "five steps for helping your newly redundant colleagues" article. Or to post cryptic "things are hard". Or to post "things aren't hard". Because things have been difficult for me and for people around me. The toll has been apparent and invisible, and the priority has been my wellbeing and the wellbeing of the people around me (inconsistently ordered).</p> <p>That feeling stands above everything else from June 2023. That's not to say, there weren't some good things:</p> <ul> <li>Taking a wonderful sun-doused cycle ride with a close friend through the Oxfordshire countryside</li> <li>Taking many (online) French lessons to prepare for a holiday in July. I enjoy learning languages (really I think I just enjoy talking)</li> <li>Leaning on my mentorship network to talk through the human and logistical moving parts, and feeling very supported</li> <li>Having friends (bridal party members) over for a lunch and board game afternoon</li> <li>Teaching another friend how to sew, from cutting to finishing (it's hard, we still haven't finished that tunic)</li> </ul> <p><strong>Books I Read</strong></p> <ul> <li>Atalanta, Jennifer Saint. My love for the "feminists writing women from mythology as though they were characters" genre continues. Saint wrote <em>Ariadne</em>, which is in my top-three of these kinds of books (strong recommend for <em>Ariadne</em>). In comparison, <em>Atalanta</em> feels equally technically strong, turning her attention to the titular Atalanta, a mortal chosen to be a champion of Artemis, by the goddess of the hunt herself. Atalanta finds herself the only female member of the argonauts. Something in the narrative didn't quite hit me like <em>Ariadne</em>, but I suspect that's the effect of expectations.</li> <li>A Deadly Education, Naomi Novik. When I was nineteen I read all three Hunger Games novels in a very short time period (for me at least) - and I wanted a book which scratched that same itch. A story about magical students at a magical school but where the school is lousy with enchanted creatures that want to crush kids' bodies and suck out all the magical nutrition within them? And there are no adult teachers, and also the school itself is an indifferent steampunk contraption? Fuck yeah, dude. This is exactly what I needed to get me through "life is hard" times.</li> </ul>]]></description> </item> <item> <title><![CDATA[Her Majesty's Royal Coven is my favourite book of 2023 (so far)]]></title> <link>https://thomaswilson.xyz/blog/2023-07-27-hmrc</link> <guid>https://thomaswilson.xyz/blog/2023-07-27-hmrc</guid> <pubDate>Thu, 27 Jul 2023 06:27:20 GMT</pubDate> <description><![CDATA[<p>I think I first saw Dawson's book in a Sunday Times magazine, as a new release. The premise was that witches are real and the UK government has a coven (HMRC) of witches.</p> <p>There are spoilers after this paragraph. If that's not cool, stop reading here and immediately go to your local library and reserve a copy of this book (because I give good odds it's already checked out by someone else), or buy a copy. Hell, do both, see if I care.</p> <p>Okay, free range spoilers from here one.</p> <p>I love (<em>love</em>) fantasy books with witchy or occult vibes. I love fantasy because you can take something from this real (mundane, mostly non-magical) world, and try to reflect back the beauty or strangeness of a thing. War is still war, love is still love, even if you've got magic spells or demons.</p> <p>I love occult and witchy vibes because if I was a witch I could have a cottage and a cat and be mostly left alone to my own enchanting devices.</p> <p>This book takes some really fucking difficult ideas about the politics and power of gender and identity, about the irrational basis for un-moveable prejudices or hatred and says "but what if adventure with witches" <em>and it works</em>.</p> <p>Nothing has been this just-one-more-ritz-cracker level of readable to me since I read all the <em>Hunger Games</em> books irresponsibly close to university finals in 2010.</p> <p>In a second I'm going to start talking about how it's so impressive that it's this readable while also bringing in a bunch of other good ideas. The plot and pacing, the adventure and twists, turns make the bones of this book strong and moreish.</p> <p>Few villains have made me feel the chest-clenching anger and frustration since D. Umbridge in the 2000s.</p> <p>Glad you brought it up, Wilson, the Harry Potter comparison. Let's not mince words: it's a shame that an author who created such enchanted childhood moments for me, and millions others, keeps making the choice to amplify ideas that de-legitimise and de-humanise women. It's a real shame that people will value her opinion more because she wrote some wildly successful books for children. It's a shame that she cannot, as an author, perform empathy with other humans and thinks that suffering and prejudice is sort of inevitable and a source of pride, not a wound to heal. But I digress.</p> <p>Luckily this is just ("just") hate speech to me, and not invitations for people to direct hatred and anger towards me. Dawson is a trans woman, and HMRC is a book about witches and warlocks and which centres around magical children.</p> <p>One of those children is a trans girl.</p> <p>It would be easier for Dawson to write a more direct Magical School Trans Girl Protagonist book. The marketing of "Harry Potter but Trans Girl" is probably an easier sell. The Daily Mail could write some trite headline about "Schools force Harryetta Potter on our children, no thanks" and we could all pretend that's more acceptable than racism? I digress further still.</p> <p>I had a few more paragraphs like this but I eventually over virtue-signalled to even myself, so things got quite bad. Recognise trans people and fuck intolerance and hate speech.</p> <p>But instead, Dawson has not written a book for children. She has written a book for people who want a really fucking good witchy adventure, and uses the existence of trans people as a nucleus for conflict and tension for the characters.</p> <p>It is clear that Dawson has thought long and hard about gender politics and identity. About how a lot of the arguments against trans people boil down to "I don't think it's right". A point that people try to dress up with various physical/biological points, which magic does provide an <em>incredibly</em> good way to side-step. To emphasise how these beliefs aren't anything substantial - they are just stubborn prejudice and hate.</p> <p>The book looks at the masculinity and ego, about uniting and dividing women, sisterhood, and about growing older with childhood friends. It looks at some really superb parts of us, as humans, then adds witches, and then says "that's ridiculous, right?".</p> <p>Man, read this book.</p>]]></description> </item> <item> <title><![CDATA[Something about learning to see]]></title> <link>https://thomaswilson.xyz/blog/2023-08-28-something-about-learning-to-see</link> <guid>https://thomaswilson.xyz/blog/2023-08-28-something-about-learning-to-see</guid> <pubDate>Mon, 28 Aug 2023 14:32:49 GMT</pubDate> <description><![CDATA[<p>A younger, self-obsessed, version of me thought the details of "expertise" (completely devoid of context) were the secret. I think that attitude actually helped lay a pretty solid foundation to my professional past-lives, but I have tried hard to move on from it.</p> <p>I missed a few things, like the context of not being a relatively wealthy man in a metropolitan area in the western world, and also, like, the absolute joy of doing things slowly.</p> <p>But there's something in there that really engages my brain. It's the same part that loves to watch strangers doing cool things on their laptops in public. Like when I watched a guy do something that resembled gene sequencing or protein visualisation on a train, or watching someone who <em>really</em> gets photo editing blitz through like a hundred photos in five minutes.</p> <p>Most recently, it's been about looking at every detail of the bespoke suit jackets in my wardrobe (I am learning to make my own clothes).</p> <p>Whatever I have become convincingly good at (making clothes, writing software) - it becomes about <em>seeing</em>. About learning to see. Things like:</p> <ul> <li>The order of assembly for a waistband: how has the lining gone under the waistband facing without showing through on the other side?</li> <li>Setting pace in a run or cycle: seeing elevation gain now and over the next 1-2k, is now really the time to open the gas if the 14% incline coming up will bonk you, and run on to the next forty kilometres?</li> <li>Seeing process as waste in software development: is getting "design sign off" a way of increasing value delivery to customer, or is it going to result in stronger segregation of responsibilities (i.e. reduced collaboration) and longer time-to-delivery of value (i.e. slower value streams).</li> </ul> <p>Learning to see the details takes time.</p> <p>What's worse, there are so many false-friends between ways of seeing - things that feel intuitive but are wrong. The discipline of software development in particular is a minefield of "you'd think so, but it's actually completely the opposite".</p> <p>I have seen myself struggle with the most real-world truths: that going fast now in this one kilometre stretch doesn't mean that every kilometre after is going to be okay. Adding in additional fabric to a pattern over here will cause drape <em>everywhere else</em>.</p> <p>On the plus side, I am pretty good at getting the abstract.</p> <p>I think this is good to remember: that the problems or frustrations or ignorance I have are probably connected. The reason why the shirts I make are too loose is probably also the reason the trousers I make are too tight.</p> <p>Which means that if I can <em>just learn to see better</em> - I will fix at least two problems at once.</p> <p>Or more likely: I'll stumble on the next problem.</p> <p>Learning to see differently is hard. Which is sort of a circular reference: difficult things are the things where you have to look at the problems with a new (to you) way of thinking; things are easy when you look at them the way an athelete/engineer/designer would; it is difficult to learn a new way to see a problem.</p> <p>I did a PhD in chemical education - I spent four whole years thinking quite deeply about how seeing the world, and "seeing" the molecules in your mental model of the world, can help explain things.</p> <p>Look, learn to see, or try to change the way you see.</p> <p>And when you learn to see differently, know that you did a hard thing. A really impactful hard thing.</p>]]></description> </item> <item> <title><![CDATA[I've been getting pretty deep into pattern drafting]]></title> <link>https://thomaswilson.xyz/blog/2023-09-22-ive-been-getting-pretty-deep-into-pattern-drafting</link> <guid>https://thomaswilson.xyz/blog/2023-09-22-ive-been-getting-pretty-deep-into-pattern-drafting</guid> <pubDate>Fri, 22 Sep 2023 06:18:49 GMT</pubDate> <description><![CDATA[<p>I'm going to level with you - I've found myself pretty deep into drafting my own sewing patterns.</p> <p>It all started with commercial patterns. These are pre-made patterns from established designers and companies that are traditionally <em>graded</em>. The patterns come with a set of sizes, to make the garment in, for example, sizes XS-2XL.</p> <p>But a lot of the commercial patterns available for men sit closer to the <em>casual</em> in the smart-casual spectrum. The more formal patterns don't go down to my size (28" waist, 34" chest). Funnily enough, this is one of the big reasons that I wanted to learn to make my own clothes: if I want high quality mens tailoring, then Custom Made (whatever that means) really is the only option I have.</p> <p>If I want to just make (and not design) traditionally male garments, the only option I have is smart-casual patterns made to standard measurements.</p> <p>In translating these patterns from their intended fit and cloth into something more suitable (pun intended) - I found myself quite unhappy with the things I had in front of me.</p> <p>For example, I have chunky quads (from a decade of semi-religious commitment to road cycling). So I found seam allowances on the sides always pulling around to the front. But I have a pretty normal sized bum (or glutes, or seat, or hips depending on what we're calling it) - so adding cloth in to the legs caused a lot of droop just under my butt-smile. Do I want a garment that makes me look droopy?</p> <p>At this point I start thinking "well really how hard can it be?".</p> <p>Smash cut forwards a month, I am using <a href="https://seamly.io/">Seamly2D</a>, an open-source CAD software for fashion design, and the <a href="https://www.waterstones.com/book/metric-pattern-cutting-for-menswear/winifred-aldrich/9781405182935">Aldrich system</a> for drafting mens' garments. This is one of legitimately two-to-three formalised systems for drafting the handful of traditionally male garments.</p> <p>Side note: why can't we have fun, or at least varied, garments?</p> <p>But the system for drafting garments gives you only a few of the basic blocks for building e.g. trousers. What about built-in vs. Separate fly pieces, or welts and pocket facing? Now I'm having to reverse engineer individual pieces of cloth to fit the custom garment.</p> <p>It's sort of like yak-shaving, but I'm pretty certain that all the steps along the way are necessary. Or at least, the least bad option.</p>]]></description> </item> <item> <title><![CDATA[Two questions for insightful technical interviews]]></title> <link>https://thomaswilson.xyz/blog/2023-09-24-two-questions</link> <guid>https://thomaswilson.xyz/blog/2023-09-24-two-questions</guid> <pubDate>Sun, 24 Sep 2023 08:22:49 GMT</pubDate> <description><![CDATA[<h2>tl;dr The Questions</h2> <ol> <li><strong>Can you give me an example?</strong> If the candidate is using all of the right words ("feedback", "delivery", "tests") - pick (any) one of them, and try to learn as much about an example as possible.</li> <li><strong>What would <em>you</em> do instead?</strong> If you're hearing a lot of criticisms about products or processes, this is a great question to see if a candidate has spent some time thinking about what could be done. What I am looking for here is a <em>generous</em> interpretation of colleagues and business - or are all the problems because the people around them are incompetent and don't care?</li> </ol> <h2>The Problem</h2> <p>I am currently interviewing for a senior (or lead) software engineer to join the team I am working with.</p> <p>Interviews are hard for everyone, but for now I'm talking about how they are hard for the folks who are hiring, not the folks who are being hired.</p> <p>The problem is that you want to learn, quickly, if a candidate meets some competence threshold. And you want to learn that as fast as you can, so that you don't waste so much time and effort interviewing someone who isn't right.</p> <p><em>But</em> you also want to give every candidate the chance to show you the best version of themselves.</p> <p>So how do you learn, as quickly as possible, what the candidate is best at, is most interested in doing, and if they're <em>actually</em> good and interested, or if they're just saying the right words.</p> <h2>What do you talk about?</h2> <p>One of the hard things about this process is looking for specific examples of things to talk about.</p> <p>You could talk about singular bits of code. But these are so context-dependent, that going too granular or atomic misses the bigger picture. Is this code consistent with the things around it? Is this code even necessary?</p> <p>You can talk about bits of architecture. But these aren't useful without understanding the business and infrastructural demands on the system. Did we really need a queue here, or is it overkill? What does "peak" demand look like?</p> <p>Or perhaps we can talk about the individual and team practices that hold this all together. But the daily practices of engineering can be Cargo Cult'd or mis-labelled. Are retros only used when things go wrong? Do stand-ups go on for <em>far</em> too long? Are code reviews the first time an engineer asks <em>why</em>?</p> <p>The breadth of these questions make it hard to assess knowledge, especially in a thirty-sixty minute phone call.</p> <h2>Observations, Judgements, Suggestions</h2> <p>On one level, you are trying to learn about the above: the more objective truths and observations. For example, the team rely heavily on code-reviews, they have a manual testing team, and monthly releases.</p> <p>On another, you're also trying to see if the candidate is making any value judgements. Is the code they and their team write different from another team's, and is that a problem? Is the CI/CD pipeline successfully shared and always being improved? Are the agile practices that scaffold the day/week/season of their work too strict?</p> <p>And then you want to ask <em>what would you do differently?</em></p> <p>What's interesting is that these three layers (observations, value judgements, suggestions) don't always depend on each other. Some candidates narrow the scope of what they're looking at, and locally optimise. These candidates can dig deep into a problem, like building out a whole new authentication flow for the app, and emerge with a very robust solution.</p> <p>Other candidates might be more concerned with how work is defined, described, and prioritised - either as part of the engineering work, or before it reaches them. These candidates can empower the whole engineering team to deliver the most valuable features first.</p> <p>You can imagine how these different kinds of candidates would make different suggestions. A narrow and technically focused candidate might suggest that clearer infrastructure-as-code practices could make things better. A more product-flavoured engineer might talk about roadmaps, ownership of tickets, and acceptance criteria.</p> <p>These things all have value. So you need to understand what kind of value is best for you and your team.</p> <h2>Letting the candidate direct the talk</h2> <p>There's a thousand flavours of software engineer, and I think you have to accept this, and not go into an interview with too much opinion what what you are/not looking for.</p> <p>And you have to accept that these different flavours have different skills. You're looking to see what makes <em>this</em> engineer the most effective they can be.</p> <p>But you still need to learn if they <em>actually</em> do what they say. I found that if you're not careful, too many engineers have a fantastic introductory phone-call where you're really impressed by all their words. But then you get to technical interview, and you don't see any evidence for... anything they said they could do.</p> <p>So I found the most insightful (for me, the interviewer) questions I can ask are:</p> <ol> <li><strong>Can you give me an example?</strong></li> <li><strong>What would <em>you</em> do instead?</strong></li> </ol> <h3>Can you give me an example?</h3> <p>I find this one useful if a candidate starts sounding a little generic. Maybe they're talking about how important "feedback" is. But feedback from who, to who, collected when, and integrated how?</p> <p>When was the last time a candidate <em>tried</em> to talk to a user?</p> <p>Perhaps a candidate is talking an awful lot about how good tests are. What kind of tests, where do they run in the development process, and what if they're flaky?</p> <h3>What would you do instead?</h3> <p>It's okay for candidates to be frustrated at their current position. They are in an interview an another job - people don't just leave jobs that are super fulfilling (most of the time). I think it's important to understand what things made the candidate feel powerless, and like leaving was their only option.</p> <p>But sometimes the floodgates open. The candidate is being incredibly critical of their current team or employer. Maybe they don't like the way the team is structured, or the work is defined, or bemoan the lack of tests or CI/CD.</p> <p>What I am looking for is a <em>generous interpretation</em> of problems. Is the candidate able to separate out their personal or theoretical gripes from the real world constraints that affect the (real world, not theoretical) cost of solving a problem, and the benefit of having solved it.</p> <p>The even better follow-up question is "have you made these suggestions to anyone in your team, or your manager?".</p> <p>If someone is only interested in calling-out, or in armchair architecting - then they might not be aware of some of the more pragmatic constraints.</p> <p>Un-generous or pessimistic attitudes can corrode or rot a team, I think, from the inside-out.</p>]]></description> </item> <item> <title><![CDATA[Test Driven Development is like meditation]]></title> <link>https://thomaswilson.xyz/blog/2023-09-27-test-driven-development-is-like-meditation</link> <guid>https://thomaswilson.xyz/blog/2023-09-27-test-driven-development-is-like-meditation</guid> <pubDate>Wed, 27 Sep 2023 14:16:27 GMT</pubDate> <description><![CDATA[<p>The goal isn't it be good at it.</p> <p>The goal is to do it.</p>]]></description> </item> <item> <title><![CDATA[Vibe Check #15]]></title> <link>https://thomaswilson.xyz/blog/2023-10-04-vibe-check-15</link> <guid>https://thomaswilson.xyz/blog/2023-10-04-vibe-check-15</guid> <pubDate>Wed, 04 Oct 2023 06:59:55 GMT</pubDate> <description><![CDATA[<p>September 2023 was definitely the end of summer. As I write this, the temperature remains balmy in the twenties, but it's dark at seven-thirty in the evening, and the days take turns towards the blusterous, or rain sprayed.</p> <p>All of the things that can only happen in summer - gatherings of families in gardens, eating outside in the evening, the crisp bubbles in a spritzer or bite of chilled wine, the indulgent laziness of long evenings. They're all gone. They'll be replaced by something cosier and warmer, and the spectacle beauty of autumn. But it is good to observe their passing.</p> <p>This was the first full month after I made the decision to quit my job (and found a new one). It was a difficult decision, I was in a very physical discomfort while I sat with the decision. When I made the decision I was 51/49. In the time since then, I have become more confident that this was the right thing for me (the human) and my future. The force keeping me, a person who has changed, close to a job, that has also changed felt pretty constant and unchanging. I don't know what to do with this feeling - I don't think it's holding me back anymore, but it was strong and hard to notice (at least at first).</p> <p>Creatively, this month has been about focusing on quality. As I get deeper into sewing, and closer towards the wedding, I have spent a lot of time this month obsessing over the finer details of trousers. The fit and drape, the anatomy, and finishing details on the inside and out. I have fully constructed two sets from a suiting cloth similar to what I will be wearing on my wedding day. One set of trousers ended up so mis-matched and asymmetrical they were thanked for what they taught me, but then discarded. The other set came out a lot better, but maybe 3cm too large around the waist - so they sit waiting to be altered to become wearable.</p> <p>My tailoring (both cutting and assembling) has come on a lot this past month. I taught myself how to draft a pattern, using the <a href="https://www.project-patterns.co.uk/metric-pattern-cutting-winifred-alrich-book-review/">Aldritch</a> set of mens patterns and <a href="https://seamly.io/">Seamly</a>, an open-source pattern drafting piece of software. I also drafted a French Fly (from scratch) and worked with side-seam pockets (not slashed pockets).</p> <p>The technical details are unimportant, what's been joyous has been this feeling that these clothes are <em>mine</em>. That each little tweak and detail, each tightening of a seam or width adjustment of a waistband, has made them unique and mine. It is a lovely feeling, to feel connected.</p> <p>Now that it's getting cooler, I have been watching films again, and in September I watched:</p> <ul> <li><a href="https://letterboxd.com/film/you-are-so-not-invited-to-my-bat-mitzvah/">You are so not invited to my Bat Mitzvah</a> - it's not serious, but it is a lot of fun. I'd recommend as a cosy movie.</li> <li><a href="https://letterboxd.com/film/elemental-2023/">Elemental</a> - unfortunately the most disappointing Pixar film I have seen in a long time. The messaging and metaphors feel confused. My favourite review on Letterboxd was simply "what're we doing here?"</li> <li><a href="https://letterboxd.com/film/polite-society/">Polite Society</a> - a fun film. It know what it is (which is a little bit ridiculous), and as someone who's never watched a Bollywood film, this film makes me want to watch some. If only for the campy tropes (I bloody love a campy trope)</li> </ul> <p>It's not been a bumper month for reading, but I did finish <a href="https://www.waterstones.com/book/the-other-black-girl/zakiya-dalila-harris/9781526630360">The Other Black Girl</a> by Zakiya Dalila Harris. I found it a little disappointing, but I admired its courage.</p> <p>I am hopeful that I will read more in October.</p>]]></description> </item> <item> <title><![CDATA[It's still easier to just do it on paper]]></title> <link>https://thomaswilson.xyz/blog/2023-10-19-paper</link> <guid>https://thomaswilson.xyz/blog/2023-10-19-paper</guid> <pubDate>Thu, 19 Oct 2023 07:11:07 GMT</pubDate> <description><![CDATA[<p>About three years ago (several months into a novel coronavirus pandemic) I decided I wanted to learn to sew, and about a year ago I started to get pretty serious about sewing my own wardrobe.</p> <p>To do this, I have had to really engage with pattern drafting. That's the act of specifying the 2D shapes that you cut out of fabric (which might be the garment cloth, a lining, interfacing, etc.), and which you then assemble to make the garment.</p> <p>It <em>feels</em> like this shouldn't be such a hard problem. Yes "all bodies are different" but really those differences aren't very big are they? I've the typical human body shape (a seemingly proportional torso, four limbs, no notable physical absences or irregularities) - so drafting a pattern for me should be pretty straight forward.</p> <p>You can see where I am going with this. Believing that was a stupid thing to believe. If a garment doesn't fit right, it's probably because there's either too much or too little cloth somewhere. But that could be anywhere on a body or garment.</p> <p>For example, I have particularly chunky thighs for my size (hopefully from cycling). But on a trouser pattern, the thighs can be a liminal no-mans-land between the seat (butt) measurement and the ankles. On the patterns I was drafting (which I have taken wholly from a published and respected author) there is no <em>thigh</em> point.</p> <p>It therefore wouldn't be possible to just "widen at the thigh point". It would be a case of adding some width, probably at a point between two pre-existing lines. Which would add/subtract cloth from the whole garment, and would need to be reflected symmetrically on the left-right axis, as well as the front-back. It would also add/remove cloth from the garment which could cause pulling or sagging.</p> <p>It's not <em>just</em> adding another point.</p> <p>Sure, I might deviate from a typical or normal body in only a handful of ways - but there's maybe several hundred <em>possible</em> deviances.</p> <p>The idea that one could reasonably account for these possible variances in a standard-issue pattern would get in the way of just getting something done.</p> <p>A few weeks back I started an online cohort course for making a suit jacket. It's run by <a href="https://www.tailoringacademy.co.uk/">The Tailoring Academy</a>, and I'm only four weeks in (of about thirty) so I am withholding judgement - but I <em>think</em> I'll be able to a make a jacket I am proud of for my wedding in July 2024.</p> <p>The first section of work as all about drafting by hand (on paper, not with CAD) the building blocks for the pattern: a front, side, back, and upper/lower sleeve pieces. These are all drafted semi-separately but all need to fit together.</p> <p>The problem: what if the pieces won't fit together? E.g. what if there is too much cloth at the top of the sleeve to fit into the arm hole (scye) comfortably?</p> <p>The solution: just cut them out, measure some things, and compare them to each other. If you need to re-draw some lines, then re-draw them.</p> <p>The alternative of adjusting the drafting method to completely remove this need to check and compare the pieces <em>might</em> be possible, but it would probably be a lot more effort (for pattern-maker, and also for anybody drafting the pattern).</p> <p>Pattern making and sewing has taught me that sometimes, it is just easier to do it on paper. It might feel inefficient, and sure it might hypothetically be solvable - but the problem at hand is making a really nice suit jacket.</p> <p>The solution is hundreds of hours further down the rabbit hole of geometry and fashion design, or forty minutes of cutting paper and measuring with a ruler.</p> <p>Just use the paper, dude.</p>]]></description> </item> <item> <title><![CDATA[Vibe Check #16]]></title> <link>https://thomaswilson.xyz/blog/2023-10-29-vibe-check-16</link> <guid>https://thomaswilson.xyz/blog/2023-10-29-vibe-check-16</guid> <pubDate>Sun, 29 Oct 2023 10:46:34 GMT</pubDate> <description><![CDATA[<p>The past few Vibe Checks happened between one-to-ten days after the month ended. Today it happens a few days <em>preceding</em>. The preparedness.</p> <p>October 2023 has been a delightful month. We've had our first few proper cold-snaps (the heating isn't yet on a schedule, though); the astonishing bright oranges and deep reds of autumn have appeared; getting cosy on the sofa with a book or a film has made a return; the wool of my garments is getting thicker.</p> <p>This is also my last month at my current job (Head of Software Engineering at Oxwash). I have known I am leaving for the last three months, and it has got notably harder to be invested in the long-term and professional future of the company. I have tried my hardest to fight it, but it's felt inevitable - especially in the last week, to put less conviction behind my beliefs and stubbornness in my attitudes. It's a reminder to remain empathetic to all the outgoing employees I have worked with before, who you see slowly retreat from the performance in a job.</p> <p>I love the seasons, yo - I could go on about how Autumn feels like the beginning of a year. Spiritually this is the time I emerge from the short-sighted hedonistic fun of summer, of drinking wine with lunch and/or dinner, and of travelling around. How it's now about being sensible, about asking questions about who I want to be in six months when we begin to emerge from the cocoon of indoors time. About how we only notice the full-bodied presence of life and summer when it starts to die back in dramatic colour. <em>Harsh winds rush the darling buds of May</em> and all that.</p> <p>Instead I think I just want to tell you about some of the things I watched and read this month:</p> <p>Some of the films I have watched this month are:</p> <ul> <li><a href="https://letterboxd.com/film/about-time/">About Time</a> - a pretty unique, charming, British Rom-Com that I have seen way back in my past but thoroughly enjoyed a rewatch in the cold-outside-warm-inside combination.</li> <li><a href="https://letterboxd.com/film/the-babysitter-2017/">The Babysitter</a> - a horror-comedy with a bit more miss-than hit on the timing (it felt like a 45min film dragged out with lingering shots and loose timing). But it's 👻 Spooky Season so it's been in-fitting. I am someone who doesn't like horror films, and I am living with someone who doesn't like horror films. This is about as close as we're getting in this household.</li> </ul> <p>It's also been a pretty book-ish month, as I finished off a few lingering books from my <em>currently reading</em> shelf:</p> <ul> <li><a href="https://www.jamessacorey.com/books/babylons-ashes/">Babylon's Ashes</a> by James S. A. Corey. This is the sixth book in The Expanse series by the author (who is actually two authors, co-writing). I thoroughly enjoyed this book, and this series - and as it was Published in 2016, I also think you can see ripples of concern about misinformation and social media, and celebrity-as-identity slipping in. What felt like a charming techno-utopian series feels like it's becoming greyer and murkier. It's a good evolution.</li> <li><a href="https://www.penguin.co.uk/books/444582/lessons-in-chemistry-by-garmus-bonnie/9781804990926">Lessons in Chemistry</a> by Bonnie Grams. I was rec'd this by a couple of people over summer, and I didn't get around to it. I am <em>so</em> glad to have read this book which is a <em>debut novel from the author</em>. Goodness gracious, the voice and tone, the sharpness and love for people. This is a book worth reading - it's not going to shift your world view but it's refreshing. At times it feels like the good parts of Pratchett (which I say as someone who hasn't quite <em>got</em> Pratchett yet).</li> <li><a href="https://www.hachette.co.uk/titles/robert-galbraith/the-running-grave/9781408730966/">The Running Grave</a> by Robert Galbraith (who is JK Rowling). Ah, the age of "can we separate artist from art?" Conversation? The thing about Rowling is that I just think she's a vector for dehumanising and delegitimising trans people. But, on the other hand, her Cormoran Strike novels are compatible with what I like: a great central mystery and excellent characters and relationships. This book carried on that tradition, and I am genuinely glad that I read it. I carried it with a donation to Stonewall, to double the cost of the book - so that Rowling benefited less than the people fighting against her inequity.</li> <li><a href="https://www.penguinrandomhouse.com/books/690138/quietly-hostile-by-samantha-irby/">Quietly Hostile</a> by Samantha Irby. Man, this woman writes essays, yo. She writes "laugh-out-loud-but-quietly to my book as I read next to my sleeping partner" essays. I can't big-quotes "relate" to what she's writing about - she grew up very differently to me, and sees the world very differently. But this one essay she wrote about having an anaphylactic shock and almost dying at the hospital was this third-person, profound experience that gives you an insight into her worldview as she faces genuinely-almost-death. I love everything this woman has ever written, and this book sits proudly dog-eared on my shelf for when I next need a cosy read.</li> </ul>]]></description> </item> <item> <title><![CDATA[Advice for CV writing]]></title> <link>https://thomaswilson.xyz/blog/2023-11-12-advice-for-cv-writing</link> <guid>https://thomaswilson.xyz/blog/2023-11-12-advice-for-cv-writing</guid> <pubDate>Sun, 12 Nov 2023 11:06:42 GMT</pubDate> <description><![CDATA[<p>In the past couple of months I have spent a lot of time looking at CVs. I found a new job, hired a replacement for my old job, and helped several friends and colleagues find new jobs.</p> <p>As an aside: the market for software engineers is correcting from over-demand and under-supply, into a more discerning or critical place. I think this is a bad thing for the individuals, but a good thing for the population. I'm not sure if it's a good thing for the long term or not.</p> <p>Anyway, here are some things I found myself thinking a lot while writing, revising, and reviewing CVs for software engineering professionals. I was working from junior to senior, and from Individual Contributor (IC) to Product Owner or Manager roles.</p> <ol> <li>If I see any numbers for anything other than dates, durations, or version numbers <em>i will scream</em>. Name-dropping Angular 2+ or an 95% test coverage: OKAY. Telling me you have 3/5 git skills, or your python is rank 1 of 5 of your technical skills is akin to telling me you're a Virgo. This is a made up scale that you're placing yourself on, stop it.</li> <li>Two pages, max. I know, I like to write too.</li> <li>Pick a font that isn't a default, make sure it's well-spaced and readable (see also point 2).</li> <li>Your personal statement should have something opinionated or controversial in it. Pleasing everyone sounds very generic. Everyone is a "self-motivated problem solver who loves working in teams". It's boring. Tell me that you love brining in Infrastructure as Code, or replacing Low/No Code tools with actual code, or that you love building semantically correct HTML. Yes, this will put some people off, but you don't want to work at <em>any</em> company, you want to work somewhere that vales you.</li> <li>Go chronologically and group similar things together. Put your academic qualifications first if they're relevant or recent, but don't mix jobs, volunteering, and qualifications. It looks like padding.</li> <li>I like seeing genuine hobbies or interests. I think it's controversial, but they're a good small talk starter. Even if they're generic or boring (yes, we all like good food and video games, we're all well-fed nerds). Make them small-enough to be ignorable. Avoid virtue signalling.</li> <li>Sell the value you delivered, to customers or the team.</li> <li>Telling me that you followed company process is like an actor boasting they learned all their lines: it's a baseline expectation. A bad performance can't be saved with "well at least they memorised their lines".</li> <li>Claims that can be evidenced are 10x more interesting. You increased test coverage? Tell me you went from 50% to 70% in six months. You converted a monolith into a distributed system? Tell me that P90 response times went from 800ms to 50ms on the slowest points. You reduced deployment times in the team? Tell me some pipeline times.</li> <li>Check for spelling mistakes, then double-check.</li> <li>Read all of the document out loud.</li> <li>Another spicy take: if you're primarily a web developer, it's probably good to have your own personal website. A website can be an index.html file. Actually, more websites should be index.html files.</li> <li>Things that happened long ago, or things that are less relevant deserve less space. Sometimes it feels like people are boasting about being a prefect when they were fifteen.</li> </ol>]]></description> </item> <item> <title><![CDATA[Why not mock in your automated tests?]]></title> <link>https://thomaswilson.xyz/blog/2023-12-01-why-not-mock</link> <guid>https://thomaswilson.xyz/blog/2023-12-01-why-not-mock</guid> <pubDate>Fri, 01 Dec 2023 07:48:55 GMT</pubDate> <description><![CDATA[<p>Mocking isn’t inherently a bad thing.</p> <p>They can simulate expensive (time, computation, money) external dependencies like database or third-party services. Though these integrations should have <em>some</em> level of integration test, this shouldn’t be a dependency for unit-level, or sibling/dependent software.</p> <p>However, overly liberal use can lead to a brittle test suite that poorly reflects the actual behaviour of a system. This is to say: the tests are not simulating what will happen in a production environment, and therefore do not give us any confidence in the behaviour or stability of our code (bad).</p> <p>They assume certain inputs and outputs, which may not align with the evolving nature of external systems or dependencies. Mocks are easy to mis-use because:</p> <ul> <li>Mocks which are too broad (e.g. “whenever someone makes a <code>FIND</code> call in SQL, return this result) wouldn’t catch a breaking change in the properties we’re actually <code>FIND</code>ing),</li> <li>Mock which are too specific (e.g. “whenever someone calls <code>getPerson</code> with the arguments <code>['the-id', true]</code> - you should return this record) tie the mock very closely to the implementation details of how we e.g. get a person.</li> </ul> <p>Without careful maintenance (imo, low-efficient effort), set-ups for mocks end up as <a href="http://www.catb.org/jargon/html/R/rain-dance.html">Rain Dances</a> - a long-step of actions occur, some of which overwrite each other, just to get the test to green. Doing this rain dance takes time, and offers no value in terms of the reliability of the software built.</p> <p>Even worse than wasting time: the goal is sometimes to just get the tests to pass, at the expense of getting the to reliably fail. That is to say: changing the implementation in a way which <em>should</em> cause it to fail, does not. This is the first step of the RED-GREEN-REFACTOR cycle.</p> <p>This situation impedes the agile evolution of the software, as developers may become hesitant to improve or modify code due to the overhead of updating numerous dependent mocks. As such, what initially seems like a tool for increasing development speed can, paradoxically, slow down long-term progress.</p>]]></description> </item> <item> <title><![CDATA[Vibe Check #17]]></title> <link>https://thomaswilson.xyz/blog/2023-12-17-vibe-check-17</link> <guid>https://thomaswilson.xyz/blog/2023-12-17-vibe-check-17</guid> <pubDate>Sun, 17 Dec 2023 18:57:55 GMT</pubDate> <description><![CDATA[<p>December 2023's Vibe Check was started on gloomy December morning, and finished a fortnight later on cosy December night. Context changes things. Winds and rain (both freezing) stopped what <em>was</em> a mild winter. "Winter's not too bad" I thought, like someone who's never lived through a winter. We're into the worst six weeks of the year - three weeks from the solar solstice. It's dark by four in the afternoon, and that's still got to get earlier for a while.</p> <p>Anyway, how was November? I had three <em>wonderful</em> weeks of unemployment. I had planned to spend the time breaking the back (pun intended?) of my wedding suit jacket. But I spent my time in much more worthy pursuits: taking cycle rides in the bright November sun, admiring the world around me as autumn shifts the hue slider into 'ultra-vibrant', eating well, and seeing friends and family. Then I crammed a lot of suit making into four days at the end.</p> <p>The suit jacket is going well though, thanks for asking. I am part of an online cohort course with the <a href="https://www.tailoringacademy.co.uk/">Tailoring Academy</a>. Until this course I was wholly a self-taught sewist. Being able to self-teach is one of the few fulfilled promises of the internet. If I wanted to make women's garments, not bespoke menswear, I think there would be a lot more material for me to self-teach with. So this course has been a great journey, giving a chance to hear from trained and experienced professionals. I have my moments, the work goes slow at times, but I couldn't do work of this type or this quality by myself. I feel really grateful for that. Not that I don't have panicky moments.</p> <p>I definitely have noticed that I am not sewing for "fun". I am sewing a Serious Businessâ„¢ï¸ garment with a strict deadline. And I'm also choosing not to share photos or details with most people. So I'm doing a lot of work "just" for me.</p> <p>Professionally, I started a new job this month - I am now a senior software engineer at <a href="https://www.laka.co.uk">Laka</a>, who run bicycle insurance with a collective pricing model. I am in my third week, so still very actively learning about the landscape: the people, processes, problems, business, customers, and all the good stuff.</p> <p>I've not started a new job in three years, and I feel a little out of practice. The shift from Head-Of into Senior has been a gear shift. Not a good thing or a bad thing, just a transition. I <em>wanted</em> some change.</p> <p>Perhaps the thing I have enjoyed most about the cold snap is my return to video games. I've cracked out the Steam Deck, which is now functionally a handheld Balders Gate III machine. The day after I wrote the first draft for this blog post, Balders Gate won the Game Awards "Games of the Year" award. Friends, get it. It's a good game. It's "go to bed at midnight" and "think about it when you're not playing it" good.</p> <p>Anyway: Some films I have watched this month:</p> <ul> <li><a href="https://letterboxd.com/film/quantum-of-solace/">Quantum of Solace</a>: I want to watch James Bond on the sofa and eat unsophisticated food, and have a drink. This film met the brief. Honestly very good, I see why the reviews were positive.</li> <li><a href="https://letterboxd.com/film/when-harry-met-sally/">When Harry Met Sally</a>: It's a cult classic and I think I was a bit ashamed that I hadn't seen it before (I <em>love</em> rom coms). Taken in context, it's a very good film. It's cosy Christmas fare. Another sofa-supper-gin combo winner.</li> <li><a href="https://letterboxd.com/film/shiva-baby-2020/">Shiva Baby</a>: A bit of whiplash from cosy Christmas fare. This film captures anxiety in a way that made me <em>so</em> uncomfortable as a viewer, which is a good thing (?). It's got a fitting soundtrack of violins that made me curl up into myself whenever it started. It's a good film but not a good time.</li> <li><a href="https://letterboxd.com/film/nimona-2023/">Nimona</a>: I think dismissed this as a children's film when I saw it on Netflix. I was wrong. You should watch this movie. It's a little on the childish side, but it's flirty with a lot of queer and gender issues without being a film "about" queer and gender issues. After some light reading, the film itself almost didn't get made, and I am just so grateful that it did. Funny and heartwarming, queer, and not patronising. Checks across the board. There's a <a href="https://letterboxd.com/journal/nimona-interview-nick-bruno-troy-quane-nd-stevenson/">really great piece on Letterboxd from some of the creators here</a>.</li> <li><a href="https://letterboxd.com/film/quiz-lady/">Quiz Lady</a>: I enjoyed this film. It knew what it was, it was tight, and it had some very funny moments. Both the leads playing against type, and just good fun.</li> </ul>]]></description> </item> <item> <title><![CDATA[2023 - Tools for Making Software / Default Apps]]></title> <link>https://thomaswilson.xyz/blog/2023-12-22-2023-tools-for-making-software-default-apps</link> <guid>https://thomaswilson.xyz/blog/2023-12-22-2023-tools-for-making-software-default-apps</guid> <pubDate>Fri, 22 Dec 2023 11:31:32 GMT</pubDate> <description><![CDATA[<p>Since at least 2019 I have done <a href="https://www.themesystem.com/">Yearly Themes</a>, which I heard of from the fine folks at Cortex Brand.</p> <p>2023 was the <em>Year of Tools</em>, where I wanted to focus on the tools I use to do things (work things, fun things, any things).</p> <p>I spend a lot of time building software: mostly with other people at companies, and sometimes for myself. I've been doing this for about a decade, and I had found myself into a bit of a rut with the tools.</p> <p>I made good efforts this year to find the right tools for the job of building, testing, and using software. It was a good challenge, and made me realise just how</p> <p>About a month or so ago the <em>Default Apps</em> blog post idea emerged (I saw it from <a href="https://chriscoyier.net/2023/11/25/default-apps-2023/">Chris Coyier</a>, who got it from <a href="https://mattcool.tech/posts/default-apps-2023/">Matt C.</a>, who credits <a href="https://tracydurnell.com/">Tracy D.</a>'s meeting in the Homebrew Website Club)</p> <h2>Desktop Apps</h2> <ul> <li>Warp (<a href="https://www.warp.dev/">warp.dev</a>) is a terminal. It does a few things really well: visually it's very pleasing; a non-historic text editing experience; the idea of 'blocks' which capture the output from a single command (and make them easy to copy/paste, and navigate between); and the built in AI chat-style interface for asking questions like "how can i do X".</li> <li>JetBrains IDEs (<a href="https://www.jetbrains.com/">jetbrains.com</a>) are a suite of modern Integrated Developer Environments (IDEs). I spend about 80% of my code-time in these editors (VSCode and vim take the rest), and they're just great tools. Two main reasons: i) the refactoring tools are <em>incredible</em> - for renaming, moving, extracting code. ii) the integrated testing experience (running single tests and whole suites inline). Doing that in the IDE reduces both feedback time, and the effort it takes to get to problematic code. I know you can do all these things with $YOUR_FAVOURITE_EDITOR, I know the JetBrains isn't free.</li> <li>Tuple (<a href="https://tuple.app/">tuple.app</a>) is simply the best pair programming tool and experience I have ever used. Love it.</li> </ul> <h2>AI</h2> <p>2023 was the year of generative AI. We (humanity) are still finding what these tools are good for (summarising and re-wording) and useless at (creating new things). But we <em>are</em> using them.</p> <p>It's not as controversial as it was, but I use AI every day that I am writing code.</p> <p>I find these tools make two things <em>much</em> better: i) writing very generic boilerplate code, and ii) explaining previously-written code, and suggesting alternatives. I use them every day, and they help me understand.</p> <ul> <li>Copilot (<a href="https://github.com/features/copilot">github.com</a>) - Code suggestions (and recently chat-like interfaces) right in your VSCode and Jetbrains editors.</li> <li>ChatGPT (<a href="https://chat.openai.com/auth/login">openai.com</a>) - Y'all know what ChatGPT is by now. A chat-style interface for a Large Language Model.</li> </ul> <h2>Command Line Tools</h2> <ul> <li>jq (<a href="https://github.com/jqlang/jq">github.com</a>): parse, filter, format JSON from the command line. For example - I use this to format results from GitHub's CLI to get information about PRs and contributions etc.</li> <li>the silver searcher (<a href="https://github.com/ggreer/the_silver_searcher">github.com</a>) is an ack-like tool for finding text. It sounds basic to say "use this to find text in files". I use it for finding TODOs in certain parts of code, or finding specific function/variable names across large parts of a codebase (for namespace collisions or similar patterns).</li> </ul>]]></description> </item> <item> <title><![CDATA[Vibe Check 2023]]></title> <link>https://thomaswilson.xyz/blog/2024-01-02-vibe-check-2023</link> <guid>https://thomaswilson.xyz/blog/2024-01-02-vibe-check-2023</guid> <pubDate>Tue, 02 Jan 2024 22:35:38 GMT</pubDate> <description><![CDATA[<p>The vibes were good, mostly. Things got a bit dicey for a moment, especially in the first half of the year.</p> <p>I left a job that I was good at, largely enjoyed, and where I really respected the people. I've been more engaged in the day-to-day of making and moulding software.</p> <p>I doubled down on making clothes that I can wear personally and professionally. I think I spent more time and attention taking good photos this year than I have probably since 2020. I think photos and garments are the things I have made this year that I have the most non-professional pride in.</p> <p>I bought at least several thousand gizmos and widgets for pattern construction or garment sewing. Even worse, I use them regularly enough to mandate keeping them. I have a special hole punch for button holes on cloth and another special hole punch for cutting little notches in paper.</p> <p>I did more swimming and less cycling in 2023 than 2022 (I think). I have both written and read less, personally and professionally.</p> <p>I've become quite good at wedding planning. Maybe the best I will ever be at wedding planning. I don't want to peak too soon.</p> <p>I have had anxiety dreams about being il-prepared, or il-clothed, for the wedding. I don't think I have ever had anxiety dreams before. I am thirty-one years old, I have cycled solo across another country during storms, performed on stage without professional training, and I hold a doctorate. Nothing has made me as nervous as my wedding is making me.</p> <p>I left the country for the first time since 2019, and realised that 2023 Wilson travels and feels differently than he did previously. I had colourful cocktails and chilled wine on boat and on a town square, under the summer sun... should I convince myself it was unbearable.</p> <p>I connected with some parts of my life that I'm not happy to talk about publicly at the moment. I wouldn't mention them, but they brought me some real joy.</p> <p>I played a greater number and variety of board games. I love board games, I love eating snacks and alternately crunching numbers and laughing with friends.</p> <p>I played Baldur's Gate III, a game I think about sometimes when I'm not playing it. The Steam Deck is a swell device for playing video games.</p> <p>I am grateful for 2023, which I had dubbed my <em>Year of Tools</em>, by the way. I am grateful for all the joyful moments, so many of which were around friends and family. It was a good year, but unfortunately one that 2024 will probably top.</p>]]></description> </item> <item> <title><![CDATA[Why code comments?]]></title> <link>https://thomaswilson.xyz/blog/2024-01-16-why-code-comments</link> <guid>https://thomaswilson.xyz/blog/2024-01-16-why-code-comments</guid> <pubDate>Tue, 16 Jan 2024 21:59:17 GMT</pubDate> <description><![CDATA[<p>Let's get into some real 2018 Wilson shit and talk about writing comments in code.</p> <p>Comments are bits of text that developers leave in code files that are explicitly marked as "please ignore" to the computer who reads the computer instructions.</p> <p>They are written messages from one developer to another.</p> <p>Why would you leave a comment? One of the notorious (if not impactful) texts of software engineering, <a href="https://www.oreilly.com/library/view/clean-code-a/9780136083238/">Clean Code</a>, holds that comments are a failure of code. It should be clear what code is doing, and comments are a crutch that prevent code from being Clean.</p> <p>I was recently reading <a href="https://www.amazon.co.uk/Philosophy-Software-Design-John-Ousterhout/dp/1732102201">A Philosophy of Software Design</a> (sorry about the Amazon link). The author has taught software engineering to undergraduates in American institutes, and noticed some recurring patterns in how people (novices, especially) create their own shortfalls. They put into words some of the heuristics I've shaped over the years.</p> <p>I wanted to write down some of those things, and give some examples of what I think about when I am writing comments.</p> <h2>Name and Date</h2> <p>Always name and date a comment.</p> <p>A comment written last month is different to something that's been around for a year. A comment left by your good colleague Wilson might read differently to something left by another engineer.</p> <p>As a bonus, if you feel like you don't want to attach your name to a comment (e.g. it might not be quite true, or might be a cop-out), then this is a good way yo make you encounter those feelings.</p> <p>As a bonus bonus point, I preface my initials with a <code>--</code>, to make a pretty easy <code>grep</code>-able string. Here's a nice one-liner: <code>ag -i '\-\-tjw' ./</code>. As of right now, I have committed 32 comments in 19 files since November 2023</p> <pre><code class="language-js">// It would be nice to use the Intl library here --TJW 2023-01-15 export const formatDate = (date) => externalLibrary.format(date, 'yyyy-mm-dd') </code></pre> <h2>Name the uncertainty</h2> <p>Label code that is likely to change soon. ("Soon" becomes easy to define when you name and date everything).</p> <p>Label code which contains known problems,</p> <p>Clearly label problematic patterns which should not worth copy-pasted. If we find ourselves in an unfamiliar part of the codebase, we might copy-paste something nearby to get going. I think copy-pasting without critically evaluating the quality of code (hard if you don't have context) is a serious pathway to how problems proliferate.</p> <pre><code class="language-js">export class User { // The User model shouldn't be coupled to encrpytionLibrary // if you find yourself here, please consider extracting this // to a separate package or module --TJW 2024-01-15 static encryptPassword(password: string): string { return encryptionLibrary.encrypt(password); } // We plan to replace this with a 'chosenName' field soon // --TJW 2005-10-12 get fullHumanName(): string { return [this.firstName, this.familyName].join(' '); } } </code></pre> <h2>Name the change or non-compliance</h2> <p>Similarly, if you're writing code which doesn't fit a norm or expected pattern, then call it out.</p> <p>This stops the copy-paste problem above, but largely serves to highlight variation of patterns in the codebase.</p> <p>It there is going to be variation (things will never be consistent everywhere) - it's good to have the context about <em>why</em> this decision was made.</p> <p>There's a meaningful difference between someone not knowing the best practice, and someone knowingly deviating from it.</p> <pre><code class="language-js">// We are injecting the currency here, but normally we would // take it from the Order. We're passing it in as an argument // because we might need to calculate tax differently based // on locale --TJW 2024-01-16 export const getDeliveryCost(order: Order, currency: Currency): number => { .. } </code></pre> <h2>Give the dates in human-form</h2> <p>If you're doing any kind of date and time maths (including conversion), write out what you have in human language.</p> <p>Tell me "this is 9am on a Monday in GMT in London" or "this is one second later".</p> <p>You're probably okay not to name and date these.</p> <pre><code class="language-js"> it('should handle time-zone conversion', () => { // 09:00 GMT the day before GMT-BST switch over const beforeSwitch = new Date('2024-03-30T09:00+01:00') // 09:00 BST the day of the GMT-BST switch const onSwitch = new Date('2024-03-31T09:00Z) // ... }) </code></pre>]]></description> </item> <item> <title><![CDATA[Vibe Check #17]]></title> <link>https://thomaswilson.xyz/blog/2024-02-14-vibe-check-17</link> <guid>https://thomaswilson.xyz/blog/2024-02-14-vibe-check-17</guid> <pubDate>Wed, 14 Feb 2024 15:28:16 GMT</pubDate> <description><![CDATA[<p>January 2024 was a lovely month, really. We ended up celebrating a few delayed Christmases, so the festive period itself didn't tear through my stamina. It also meant that I didn't really feel The Blues, because every other week I was going to a family household and getting wined and dined.</p> <p>It also sunk that <em>I am getting married this year</em> - less than two hundred days. It feels exactly as you'd think: a bit scary but mostly exciting. There's a lot of things to plan for a wedding in 2024, but just start at the centre and work out.</p> <p>Despite being the dead of winter, I spent more hours on my bike (with Strava running, at least) than I did in any month of 2023. I <em>love</em> cycling, it's legitimately so much fun and I don't know why I spent the last seven months of last year doing basically minimal hours on the bike outside. Oxfordshire's been blessed with dry, sometimes even sunny, days. It's turned windy this last week, and I <em>hate</em> cycling in the wind.</p> <p>I've also got back into my winter reading rhythm, mostly with physical books. This month I finished:</p> <ul> <li><a href="https://www.tjklunebooks.com/the-house-in-the-cerulean-sea">The House in the Cerulean Sea</a>, by TJ Klune. A cute queer romance story, very drinkable, won't read again but I'm glad I did.</li> <li><a href="https://www.hive.co.uk/Product/Juno-Dawson/The-Shadow-Cabinet/27455797">The Shadow Cabinet</a>, by Juno Dawson. The sequel to my favourite book of 2023, perhaps too drinkable. I'm excited to see where the series goes, and for the historic prequel novel slated for later this year. Everybody who reads fantasy should read this series.</li> <li><a href="https://www.hive.co.uk/Product/Elizabeth-McKenzie/The-Dog-of-the-North/28770729">The Dog of the North</a>, by Elizabeth McKenzie. I'm not sure if the "slice of life" descriptor is new, or just new-to-me, but this book fits that. It takes place over only a couple of (unusually eventful) weeks in a woman's life in California. It was a nominee for the Women's Prize last year, and I think the subtler notes were lost on my burned-out tastebuds. I am glad I read it, but found myself thinking "okay" a lot. Like when someone tells your their dreams.</li> </ul> <p>Basically all of my creative energy has gone into the design and construction of my wedding suit. Both the waistcoat and trousers are now to be hand-finished (largely buttons buttonholes). I finished constructing a shirt but ultimately find myself unsatisfied with the cut, so I'm re-cutting another garment. I suspect I'll have a day shirt and an evening shirt. It'll be a long day so I reckon I'll be glad. Jacket/Coat progress has stalled behind these other garments, but I'd rather not split my focus.</p> <p>I can't recall if I've written about it before, but the emotional turmoil of not doing the "correct" lean/agile/kaizen thing here of a) one thing at a time, and b) the most uncertain things first, has caused me serious emotional distress.</p> <p>I am at least eighty percent sure it's the right choice for minimising my anxiety, which I think it caused because my brain equally weights the garments (making a shirt != making a jacket, at all really) and underweights cutting, construction, and hand finishing (in terms of hours, hand-finishing is a lot). If I was a professional garment maker I'd want to know what the actual right thing to do here is.</p> <p>I'm not, I'm just making the clothes I'll wear on the most photographed day of my life. Something I need to do once, and non-reproducibly.</p> <p>Lastly, I toyed around with film photography this month, using the old Nikon (FG-20) that my parents had in their attic, and which took all the photos of baby Wilson. Some problems with the shutter (probably caused by non-use) rendered two rolls of film underwhelming and with exposure banding (the bottom half of the photos is basically black, thanks to the shutter coming from bottom-top of the frame).</p> <p>I think I want to invest in a moderate film camera soon, I love the glimpses of photos that came through in development, truly. I love the emotional attachment and idea of the camera, but I think the reality is a little bit overwhelming.</p>]]></description> </item> <item> <title><![CDATA[Using Vim again, or: how the tool shapes the work.]]></title> <link>https://thomaswilson.xyz/blog/2024-02-25-using-vim-again-or-how-the-tool-shapes-the-work</link> <guid>https://thomaswilson.xyz/blog/2024-02-25-using-vim-again-or-how-the-tool-shapes-the-work</guid> <pubDate>Sun, 25 Feb 2024 11:54:47 GMT</pubDate> <description><![CDATA[<p>I don't know, man, every ninth moon cycle something comes over me and asks "remember how you learned software engineering using vim and rails and that was sort of it?"</p> <p>That time has come, all aboard Steam Train Vim.</p> <p>Specifically, I found <a href="https://www.lazyvim.org/">Lazy Vim</a>, a neovim setup, which I am configuring with <a href="https://www.lua.org/">lua</a>, a scripting language I've never used before.</p> <p>I am already learning stuff !</p> <p>It's <em>wild</em> how much I learned about making software without Intellisense (or language servers), integrated test runners, refactoring tools, copilot autocomplete.</p> <p>I wrote a lot of my doctorate in plaintext files in vim.</p> <p>I did a lot of my foundational thinking and building work as an engineer here, in vim.</p> <p>But I feel weird that the layer between "me" and the thing that runs my software is quite chunky.</p> <p>And the software I interracted with became more and more like the big and chunky codebases that these tools excel at. I became a professional software engineer, I guess.</p> <p>Alongside, maybe because of, this - the act of writing software has become something chunky. It has become a proper-noun Activity.</p> <p>I <em>love</em> the JetBrains suite of tools. I do not want to stop using them. They are so good.</p> <p>But the spirit of rebellion, of <em>actually</em> hacking away on a computer became something I don't really do any more.</p> <p>I am familiar enough with the commandline that it's not magic. I hand-wavy know what's happening. But I think there's a feedback loop here: I only see things done with bash, sed, awk (and friends) when either i) it is a trivial example, or ii) a "hacky but it works" solution that no one's touched since 2012.</p> <p>The promise of Vim from every Vim-huckster was that you could <em>edit code at the speed of thought</em>. It's an appealing idea, but most of the time I am not limited by typing speed, I'm limited by thinking speed (and quality).</p> <p>Problems are just hard sometimes. And <a href="https://quoteinvestigator.com/2017/02/09/efficient/">for over a century now</a>, we've known there's no point in optimising for:</p> <blockquote> <p>systemic ways of doing things which need not be done at all.</p> </blockquote> <p>Anyway, maybe I'll do something with it (cool), or maybe in seven days I realise present/past Wilson is/was being too idealistic and not pragmatic enough.</p> <p>Whatever, I'm writing this in Vim and I'm having a great time.</p>]]></description> </item> <item> <title><![CDATA[Duolingo is an engagement platform]]></title> <link>https://thomaswilson.xyz/blog/2024-03-06-duolingo-is-an-engagement-platform</link> <guid>https://thomaswilson.xyz/blog/2024-03-06-duolingo-is-an-engagement-platform</guid> <pubDate>Wed, 06 Mar 2024 10:01:40 GMT</pubDate> <description><![CDATA[<p>I've had these thoughts in my head for a while, <a href="https://daverupert.com/2024/02/duolingo/">Dave Rupert published a piece</a> a few weeks ago. Which really had me in the first half, it's worth a read.</p> <hr> <p>I re-downloaded Duolingo in January (<em>quelle cliché</em>) and maybe three weeks later booted that owl right off of my phone.</p> <p>Since about 2012, Duolingo has been on my list of "companies I would actively love to work at", but at the risk of scuppering my future employment opportunities, I don't think that's true any more.</p> <p>I think learning is hard, and so is adult behaviour change. So creating a habit-forming product for adults to learn something (like another language) puts your product at a tough intersection. Faced with that, I think most people would try to:</p> <ul> <li>Find the smallest meaningful unit of interaction, and push it</li> <li>Reward consistent or repeated engagement</li> <li>Have a good immediate rewards mechanism: sounds/visual, in-game points or currencies</li> </ul> <p>I have (wholly unfounded) opinions on language learning, but I do have (much more founded) experience of learning in general.</p> <p>What Duolingo gets right is that applying newly-learned information frequently is very good for retention.</p> <p>What it gets wrong, I think, is it makes us equate learning or progress with app usage or engagement.</p> <p>This makes sense if you are Duolingo. You know I am learning Italian because I open your app and show you (for the ninth time this week) that <em>gonna rossa</em> is 'red skirt'.</p> <p>Now let's pretend that I am serious about improving my Italian. I might add a single other activity to my learning. I might take a 1-1 class online, might watch some YouTube videos, might read some newspapers - whatever.</p> <p>This kind of progress is unpredictable, and Duolingo responds not with freedom ("learn whatever you want in whatever order, I am a companion") but with complete constraint ("learn these things, in this order, I am the instructor").</p> <p>It wants consistent engagement, it rewards you checking-in, and it doing the things it tells you to do. It uses Dark Patterns (loss aversion, skinner boxes) to promote behaviours. In exchange, it never makes you feel foolish or mocked or out of your depth (which learning in more natural contexts definitely will).</p> <p>But I think <em>that's what learning a language is</em>.</p> <p>Using Duolingo annoyed me because those dark patterns worked, almost like they've been refined on millions+ of people.</p> <p>But it made me feel more like I had a <em>tamagotchi</em>, a little digital pet, that I had to keep happy and alive.</p> <p>The final moment came when a high pressured / timed word-matching game. English words on the left-hand side of the screen, Italian words on the right. This game was pushed at the end of the weakly <em>league</em> feature.</p> <p>The game itself is fun: match the pairs as quick as you can. There are different stages, each with 3 levels. As far as I can tell, you're not <em>meant</em> to get to the end, or at least it becomes exceptionally difficult.</p> <p>When time runs out (for me, somewhere around mid stage 2/5), a little pop-up comes up and tells me I can resume if only I paid several hundred of in-game gems.</p> <p>My little owl friend: you invited me here to play this game, you tell me it's a great way to earn XP to keep my place in a League (loss aversion).</p> <p>You are asking for another chunk of in-game currency to ease the pressure of rules for a game <em>you placed on me</em></p> <p>And I am paying you nearly £10/month (gladly, you offer a service).</p> <p>Nah.</p> <p>I don't think these are the actions of someone who cares about helping people learn something. I think these are the actions of someone who cares about impulse spending and user engagement.</p> <p>I think you think quite little of me and I don't think you're treating "help Wilson learn a language" as seriously as I am, and I feel sort of like I just keep on disappointing you.</p> <p>I don't know what a modern, considered education system looks like. I don't think it looks like the lecture-essay-exam structure we have at the moment. I don't think it looks like atomised, pressurised activities either.</p> <p>You know what I started around the same time, and have actively wanted to do: the daily chess.com challenges. The interaction model isn't that different: open app for 3-5 minutes to solve a problem. Close app.</p> <p>Thing is, I think chess.com know what they are, an app with a little chess game in. Yes, they have a Daily Problem and it tracks your streak, but if it gets broken it doesn't get sad at me - it just starts again.</p> <p>It doesn't give me a certain kind of problem, ramp up the pressure, then offer to release the pressure for a chunk of in-game currency.</p> <p>It's just a little chess game.</p> <p>Maybe this little problem will make you a better player or maybe it won't, but we're not actively making you think it will.</p>]]></description> </item> <item> <title><![CDATA[Vibe Check #18]]></title> <link>https://thomaswilson.xyz/blog/2024-03-10-vibe-check-18</link> <guid>https://thomaswilson.xyz/blog/2024-03-10-vibe-check-18</guid> <pubDate>Sun, 10 Mar 2024 12:12:04 GMT</pubDate> <description><![CDATA[<p>February 2024 was quite nice, to be honest. The weather ended up being less dry and more windy, so it became harder to get out on the bike. Which was a shame, after weeks of still, dry weather. Such is the nature of a false spring.</p> <p>It's got to to the time of the year: small pots of mud on the window sill, gently heated from underneath, condensation forming on the plastic dome, the morning, afternoon, and evening checks to see if anyone's come up yet. The <em>joy</em> of seeing something white, and half the size of a grain of rice, emerge.</p> <p>To see it turn green, and tiny leaves unfold.</p> <p>Spring is a nice time to feel lucky. Lucky to share my house with these plants, and a live-in gardener. Lucky to see the shoots come up and know (as much as one can) that I'll be around to see them flower. Lucky that the inescapable dark of winter happened long ago, and will return long in the future.</p> <p>Yet more of my life is viewed in relation to the wedding. Chasing guest RSVPs, making wedding rings (10/10 experience, would recommend), the suit. <em>The Suit</em>, there is so much suit to make. So many things to hand-stitch, to consider the finer details closely. How on earth we came to purchase these things for <em>hundreds</em> of Great British Pounds is beyond me. The seven year tailor's apprenticeship seems fitting (forgive the pun).</p> <p>I've spent more time taking photos. A brief dalliance with my parents' film camera yielded nothing but mechanical failures and issues. I'd love to spend the money and time to find someone to get it fixed, but not right now. I purchased an 85mm prime lens (second-hand from <a href="https://www.mpb.com/en-uk">MPP</a>). I've a lot of social engagements this year, and I'm hopeful I can capture some nice portraits and candid shots with it.</p> <p>I an struggling to make the time to read, but I am continuing through Wool by Hugh Howey, and enjoying it. A superb piece of dystopian sci-fi. Apple TV's limited series <em>Silo</em> brought it to my attention. I'm only a half way through the book, but it's interesting to see the drift. Similarly with <em>Lessons in Chemistry</em> - the adaptation to limited series made artistic and plot changes that were interesting. It's nice that they're essentially separate pieces.</p> <p>What of work, of software engineering? Yeah, it goes. I am still only months into a new company, I have seen the challenges and problems, and found where change is slow.</p> <p>I am still using neovim for test editing (I am using it <em>right now</em>). I'm writing plaintext and <em>some</em> code with it, but the features of JetBrain's IDEs are a) worn into me, and b) <em>incredibly</em> good for working in legacy and large codebases.</p> <p>I also gave into another pull I have felt for a while: I span up a new Ruby on Rails project. Just a little side project. Rails was the framework I wrote my first ever major piece of software with. I am amazed how productive yet uninformed I was, as a <em>solo engineer</em>. I've found myself thinking "this isn't what I should be spending my time doing" a lot recently.</p>]]></description> </item> <item> <title><![CDATA[Code Snippet: Count the number of files with an extention ]]></title> <link>https://thomaswilson.xyz/blog/2024-03-11-code-snippet-tree-grep</link> <guid>https://thomaswilson.xyz/blog/2024-03-11-code-snippet-tree-grep</guid> <pubDate>Mon, 11 Mar 2024 21:09:52 GMT</pubDate> <description><![CDATA[<p>I wanted to know how many files that ended in either <code>.test.ts</code> or <code>.test.js</code> in a directory, came up with this guy:</p> <pre><code class="language-sh">tree --noreport --gitignore -i | grep -c -E '\.test\.(js|ts)' </code></pre> <h2>Tree</h2> <p><a href="https://formulae.brew.sh/formula/tree">tree</a> is a tool for listing out the contents of a directory in a tree-style format.</p> <ul> <li><code>--noreport</code> Removes a summary line at the bottom ("10 directories, 35 files")</li> <li><code>--gitignore</code> Looks for a <code>.gitignore</code> file and excludes those directories, useful for those pesky <code>node_modules</code> directories</li> <li><code>-i</code> Removes the whitespace and indent (makes it better input for regex)</li> </ul> <h2>Grep</h2> <p>Grep is a tool for searching text against a regex.</p> <p>We pass in the input from tree into Regex, and only look for files that match a pattern</p> <ul> <li><code>-c</code> for "count", i.e. just tell me how many matches you found</li> <li><code>-E</code>for extended regex, it makes the <code>(js|ts)</code> fragment work</li> </ul>]]></description> </item> <item> <title><![CDATA[Website Redesign (March 2024)]]></title> <link>https://thomaswilson.xyz/blog/2024-03-17-website-redesign</link> <guid>https://thomaswilson.xyz/blog/2024-03-17-website-redesign</guid> <pubDate>Sun, 17 Mar 2024 22:14:26 GMT</pubDate> <description><![CDATA[<p>It's March 2024, I'm on a long weekend holiday in The Lake District and the Website Redesign Fever came over me.</p> <p>I think it looks good, or at least simpler.</p> <p>It reflects my continued radicalisation into Plain Text, informed (heavily) by <a href="https://www.marginalia.nu/">marginalia</a>.</p> <p>I also took this chance to bump from Svelte Kit 1 to 2. <a href="https://kit.svelte.dev/">Svelte Kit</a> it is a framework for building websites with the <a href="https://svelte.dev/">Svelte</a> framework, which remains my favourite flavour of frontend tool.</p> <p>It's got a Dark Mode now:</p> <p><img src="/assets/blog-images/2024-redesign/screenshot-1.png" alt="Home Screen in dark mode"></p> <p>As well as a light mode: <img src="/assets/blog-images/2024-redesign/screenshot-2.png" alt="A blog screen in light mode"></p>]]></description> </item> <item> <title><![CDATA[Make it easy to just try again]]></title> <link>https://thomaswilson.xyz/blog/2024-03-23-try-again</link> <guid>https://thomaswilson.xyz/blog/2024-03-23-try-again</guid> <pubDate>Sat, 23 Mar 2024 07:39:22 GMT</pubDate> <description><![CDATA[<p>Something I know about myself is that I learn best when I make lots of quick attempts at something. This works better for me than spending longer on each individual step. Like when I learned to make clothes: I had an <em>awful</em> lot of unwearable garments.</p> <p>I think it's fun that other people (including my partner) learn best by paying monumental attention each (sub-)step of their first attempt, wanting to get it perfect.</p> <p>You learn how you learn, in more ways than one.</p> <p>Something that John Ousterhout recommends in <a href="https://www.amazon.co.uk/Philosophy-Software-Design-John-Ousterhout/dp/1732102201">their books on software design</a> is designing something twice, because you probably won't get it right the first time, even if think you <em>definitely should get it right the first time</em>.</p> <p>This past week I've made lots of little tweaks to software. A few "oh, when you do X, could we make sure Y happens" or "oh, wouldn't it be nice if B was automatically calculated when you put in A?".</p> <p>I have found myself, more than ever, relying on the ability to completely undo all changes to file(s), and take another run at it.</p> <p>Sometimes it's because the footprint of a "simple" change spirals, other times it just "feels" wrong, other times it just breaks.</p> <p>If I was a clever man, maybe I'd be able to foresee which approaches are likely to be chaotic and messy. But, too often, something doesn't work the way you'd expect, or some of your own code isn't quite flexible enough yet (and now isn't the time to make it flex).</p> <p>Making it easy to hit the eject button, and feeling happy doing it, feels like a close second - and something that I think lets me ship higher quality software quicker.</p>]]></description> </item> <item> <title><![CDATA[When should tests fail ?]]></title> <link>https://thomaswilson.xyz/blog/2024-03-29-when-should-tests-fail</link> <guid>https://thomaswilson.xyz/blog/2024-03-29-when-should-tests-fail</guid> <pubDate>Fri, 29 Mar 2024 20:56:30 GMT</pubDate> <description><![CDATA[<p>This is a blog post about automated testing in software.</p> <p>One of the most useful thoughts I've had about testing <a href="/blog/2023-09-27-test-driven-development-is-like-meditation">is that</a> writing tests is like meditation:</p> <blockquote> <p>The goal isn't to be good at it. The goal is to do it.</p> </blockquote> <p>I had an interesting interaction at work the other day: when co-designing some software, somebody said something like "Oh, I did it that way because then the tests didn't fail".</p> <p>For me, tests should fail as often as necessary (but not more often). Changing some code to make it better (faster, slimmer, more legible, whatever) is great - and that's what this engineer was doing. Deciding to not/do something <em>only</em> because it will make tests fail doesn't feel right to me.</p> <p>It got me thinking: when <em>should</em> the tests fail ?</p> <p>There's obviously no right answer, but for me tests should fail because:</p> <ol> <li>You've changed the observable behaviour of some code, or</li> <li>You've changed the expectation of some tests (e.g. you're being more strict or specific in how you're testing your code).</li> </ol> <p>But also, I wanted to think about when tests offer the best bang/buck ratio. I arrived at wanting tests to fail most when:</p> <ol> <li>I am reproducing or isolating a bug, or</li> <li>When I am writing newer code, or code without much precedent.</li> </ol> <p>The first point feels pretty intuitive: if there's a problem somewhere, write code that reproduces the scenario. Then fix the root cause, then watch the test pass. Leave the test in the codebase and it'll never regress in the same way ever again. Unconditional success, 0% failure chance, unanimous praise from your whole team.</p> <p>But the second point, about writing newer code, or refreshing older code - that feels <em>especially</em> high value to me.</p> <h2>...it's like going to dinner with pedantic friends</h2> <p>I think if you're scared of tests failing, you're probably trying to minimise your interaction with them, in case you break something.</p> <p>I see the tests as a group of emotionally-resilient, but incredibly pedantic, friends who you have to take everywhere. They'll go out with you, but you <em>will</em> be getting the 11:27 train, and the bill <em>will</em> be split perfectly fairly.</p> <p>The thing is, you still sort of have to engage with them, even if you know they're going to be a stickler about splitting the £3.49 sweet potato fries. For whatever reason it's worth having these friends in your life, <em>despite</em>, these obvious trivial nuisances.</p> <p>But also imagine that you have to tell these friends <em>everything</em> that you're doing. You cannot lie to them. You have to tell them you were in the bathroom for ten minutes because you were scrolling Instagram, not because there was a family emergency.</p> <p>They wouldn't judge you for it, but you feel sort of gross as you scrolled alone instead of socialising.</p> <p>Tests force us to be honest and explicit, so the analogy doesn't quite stretch to every friendship you'll ever have.</p> <h2>...or getting a second chance</h2> <p>The other thing we gain when we engage with tests, is a bunch of do-overs or just-one-more tries at writing.</p> <p>One of the simple take-aways I got from John Ousterhout's <em>A Philosophy of Software Design</em> is:</p> <blockquote> <p>Rather than implementing the first idea that comes to mind, try a couple of alternative designs and pick the cleanest one.</p> </blockquote> <p>When you work in tests <em>first</em> you're getting a preview of what the "real world" will look like, without having to go to the real world.</p> <p>You might decide that the change you've implemented looks ugly, or that it just about breaks a threshold for doing "too much".</p> <p>Or maybe you make the change you wanted, and it slots in perfectly. A success signal for previously well-designed software.</p> <p>You might not need it if you're making small changes. But for more complex, choreographed code - I bet good money that your third or fourth will be a lot better than your first. <a href="/blog/2024-03-23-try-again">I actually wrote about this recently too.</a></p> <h2>The alternative</h2> <p>Also, the alternative is worse: imagine if the tests <em>never</em> failed.</p>]]></description> </item> <item> <title><![CDATA[Thoughts on generative AI]]></title> <link>https://thomaswilson.xyz/blog/2024-04-06-thoughts-on-generative-ai</link> <guid>https://thomaswilson.xyz/blog/2024-04-06-thoughts-on-generative-ai</guid> <pubDate>Sat, 06 Apr 2024 09:14:47 GMT</pubDate> <description><![CDATA[<p>I'm going to argue in this piece that using AI models to generate for-human text is good professionally, but not creatively.</p> <p>The most extreme interpretation of my opinion is that a liberal reliance on AI-generated text is bad for people at work and play.</p> <p>I'm going to talk mostly about generating prose which is longer than a couple of sentences. I'm not really going to talk about AI models that generate software or code, images, movies, etc.</p> <p>Lastly, I talk mostly about knowledge workers in the tech industry.</p> <h2>It's just autocomplete</h2> <p>People have dismissively called text generative AI "autocomplete". There's actually some truth to that, but it feels a little like calling a skateboard and a Land Rover four-wheeled vehicles. Technically true, sure.</p> <p>When an AI model generates prose it is:</p> <blockquote> <p>using its predictive powers to decide what the next word should be. When generating longer pieces of text, it predicts the next word in the context of all the words it has written so far; this function increases the coherence and continuity of its writing. (<a href="https://spectrum.ieee.org/what-is-generative-ai">source</a>)</p> </blockquote> <p>I have heard a number of people praise text generative AI models, like <a href="https://openai.com/gpt-4">ChatGPT</a> or <a href="https://www.anthropic.com/claude">Claude</a>, because the models allow them to produce <em>more</em> written content <em>quicker</em> within their professional/work context.</p> <p>I've heard people talk about how embedding generative AI into more aspects of professional life (like giving/receiving feedback, developing product requirements, giving status updates on work in progress) will be fantastic.</p> <p>My response ranges from very positive ("good, humans shouldn't spend their time doing that") to very negative ("you are describing a dystopia"). And I wanted to dig more into that.</p> <h2>The good: communicating between expertise and domains</h2> <p>Look, not all writing has to be creative.</p> <p>Some kinds of writing are better when they're predictable.</p> <p>For example, I use ChatGPT to write emails to customer support teams, for hotel and restaurant reservations, and for the hundred other 1-5 message interactions that accumulate over daily life.</p> <p>If I am doing a transaction with a company, but <em>talking</em> with someone who only represents that company (but also is very busy) - having boring, concise text with tall the information necessary, is great for everyone.</p> <p>I have a set pattern: greeting, problem, context, desired resolution, farewell.</p> <p>For example: I had to book a hotel for immediately after my wedding. We really wanted a room with specific features and dimensions that only ~50% of the rooms at a hotel met. So I said to chat GPT something like:</p> <pre><code class="language-txt">I am booking a hotel for my honeymoon at Hotel X for N nights between $START_DATE and $END_DATE, and we want a room which has both $FEATURE_ONE and $FEATURE_TWO. Their website says some (but presumably not all) rooms have both of these features. Please write a polite but informative email to their booking team to enquire about the availability of these rooms on these dates, mention it's our honeymoon, and politely request a possible discount </code></pre> <p>And you know what, reader? We got that hotel room, at a great price, with the room we wanted.</p> <hr> <p>Anyway, back to building software.</p> <p>Having a predictable format at the non/technical boundary is just as useful as being able to talk to a hotel.</p> <p>Non-technical folk need to know the status and progress of technical work, and consequences for "what's getting done, and when?". This is a reasonable expectation, and I have seen incomplete or inadequate answers cause frustrations or, worse, blank-filling ("even if there are problems, it sounds like the initial deadline is going to be met").</p> <p>Whereas technical folk need to communicate the various burps and gurgles of their current work to non-technical folk. There are endless reasons why work takes unexpectedly longer than planned. Communicating, or deciding to omit, each one in an appropriate and accurate way is hard work.</p> <p>In situations where you don't have to persuade the reader that your claim is both true and justified, where you are simply broadcasting without expecting a response, boring text is great.</p> <p>Use generative AI to:</p> <ul> <li>take a list of bullet points</li> <li>tell it about your audience (non-technical managers)</li> <li>tell it about your desired formats (300-500 words, no introduction or preamble, no more than three sentences per paragraph)</li> </ul> <p>Copy-paste your text into Notion, give it a proof-read, send a link to your team, go about your day.</p> <p>Hope that no one asks AI to summarise the summary into a list of bullet points.</p> <p>I think AI can help us give people what they actually want and justifiably need, with less human effort and attention.</p> <p>The machine of efficiency grinds on, and we're all happy.</p> <h2>A Magic: The Gathering warning story</h2> <p>I know I said I was mostly talking about text, but I want to talk about art for a second.</p> <p>In early 2024, there was <a href="https://arstechnica.com/ai/2024/01/magic-the-gathering-maker-admits-it-used-ai-generated-art-despite-standing-ban/">outrage at Wizards of the Coast</a>, the company who own Magic: The Gathering, a very popular trading-card game.</p> <p>The company released some promotional art for some special releases of some cards in an upcoming set. The marketing/promotional art they used for these cards (not the cards themselves), used generative AI.</p> <p>The impact of this situation was probably made greater by <em>Wizards</em> i) having a no AI art policy for their MTG cards, and ii) initially doubling-down on their "this was human human-created art" sentiment.</p> <p>I think the impact, and backlash, was so great because people were primed with strong pro human-made art sentiment. People just got <em>especially</em> angry because they were lied to about using generative AI.</p> <p>One of the strongest anti-AI points I hear bandied around is "I don't want content that wasn't written by a human". This is a viewpoint shared by Nerd Culture and Art Culture.</p> <p>By having humans at the centre of the <em>doing</em>, the end-result is better. Or alternatively, when we take humans out of the <em>doing</em>, we are depriving humans of the chance to experience, and be paid for, their skilled creative endeavours.</p> <h2>The bad</h2> <p>Pragmatically speaking, people do not care about every bit of text. A robot wrote or translated the instruction document for my boiler? Cool. A customer-service agent used AI and/or text snippets to send me a detailed piece of text with less effort and time? Sounds great, cool.</p> <p>In the above examples: you can swap out the person at either side of the transaction, and the end result is basically the same. This works great for transactional, probably professional, situations.</p> <p>When you have a captive, generous, non-interrogative reader, who wants to accept what you're saying - this text is great.</p> <p>But really, often can we assume that the thing we're writing or saying will generate no follow-up actions, no questions, no knock-on effects.</p> <p>If the is the case, how much different is a world where the text was read versus a world where the text was never written in the first place?</p> <p>Was the thing worth writing?</p> <p>No, I'm serious. I think this is my barometer for when generative AI is cool: is it <em>worthwhile</em> to spend the time to have the text?</p> <p>If you're doing a thing to have it done, for the end-result, you're doing a performative thing. Cal Newport might call this Pseudo Productivity:</p> <blockquote> <p>The use of visual activity as the primary means for approximating actual productive effort (<a href="https://calnewport.com/slow/">source</a>)</p> </blockquote> <p>Ideally we only do things that matter, and we engage with everything we do. I think that's a big ask of everyone, all of the time.</p> <p>But I think the pure ease of using generative AI to write text, makes it much easier to think that everything is performative, or transactional, or un-interrogated.</p> <p>Communicating effectively is hard work. I'm trying to do it now, and I think I'm doing a bad job.</p> <p>Presenting truthful information concisely is a skill. See also: PowerPoints and data tables or charts.</p> <p>It is hard work.</p> <p>The only real way to improve this skill is to practice it.</p> <p>Practice taking a thing you want to say, and make it legible to someone else.</p> <p>Practice not over-simplifying.</p> <p>These things simply don't matter when the stakes are low, when the the performance of doing is more important than the quality of the result, or when the text is a one-and-done interaction.</p> <p>But for the important things, for long-lived projects or projects where there are a lot of different parties involved - I think the benefits of generative AI (easy to generate, very predictable text) are answers to unimportant questions.</p> <p>The important questions are: do you understand what I just said? What does this mean for you or the people you represent?</p> <h2>But then what?</h2> <p>Let's imagine a world where all text is written by (and presumably <em>for</em>) AI models.</p> <p>We <em>will</em> just give ourselves more work to do. We'll think we're clever having a machine write our 500 word updates in 10% of the time it used to take. But we'll fill that 90% up immediately. See also: kitchen appliances in the 1950s.</p> <p>If you've invented a generative AI model that can say exactly what you want, exactly how you'd say it - and can instil that exact understanding in your reader <em>then you have invented magic</em>.</p> <p>You have made a world-ending technology or a psychic.</p> <p>That thing would have to be trained on a corpus of text which does precisely that. And that corpus <em>does not exist</em>.</p> <p>Until then, I am going to think: how worthwhile and important is it that my humanness is spent making this <em>thing</em> understood?</p>]]></description> </item> <item> <title><![CDATA[Vibe Check #19]]></title> <link>https://thomaswilson.xyz/blog/2024-04-20-vibe-check-19</link> <guid>https://thomaswilson.xyz/blog/2024-04-20-vibe-check-19</guid> <pubDate>Sat, 20 Apr 2024 21:06:28 GMT</pubDate> <description><![CDATA[<p>I think I left this Vibe Check too late into April and I sort of forgot what happened in March.</p> <p>Luckily: my blog, my rules. I declare bankruptcy for March 2024, and find myself acquitted of all charges.</p> <p>These last six weeks have been Classic British Spring: there have been thirty minute periods where the weather has cycled between blistering sun, pouring rain, and unwieldy gusts. Several times recently the weather has looked completely different in the time it takes me to rise from my desk and walk to the kitchen.</p> <p>It's only in the last couple of weeks that I've managed to get out on my bike for more than an hour, more than once a week. We've been consistently hitting 40+ mph winds in Oxfordshire, which make cycling persuasively not-fun and dangerous. Frustrating after an hospitable January.</p> <p>All is forgiven with how many more hours of daylight we get now. The sun is up when I get up, and stays up while I'm eating supper.</p> <p>I hit two number milestones recently. First, I managed to break past my previous streak on Todoist (my task-management app of choice), surpassing the 150 day record that ended in September 2019.</p> <p>Secondly, we're past the 100-day countdown for the wedding. I'm starting to worry that the wedding day might actually happen.</p> <p>I've managed to break through my reading slump, with Cal Newport's <em>Slow Productivity</em> (<a href="https://www.penguin.co.uk/books/454746/slow-productivity-by-newport-cal/9780241652916">link</a>). My feelings on this book were positive, and I'd like to put them together properly. The book reminded me that the sustainability and longevity of a practice should be thought about like we think about productivity and effectiveness.</p> <p>It is nice (and scary) to remember how few good things one can truly make in the time that we have. Said another way: it takes a lot of effort to build something meaningful, and we only get so much effort to give.</p> <p>I've been thinking somewhat about how and why I take photos. Earlier this year I discovered the <em>Walkie Talkie</em> series on YouTube, which are walking interviews with Street Photographers in New York. <a href="https://www.youtube.com/watch?v=3DulRNiQf0w">This interview with a photographer called Laura Fuchs</a> (<a href="https://www.instagram.com/laurasfuchs/">her instagram</a>) hit me nicely.</p> <p>Aside from a pragmatic, earnest work ethic - she spoke about how glad she was that she has so many photos of her friends and family. About how she's glad she got the camera out at every opportunity, even when the people around her couldn't understand why. The taking/making of photographs is obviously a pleasing action for her in itself, but now she has ways to remember each person in her life, at different points in theirs.</p> <p>Something in that attitude sat well with me, and has encouraged me to maybe take my camera a few more places, and to ask for a few more photos.</p> <p>Since last year, 2023, I have made a conscious effort to take an instant camera (the <a href="https://instax.co.uk/cameras/square-sq1/">Instax Square SQ1</a>) to various events. I've gone through about 200-250 photos since then, which, allowing for duds and give-aways, has still been enough to fill a couple of hung photo fames (<a href="https://www.etsy.com/uk/listing/1228774146/instax-square-multi-aperture-wooden">like this one</a>) as well as a bunch of pages in my personal notebook.</p> <p>I don't think I need to explain this, but photos are good. I like having photos, and I'm starting to enjoy <em>taking</em> them too. It is so lovely to have any moment recorded. Yes, you can take photos on your phone. But I think having a smart phone in a social setting changes how that social setting feels to me.</p> <p>More pragmatically, I just don't <em>look</em> at the photos I've taken on my phone. I don't know why. Probably because there are <em>thousands</em> of them, and so many of them are just gubbins. So many pictures of street cats, and expense receipts, but very few records of times with family and friends.</p> <p>I don't know if it feels different because the photos cost <em>money</em> and are far more finite, or if omitting the ever-present and multipurpose smartphone makes it <em>feel</em> different. But I think there's something in the monopurpose-ness of it. It's a bit like Ezra Klein <a href="https://www.nytimes.com/2024/04/07/opinion/gmail-email-digital-shame.html">recently said of emails</a> (paywall):</p> <blockquote> <p>I am looking now for software that insists I make choices rather than whispers that none are needed</p> </blockquote>]]></description> </item> <item> <title><![CDATA[Tiny project: kindle-md-highlights]]></title> <link>https://thomaswilson.xyz/blog/2024-04-28-tiny-project-kindle-md-highlights</link> <guid>https://thomaswilson.xyz/blog/2024-04-28-tiny-project-kindle-md-highlights</guid> <pubDate>Sun, 28 Apr 2024 07:57:03 GMT</pubDate> <description><![CDATA[<p>tl;dr <a href="https://github.com/thomaswilsonxyz/kindle-md-highlights">source code</a> for extracting notes and highlights from a kindle-made <code>.html</code> file.</p> <hr> <p>Since 2020 I've been running <a href="https://obsidian.md/">Obsidian</a> as my notes app of choice. The hacker in me likes that it's just <code>.md</code> files all the way down (basically).</p> <p>One of the things I like to do in Obsidian is keep a track of notes I've made from books I've read.</p> <p>I'm trying to throw together a book review (for the blog) of Cal Newport's <em>Slow Productivity</em>, which I read on Kindle. so I went to extract the notes from that book (using an community-published extension that had previously worked). For some reason, it wasn't working.</p> <p>The Kindle app lets you export your highlights as a <code>.html</code> file (assuming they're <10% of the book), and so I wrote a chipper little package (just one <code>.js</code> file) that parses through the HTML file, and <code>console.log</code>s out all of your notes.</p> <p>It's hella brutalist, you have to just copy-paste the output from the terminal, but it took <1hr to throw together, and now my notes from Slow Productivity are in my Obsidian vault, and I can <em>get on with writing the damned review</em>.</p>]]></description> </item> <item> <title><![CDATA[Very Convincing Large Language Models]]></title> <link>https://thomaswilson.xyz/blog/2024-05-07-very-convincing-large-language-models</link> <guid>https://thomaswilson.xyz/blog/2024-05-07-very-convincing-large-language-models</guid> <pubDate>Tue, 07 May 2024 20:51:27 GMT</pubDate> <description><![CDATA[<p>I <a href="/blog/2024-04-06-thoughts-on-generative-ai">recently wrote</a> about my thoughts on generative AI. The quality and capacity of Large Language Models (LLMs) continues to command our attention, and companies are generally trying to stick them anywhere. In apps (like <a href="https://www.notion.so/help/guides/category/ai">Notion</a>) and in little computers you can pin to your chest like the Apple Broach <a href="https://www.youtube.com/watch?v=ht_y6WMLd6k">in that episode of Big Mouth</a> (like <a href="https://humane.com/">Humane</a>).</p> <p>Last month I came across <a href="https://arxiv.org/abs/2404.09329">this study on arXiv</a> which looked at the ability of LLMs to generate persuasive texts for people. The full paper's 25 pages (do skim the start and end, though), the authors had both humans and a LLM (<a href="https://claude.ai/">Claude</a>) write a couple-hundred words of persuasive text on contentious issues (e.g. police always wearing body cameras when on duty).</p> <p>The authors compared human- versus machine-made texts along a handful of methods (readability, lexical complexity, sentiment, and morality).</p> <p>They found that the LLM-generated text to be more convincing, which they scope as being equally emotional, but more lexically complex and morally grounded than human text:</p> <blockquote> <p>morally laden language significantly impacts attention and can be highly persuasive... [LLMs demonstrated] a strategic use of moral-emotional language that aligns with the persuasive strategy of negative bias, where negative information tends to influence judgments more than equivalent positive information (Robertson et al., 2023; Rozin & Royzman, 2001)... the mere emotional charge of the language may not be as pivotal as the moral framing of the content, aligning with the view that morality can be a stronger driver of persuasion than emotions alone (van Bavel et al., 2024).</p> </blockquote> <p>I worry a lot about misinformation.</p> <p>I worry that the companies that got corruptingly rich by, sort of accidentally, creating a miasma for disinformation and misinformation to travel through. I worry they spend this food-poverty-ending wealth in, of all things, little computers to strap to your heads that you can play imaginary lego with.</p> <p>I worry that don't-fuck-about magnitude problems like the a climate crisis, radicalisation to violence, and emerging pandemics attract, breed, and circulate patently false information.</p> <p>I do not think that as people get radicalised they are sitting with opposing arguments in each hand and making an informed choice between "human" and "lizard" for the question "what is the royal family?"</p> <p>We do not <em>need</em> machines that are more convincing, especially when the little black box is just autocomplete. More so than any human, the LLM is <em>entirely</em> a product of its environment - train it on strong false information and you'll get strong false, very convincing arguments.</p> <p>Need I cast your mind back five months to <a href="https://www.youtube.com/watch?v=yDp3cB5fHXQ">hbomberguy's explosive video on plagiarism</a> - how widespread and blatant and unnoticed intellectual dishonesty was for several (not small) content creators.</p> <p>Sure, YouTube videos definitely are fuck-about magnitude. But have a LLM reword some stolen text, or generate some convincing but false information, speak it into your Shure microphone at your desk with some LED backlighting, and what you've got is a semblance of authenticity, and enough removal from what generated the content to be human, and emotional.</p> <p>I think videos can be a lot more attention-commanding than emotionally laden prose. And all the cool social medias are 80+% video.</p> <p>I worry that LLMs are going to be another tool for radicalisation and division of a lot of people, and that actually expecting the platforms to police this stuff is essentially impossible. They have no incentive to do it.</p> <p>I do not know how we get through this, but unlike when they tried to sell us 3D TVs or Segways or NFTs or face computers, this time the change is just sort of happening.</p> <p>And once more the nerds selling us the utopia do not have a strong anti-dystopia set of tools from what I can see.</p>]]></description> </item> <item> <title><![CDATA[Modern web tools and platforms are useful.]]></title> <link>https://thomaswilson.xyz/blog/2024-05-23-modern-web-tools-and-platforms-are-useful</link> <guid>https://thomaswilson.xyz/blog/2024-05-23-modern-web-tools-and-platforms-are-useful</guid> <pubDate>Thu, 23 May 2024 07:12:06 GMT</pubDate> <description><![CDATA[<p>My very first serious software product was built in Ruby on Rails, around 2014. <a href="https://www.ruby-lang.org/en/">Ruby</a> is a programming language with a relatively small, but happiness-oriented, community around it, and Rails is a framework for building web applications in Ruby. Around 2010, <a href="https://rubyonrails.org/">Rails</a> was <em>the</em> framework to build things in. Twitter and GitHub (among others) ran for many years on Rails.</p> <p>Rails is a monolith that Does Everythingâ„¢. It's one big bit of software that does database things, data validation, user authentication, HTML rendering, logging, etc. etc. You pop your Rails app on a server with a database, pay $0-5/month for hosting, and you have a <em>full</em> piece of software.</p> <p>Rails is also famously opinionated. It believes in <a href="https://rubyonrails.org/doctrine#convention-over-configuration">Convention Over Configuration</a>, meaning that the framework has a right way to do things, and your job as a developer is to follow those ways. In return, you gain productivity.</p> <p>Pretty early in my career, I started building building software for the web (semi-accidentally). I found that I had an appetite for front-end work, i.e. building things you <em>see</em> when you go to a website. This gently turned into building the tools for other engineers to build those little rectangles.</p> <p>Around this time, some of the very largest technology companies, Google and Facebook, released a framework and a library (Angular and React respectively) for building web interfaces. The idea of these tools was "hey, user interfaces are getting more complex, why don't we have tooling for building the visual part of a website, and not worry about the other bits, like databases and servers?"</p> <p>I have complicated feelings about this shift from monolithic full-stack software (like Rails), and separated smaller software (like React). I really want to love them, I really want the simplicity of them, but like... the user-experience of modern web can be (but is not always) <em>so</em> good. And also, the developer experience of newer tools is <em>so</em> much better.</p> <p>I miss how "simple" things were when working with Rails. In web development there's the CRUD operations: Creating, Reading, Updating, or Deleting. This is everything you can do with data: make it, view it, change it, or get rid of it. Full-stack frameworks like Rails make these operations real easy: from rendering the "edit" page, to submitting the form, and updating the data in the database - it's a solved convention.</p> <p>When you eject from big, opinionated frameworks, you still need to do your CRUD operations. But you end up having to build your own conventions. Similarly, you now need to have opinions about form validation, HTTP authentication, database adapters, erroring and logging, testing and routing, naming conventions. By accident, each company ended up building their own Whole Thingâ„¢.</p> <p>I've not had <em>loads</em> of time in the last year, mostly because I'm planning a wedding for this summer, but I have been able to build some side projects. For example: I built the website for our wedding. I also tried to build out a couple of Cool Ideas, specifically in Ruby (with and without Rails).</p> <p>I'm going to be honest, the developer experience of working with tool like Rails just... wasn't good.</p> <p>Before I speak a bit more about the web in specific, I want to clarify that I rediscovered how much I love working with Ruby. The syntax reads so well. I wholly recommend <a href="https://poignant.guide/">Why's (Poignant) Guide to Ruby</a>. If I start talking here about what makes Ruby Legitimately Elegantâ„¢, I'll loose everyone.</p> <p>There are two things that made working with Rails frustrating to me:</p> <ol> <li>Working with your own source code, namely a lack of types / intelli-sense; and</li> <li>Working with other people's source code, namely a lack of documentation and/or examples</li> </ol> <p>It's not a coincidence that two currently relatively popular languages (TypeScript and Kotlin) are maintained by companies who also build tools for working with the source code. Microsoft manage TypeScript and build the VSCode editor, and Kotlin is managed by JetBrains of Intelli-J fame.</p> <p>As a developer, working with either of those languages in those editors is a <em>delight</em>. Both run Language Servers, i.e. little bits of software that parse through the source code you're editing, and allow you to navigate your way around the codebase (go to where something is defined or used), and let you preview the in-code documentation without leaving a file.</p> <p>These are nerdy-ass details, yes, but man, I got one of them small brains. I'm trying to express an idea in code.</p> <p>And these benefits aren't limited to accessing your own source code. When you pull down a package or dependency to work with, it's just as easy to snoop around the code that someone else wrote, and figure out what's going on.</p> <p>Working with some Ruby packages made me feel pretty bad that I couldn't "just figure it out". Luckily, co-pilot had seen it all before, so was able to make pretty useful suggestions. But the quality of documentation for some of these packages, some of them with hundreds of millions of downloads, was varying and scarce. They each assumed that you already knew what you were doing. Imagine Google's worst, auto-gen'd Cloud Platform docs, but everywhere all of the time.</p> <p>And then there's the dozen or so paper cuts: modern web tooling has hot-reloading (where your preview in a browser changes as your source files change), so it's easy to see the impact of a change you've made. There's template-style files (where your markdown, styling, and script are all in the same place). There's ad hoc support for css/js imports.</p> <p>I don't really know why we didn't see a "Rails for X" emerge, where X is a modern language with a community and company that are responsible for the developer experience. Maybe we're... happy? Each of us building our own horrible jenga towers.</p> <p>But that feels frustrating and I don't like that. I want to build cool shit and deliver value. Life is short, too short, hardly long enough, and spending it tinkering with co-pilot or trawling 7+ year old threads on Stack Overflow doesn't fill my cup.</p> <p>Maybe I'm not smart enough or too impatient for it, but I think on some level, the grumbling about how modern web tooling is too complex and "I miss Rails" is really just "I miss when I had to do fewer things" or "I miss when the web was used by fewer people and those people were mostly nerds".</p> <p>Yes, modern web tools are very prone to unnecessary complexity. But so is pretty much anything humans do (see also: bureaucracy, product design, customer support with any large company)</p>]]></description> </item> <item> <title><![CDATA[📖 Matrix]]></title> <link>https://thomaswilson.xyz/blog/2024-06-01-matrix</link> <guid>https://thomaswilson.xyz/blog/2024-06-01-matrix</guid> <pubDate>Sat, 01 Jun 2024 07:22:53 GMT</pubDate> <description><![CDATA[<p>This a review of the book Matrix by Lauren Groff (<a href="https://laurengroff.com/book/matrix/">link</a>).</p> <p>It's been hard to find time to read in 2024, namely because I'm planning a wedding (<em>blaming something on wedding planning</em> - that's Wilson Bingo 2024).</p> <p>When I find myself in reading slumps, small books, especially small literary books can really help. I first realised this some seven years ago with Robert Seethaler's <em>The Tobacconist</em> (<a href="https://www.panmacmillan.com/authors/robert-seethaler/the-tobacconist/9781509806591">link</a>).</p> <p><em>Matrix</em> was one of these books to me, recommended in Blackwells, Oxford, by one of those handwritten bookseller notes that described it as a literary, queer, historical fiction. Plus, written by a woman. It was like catnip and reading bingo.</p> <p>To be quick: I really enjoyed <em>Matrix</em>. The writing style with its blend of sparse punctuation, and slipping grip on the passage of time, was effectively without being unwelcoming or wilfully opaque to me, a mere mortal.</p> <p>Similarly, it wasn't <em>all vibes no plot</em> which can be an indulgent trap for things to fall into.</p> <p>The book follows Marie, based on the real but foggy historical figure of <a href="https://en.wikipedia.org/wiki/Marie_de_France">Marie de France</a> , a twelfth-century religious woman. It tells her story as a woman leaving court, who takes up leadership of a nunnery/monastery.</p> <p>The book follows her friendships and relationships in the close-quarters, medieval quarters for an enclosed space. It follows a powerful and knowledgeable woman at a time when women were not tolerated as powerful or knowledgeable. I don't know enough history to answer this, but I wonder how much of what we are shown is modern sensibilities spread onto ancient events.</p> <p>From what little history I have read, especially history surrounding women, it's pretty common. What's less common is that Marie's suffering, efforts, and skills are put at the forefront. They are not dismissed (or invented) as masculine.</p> <p>The gentleness and discomfort of ever-present relationships (where else are nuns to go, except the ground of their abbey?) bleed through this book. Marie's relationship to others, and her largely unacknowledged queerness, come through frequently enough that you understand they are important, but they do not paint everything.</p> <p>This isn't a book about being queer, it's a book about being Marie. It gave me the context and want to empathise with her, and Groff pulls it of so skilfully.</p> <p>What's more - it's a short book, and it covers some sixty years of Marie's life.</p> <p>I am glad I read this book.</p>]]></description> </item> <item> <title><![CDATA[Summer Hours 2024]]></title> <link>https://thomaswilson.xyz/blog/2024-06-18-summer-hours-2024</link> <guid>https://thomaswilson.xyz/blog/2024-06-18-summer-hours-2024</guid> <pubDate>Tue, 18 Jun 2024 06:18:13 GMT</pubDate> <description><![CDATA[<p>It's that time of year when I intentionally set-aside the guilt of not writing all the blog posts I want to, in favour of spending time outside.</p> <p>In the great tradition, I'll be on Summer Hours for the next few months. Spending times outside, ideally eating and drinking good food.</p> <p>In July I'm getting married - which I am <em>incredibly</em> excited for.</p> <p>Around that, I'll be attending other weddings, spending time with family and friends, and lapping up what little sunshine as are bestowed on these Great British Isles.</p> <p>✌ï¸â˜€ï¸</p>]]></description> </item> <item> <title><![CDATA[Summer Hours 2024 are over]]></title> <link>https://thomaswilson.xyz/blog/2024-08-26-summer-hours-2024-are-over</link> <guid>https://thomaswilson.xyz/blog/2024-08-26-summer-hours-2024-are-over</guid> <pubDate>Mon, 26 Aug 2024 09:48:30 GMT</pubDate> <description><![CDATA[<p>Hello, again.</p> <p>Nature is telling me that summer is over. Or at least that calling this late August <em>summer</em> is stretching the truth.</p> <p>The days are getting shorter. The wind has a cold bite to it. The squirrels want nothing more than to de-head the seeding plants and cache food anywhere in the garden.</p> <p>Autumn is coming. Famously the best season. Other than summer.</p> <p>I want to write more, but the best way to start is to start. This is my re-starting.</p> <p>Long-live summer.</p>]]></description> </item> <item> <title><![CDATA[Makers make]]></title> <link>https://thomaswilson.xyz/blog/2024-09-03-makers-make</link> <guid>https://thomaswilson.xyz/blog/2024-09-03-makers-make</guid> <pubDate>Tue, 03 Sep 2024 19:20:05 GMT</pubDate> <description><![CDATA[<p>I owe a lot of the things I like about myself to the <a href="https://www.relay.fm/cortex">Cortex Podcast</a>.</p> <p>When I was a different person I was listening to the podcast on a bike, cycling alone through central France. One of the hosts said something like:</p> <blockquote> <p>You know what creators do? They create.</p> </blockquote> <p>It was in the context of, very loud air-quotes, "entrepreneurs" - people who seem more interested in selling small cohort courses for aspiring business owners, than starting their own actual business.</p> <p>Or maybe they were talking about people who were always one workshop away from writing the first draft of their screenplay, or will book onto the <em>next</em> open mic night.</p> <p>I guess the actual quote doesn't matter, really.</p> <p>But the message stuck with me.</p> <p>You know what creators do? They create.</p> <p>And you know what's even cooler? You probably don't need permission to start making. You can just... start.</p> <p>Your smart phone has a camera, your computer has a notes app, the social media platforms would <em>love</em> to host your capital-C Content. The library is so full of books, but it would be very uncool of you to pirate those PDFs of research papers online.</p> <p>The quote is a reminder that if you want to identify as a maker, a crafter, a creator - you can. You just need to start making, crafting, creating.</p> <p>And in the moments when you, maker you, stop making - perhaps because it feels too big or unrewarding or not good enough - all you have to do is start making again.</p> <p>Frog the yarn and start a new scarf, ⌘N a new document, put the crummy garment in the bin.</p> <p>You do not need permission, you are a maker, so you make.</p>]]></description> </item> <item> <title><![CDATA[Never Adobe]]></title> <link>https://thomaswilson.xyz/blog/2024-09-13-never-adobe</link> <guid>https://thomaswilson.xyz/blog/2024-09-13-never-adobe</guid> <pubDate>Fri, 13 Sep 2024 13:52:32 GMT</pubDate> <description><![CDATA[<p>While listening to <a href="https://syntax.fm/show/817/you-need-these-30-apps-part-1/transcript">an episode of</a> the Syntax Podcast, I heard one of the hosts say something like:</p> <blockquote> <p>I am a Never Adobe kind of person.</p> </blockquote> <p>And I love this idea. Because my perception of Adobe, as someone who has a passing interest in making better photographs, is a company that wants to build efficient machines for taking more of my money, more reliably. They do not strike me as a company who want me to make better photographs - that feels more incidental.</p> <p>Like every company, I am sure there are good individuals in there, fighting for the business to stand with, not opposite, the people it serves. Unfortunately I don't think those voices are having a meaningful impact. Or perhaps the corporate structure and incentives make it sort of impossible to listen to them.</p> <p>Frankly, I don't really care enough to figure out how generously I should interpret Adobe's consumer-facing practices. Now that the company is being sued by the US government on antitrust ground, <a href="https://www.theverge.com/2024/7/25/24205774/adobe-ftc-lawsuit-creative-cloud-cancellation-fees-heroin">in an interview with The Verge</a> Adobe's Chief Trust Officer:</p> <ol> <li>clarifies (in one sentence) that early termination fees are 50% of remaining payment for a year's subscription, and then immediately states they couldn't display that at checkout because "it’s not a big box"</li> <li>the idea that they're obfuscating pricing at checkout is baseless and something they've been trying to solve since October 2021. To be clear, this is not a problem, and if it was a problem, we've been trying really hard for <em>years</em> to address it.</li> </ol> <p>It's not my job and I am tired, but this sort of sinks, right? I worry I would be the only party engaging in this discussion in good faith.</p> <p>I'm sure that their checkout conversion rate is incredible, and that might be what they have indexed for.</p> <p>It's not that I had subscription services. I'm a happy to see money go out of my account for Netflix, fairly procured coffee, safe file backups, a reliable internet connection, and gym access. I think it's maybe more true that Adobe treat me like a mark, a little baby they can trick for their pocket money.</p> <p>I don't think it's an unreasonable expectation to want to cancel any of the above, at any point. But Adobe would disagree.</p> <p>These past months, as I've been making more photos in raw format, I've been relying more on tooling and workflows to triage more and bigger photos.</p> <p>I frankly have little to no interest to spending <em>thousands</em> of pounds in the next one-to-fifty years of my life (let's see how much of a phase photography is) for these kinds of workflows.</p> <p>But, let me tell you, this is <em>the</em> path of least resistance here. Their Photoshop and Lightroom products are just dominant. One of those is a verb now. You don't even say "I'm going to PowerPoint at the meeting" or "she Excel'd it, and our forecast is good". How many other pieces of software (not web services) are verbs?</p>]]></description> </item> <item> <title><![CDATA[Tuesday at 2PM]]></title> <link>https://thomaswilson.xyz/blog/2024-09-24-tuesday-at-2pm</link> <guid>https://thomaswilson.xyz/blog/2024-09-24-tuesday-at-2pm</guid> <pubDate>Tue, 24 Sep 2024 21:03:19 GMT</pubDate> <description><![CDATA[<p>I was listening to the most recent episode of the <em>Decoder</em> podcast (<a href="https://www.theverge.com/24247369/the-browser-company-ceo-josh-miller-arc-google-chrome-ai-search-web-decoder-interview">link</a>) with the creator of the <a href="https://arc.net/">Arc Browser</a>, Josh Miller.</p> <p>Arc is a web browser, so naturally he was asked something like "why compete with Google's Chrome browser?", and he said something that resonated:</p> <blockquote> <p>What we’re focused on is the individual and the person at the other end… the focus on publishers as Google describes them, <strong>has left the individual on a Tuesday at 2PM lacking a lot of powerful tools to make them better and faster</strong> [emphasis my own]… in fact, we think that what was missing was looking at my wife using her laptop on Tuesday at 2PM [and realizing], “Wait, that’s what she’s doing? We can do better. Computers can do more than that.â€</p> </blockquote> <p>I think the "computers can do more than that" line rubs me the wrong way, perhaps because it reminds me of <a href="https://www.notion.so/about">Notion's line</a> about wanting to fulfil the vision of computing from the mid-late twentieth century. Approximately one billion percent more people use (and love) Notion than have ever used (<em>or</em> loved) a piece of software I have written.</p> <p>Notion, you are a subscription-based, enterprise-grade, user-generated intranet tool.</p> <p>Stay with me on this, I'm going to try and land the plane of this metaphor, I promise.</p> <h2>Documentation, a rant</h2> <p>Notion, you are very successful, and a lot of people love using your tools. But, I think people reach for those tools before thinking about the foundational questions of coordinating the direction(s) of travel, and the knowledge of institutions.</p> <p>If you would like proof of this, and you work somewhere with a Notion subscription - go and look at the shared "knowledge hub" areas of your company's Notion. Everywhere I have worked since 2018 (it is 2024) has had a warren of onboarding, process, and company documentation that was true once then never updated.</p> <p>This doesn't happen because Notion is bad or people are unthinking. I have worked almost entirely with companies full of thoughtful, caring, very intelligent people. (Before you think I am being saccharin: I also once had a company I contracted for suddenly refuse to acknowledge my invoices or pay me for several months, actions I would dub neither "thoughtful" or "caring" (or legal)).</p> <p>It happens because the beauty of the software you use to write documentation and create Kanban boards probably isn't the limiting step in the process of building something good.</p> <p>I think the infinite canvas of Notion's surface makes both breadth and depth equally available (and tempting) for people to fill out. Sure, this page is mostly done, but I better sign-post these sibling pages because they're related, and create a couple of sub-pages here, because it's getting quite long.</p> <p>I think it's possible to mistake work that is pleasingly weighty, and placed within a solid document structure as important. I think it's possible — easy, even — because it <em>looks</em> important.</p> <h2>Be curious, want to help</h2> <p>Conflating correlation with causation isn't a new problem. Tyler Vigen's <a href="https://www.tylervigen.com/spurious-correlations">Spurious Correlations</a> will correlate two things convincingly: <a href="https://www.tylervigen.com/spurious/correlation/1472_associates-degrees-awarded-in-parks-recreation-leisure-fitness-and-kinesiology_correlates-with_google-searches-for-tummy-ache">google searches for "tummy ache" against and university degrees awarded</a>; or <a href="https://www.tylervigen.com/spurious/correlation/1173_total-runs-scored-by-chicago-cubs-team-in-national-league-central-and-east-division_correlates-with_the-divorce-rate-in-connecticut">baseball and divorce</a></p> <p>Let's take a straw man example, and really torture it: you want to think more clearly, so you go be near books.</p> <p>If I blindfolded you and measured the quality of your thinking (somehow, idk) - I don't think that your proximity to books would correlate with better/worse thinking.</p> <p>But I actually seriously believe that some of the world's finest thinking happening today is being done in, or around, libraries and studies.</p> <p>To correlate proximity to printed word, and quality of output would be possible, arguably interesting, but I think more important it would be <em>easy</em>.</p> <p>In practice, I think we can be better served by wanting two things: to be curious, and to help.</p> <p>Imagine I tell you two things about me: i) I care obsessively about helping people make their best work by helping them think more clearly, and ii) I founded a company that will insulate your wall cavities with used books, to increase your proximity to printed word.</p> <p>Would you think that I <em>actually</em> care about helping people do their best work? Or would you think I'm working backwards to a business because I have access to a lot of cheap books?</p> <p>Perhaps less flippantly: you cannot simply build a hospital near an inhabited area, and expect mortality to decrease. You cannot deliver food and water to a natural disaster site and expect famine to dissipate equally.</p> <p>To do these things you must be curious, and you must care.</p> <h2>Landing the plane</h2> <p>To come back to Josh Miller's quote about building a browser to compete with Google's Chrome: you do not need to understand all the ways in which Chrome is a browser built for Google, not for you the individual, to understand that your lived experience is bad in some way, and could be better in some way.</p> <p>It is Tuesday at 2PM, you are using a web browser designed by (and in service of) the company that makes twenty bazillion dollars a year by serving you advertisements that get more valuable the more the company knows about you (where you live, how often and where you exercise, etc.).</p> <p>In this moment, I would take a viable alternative made by someone who <em>feels</em> this is important, over one made by someone who wants to improve five specific metrics about my experience.</p> <p>How do you measure "creeped out" on a five-point emoji scale?</p> <p>This reminds me somewhat of <a href="https://robinrendle.com/notes/vibe-driven-development/">vibe-driven development</a>: that the effort to gather and understand high quality data-driven insights is high, and if you care about (and use) the thing you're building, you can probably just… make it better.</p> <h2>An anecdote</h2> <p>To close with an anecdote: I used to work in the sustainable fashion space, at a time when there was a lot of excitement about the rental market. People renting their clothes for days-to-months, and other people making bank by owning but never wearing those garments. It worked for real estate, famously.</p> <p>I met, first- and second-hand, a lot of start-ups wanting to get in on this. I met people with a history in finance, logistics, project management, whatever. I remember sitting in an intro call with a (now defunct) company, that was going very well out of the pandemic. I remember the founders proudly saying that they knew nothing about fashion or clothes, but that they ran the numbers and the luxury fashion space had the highest possible yield to them.</p> <p>These people never thought about the Tuesday at 2PM of the people who wanted to rent a dress for a wedding, a coat for a date night, or daily outfits for their newborn.</p> <p>They thought about the metrics they could optimise. I suspect that's how they see their customers, that is how they will see their employees and their partners.</p>]]></description> </item> <item> <title><![CDATA[Link: "Tossed Salads And Scrumbled Eggs" - Lucidity]]></title> <link>https://thomaswilson.xyz/blog/2024-09-28-link-tossed-salads-and-scrumbled-eggs-lucidity</link> <guid>https://thomaswilson.xyz/blog/2024-09-28-link-tossed-salads-and-scrumbled-eggs-lucidity</guid> <pubDate>Sat, 28 Sep 2024 14:24:47 GMT</pubDate> <description><![CDATA[<p><a href="https://ludic.mataroa.blog/blog/tossed-salads-and-scrumbled-eggs/">Link to the original article</a> from Nikhil Suresh.</p> <p>I came across this article on Hacker News, and gave it my full attention this Friday, with a glass of wine. It's from the same author that gave us <a href="https://ludic.mataroa.blog/blog/i-will-fucking-piledrive-you-if-you-mention-ai-again/">I Will Fucking Piledrive You If You Mention AI Again</a></p> <p>I had the unique experience of seeing someone articulate the strong beliefs I have about How To Do Work Properly, in a clearer way, while being both funnier and more outraged.</p> <p>Suresh, you won't know this feeling, but it hurts to know in my heart that I will come at most second best in a niche I, until recently, thought occupied entirely by me shouting into the twin voids of my blog and every manager I have had since 2020. Ever more niche I must pitch myself.</p> <p>Look, just read the piece, but here are some of my highlights:</p> <blockquote> <p>And this is exactly why I don't view Scrum itself as particularly problematic. The <em>fundamental issue</em>, the one that is only moved by small degrees by project management methodologies, is that many, many people simply have totally unsophisticated ideas around how knowledge work functions.</p> </blockquote> <blockquote> <p>A phrase I love is that "the map is not the territory", which more or less translates to the idea that <em>maps</em> merely contain abstract symbols of the territory they represent, and that while we may never have access to a perfect view of the whole territory, it is important to understand that we aren't looking at the real territory… Some people have just lived with these symbols for so long that they think drawing a box on a PowerPoint slide that says "Secure Personally Identifiable Data" is the same thing as <em>actually making that happen</em>, as if one could conjure a forest into existence by drawing some trees</p> </blockquote> <p>"As if one could conjure a forest into existence by drawing some trees."</p> <p>I have never, perhaps ever, written a sentence that goes that hard. The <em>closest</em> thing I have, that I trot out at every possible occasion, is "sure, go shout at the tides if you just want to shout". <em>as if one could conjure a forest into existence by drawing some trees</em>… it's good and I will use it.</p>]]></description> </item> <item> <title><![CDATA[Setting environmental variables in a Step in a GitHub Action (with Supabase, specifically)]]></title> <link>https://thomaswilson.xyz/blog/2024-10-12-github-actions-environment-variables</link> <guid>https://thomaswilson.xyz/blog/2024-10-12-github-actions-environment-variables</guid> <pubDate>Sat, 12 Oct 2024 15:49:13 GMT</pubDate> <description><![CDATA[<p>Recently I thought "maybe it's about time my tests run in CI" for one of my side-projects (<a href="https://herearethose.photos">herearethose.photos</a>, a site for quickly and privately sharing photos).</p> <h2>The Problem</h2> <p>Using GitHub actions, it's possible to set job-level environment variables, and step-level environment variables. But what if you need to set an environment variable <em>as the result of</em> a step in a job, and then reference them in a later step?</p> <h2>The Solution</h2> <p>Using a temporary file for a workflow, accessible at <code>GITHUB_ENV</code> (so <code>$GITHUB_ENV</code> in a script)</p> <p><a href="https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/workflow-commands-for-github-actions#environment-files">See GitHub's related documentation</a></p> <h2>Why?</h2> <p>I wanted my Supabase instance to be ephemeral: living only for the duration of the workflow then spun down. Although some things are knowable before time (like URLs and ports), other things are generated on-the-flow (like authentication credentials).</p> <p>Storing these kinds of values as environmental variables is what allows the code to execute identically in local development, test, ci, production, and production-like (e.g. <code>staging</code>) environments.</p> <h2>The Code</h2> <p>The following snippet assumes:</p> <ul> <li>you're writing JavaScript or TypeScript</li> <li>you're using pnpm for package management</li> <li>you have a directory called <code>web</code> which has a <code>package.json</code> that has a script called <code>test:ci</code> - which runs your tests (mine calls <code>vitest</code>)</li> <li>your code sources environment variables from the environment (<code>process.env.VARIABLE_NAME</code>), as opposed to from a known .env file (like <code>.env.ci</code>)</li> </ul> <pre><code class="language-yaml">name: Unit & Integration Tests on: push: branches: [main] pull_request: branches: [main] jobs: test: runs-on: ubuntu-latest env: PUBLIC_ENV_NAME: ci steps: - uses: actions/checkout@v3 - name: Setup Node.js uses: actions/setup-node@v3 with: node-version: "20" - name: Install pnpm uses: pnpm/action-setup@v2 with: version: 8 - name: Install dependencies run: pnpm install - name: Setup Supabase CLI uses: supabase/setup-cli@v1 with: version: latest - name: Start Supabase and set environment variables run: | supabase start supabase migration up --local echo "PUBLIC_SUPABASE_URL=$(supabase status --output json | jq -r '.API_URL')" >> $GITHUB_ENV echo "PUBLIC_SUPABASE_ANON_KEY=$(supabase status --output json | jq -r '.ANON_KEY')" >> $GITHUB_ENV echo "SUPABASE_SERVICE_KEY=$(supabase status --output json | jq -r '.SERVICE_ROLE_KEY')" >> $GITHUB_ENV - name: Run tests env: PUBLIC_SUPABASE_URL: ${{ env.PUBLIC_SUPABASE_URL }} PUBLIC_SUPABASE_ANON_KEY: ${{ env.PUBLIC_SUPABASE_ANON_KEY }} SUPABASE_SERVICE_KEY: ${{ env.SUPABASE_SERVICE_KEY }} run: cd web && pnpm test:ci - name: Stop Supabase if: always() run: supabase stop </code></pre>]]></description> </item> <item> <title><![CDATA[Stop with the caveats ]]></title> <link>https://thomaswilson.xyz/blog/2024-11-01-stop-with-the-caveats-</link> <guid>https://thomaswilson.xyz/blog/2024-11-01-stop-with-the-caveats-</guid> <pubDate>Fri, 01 Nov 2024 15:33:57 GMT</pubDate> <description><![CDATA[<p>It might be my specific internet bubble, but two phrases I hear a lot online are: "this is just my opinion" or "this is just how it feels to me".</p> <p>I implore you: stop using these phrases. Stop using them in situations where subjective opinion or personal preference are the default. You do not need to say them, you are dismissing or belittling your own thoughts or opinions.</p> <p>I can think of so few situations where this explicit flag serves a purpose. You're kind of assuming they're going to do like two things:</p> <ul> <li>Either, the phrase will stop your reader/listener from feeling like your opinion threatens their own and will be less angry, or</li> <li>They will hear your argument more generously, or less worthy of criticism or contradiction, because it is <em>only</em> a personal opinion.</li> </ul> <p>What this phrase will never do is cause a (generous) reader to set aside an expectation of objective truth, and be satisfied with a subjective opinion.</p> <p>Think about any single thing that you're good at or experienced in. I'm good at sewing, there is no "best" anything: sewing machine brand, thread manufacturer, pattern designer, cutting tools. Every craft has these kind of small divisions, and I have strong opinions about all of the above.</p> <p>I could try to sand-down my opinions of all value judgements, I could say "I prefer hand-basting to pinning, but really both work and you can do whatever you want, honestly it doesn't matter so long as you enjoy the process".</p> <p>Alternatively, I could say that I think we should default to hand-basting even though it takes more time, because it's more precise, and you work more closely with your cloth, I think it's more responsive to the garment you're making.</p> <p>No amount of "actually in my opinion" is going to change my mind on this issue. But you understood, as I said above, that I am just expressing an opinion.</p> <p>So long as we are talking about situations where personal preference <em>is</em> the topic, you don't need to flag that you have a personal preference.</p> <h2>This is boring</h2> <p>We all have different opinions and preferences. This violates one of my long-standing smell tests: is what I am about to say interesting?</p> <p>It's bland to say that different people are different.</p> <p>But what, exactly, do you think a personality is, if not something that can be expressed through a series of preferences ?</p> <p>I worry that constantly defaulting to opinions or preferences weakens other important discussions.</p> <p>It would be weird to discuss my preferred garment construction method in my personal tailoring practice within the same framework as questions like "how many human rights should this person have?" or "how much polio is too much polio" (all and any, respectively).</p> <p>But people are still out here, very proudly, with their name and face attached to their opinion, telling us that some people do actually deserve less human rights, and that some polio is a fair price to pay for their inalienable right to make poor collective decisions.</p> <p>If people can say those things and gaslight you into thinking not only that maybe you're wrong, but that <em>this is a discussion of personal opinions that we're all invited to</em> - then you can get through your next speech without laying down a goose down pillow for an unreasonably angry listener's expectations.</p> <h2>Bring it back, Wils</h2> <p>Sorry, online dis/misinformation spreading took over my train of thought again.</p> <p>Thinking generously, these phrases evolved as successful preventative phrases against the ever-present threat of the internet's criticism sewer pipeline.</p> <p>That's not just a funny dismissive name, I think the anger and criticism that someone could feel because someone else is attempting to launder their opinion as <em>fact</em> is waste. Even worse than real sewage, I don't think it's even fertile.</p> <p>To say the Wrong Thing, or worse, to have someone hear what you said as the Wrong Thing, can lead to loud criticism. This isn't a new or unchanging thing, but it's secondary to my point today.</p> <p>If I ever ran some kind of social media empire, I would start every single review or discussion with "what I am about to say is objective truth, to which you cannot disagree; I have never expressed an opinion, and if I had it would have been the correct opinion"</p> <p>I really can't say it enough: I think people are blasting past some very important, and entirely philosophical (and therefore flexible or changeable), questions like "what makes something 'true'" and "what is 'certainty'?" and just kind of going on vibes. Like most humans have done for all of history.</p>]]></description> </item> <item> <title><![CDATA[Deploying a Ghost blog with Coolify and a Dockerfile]]></title> <link>https://thomaswilson.xyz/blog/2024-11-10-deploying-a-ghost-blog-with-coolify-and-a-dockerfile</link> <guid>https://thomaswilson.xyz/blog/2024-11-10-deploying-a-ghost-blog-with-coolify-and-a-dockerfile</guid> <pubDate>Sun, 10 Nov 2024 11:35:36 GMT</pubDate> <description><![CDATA[<p>I think I might like a place to publish content (photos, some longer-form writing) that doesn't feel like it belongs on my personal, tech-centric blog.</p> <p>I chose <a href="https://ghost.org/">Ghost</a>, an open-source platform for publishers or content-creators. The first ever blog that I spun up during my postgrad studies was a Ghost blog, and for a variety of reasons it felt better than using WordPress or Substack .</p> <p>I chose <a href="https://coolify.io/">Coolify</a> as a host-your-own Platform-as-a-service (PaaS) that would let me deploy multiple containerised applications to a server that I owned (or rented).</p> <p>Ghost offer a paid plan that starts at $9/mo, but its core technology is open-source, so I wanted to self-host.</p> <h2>Spin up a server</h2> <p>I spun up a Virtual Private Server (VPS) on Hetzner, I took their CX32 model: €7.56/mo gets me 4vCPUs, 8GB memory, and 80GB disk space along with daily backups.</p> <p>After the server has spun up, I SSH'd in (using the keys that are generated during the creation process), and followed Coolify's <a href="https://coolify.io/docs/installation">own self-hosted instructions</a>, which took no more than a couple of minutes.</p> <p>Now when I go to my VPS's IP address, I see the Coolify UI. Cool !</p> <h2>Decide on your domain name</h2> <p>If you want your blog deployed to a domain (e.g. thomaswilson.xyz) or a subdomain (e.g. ghost.thomaswilson.xyz) then you should decide this up top. In all the examples below, I have used ghost.thomaswilson.xyz.</p> <p>You will need to replace that with whatever you decide to use.</p> <h2>Create the Coolify Resource</h2> <p>Within a Project in Coolify, create a new Resource, and Select "Dockerfile"</p> <h2>Specify the Dockerfile</h2> <pre><code class="language-Dockerfile">FROM ghost:alpine ENV NODE_ENV=production \ url=https://ghost.thomaswilson.xyz \ database__client=sqlite3 \ database__connection__filename=/var/lib/ghost/content/data/ghost.db \ paths__contentPath=/var/lib/ghost/content # Create a directory for Ghost content RUN mkdir -p /var/lib/ghost/content && \ chown -R node:node /var/lib/ghost/content USER node VOLUME ["/var/lib/ghost/content"] EXPOSE 2368 CMD ["node", "current/index.js"] </code></pre> <h2>Expose the Network port</h2> <p>By default (and specified in the above Dockerfile), Ghost will run on port 2368. I don't see a need to change that.</p> <p>In the Network tab of the Resource's Configuration, specify <code>2368</code> under the "Ports Exposes" field.</p> <h2>Specify volumes</h2> <p>In Configurations > Storages, mount a new volume where the directory on the host is <code>/data/ghost/content</code>, and the path on the container is <code>/var/lib/ghost/content</code> (the directory specified in the container above).</p> <p>This will mean that your content (managed in a SQLite database, specified in the Dockerfile) will persist between deploys, so you won't lose all of your content just because you re-deploy your resource.</p> <p>It should also allow you to export the directory content from your VPS, should you wish to jump ship to another server.</p> <h2>Set Domain Name Records</h2> <p>This might take a couple hours to filter through the pipes of the internet.</p> <p>In your domain registrar, create an <code>A</code> record that points your desired (sub)domain towards the static IP of your VPS.</p> <p>In my instance, I pointed <code>ghost</code> towards the IP, so that <code>https://ghost.thomaswilon.xyz</code> would point towards my .</p> <p>Within the Configurations page of your Ghost blog Resource on Coolify, set the Domains field to that same URL, so for me: <code>https://ghost.thomaswilson.xyz</code></p> <h2>(Re-)Deploy that Resource</h2> <p>Now that you've set up your resources, and domain names, you'll be able to deploy that resource !</p> <h2>Wait</h2> <p>It might take a minute for the domain name to filter through - I've used Hover and Netlify (which normally take a few hours), and Cloudflare, which has always been notably faster.</p>]]></description> </item> <item> <title><![CDATA[You can just think about it different.]]></title> <link>https://thomaswilson.xyz/blog/2024-11-19-you-can-just-think-about-it-different</link> <guid>https://thomaswilson.xyz/blog/2024-11-19-you-can-just-think-about-it-different</guid> <pubDate>Tue, 19 Nov 2024 17:38:46 GMT</pubDate> <description><![CDATA[<p>In the past few weeks I've been doing a lot of non-fiction reading about about god. About the claims made about god in religion, individual people's ideas about god, and the place of god within religion and religion within society. Pretty big stuff, to be honest.</p> <p>It's been really interesting. Some very clever people have contributed thoughtful, precise arguments about some big ideas.</p> <p>I've experienced a few interesting things since engaging with this literature.</p> <p>The first is that it's very hard to summarise these big ideas. I think part of this is because they're ideas from clever people. Sort of like how re-telling a professional comedian's joke is hard, there's non-zero effort in the telling. In fact: the telling <em>is</em> the skill. I think part of it is that ideas are often defined best in opposition or relation to each other - so it's hard to separate them.</p> <p>The second thing I've noticed is that there are these whole ideas I have about what is "true" that I rarely notice, and when I do notice them I just think of them as "objectively good".</p> <p>Allow me to sound like a (probably non-sober) university undergraduate for a second.</p> <p>The most helpful thing I can give here is an example. I was trained in science. Not the natural sciences, but the science-y: earth sciences, social sciences, information sciences. Then I became a software engineer, and worked with technical systems.</p> <p>Throughout all of this time, I have been served well by attempting to break larger systems down into their constituent parts. "Sustainability" is a combination of economic, environmental, and societal practices. Global migration is a combination of push and pull factors.</p> <p>This idea, broadly, is the idea of <a href="https://en.wikipedia.org/wiki/Reductionism">reductionism</a>, something which the Wikipedia article reminds us:</p> <blockquote> <p>[is] one of the most used and abused terms in the philosophical lexicon</p> </blockquote> <p>I don't want to abuse the term further - so I'm going to tell you an oversimplification: reductionism is broadly the idea that any "thing" can be broken down into, and entirely explained by, smaller "sub-things". A family is just a group of X people related by blood. Biology is just chemistry is just physics is just maths is just…</p> <p>The thing is that it's at very least philosophically defensible to say that this is wholly appropriate, or that this is complete nonsense.</p> <p>The thing is, some parts of reductionism don't feel true to the softer (read: joyful) parts of being human.</p> <p>Consider a good evening meal with friends. You might have your three closest friends, candlelight, live music, soft lighting, and more than enough wine. That <em>feeling</em> of "a good evening meal with friends" doesn't feel adequately explained by those things put together. Because you could have the meal during daylight, have zero alcohol, or play jazz not classical music, and the experience might be improved, ruined, or wholly unchanged.</p> <p>There is a "something else" that makes your good evening meal with friends special.</p> <p>Don't you dare tell me it's just brain chemistry, because every <em>thing</em> you have ever experienced (including your literal dreams, being drunk, your phobias, etc.) are arguably just brain chemistry - doing this kind of fuzzy hand-waving is <em>worse</em> than whatever it is you think I'm doing - I will not have it.</p> <p>I'm not now a die-hard vitalist - keen to tell you that every thing has a living soul (it might, idk), but I am aware that I could just think something different. Because although reductionism has helped us break apart and understand a lot of the natural world - it might not be good at everything.</p> <p>It wouldn't be any more useful or true to say "reductionism is good" than to say "reductionism is bad". It all depends. It depends on quite a lot.</p> <p>If I want to, I can just pick up a different way of thinking, a new way of seeing - and I don't have to feel guilty that I'm not using my "real way" or my "proper way".</p> <p>Even if one way of thinking about truth and knowledge actually gets us, finally, to the Ultimate Nature of Reality, I think there would still be people arguing that it's not an epistemically defensible paradigm. We're not always trying to get to the truth at the heart of the universe, or get everyone to agree with us - sometimes we're just curious about a new idea, but it feels somehow "silly".</p> <p>I give myself permission, whenever I need it, to abandon positivism, or reductionism, or whatever other <em>thing</em> embedded itself into my brain and disguised itself as subconscious or "human nature".</p>]]></description> </item> <item> <title><![CDATA[Deploying a Static website with Svelte-Kit, Docker, and Coolify. Or: Coolify is a neat platform.]]></title> <link>https://thomaswilson.xyz/blog/2024-11-22-deploying-a-static-website-with-svelte-kit-docker-and-coolify-or-coolify-is-a-neat-platform</link> <guid>https://thomaswilson.xyz/blog/2024-11-22-deploying-a-static-website-with-svelte-kit-docker-and-coolify-or-coolify-is-a-neat-platform</guid> <pubDate>Fri, 22 Nov 2024 14:21:13 GMT</pubDate> <description><![CDATA[<p>Tl;dr: Dockerfile is at the bottom of this blog post.</p> <p>I wrote last week about using Coolify to deploy a Ghost blog platform with <em>just</em> a Dockerfile (like, text pasted into a <code>textarea</code> on a web interface). That's <em>really</em> cool - and (to me) the power fantasy of OSS, without the tedium.</p> <p>I used to write up lists of my favourite albums of each year. They used to be endpoints on my websites (like <code>https://www.thomaswilson.xyz/albums/2019</code>). I used to do a lot of art-direction on these pages, so they used to be on special URLs, not good old markdown.</p> <p>I wanted to do another one of those pages this year. Why? Because music is joyful and hopeful, and sometimes it's easy to forget about joy and hope. Also, like, how do you actually discover new music as an adult?</p> <p>The answer: you and your friends all make custom web pages that you deploy on subdomains, and host for cheap on your own VPS.</p> <p>The problem is that barely six years since I had a custom-built website, I've re-written the whole thing maybe three times (I think it was in Vue for a minute there, pretty off-meta for 2024 Wilson). Anyway those lists have gone, RIP.</p> <p>And I don't want to make another list this year, sort of knowing it'll be gone in five years.</p> <p>Enter, subdomains. Instead of having <code>https://www.thomaswilxon.xyz/albums/2019</code>, I can have <code>https://albums2019.thomaswilson.xyz</code>. Because of the pipes of the internet, this will just route the request to somewhere entirely different from my main site (which you might be on right now!).</p> <p>And now I've got a little server with Coolify running, this whole infrastructure built to let me deploy cool little sites like this. I imagine it could do complex things too, but because my web framework <em>du jour</em> is SvelteKit - it's going to get spit out as just a bunch of HTML, CSS, and JS files.</p> <p>Cool ! Web servers know exactly what to do with this.</p> <p>The code's below, but it was so, so easy to use Coolify to set this up. It took ~30 minutes, with Friday afternoon brain, and on patchy café wifi. This is my second-ever self-hosted PaaS deployment, and I couldn't be happier !</p> <h2>Show me the code</h2> <p>Yep, of course.</p> <p>Install the static adapter (so Svelte knows to build the site as generated, static HTML, CSS, and JS files):</p> <pre><code>$ pnpm add @sveltejs/adapter-static </code></pre> <p>I then followed the two steps on the <a href="https://svelte.dev/docs/kit/adapter-static">official documentation</a>. At the root of my app, I let Svelte know that pre-rendering is cool:</p> <pre><code>// src/routes/+layout.ts export const prerender = true; </code></pre> <p>And then I told Svelte to build the app using the static adapter</p> <pre><code class="language-js">// svelte.config.js import adapter from '@sveltejs/adapter-static'; const config = { // .. some other stuff kit: { // adapter-auto only supports some environments, see https://svelte.dev/docs/kit/adapter-auto for a list. // If your environment is not supported, or you settled on a specific environment, switch out the adapter. // See https://svelte.dev/docs/kit/adapters for more information about adapters. adapter: adapter({ pages: 'build', assets: 'build', fallback: undefined, precompress: false, strict: true }) } export default config; </code></pre> <p>I spun up the following Dockerfile in the root of the repo:</p> <pre><code class="language-Dockerfile"># Use the official Node.js image as the base image FROM node:18-alpine AS build # Set the working directory WORKDIR /app # Install pnpm RUN npm install -g pnpm # Copy package.json and package-lock.json COPY package.json pnpm-lock.yaml ./ # Install dependencies RUN pnpm install # Copy the rest of the application code COPY . . # Build the SvelteKit app RUN pnpm build # Use a lightweight web server to serve the static files FROM nginx:alpine # Copy the build output to the nginx html directory COPY --from=build /app/build /usr/share/nginx/html # Expose port 80 EXPOSE 80 # Start nginx CMD ["nginx", "-g", "daemon off;"] </code></pre> <p>Using the Coolify UI I spun up a new resource, pointing at my (public) GitHub repo, and specified to build from a Dockerfile. Because that Dockerfile is now present, and running the <code>build</code> script which is pointing towards the <code>adapter-static</code>.</p>]]></description> </item> <item> <title><![CDATA[Vibe Check #20]]></title> <link>https://thomaswilson.xyz/blog/2024-12-01-vibe-check-20</link> <guid>https://thomaswilson.xyz/blog/2024-12-01-vibe-check-20</guid> <pubDate>Sun, 01 Dec 2024 08:09:08 GMT</pubDate> <description><![CDATA[<p>I used to write a <em>Vibe Check</em> blog post at the end of each month. I haven't written one for six or seven months, and I miss writing them. But also I have been busy.</p> <p><img src="https://www.herearethose.photos/api/files/9efeb603-e2e9-4176-b21c-136e78cd04f4/cdn?viewport=lg" alt="Mists on the River Thames"></p> <p><img src="https://www.herearethose.photos/api/files/87680c45-66f0-4ea5-bab1-ee72a86cbe05/cdn?viewport=lg" alt="The view from Brill Hill"></p> <p>November 2024 was a very autumnal month. Here in Oxford it's been blustery, and it's been flood-y. Parts of the Tow Path, both up- and down-stream have been intermittently under 5cm-50cm of water for the last couple of weeks. We had a flurry of snow a couple weeks back, too - making the world crisp and etherial for a few hours.</p> <p>It's also been my penultimate month at my current job. In the new year I start a new position, returning to a more leadership-y role. I wanted the transition from <em>Head Of</em> to <em>Senior</em>, but I don't think it matches my sensibilities. I am, for better and worse, unable to see something and <em>not</em> voice my opinion of it. I know about grasses and fences, but I'm hopeful that being able to lean into this a little more will make me happier.</p> <p>It's winter, and so I have adopted my favourite winter sport: knitting. This year I'm learning to make socks. Having started one on double-pointed needles (DPNs), I frogged it…</p> <blockquote> <p>Another word in knitting for “undoâ€, is “ripâ€. When you are undoing stitches, we often say you are “ripping itâ€. IE: “Rip it, Rip it†sounds like “ribbit ribbit†and that’s how we get the term Frogging. (<a href="https://www.knittinginthepark.com/to-frog-or-not-to-frog/">knittinginthepark.com</a>)</p> </blockquote> <p>I've now started again on circular needles: the ones are that two needles, connected with a little cable running between them - though "cable" in knitting means something else. I forget how good knitting is for mostly-listening work meetings. It's something to do with my hands, and helps me focus, and not want to check emails/slack (which I would never do in a meeting, obviously).</p> <p>Christmas approaches. I think the household will see its first decoration before the sun goes down on Monday (it is Sunday as I write this). I <em>love</em> Christmas decorations. Make the house all cosy and bright, as the rhythms of the natural world continue to slow themselves. I find the first six weeks after solstice the most difficult - nature needs a rest, as we all do, and as it lies in wait of for friendly conditions. It very sensibly seeks to wait-it-out.</p> <p>I am reminded always of how much more harrowing winter would have been for my ancestors. How lucky I am to live in a time with fairy lights and central heating, microwaves and freezers.</p>]]></description> </item> <item> <title><![CDATA[Vibe Check #21]]></title> <link>https://thomaswilson.xyz/blog/2025-01-09-vibe-check-21</link> <guid>https://thomaswilson.xyz/blog/2025-01-09-vibe-check-21</guid> <pubDate>Thu, 09 Jan 2025 00:00:00 GMT</pubDate> <description><![CDATA[<p><img src="https://www.herearethose.photos/api/files/76032892-8c71-4a69-80a9-cee58525b6bd/cdn?viewport=lg" alt=""> December comes to us, mild in temperament and temperature this year. Although this season didn't see quite the Grand Social Obligations Tour that previous festive periods have, the household has remained busy (and largely healthy) through December, something to always be celebrated.</p> <p>The month contained moments of great personal and social delight which, though both real and invaluable, aren't fit to share far and wide on the open internet. Let the record show that I feel both grateful and fulfilled by the people in my life, and my relationships to them.</p> <p>December 2024 saw my last working day at my (now previous) job as a Senior Software Engineer. In a few weeks I'll be starting a more leadership-focused position in a larger organisation, with a much larger technical footprint. I am excited, and glad to have taken a short (three-week) break between positions. Time off has a funny way of being neither as much time, nor off, as one expects at the outset.</p> <p>A few months before the end of 2024 I wrote a list of projects I had started, and wanted to finish. These were things I <em>wanted</em> to finish but which had started dragging. I am proud to report that in the last four weeks of 2024, I managed to:</p> <ol> <li>Finish knitting my first pair of socks</li> <li>Finish the second book in John Gwynne's <em>Bloodsword Saga</em></li> </ol> <p>I continue to make a lot of my own clothes. My relationship to this practice <em>is</em> getting more complicated. I have a lot of thoughts about how inaccessible the knowledge of "proper" tailoring and garment construction is. I wonder if that's a "real" problem, or only a "me" problem. I am infuriated by how often "you just have to know" is the answer to questions, and I wonder how much <a href="https://en.wikipedia.org/wiki/Cargo_cult">Cargo Culting</a> or Rain Dancing (i.e. rituals seem to have previously worked, but through unclear mechanisms) happens here.</p> <p>But I am delighted to report that knitting has little to none of this. My experience has been that people are <em>delighted</em> to provide you with very clear, standardised instructions on how to make a pair of socks. Even better, similar services are available for many other garments! I am also currently batting 100% on "unclear instructions that an LLM can help clarify". It definitely takes <em>longer</em> to make knitted garments - <em>weeks</em> for two socks - and one cannot practically wear only knitted cloths, but it is a skill I am grateful to have, and to improve.</p> <p>I wanted the pressure to finish the garment precisely for this reason: it is refreshing and I am glad to have done it, but I found it hard to assign time to it.</p> <p>The book was a similar story: a recently-completed trilogy that I am actively enjoying. But at 600-some pages, and as a physical book (I am 1:2 on books:audiobooks) I found myself picking up, and finishing, books around it. By setting the end-of-year marker, I was able to leave that feeling of drag behind. And it feels fantastic.</p>]]></description> </item> <item> <title><![CDATA[Letter to MP against support of Shein IPO]]></title> <link>https://thomaswilson.xyz/blog/2025-01-16-letter-to-mp-against-support-of-shein-ipo</link> <guid>https://thomaswilson.xyz/blog/2025-01-16-letter-to-mp-against-support-of-shein-ipo</guid> <pubDate>Thu, 16 Jan 2025 00:00:00 GMT</pubDate> <description><![CDATA[<p>The following is an extract from a letter I sent to my MP in January 2025 to express my concerns about Shein's attempts to make an initial public offering (IPO), while continuing to source cotton from slave labour.</p> <p>I post it because this year I want to take seriously my involvement in democracy, and part of that is expressing our opinions clearly to the people who represent us in government.</p> <p>The body of the letter follows below:</p> <hr> <p>I am sure you are aware that on January 7, Shein, the global fast-fashion company founded in China and headquartered in Singapore, attended a parliamentary hearing with the Business Select Committee<sup><a href="#user-content-fn-parliament" id="user-content-fnref-parliament" data-footnote-ref aria-describedby="footnote-label">1</a></sup> (BSC).</p> <p>Shein seems to be seeking an Initial Public Offering (IPO) on the London Stock Exchange, after their recent (2024) bid for the same on the New York Stock Exchange, which appears to have been withdrawn<sup><a href="#user-content-fn-bbc-ipo" id="user-content-fnref-bbc-ipo" data-footnote-ref aria-describedby="footnote-label">2</a></sup></p> <p>It is likely that their failure to list in New York was due to concerns about Shein using cotton sourced from the Xinjiang region of China in garments they produce and sell. The Xinjiang region has been associated with sustained "systemic policies of mass detention, torture, and cultural persecution"<sup><a href="#user-content-fn-hrw" id="user-content-fnref-hrw" data-footnote-ref aria-describedby="footnote-label">3</a></sup> against Uyghurs, which Human Rights Watch have called crimes against humanity. In 2022 independent testing of cotton from a variety of garments bought from Shein were found to contain cotton, at least partially, from the Xinjiang region of China<sup><a href="#user-content-fn-bloomberg" id="user-content-fnref-bloomberg" data-footnote-ref aria-describedby="footnote-label">4</a></sup>. Shein did not provide any comment on these test results at the time.</p> <p>Due, in part, to human rights concerns the United States government signed the Uyghur Forced Labor Prevention Act in 2021, which prohibits the import of materials manufactured in whole or in part within the region. It seems likely that this legal framework contributed to a New York IPO being non-viable.</p> <p>In the context of a London IPO, I was delighted to watch the BSC chair question Shein's General Counsel with the clear intention of addressing the core issues. I was frustrated and unimpressed when it was clear that Shein's General Counsel was unwilling or unable to answer this line of questioning with any specific facts or company policies about their sourcing and labour standards in their supply chain.</p> <p>In 2024 Shein's Executive Chairman Donald Tang visited Paris and London, stating: "we are going public to embrace scrutiny and public diligence, putting ourselves in the public square and the large fish tank for people to examine, asking questions"<sup><a href="#user-content-fn-politico" id="user-content-fnref-politico" data-footnote-ref aria-describedby="footnote-label">5</a></sup></p> <p>This recent hearing with the BSC was an opportunity for Shein to demonstrate, to the public and government, their commitment to scrutiny and diligence. In reality, their response "bordered on contempt", to quote the meeting chair.</p> <p>Shein are clearly a well-resourced company who have consistently prioritised optimisation-via-data into a very favourable market valuation. Over the last few years, this same company faced sustained, justified, and frankly extremely worrying concerns about their supply chain. They have been questioned by organisations from the United States, European Union, and now Great Britain. Their public actions suggest Shein is a company uninterested in answering scrutiny, but instead interested in lip service and a dominant market position to the exclusion of competition, even if that involves slave labour.</p> <p>We have yet to see Shein make tangible improvements to its supply chain. At the very least they should be able to articulate and defend policies regarding its sourcing and labour practices. Moreover, we should expect them to enact and enforce them.</p> <p>It is extremely clear to you and I both that it is never acceptable to violate human rights. Shein, and other companies, appear to see their involvement in modern slavery to be a justifiable or non-noteworthy cost of doing business.</p> <p>I do not want business to be this way. I do not wish for London's Stock Exchange to offer any kind of endorsement to these practices.</p> <p>The fact is that many clothing companies in Great Britain exist today that make the lives of their workers <em>better</em>. That take great care to source materials fairly and sustainably, investing in the lives of their labour force.</p> <p>This government has clearly articulated, many times, that it wishes to support working people. This involves setting a global example of a developed economy protecting the lives and labour which support it. I do not think anybody wants a country where violation of human rights becomes an acceptable or ignorable practice at certain scales of operation.</p> <p>I want to have conversations about things more visionary than a life free from slavery. I want certainty that the clothes that fill our wardrobes (and increasingly, our landfills) didn't necessitate slavery. But while it is possible for individuals and companies to accumulate immense wealth by doing exactly this, we simply cannot have those discussions.</p> <hr> <section data-footnotes class="footnotes"><sup class="sr-only" id="footnote-label">notes</sup> <ol> <li id="user-content-fn-parliament"> <p><a href="https://committees.parliament.uk/committee/365/business-and-trade-committee/news/204582/btc-questions-shein-temu-mcdonalds-tesco-antislavery-commissioner-on-labour-rights-and-supply-chain-integrity/">BTC questions Shein, Temu, McDonalds, Tesco, Anti-Slavery Commissioner on labour rights and supply chain integrity (parliament.uk)</a> <a href="#user-content-fnref-parliament" data-footnote-backref="" aria-label="Back to reference 1" class="data-footnote-backref">↩</a></p> </li> <li id="user-content-fn-bbc-ipo"> <p><a href="https://www.bbc.co.uk/news/articles/c9xx8l600z6o">Fashion giant Shein closer to London listing (bbc.co.uk)</a> <a href="#user-content-fnref-bbc-ipo" data-footnote-backref="" aria-label="Back to reference 2" class="data-footnote-backref">↩</a></p> </li> <li id="user-content-fn-hrw"> <p><a href="https://www.hrw.org/news/2021/04/19/china-crimes-against-humanity-xinjiang">China: Crimes Against Humanity in Xinjiang (hrw.org)</a> <a href="#user-content-fnref-hrw" data-footnote-backref="" aria-label="Back to reference 3" class="data-footnote-backref">↩</a></p> </li> <li id="user-content-fn-bloomberg"> <p><a href="https://www.bloomberg.com/news/features/2022-11-21/shein-s-cotton-clothes-tied-to-xinjiang-china-region-accused-of-forced-labor">Shein’s Cotton Tied to Chinese Region Accused of Forced Labor (bloomberg.com; paywall)</a> <a href="#user-content-fnref-bloomberg" data-footnote-backref="" aria-label="Back to reference 4" class="data-footnote-backref">↩</a></p> </li> <li id="user-content-fn-politico"> <p><a href="https://www.politico.eu/article/china-shein-european-regulation-dumping-forced-labor-pollution-donald-tang-geopolitics/">China’s Shein sweet-talks EU to stave off hurdles on ‘fast fashion’ goods (politico.eu)</a> <a href="#user-content-fnref-politico" data-footnote-backref="" aria-label="Back to reference 5" class="data-footnote-backref">↩</a></p> </li> </ol> </section>]]></description> </item> <item> <title><![CDATA[Vibe Check #22]]></title> <link>https://thomaswilson.xyz/blog/2025-02-02-vibe-check-22</link> <guid>https://thomaswilson.xyz/blog/2025-02-02-vibe-check-22</guid> <pubDate>Sun, 02 Feb 2025 18:08:00 GMT</pubDate> <description><![CDATA[<p>January gets a bad wrap. As someone with a January birthday I try not to take it personally. I also spent the first three weeks of January 2025 intentionally between jobs - being free of work commitments, but assured of upcoming employment, I personally found this to be a most agreeable month.</p> <p>Much of my free time was, as expected, spent doing house-related admin. I fear that time completely divorced from any societal or administrative obligations would leave me marooned. So in may ways, the chores were a gift that I am grateful for. In many other ways, I long for a time without chores.</p> <p>Having so much free time allowed me to finished three books, as well as start a fourth. For some people I suspect this would be an unremarkable reading rate - but it's the most I've read in the last twelve months. I was rewarded handsomely for it, and I stumbled across some of the best books I have read in recent memory.</p> <p>I have scattered thoughts I would like to collate, but for now take some short-form reviews in their stead:</p> <ul> <li><em>Ring the Hill</em> by Tom Cox. This book is equal parts nature writing, memoir, and essay. It happens to be one of the funniest, warmest, most generous pieces of writing I have read in a while. I have already gifted a copy and leant mine out.</li> <li><em>Half Arse Human</em> by Leena Norms. The expectations of "YouTuber book" would be misleading. Intentionally published in January to ride the New Year New Me wave, Norms advocates for small and sustained changes over large and fading ones. She calls for community and collective action, reminding us of the part we play in that, like talking to our friends, finding new friends, or writing to our MPs.</li> <li><em>Man's Search for Meaning</em> by Viktor E. Frankl. In only a hundred pages, Frankl summarises his experiences as a Jewish Prisoner of War during WW2, including his time in Auschwitz. The edition I had then followed with a brief introduction to Logotherapy, a field pioneered by Dr. Frankl, among others. I don't know how you go about reviewing somebody writing about their first-hand experiences in Auschwitz. This is an important book, and Dr. Frankl was, by all accounts, a remarkable man, doctor, and writer. He lived, by the way, to ninety-two years-old.</li> </ul> <p>This past week I have started my new job. As such I have set myself a pure fantasy book, Fonda Lee's <em>Jade City</em>, the first in a Japanese-inspired mafia story. The average Good Reads rating of each successive book in the trilogy gets higher, and this first book certainly feels like it is laying groundwork. I had to make a diagram of people, clans, companies, and their relationships. It's worked, though ! The latter books are available from my public library, so I suspect I will finish the series there in the following months.</p> <p><strong>As for sewing</strong>, I have drafted a waistcoat pattern, using the Müller&Sohn system - and took some of the time between jobs to work on the construction. I found the <a href="https://www.handcrafttailor.com/">Handcraft Tailor Academy's</a> short video short course on waistcoat assembly (<a href="https://vimeo.com/ondemand/thehtasbwaistcoat/">link</a>) super helpful for the construction. The existing resources for assembly I have assumed a slightly different cut/pattern (one with a joined-up collar or back) - but this course did not.</p> <p>The videos show a few handy tricks for some of the finer tailoring details. At the moment I really appreciate these finer details, which are often finished, if not entirely constructed, by hand. I think working like this reminds me how much of a garment is a living, malleable thing - not static and unyielding. It lets me take my time with pressing, folding, easing - to create a garment that feels more precisely constructed.</p> <p>Yes, it's slower construction - but the slowness can be a feature.</p> <p><strong>Personally, I have</strong> been frustrated by inclement weather. Rain, winds, and frost have kept me off of my bike. The return of dance and exercise classes has kept me a little saner. But just today I am returned from a three-hour bike ride, on a Sunday, in the sun. Few things feel more restorative to my soul.</p> <p>I managed to journal most every day this month, and feel fresher for it.</p> <p>In all, I thrive.</p> <p><strong>Stray Links</strong></p> <ul> <li>"I knew one day I’d have to watch powerful men burn the world down – I just didn’t expect them to be such losers" by Rebecca Shaw, The Guardian (<a href="https://www.theguardian.com/commentisfree/2025/jan/16/i-knew-one-day-id-have-to-watch-powerful-men-burn-the-world-down-i-just-didnt-expect-them-to-be-such-losers">link</a>)</li> <li><em>American Fiction</em>, Film, 2023. The best film I saw this month, novel-like. (<a href="https://letterboxd.com/film/american-fiction/">Letterboxd link</a>)</li> <li>"Your Billions Will Not Grant You An Exemption From The Indignity Of Death" by Tom Cox (<a href="https://tomcox.substack.com/p/your-billions-will-not-grant-you">link</a>)</li> </ul>]]></description> </item> <item> <title><![CDATA[Book Review: wow, no thank you]]></title> <link>https://thomaswilson.xyz/blog/wow-no-thank-you</link> <guid>https://thomaswilson.xyz/blog/wow-no-thank-you</guid> <pubDate>Tue, 01 Sep 2020 12:00:00 GMT</pubDate> <description><![CDATA[<p>Samantha Irby came onto my radar in 2019 after a reading slump from that time I was burned out by my job in a VC startup. <em>We are never meeting in real life</em>, her previous set of essays published in 2017, was displayed prominently in a central London bookstore it was a) bright yellow, and b) covered in a picture of a hateful cat - so I started believing in destiny and bought the book, read the book, and adored it.</p> <p>In 2020 I went through a reading slump because of burnout caused by being freelance but also by the extremely pressing apocalyptic vibes of the time (which have totally passed). This time, Irby let me know that she was publishing another set of works on Instagram (by public posts, not DMs) and rather than thinking about how I'm likely to deal with burnout in this cyclical manner until something changes, I bought the book, read the book, and felt a little bit better.</p> <p>This is the second time Irby's books have been a tonic for worrying cases of Readers-Block - something I don't want to google because I'm really hoping I just made it up<sup><a href="#user-content-fn-1" id="user-content-fnref-1" data-footnote-ref aria-describedby="footnote-label">1</a></sup>. I read this book quickly because it is short, not because I am fast at reading - but I did read it quickly nevertheless, and I was sad it was over.</p> <p>Despite the affection I feel towards this book and Irby's writing style, I have a hard time describing anything about her writing in a way that would make anybody actually want to read it. So if you think you're in the market for cathartic, nsfw, but still celebratory personal essays - then you should buy this book. If you can laugh at yourself and the way you're far less cooler than you want to be, but also low-key maybe resent yourself for it - then buy this book. It's good and it's funny and the days are long enough without having to read the contemporary literary city romance <em>du jour</em> just because everyone else is reading it and you don't want to.</p> <p>Now please, let me try and explain the punchline to somebody else's joke. Irby will let you know, in pretty much these exact words, that she either is, or has been, a dirtbag with leaky bowels who thought for much of her life that she would die alone, played out by endless CSI re-runs that dance light across her decaying body in an tiny flat in Chicago. But she's funny with it, ya know?</p> <p>For example, in <em>we are never meeting in real life</em> she writes in one essay about the time she had ate a bad hamburger before an interstate drive and had to squat out diarrhoea on the side of the standstill, snow-covered highway in front of strangers and also her college friends. And then in literally the next piece she writes about her dead father. In <em>wow, no thank you</em> Irby flits well between insecurities in her roles as a step mum, staff writer in Hollywood (lol what), Somewhat Famous Person, friend, and newly middle-aged woman. But she also speaks about how, obviously, she shouldn't get a dog, about how dirt-poor she was growing up, and generally what an all round gross kinda human she was and continues to be.</p> <p>I like self-derogatory humour. Some people use it as a way to fish for complements, some people genuinely think they're hot trash, but other people, like Samantha Irby, can talk bad about themselves and somehow do it without damaging meanness and with surprising tenderness and patience. <em>Wow, no thank you</em> is a hopeful book, and it made me feel less alone and strange. Even though nothing I just wrote (not even that bit about shitting on the side of the highway) would lead you to think that.</p> <p>At the same time, Irby doesn't smother you with "just be yourself 🦄🌈🌹" or hashtag-relatable content. I've never got the impression that Irby is saying something just to make you feel good or just to make herself feel bad - she's just... talking. But talking in a way where she can tweak, re-word, refine, and prune the anecdote so that when you finally sit down for coffee/cocktails with her, the stories are honed. Sometimes they ramble, but so do I.</p> <p>I enjoyed <em>wow, no thank you</em> - obviously. It's not scribbled with notes in the margin and I'm not going to get it tattooed on by body, but it's dog-eared and battered from where I got half way through a chapter on a train or used it to grind along a kerbside (or however else it got so damaged). It's the kind of book you can easily resume and easily pause and therefore the kind of book that deserves to become a bit battered. I'd recommend it, yeah.</p> <section data-footnotes class="footnotes"><sup class="sr-only" id="footnote-label">notes</sup> <ol> <li id="user-content-fn-1"> <p>I just googled it and I'm definitely not the first person to be this clever which is not surprising but it is a shame. <a href="#user-content-fnref-1" data-footnote-backref="" aria-label="Back to reference 1" class="data-footnote-backref">↩</a></p> </li> </ol> </section>]]></description> <category domain="https://thomaswilson.xyz/blog">Book Review</category> </item> <item> <title><![CDATA[Book Review: how do we know we're doing it right?]]></title> <link>https://thomaswilson.xyz/blog/how-do-we-know-were-doing-it-right</link> <guid>https://thomaswilson.xyz/blog/how-do-we-know-were-doing-it-right</guid> <pubDate>Sun, 20 Sep 2020 00:00:00 GMT</pubDate> <description><![CDATA[<p>Sykes' collection of essays covers a surprisingly large amount of ground for a relatively short book. She turns her attention to a lot of the inner turmoils that seem to plague millennials' inner monologues, as well as broader societal issues: fast fashion, the "true self", instagram husbands, and work-life balance all feature. <em>How do we know we're doing it right?</em> clearly comes from a lot of careful conversations, introspection, and research but at times Sykes seems to lose herself under disjointed quotations of other peoples' words. When she does start to connect others' research to her own opinion, the two feel a little disjointed, which is a shame because both raise good points worth discussing.</p> <p>I hadn't heard of Pandora Sykes before I saw this book in a local bookshop. I'm a sucker for strong feminist essayists, and also for buying books on a whim so I picked this up. It turns out this is Sykes' first collection of essays, though she's a seasoned editor, journalist, and broadcaster according to <a href="https://pandorasykes.com/">her own website</a>.</p> <p>I was initially worried that I'd bought a well-written book aimed at a more female more middle-aged more parent audience. The first couple of chapters spoke about parenthood and domestic life, and the environmental and psychological toles of fast fashion. Both of these things are issues that we should all be aware of, regardless of our role as child guardian or garment buyer, but both aren't things I spend a lot of my time being affected by<sup><a href="#user-content-fn-1" id="user-content-fnref-1" data-footnote-ref aria-describedby="footnote-label">1</a></sup>. Not to brag, but I have practically no children and I'm really trying to avoid shopping in H&M (or at least feeling appropriately guilty when I do). Though it was fun to have a well-spoken and funny woman complain about the state of a hypothetical husband and baby-daddy - some parts of the book definitely felt less relevant or less targeted at me. I could clearly see what was being said, I just couldn't relate.</p> <p>And then something happened. Suddenly Sykes was talking my language: in talking about social media use and its effects on us, she spoke about her own very purposefully spent time unplugged not because it was "so good" or "well balanced" but because she recognised it's what <em>she</em> needs for <em>her</em> brain to function in a way that makes <em>her</em> happy. Not because she wants to humble-brag or shame others, but because genuinely it is the right choice for her. This is something I've had simmering at the back of my brain for a while: that the inner monologue a lot of creatives rely on is being pushed aside for this content. It's not even limited to creatives - everyone can benefit from providing their mind more unoccupied space move in, or less noise to speak above depending on your metaphor of choice.</p> <p>She mentions, but I don't think does justice, to the constant input from, or demands made by, technology on our attention and time. She makes some really great points about <a href="https://longreads.com/2019/04/26/when-did-pop-culture-become-homework/">Cultural Homework</a> - about how there's always <em>that</em> series or film to watch. But this almost already feels outdated against the algorithm-run media platforms of Twitter, podcasts, YouTube, and Netflix. There's always more material, there's always something "we think you'll love" or something "everybody's talking about" even if no one you know ever actually speaks about it. These recommendations will be served up to you unless you actively stop it. This is a different point to the Cultural Homework idea, but I think it's got a lot more potential to destroy the internal conversations, meandering thoughts, and quiet moments that make us... us.</p> <p>I'm a software engineer by day but creative by night, and these are issues I think about a lot, so I don't think it's fair to judge someone's work for not writing about things that I personally find very interesting. In all, Sykes does what all good essayists do: taken some nebulous thoughts and feelings and put them into coherent words.</p> <p>It's also wonderful to hear the strong feminist currents through pretty much all the pieces. Sexism, like any other kind of prejudice, is plagued by the idea of a <em>micro-aggression</em>. While the right wing of the political spectrum have got a hold of this word and use is pejoratively to dismiss any discontent as an overreaction, Sykes is able to pinpoint specific examples and lay them in front of you. When she's talking about social media usage from a woman's perspective it becomes plain how female empowerment, voice, and worth still rely on external validation for their power, which often comes from their aesthetic beauty.</p> <p>This slight shifting of the rules is not the same as the ground-up change that we need. Changing the standards of "beauty" is not the same as changing the "source of power". It's easy to be placated by a celebration of stretch marks and natural hair (looking at you, Kendrick) and Sykes reminds us that we still need to go further.</p> <p>As a dude, I don't want to talk about why something might make me feel inexplicably <em>icky</em>, because often I am a witness not a participant, and often the last thing we need now is another dude speaking on behalf of women. This means that I don't have a lot of experience putting into words why something makes me feel <em>icky</em> - but this book gave me that. It gave me concrete examples and it gave me a well-considered viewpoint from both a participant and an observer perspective.</p> <p>And she does all this without ever asking for, or demanding, you believe her. Perhaps if I came into this book without already agreeing with her, I wouldn't have found the arguments so convincing. But I don't think her intention is to convince or persuade so directly. I might as well score the book a 0 because it taught me nothing about the economics of wool in 1400s Morocco. Instead, the tone I got was of someone patiently and considerately explaining why they think and act the way they do, and let's stop for a second to realise that this is totally the ~~~magic of books~~~ and the wonder of reading.</p> <p>While it's very clear that she has her own opinion on the matter, this often feels disconnected from the citations or research she puts in. She'll often throw in a bunch of quotes from books, or personal e-mail exchanges (which aren't published by the way, but I'd 100% read that in a serialised newsletter, Sykes) and then in a paragraph move onto something which feels... sort of related? I got a lot of good book and author recommendations, but it felt like she had a quota for her bibliography? I'd prefer to see these references linked better into the main body of text, or at least acknowledged consistently. Sometimes she'll come back to mention and author or a work, but a lot of the time it's "as [AUTHOR] says in [WORK] 'word word word'" and then we never hear about [AUTHOR] or [WORK] again in any detail.</p> <p>With that said, I would recommend this book. I made a lot of notes in the margins - I got a lot of good further reading, and she gave me a lot of examples and words for things which I will use in the future. I look forward to anything Sykes write in the future and I'll definitely pick it up, as I think there's room for a tighter, more informed writing style. Alternatively, she can keep things just the way she is, and I can feel like my clever patient badass friend is explaining things to me and I'd still read it. 3.5â</p> <section data-footnotes class="footnotes"><sup class="sr-only" id="footnote-label">notes</sup> <ol> <li id="user-content-fn-1"> <p>Men can be equally as targeted by fashion marketing which preys on insecurities - fortunately the algorithms that serve us adverts never place them in front of me. <a href="#user-content-fnref-1" data-footnote-backref="" aria-label="Back to reference 1" class="data-footnote-backref">↩</a></p> </li> </ol> </section>]]></description> <category domain="https://thomaswilson.xyz/blog">Book Review</category> </item> <item> <title><![CDATA[Book Review: Queenie]]></title> <link>https://thomaswilson.xyz/blog/queenie</link> <guid>https://thomaswilson.xyz/blog/queenie</guid> <pubDate>Sat, 26 Sep 2020 00:00:00 GMT</pubDate> <description><![CDATA[<p><em>Queenie</em> is an excellent debut by Carty-William. The novel's titular narrator pins you to the page - she has a strong and unique voice, yet also unreliable and unlikable at times. It takes you through something which feels both personal and also cultural: micro-aggressions, personal and collective trauma, mental health, and love and friendship in the early 21st century. It's a really gripping and motivating work that Carty-Williams manages to end on a hopeful, if a little well-trodden, note.</p> <p><em>Queenie</em> is first-person narrative of a mid-twenties Jamaican-British woman living in London as she comes out of a big breakup. I can easily see the narrative resonating best with a younger audience, with sprinklings of e-mails and WhatsApp Group Chats scattered throughout the narrative, it feels like how I talk with my friends: frequently and with short messages. She's funny, but it rarely feels jarring or gimmicky or unrealistic. Sometimes the humour's intentional, sometimes its situational</p> <p>As well as the titular Queenie, the book has a (mostly younger) cast of friends, colleagues, family members, and a whole bunch of awful men. I'm serious, there are a lot of terrible men in this book, one of them calls his penis "The Destroyer", one of them licks Queenie's shoulder and says it "tastes like chocolate", even towards the end of the book they stop getting human names, and just get nicknames (Balding Alpha) which I think is a really nice subtle mechanic. Terrible men aside, Queenie's sassy young best friends (The Corgis) are 100% here for it, and her Jamaican family are trying their best. Sometimes the friends feel a little relegated to "best friends of the protagonist", but that fits nicely with the sometimes selfish first-person perspective that dominates at least the first half of the book. Either way, it's nice to see non-romantic love given a lot of screen time and responsibility in forming a life in response to a trauma. Even if our narrator doesn't acknowledge it or see it all the time, the book's got a lovely sense of community.</p> <p>As someone not from an immigrant family, who hasn't spent significant time in the homes of any first or second generation immigrant families - the and cultural presence and attitudes within a Jamaican household unit was introduced well and treated kindly. There is no othering of any party, nor does anyone explain more than is strictly necessary - you get a good sense at how some people live their day-to-day lives, and that's lovely.</p> <p>I can however, speak more for life as a young person in London. <em>Queenie</em> is so clearly written by someone who lives, walks, and sees London. The painting of strangers, her relationships with her friends and co-workers, the bemoaned but helpless state of gentrification. As someone who also loves this city, it felt right at home. Similarly, as someone in their late twenties who doesn't doesn't feel as though they have their life together, as if some friendships <em>are</em> competitive and some life goals <em>are</em> unfulfilled - this book makes me feel seen and a little less worried. It doesn't belittle or undermine the time and personal effort it can take to rebuild a life after something comes through and sweeps all the pieces away. We all know these things, but it's never a bad thing to be reminded of.</p> <p>It's not always particularly easy or comfortable reading, but Carty-Williams has created a deeply personal narrative without serving them up through a parade of unlikely or unrealistic scenarios. Issues of personal and cultural trauma, and self-destructive self-esteem issues are put in front of you but they often go unexamined or un-critiqued by the narrator, both because they are not noteworthy to her but also because she does not have the ability to recognise or confront them herself. This book draws empathy out of you like an angry tired toddler going to sleep - you might not want it to happen, but your brain's going to do it anyway.</p> <p>I think this is made even more effective by the first-person narrative. The book feels personal, but more cohesive than a stream-of-consciousness might give. You get patterns and trains of thought which are mostly, but not always, refined or perfect. The first person perspective was pulled off very nicely by Carty-Williams. She combines this with elements of an unreliable narrator, with facts or events being omitted and only referenced later, sometimes by other characters. It's just enough to make you question Queenie, <em>despite</em> being inside her head. Similarly, the passing of time feels uneven and variable. This is an inveitable during a trauma or dramatic event - time can slip or crawl by, seemingly with little control over it. This is something we've <em>all</em> been experiencing in the COVID pandemic, so maybe I'm just a little sensitive to it right now.</p> <p>With that said, the pacing wasn't perfect. Somewhere in the second third it certainly slumped, and some events or plot points felt a little awkwardly placed. It's like Carty-Williams had something she wanted to show a part of Queenie, or contemporary racism in London, but which didn't fit naturally within the flow of the plot. It's hard to find space between your protagonists' redemptive narrative and an ongoing societal observation/criticism, and that certainly shows at times.</p> <p>On the whole though, <em>Queenie</em> handles societal criticisms with admirable maturity. With the recent massive (re-)rise in the Black Lives Matter movement throughout 2020, Carty-Williams manages to take an approach which does not feel cliché and which engages you in the conversation. It does not feel tired, fuelled entirely by emotion, or reliant on impersonal facts or figures. Carty-Williams has certainly benefited from the current awareness, but she does not depend on it. There doesn't seem to be any singular agenda being pushed ahead of the narrative and it remains foremost a work of fiction driven by characters and empathy. For someone who's interested in the lived experience of these cultural issues, <em>Queenie</em> provides them to you without always highlighting them. You get a real "oh cool this again" when people make what are quite clearly racist remarks, even though "I don't see colours" and "I'm not racist but..."</p> <p>I think a lot of people, young or old, would benefit from reading <em>Queenie</em>: it's a well written, narrative-driven book which communicates in a thousand subtle ways how it feels to be mid-late twenties in London in 2020. I can't speak to how it conveys the lived Black experience, but it is explained clearly and introduced without pandering. Even if you just want an interesting read to understand mental health a little better, this book will do that. I really liked this book and I'm very excited to see where Carty-Williams applies her noteworthy aptitude for character next. 4 â</p>]]></description> <category domain="https://thomaswilson.xyz/blog">Book Review</category> </item> <item> <title><![CDATA[Book Review: Cat's Cradle]]></title> <link>https://thomaswilson.xyz/blog/cats-cradle</link> <guid>https://thomaswilson.xyz/blog/cats-cradle</guid> <pubDate>Sat, 03 Oct 2020 00:00:00 GMT</pubDate> <description><![CDATA[<p>After <em>Slaughterhouse 5</em>, <em>Cat's Cradle</em> is the second Vonnegut book I've read. I've heard wonderful things about Vonnegut, and this book exemplifies a lot of those, namely uncomfortable observations and a black, dry humour. The book circles a number of themes, principally the dangers of purely objective or impersonal scientific research, and the role of religion to society and people. It hits these notes well throughout the piece, but I found the meandering, seemingly powerless, plot arch a little unstable at times - like there wasn't anything for me to reliably hold on to. Our narrator is very much at the whims of those around him, and feels more like a vehicle to show different things to the reader rather than a person.</p> <p>This lack of depth to our narrator could be purposeful - he is, after all, essentially writing a memoir which covers his (ultimately unsuccessful) attempt to write a biography of the Dr. Felix Hoenikker. Hoenikker is a scientist working on the creation of nuclear weapons, who is the classic absent-minded genius. Though fictional, Hoenikker is a semi-transparent copy of (the real) Irving Langmuir: the Nobel laureate who actually did once leave a tip for his wife after she prepared him breakfast at home.</p> <p>Hoenikker is dead, so we have to piece Hoenikker together from the testimonies of his children and people who knew him. We are presented a portrait of someone doing very dangerous work around nuclear weapons, but who cannot form or understand the most basic of relationships with even his immediate family. The placement of someone who is not aware of, let alone able to discuss, the moral implications of their possibly apocalyptic work is an undercurrent through the work. To be fair - it is an interesting note, it's easy to praise science for its own complexity, and forget the messiness of actually using it.</p> <p>From this setup, we get some moments which show moral indifference and ignorance as almost indistinguishable. Hoenikker's work is purely hypothetical to him and his kind, but globally important to the rest of the world. I have never had to struggle with in any of these questions in the real or immediate context (which I'm grateful for). It is fairly clear that the book was conceived in a place where the Arms Race and scientific research dominated the author's attention. Vonnegut clearly had to wrestle with these thoughts in a very applied setting. Historically and contextually, it is clear that this is a very important and well-timed book.</p> <p>The world and events which form around our narrator is often full of moments of black humour, of the absurd, of hypocrisy where all you could do is laugh. Which is, from what I hear, the realm of Vonnegut.</p> <p><em>Cats Cradle</em> also throws us into the existential ocean with Bokonism - a fictional religion created by Vonnegut. The essence of Bokonism lies with <em>foma</em> - which are harmless untruths, and the related belief in some kind of predestination. Bokonism explores the genesis, adoption, and persecution of a religion - it's a very concise, sometimes oversimplified (though often for humour) examination of religion.</p> <p>Again, here Vonnegut finds the most bleak or despairing parts of humanity and you're forced to laugh at it, because the alternative to feel a bone-deep worry or despair.</p> <p>Unfortunately, these ideas weren't enough to carry me through the book. They could have been if I had found the narrator a bit more fleshed out, a bit less willing to just accept everything. He feels like an observer, like his role is just to document what's happening. He's a journalist/author writing a book, so it wouldn't be odd to pair these observations with some kind of cross-reference, anecdotes, fact-checks, or journalistic flair. He didn't subtract from the story, but he definitely didn't add anything to the book.</p> <p>While this fits with the helplessness/comfort of predestination from Bokonism, and it is indeed fun to piece together the life/thoughts of a person through what other people share about them - the narrative itself just didn't engage me. Maybe I've been ruined by expecting too much to happen in a plot, but I don't think that's true.</p> <p>I felt I could have stopped reading at any point and not wonder about what was going to happen next. Especially towards the end of the book things just get more and more absurd, but it's left to us, the readers, to notice this absurdity. Which is a nice touch, but at the same time there doesn't seem to be a ceiling or climax to how weird things can get. There's no tension or threat, it just keeps getting weirder. This is only really in the last 10-20% of the book - it's a real gear change.</p> <p>Admittedly, it has been a while since I have read a "modern classic", and so I wonder if I would have enjoyed this book a little more if I was better prepared, more critical, or more aware of the historical/personal context. I read it in 2020, a year when literature served more of an escapist purpose than academic exercise. Nevertheless, the book had enough interesting ideas and darkly funny moments, and was frankly short enough, that none of these became deal breakers. I'm glad I have read it, I just didn't particularly savour the reading. 2.5â</p>]]></description> <category domain="https://thomaswilson.xyz/blog">Book Review</category> </item> <item> <title><![CDATA[Book Review: Hamnet]]></title> <link>https://thomaswilson.xyz/blog/hamnet</link> <guid>https://thomaswilson.xyz/blog/hamnet</guid> <pubDate>Sun, 18 Oct 2020 00:00:00 GMT</pubDate> <description><![CDATA[<p><em>Hamnet</em> follows Agnes, the wife of William Shakespeare, and her family - her brothers, children, in-laws - as well as several of the greater village populous. The book makes very few references to William, and never actually names him. He is always "he", "husband", "father", "him". Describing Agnes as "the wife", as I did mere sentences ago, serves only as an introduction, and as a drastic under-selling of Agnes.</p> <p>Set in a 1500s southern England, the book darts between the characters' present - following the life and early death of Hamnet, Agnes' only son - and the years preceding these events: Agnes' childhood, meeting her husband, raising a family. The heart of the plot is sparked by an historical fact: Shakespeare did have a son called Hamnet, who died aged 11 in 1596 from the "Pestilence" (the Black Death). Shakespeare never mentioned this death directly in his writing, and it's still unclear what impact this death had on the writer.</p> <p>O'Farrell never addresses this issue head-on, but rather through negative space and leaving feelings or events unaddressed or unexplained. This device is turned effectively against William, a man we know very little about - something which is true both in this book and in the broader historical perspective. His absence, rather than his presence, is what dominates this book.</p> <p><em>Hamnet</em> is an exploration of the death of a child, and how it could have such little evident impact on the work of someone from whom we have so much writing, and who we associate with such breadth and depth of human expression. Where did the grief and sadness go? Grief is certainly present in this book, though O'Farrell spends more time, and perhaps more effort, on the theme of our identity set against our family and work. She covers love in various forms, secrecy, obsession, and obscurity in engaging ways - because we are all many people, circumstances dependent. Agnes struggles to reconcile a free and wild upbringing with the confinements and expectations of house-bound married life to a man who is rarely present, in any sense of the word.</p> <p>Much of <em>Hamnet</em>'s story pins on character, with major plot events or twists being thin on the ground. O'Farrell shows us the small but rich inner lives of a village in the 1500s. We follow several characters throughout the book, and although Agnes is certainly given the most attention, O'Farrell has a way of fleshing out characters in short phrases and segments which, although sometimes spread many pages apart, feel cohesive.</p> <p>Just like you can't pull plot from character in this novel, I don't think you could pull character from language. To be frank, O'Farrell's use of language in this book is masterful. It is precise and pointed, it is emotive but it does not linger or repeat.</p> <p>There is a section near the middle where she describes how the Black Death arrived to England from Italy - it is a complete departure from the day-to-day lives in an English village, but she captures your attention and explains everything in human terms. This book paints portraits of people with familiar language, and allows the world to build around that - even if you don't realise you're building it.</p> <p>I also want to praise the light mystic / magical elements which O'Farrell scatters around Agnes. She is a woman who <em>knows</em> things. These are never fully addressed or explained, which is fitting: Agnes never questions or second guesses them herself. They are a part of her, and although Agnes knows other people don't have them, she never exploits or divulges too much to anybody. This adds an extra sense of life to the already very-much-alive world which O'Farrell has created as a backdrop to a vibrant piece of work.</p> <p>In <em>Hamnet</em>, O'Farrell has written a study of the human psyche when it cannot define or express itself. She has written in such transportive language, with light mystic elements, but the plot is almost irrelevant at times. There's a seeming lull in pace at certain points, and perhaps, at times, O'Farrell leaves a little too much unexplained or open to interpretation. Sometimes these are invitations to imagine the characters more deeply, but sometimes I felt conflicted or unsatisfied.</p> <p>Despite this, I would recommend reading <em>Hamnet</em> - ideally in the Autumn/Winter season, under fairy lights, perhaps with a coffee or tea while the rain thrums gently outside. It is a literary work of art, allow it to transport you somewhere else. 4.5 â</p>]]></description> <category domain="https://thomaswilson.xyz/blog">Book Review</category> </item> <item> <title><![CDATA[Book Review: An Absolutely Remarkable Thing]]></title> <link>https://thomaswilson.xyz/blog/an-absolutely-remarkable-thing</link> <guid>https://thomaswilson.xyz/blog/an-absolutely-remarkable-thing</guid> <pubDate>Sun, 08 Nov 2020 00:00:00 GMT</pubDate> <description><![CDATA[<p>An Absolutely Remarkable Thing (AART; because I'm not paid by the word here) is a wonderful Sci-Fi(-ish) adventure by Hank Green, one of the content creators in the first wave of the YouTube-meets-mainstream movement. It's a delightful first piece in his <em>The Carls</em> series, and even if the characters fall a little flat - the story is compelling enough to make this book a delightful and worthy read. Green's obviously got a lot to say about the current state of internet, fame, media, and global attention. He doesn't stuff it down your throat, but uses it to shift his story forwards.</p> <p>AART follows April May, a young twenty-something art graduate living in New York, who's thrust into international fame after she stumbles across a giant metallic samurai-like sculpture who she calls Carl, in the streets of New York. Pretty soon April, and then everyone she comes into contact with, start having the same dream every night: they 'awaken' in a giant uncanny-valley city, full of riddles and puzzles that feel like they were made by an AI who sucked information out of Wikipedia. We follow, from a first-person perspective, as April is thrust into international recognition and fame, as she tries to solve the mystery of the Carls, and facilitate international cooperation against a potential threat from outer space. It's pretty fantastic when you spell it out.</p> <p>The thing about basically-instant fame thrust upon "normal" people is that they're completely unequipped to deal with it. The first-person narrative in AART does an excellent job of showcasing this, even if April's flaws are show-ponied in front of us sometimes. We get a good sense that reality, society, and her friends are warping in front of her. They may appear close or present, but they often feel out of reach, or beyond influence - as the person April was transitions into the idea or figure or character of April. Green does a good job of fleshing out the characters who stay in a relatively tight orbit of April, and doesn't parade a seemingly endless number of characters. He directs your attention to those who are important, and signposts clearly when someone's just passing through.</p> <p>As the book goes on, the relationships become increasingly dominated by their dependence on April and the entire Carl phenomena to define them. In some places, peripheral characters' strengths and capacities are a little superficial or passed over. For example one of the characters spins up something like an entire tech start-up within weeks/months, and it's just sidelined as a narrative tool to push the story forwards. Other characters fall a little flat and only appear when they need to do something for April, even though their friendship pre-dates The Carls. Rarely does anyone else show weakness or signs of struggling. Sure, April becomes increasingly self centred, and it might be hard to force these details into the story, but I noted their absence.</p> <p>However I find myself forgiving a lot of these flaws in characterisation and narrative in favour of an extremely compelling story. This book was an adventure, really. There were clues and puzzles to solve, a well established villain and tight pressure from them, and at least two moments which shocked me in their unpredictable-ness. The pacing escalated well throughout the book and maintained itself nicely, and the book didn't outstay its welcome. It is a relatively short read, and there's always <em>something</em> happening.</p> <p>The world is pretty much a modern day (2020s) America, with the exception of a woman president which, look, actually including Trump in this novel would have been an awful idea. There's a nice inclusion of both internet and portable technology, which is refreshing - it seems almost inconceivable to me that a book about a 20-something woman from New York <em>wouldn't</em> have a ton of group chats. Green utilises this in the way we do in real life - it's not a <em>thing</em>, it's just a tool that the characters use.</p> <p>Green clearly understands the modern world at both a macro and a micro level. He understands how people talk to each other, how 'traditional' and 'modern' media are in tension with each other, how the western world spends its attention, and how we conflate infamy and expertise. These kinds of critiques and commentaries are placed nicely within a Sci Fi-ish adventure, and never showcased explicitly. It becomes a high-resolution and completely believable backdrop to a more fantastic story. The book doesn't try to over-reach in those regards.</p> <p>As someone who doesn't read a lot of Sci Fi, and who hasn't read a lot of Young Adult recently (as vague as the YA genre is), I enjoyed reading this book. It immediately left me wanting to pick up the sequel, if not for the poetic writing or poignant philosophy, for the compelling plot. When I read cheaper/junkier crime novels I'm often left feeling a little embarrassed or like I should go read something "real". That wasn't the case with this book. I was invested in what was happening, so yeah it's a good book 3.5â</p>]]></description> <category domain="https://thomaswilson.xyz/blog">Book Review</category> </item> <item> <title><![CDATA[Book Review: On Connection]]></title> <link>https://thomaswilson.xyz/blog/on-connection</link> <guid>https://thomaswilson.xyz/blog/on-connection</guid> <pubDate>Sat, 14 Nov 2020 00:00:00 GMT</pubDate> <description><![CDATA[<p>Kae Tempest is a London-based artist who works with words. I first discovered their work in 2016, with the release of <em>Let Them Eat Chaos</em> - a conceptual spoken word album which imagines a London street at 4:18am. To be perfectly honestly I think Tempest has a well honed skill with words. Their work has spoken to me with clarity in times when not a lot else could get through. Some of Tempest's phrases and lyrics are burned, deep, into my brain and emerge with remarkable frequency when I'm just trying to live my life. So Tempest could have filled the hundred-or-so pages of this book with near nonsense and I'd still recommend it to anyone. Fortunately, they didn't do that.</p> <p>In this relatively short, and surprisingly personal, essay, Tempest talks about the purpose and process of making art. Of the difficulties of creation, of the things which make watching, hearing, seeing, experiencing art interesting, and of the things you have to accept as someone who wants to make art. I was delighted to find Tempest speak of their own past, and privilege, and experience. They have historically been rather cautious about sharing personal details, which is fair, but it's nice to see and read.</p> <p>The margins of this book were filled with highlights and underlines, it's a short piece and it's crammed with things I want to pay attention to, and to remember. It doesn't go on when it can be concise, but there were perhaps moments of repetition, or points which were presented and then immediately abandoned. It's a refined set of thoughts, but that doesn't mean it doesn't branch off every now and again. Which is fine, this isn't a textbook.</p> <p>As the book's title suggests one of the central turning points in this book is the role of art as a tool to connect us. As a tool for empathy, to remind us of others' inner lives, to connect us to ourselves. This connection is the source of tension - around which we can hang a narrative or theme to engage the audience with our art. Tempest asks us to consider both ourselves and the subject of our art - what are the things your character is trying to say, and what are the reasons you, the artist, think this is worth saying or hearing? What does this say about the subconscious version of your self, who you can watch but only if you really try? Tempest openly draws heavily from the Jungian ideas of subconscious.</p> <p>A secondary point which Tempest mentions rather nebulously throughout the first third of the book is our culture of capitalism. A good thing to be aware of, and criticise, but something which they only detail relatively shortly. Despite the brevity, it's a wonderful point: we are surrounded by notions of productivity and efficiency which value taking something, extracting it, refining it, and making something more valuable from these raw materials. We cannot view our relationships with others, or with ourselves, in this way. We cannot connect with people if we are constantly looking to extract and refine whatever we can from them or from our relationship with them, even if that thing is art.</p> <p>There's a bittersweet note in this book being released during the COVID-19 pandemic. Tempest talks about the unique ability of poetry to level an audience. To connect everyone listening to one act, one narrative, one performer, one voice. The ability of us to gather, hear something, and then move apart connected more closely to the people around us, despite having nothing more in common than when we arrived. It's pretty unique in human experience. We'll get back to gathering like that in the future, but it felt so implausible in the here and now, when I have been to precisely one live music event in the last eleven months, and I don't think I'll be going to any for the foreseeable.</p> <p>Tempest lives by example in this book - encouraging us to ask if there is anything unspoken or unacknowledged in our art. To consider if we the audience, or we the creator, would benefit from considering art in relation to our self. The vulnerability and open-ness they share throughout the book is encouraging, though maybe could still seem cagey if the reader isn't aware of Tempest before picking up this book. Despite that, I think anyone who loves or makes any kind of art, or who spends a lot of time working with people, will recognise the heart of this manifesto as useful.</p> <p>At very least, it is a short book, even if you hate it (but still feel compelled to finish it) then it's not going to take more than a few hours of your time. Not that that should be the ultimate selling point of a book, but you get my intention. Read this book, it might help you know yourself better, and give you a way to shape or vocalise your thoughts. 4â</p>]]></description> <category domain="https://thomaswilson.xyz/blog">Book Review</category> </item> <item> <title><![CDATA[Book Review: The Phoenix Project]]></title> <link>https://thomaswilson.xyz/blog/the-phoenix-project</link> <guid>https://thomaswilson.xyz/blog/the-phoenix-project</guid> <pubDate>Wed, 02 Dec 2020 00:00:00 GMT</pubDate> <description><![CDATA[<p><em>The Phoenix Project</em> (TPP) is a a fiction book for nerds (said the nerd, on his blog). It's a parable for people who design, build, or deploy software. I want this article to just be about the book itself, not its content. The things I, as an engineer, found interesting about <em>The Phoenix Project</em> deserve their own post. Instead, this piece takes a more literary, or meta, look at The Phoenix Project.</p> <p>TPP is set in <em>Parts Unlimited</em>, a (fictional) automobile parts manufacturing company in America. As a company, <em>Parts Unlimited</em> is carrying a great deal of technical debt and business pressures. So it's set in a very boring, but realistic, scenario - and follows some very boring (but interesting and important) discussions and events which transpire in the process of building software in <em>Parts Unlimited</em>.</p> <p>TPP follows Bill, an middle-rung operations engineer - someone who is responsible for deploying software to become available to the end users (clients, stores, internal staff). Within the first chapter of the book, Bill is promoted from his comfortable job into a higher management role, which he does not want to take. The rest of the book follows Bill as he slowly realises just how bad the process of building and deploying software has gotten in his own company. The titular Project Phoenix is a long-overdue software product which the company planned and built for the last 12-24 months as a response to increased velocity from their competitors. Bill, with the help of his mysterious sensei (and potential board member) Erik, spends three hundred pages implementing solid working principles and protocols into Parts Unlimited, informed heavily by current manufacturing practices.</p> <p>It's actually quite a hard book to explain. While The Phoenix Project is <em>technically</em> fiction, in that the people and places are made up, its goal is to explain a certain (very real) way of building software - and similarly to explain the consequences of other approaches. Where other books may be concerned with exploring relationships, ideas, or language - this one wants you to understand that you <em>really</em> need to be able to visualise work-in-progress in your engineering teams. It shows you how a lot of people in a business think about both their job in the business, and the job of the business to them.</p> <p>Look, if you're a software person, this book has probably already crossed your radar. It's one of the cornerstones of modern Dev-Ops, at least in the last five years. It spawned a number of other influential books like <em>The Dev Ops Handbook</em>, <em>The Unicorn Project</em>, and <em>The Three Ways</em>. If you're not aware of this book, or what words like "Dev-Ops" and "Sofware" mean, then you probably stopped reading half way through the last paragraph (at the latest).</p> <p>My immediate reaction after finishing this book is that there should be more books like it. It is a fantastic way to introduce people to the forces and constraints in building and managing modern software. If you're inside of the software bubble, it showcases the nature and scale of business and financial forces; if you're in on the business front it introduces you to the pressures and complexities that software people are under. If you're both (like a CTO or CIO) then it will help you think about ways that communication and information flows between IT and other parts of the business.</p> <p>I build software for the web, an area famous for evolving quickly, for re-inventing the wheel with new technologies, and for being an engineer with a degree in an unrelated subject (like music production or... environmental science, for example), thick glasses, and a MacBook Pro. There's a certain culture, at least that I've experienced, that engineers should always be on the professional development hype. I don't think this is unique to web developers, or even to software engineers, but I do know it's pretty prolific in my field. This can make it very easy to jump from one project, language, framework, or trend to the next - and never stop to consider what you're building or why. It can mean reading sparse documentation, or just forging ahead and ignoring existing documentation.</p> <p>TPP brings a much more abstract level of thinking to the process of building software, and places both engineers and software within their wider contexts. Individuals are in teams, which are in departments, which are in businesses. Software projects are managed by teams, and linked to business objectives, etc. etc. TPP shows the value of thinking about these things, and introduces them without ever pointing them out.</p> <p>A lot of these benefits are emphasised strongly because the book only gives you an overview of the specific technologies used. It becomes almost impossible to get lost in the weeds, the book keeps you firmly out of the garden. In fact, to continue this analogy, the book sits you down with the head grounds-keeper and makes you follow them around for a few months while they do their job. For engineers, especially those who are closer to the strategic or planning aspects (or who wish to progress there), this is a really good thing.</p> <p>Engineering tends to attract people who are problem solvers, and a lot of the problems which are presented in TPP are large and fuzzy. For example: how does the business decide what software gets built? When can we say software is "done" or requirements have been met? How do you know who needs to be aware of your planned actions and changes to hardware (real or virtualised)?.</p> <p>You could begin to optimise tiny parts of these specific questions, maybe increasing the efficiency or throughput by 5-10% on a single part; or you could examine the system as a whole. TPP encourages tackling these big questions, and doesn't assume that people will hear you say "we would like to completely redesign this from the ground up", and the respond with "sounds great, take all the money and time that you need". These decisions are messy, both personally and for the business.</p> <p>Something that works really well in the parable format is the introduction of archetypes: certain kinds of personalities or a certain kinds of jobs. Our tiny chimp brains find these things useful for understanding other people. For example it's why I actually enjoy hearing people talk about the star signs, and it's why we have so much fun arguing who's a Carrie, Samantha, or Miranda . TPP introduces us to a relatively small (maybe 10 person) cast of people who work at a company. This is a good number: it's enough to focus on each of them, their personalities, and the way they contribute to (or block) other people. Hopefully it's enough to help the reader think, at some point, "Ah, this guy's a bit like Brent" or "Ah, she's a Patty". This is a hugely useful generic human skill which we encourage in our personal lives, but which we often assume "you'll learn it on the job" when it comes to our working lives. This is a nice little helping hand, especially if you're newer in your career or come from a smaller or less diverse team.</p> <p>While I have praised TPP for not being too technical, this does come at the cost of giving us a <em>lot</em> of names and phrases to Google if we want to actually learn the details. This is good though, it gives you the vocabulary to go away and google things that are relevant, and the chance to ignore things which aren't. It means you can read this book in several sitting and get a good overview, but also to dig deep into anything you find particularly interesting. To this end, TPP knows its role is more of a gentle introduction than a technical primer - it assumes you don't know anything, and that you may not even be able to diagnose, let alone solve, any of the technical problems. Luckily, that's largely irrelevant.</p> <p>With all this said, the book certainly wasn't one that I simply couldn't put down. In parts it was tough to read. Notably some of the characters and interactions were a little <em>too</em> caricature-ish, and some of the sections invoked horrible flashbacks of people who knew nothing about software asking something impossible or telling you how to do something in a bad way. I had quite a visceral reaction to these sections, and from conversations / online reviews, I know I am not the only one. This speaks to the authors' experience in actual workplaces, and their ability to capture the practical difficulties that enterprises might be facing.</p> <p>I've also got some other questions, primary among them: why has everyone in this book served in the military? Bill, our protagonist, has. So has his boss. And so has his teacher. And so have a couple of other people he meets. Why are all these veterans working at this failing automobile parts manufacturing company? I guess that it's a good way to signal "get to know about your colleagues' lives before their current job", but also it could be seen as "assume everyone loves routine, command chains, and discipline" (which they don't).</p> <p>Perhaps a more serious critique would be to ask why this book adopts the mystery-thriller literary practice of leaving us out of problem solving. There are plenty of "I screwed my eyes tight and thought about it, I was so close to solving it" and "He was almost onto something". It felt a little staged, but also I guess you need something to stop this book descending into some kind of technical swamp.</p> <p>All in all, The Phoenix Project is a good book, mainly because it knew what it wants to be: an introduction to modern IT practices in an enterprise setting for anyone remotely involved in IT within a business. It's not got stunning language, considered character work, or a suspenseful plot - but it has a lot of clarity and charm. If you work in software, especially in a position where you can affect change, I would really recommend picking this up and reading it the whole way through - there's a very high chance that you'll find something useful to you. 4â</p>]]></description> <category domain="https://thomaswilson.xyz/blog">Book Review</category> </item> <item> <title><![CDATA[Book Review: Kings of the Wyld]]></title> <link>https://thomaswilson.xyz/blog/kings-of-the-wyld</link> <guid>https://thomaswilson.xyz/blog/kings-of-the-wyld</guid> <pubDate>Sun, 13 Dec 2020 00:00:00 GMT</pubDate> <description><![CDATA[<p><em>Kings of the Wyld</em> is a fantasy book which feels like three or four middle (or-upper middle) aged dudes getting drunk, playing Dungeons & Dragons, while classic Rock and Roll plays in the background. In a fantasy world where adventurers are treated like rockstars, the book follows an old band of adventures getting together for one last hurrah to save one of their daughters. The book knows what it is, and doesn't try to overreach itself. But at the same time, it does a solid job of portraying personal trauma and the process of ageing. If you like fantasy, and are familiar with the tropes, I highly recommend this book as a fun, and slightly meta, piece of fantasy. If you're less familiar with the genre, you'll likely still enjoy it, but realise there are some in-jokes or puns passing you by.</p> <p>The book is set in a fairly standard high fantasy setting - with the most notable geographic feature being The Heartwyld: an expanse of untamed forest and planes which are overrun by your standard fantasy monsters: centaurs, giant spiders, dragons, zombies, trolls... you get the idea. Though humanity was once terrorised by these creatures, humans have increasingly started killing them for sport and entertainment. Bands of adventures start to emerge, killing larger and greater numbers of beasts, before the sport is moved to giant Colosseum-like arenas. These bands of adventurers are treated just like the celebrities in our not-so-monster-ridden world.</p> <p>The premise of the book is relatively simple: the daughter of Gabe, the band's frontman, is stuck in a besieged town on the other side of the Heartwyld. He gathers the old band, <em>Saga</em>, back together for One Last Adventure to get her back. Saga was once the greatest band of all time, but since then the members have retired to a quieter, provincial way of life. Bringing them out of retirement sounds like a good narrative, but <em>Kings</em> is pretty honest about showing us how much the group really have aged, and how they're not the spritely young men they once were.</p> <p>We spend the book following Clay, Gabe, Moog, Matrick, and Ganelon - the members of Saga, as they trek across the map to save Gabe's daughter.</p> <p><em>Kings of the Wyld</em> brings a relatively unique (at least to me) perspective: that of older or retired adventurers. We come into the story once they're well past their glory days and once friendships have been formed. This allows the book to step back from the immediate, arguably senseless, violence that we would expect on a traditional Great Adventure fantasy trope, and have a more honest, if not flawed, look at the people and actions involved.</p> <p>We're also introduced to a broad range of supporting characters: a new band of lovable rogues led by a charismatic archer, the band's old booking agent who's grown (even more) selfish and greedy, a two faced bounty hunter, a gold-loving cobalt. These all seem like familiar stereotypes, but they bring the world to life - the book doesn't focus solely on the members of Saga, and it feels like Saga really lived out their greatest day and then the world moved on past them. Somehow all the tropes and archetypes fit really nicely, and it never feels cliché. Tongue in cheek? Yeah, but it treads a nice line.</p> <p>The plot of <em>Kings</em> follows a similar pattern - although there's nothing particularly complex, unforeseen, or politically/socially astute contained within it - Eames builds a really interesting set of cultures, characters, and creatures. You're taken on a tour across a massive space, travelling in giant air ships, trudging through snow, burning down bars. It's really quite the adventure. You never hang around anywhere too long to get bored.</p> <p>Not every book has to ask you to rethink the role of religion in society, or the nature of destiny and duty. Some fantasy books can just be a good romp with some realistic characters. Humans are empathetic creatures, and as a reader before long you start thinking about the characters, and their feelings or situations, even if they are ridiculous. Eames sneaks in some real emotional moments underneath the adventure, and that kind of tonal shift is the mark of a good storyteller.</p> <p>Both pacing and language are only as long as they need to be, Eames has no issues with moving you on, even if you'd maybe like to hang around for a few more pages to see what kind of insanity could ensue.</p> <p>A lot of reviews I read for this book seemed to rate and note the humour in <em>Kings</em> - but I've got to stay, I didn't find it especially funny. There are moments of levity or little puns, but for the most part it shows a pretty grim and unflattering world, every now and again poking fun at the fantasy and rock-and-role genres. I liked this decision, it made a nice change, especially as Eames didn't play up the meta-jokes about fantasy tropes so much, and I don't think he ever broke the fourth wall, which I was worried he might do. It was enjoyable but far from the Pratchett standard, but I don't think comparing anyone against that would be a good idea.</p> <p>This book didn't bowl me over with anything unexpected, but it was a fun journey with an interesting twist, even if the premise itself is overcooked. It's a good escapist read if you know you're a fan of fantasy, but I don't know if I'd recommend it if you've not dipped into the genre for a while - or maybe I would, maybe it's the perfect re-introduction. I don't know, I'm not very stedfast in my opinions. 3.5â</p>]]></description> <category domain="https://thomaswilson.xyz/blog">Book Review</category> </item> <item> <title><![CDATA[Book Review: The Silence of the Girls]]></title> <link>https://thomaswilson.xyz/blog/the-silence-of-the-girls</link> <guid>https://thomaswilson.xyz/blog/the-silence-of-the-girls</guid> <pubDate>Sun, 24 Jan 2021 00:00:00 GMT</pubDate> <description><![CDATA[<p>Pat Barker's take on the classic story of the Battle of Troy is told from the perspective of Briseis, the noble taken slave when Achilles sacks Lyrnessus. Consigned to life as a bed slave for Achilles, she is later taken from Achilles by Agamemnon, which in turn causes Achilles to stop fighting for the Greeks. In the tradition of classic epic poems like the <em>Iliad</em>, women and slaves are treated entirely as property - not as humans. By re-telling a classic from this previously unconsidered, almost inanimate, point of view Barker is able to shift away the dignity and majesty that normally tint classic or epic poems. Barker's retelling is not quite a reimagining, but she does a wonderful job of maintaining focus on the broken societies and individuals involved in the story, and of just how crude things would have been during the seige on Troy.</p> <p>Barker does a superb job of describing the setting: a war camp set up between a battlefield, Troy, and the ocean. Each of these settings are essential to the themes which run through the book: the idyll and treasures of war, and Achilles' own divine connection to the ocean (his mother, Thetis, was a Neried - a sea nymph). Barker describes the war camp as something which straddles permanence, as a home for many soldiers and the supporting staff and slaves, and the temporary make-shift encampment. Her descriptive prose are never indulgent, but over the course of the book they beat out an immediate world. The use of small comments are often the quick assessing glances of characters gives the entire book a great sense of place.</p> <p>Briseis experiences the world around her immediately, but the events and beats of the plot often have to come to her. Word is brought, or she sees the consequences of battles and political manoeuvres. Her situation inside the house and bedroom of Achilles offers some nice speculation about what we don't see in the original epic poems. This small scale, domestic focus carries heavily throughout the book, and brings a sense of intimacy to Achilles and his inner circle. It brings pangs of sympathy for Briseis' own struggles as a woman taken from her life, moved from nobility to slave, and as witness to relentless violence.</p> <p>The result is a story that keeps its pace up right up until the 80-90% mark. Towards the end, things really drift off, and I couldn't get a clear sense if Barker was trying to wrap things up or leave them open. <em>The Silence of the Girls</em> breaks the strict narrative structure of the original epic source material, that attempting to break form makes sense. I just didn't get a sense of commitment to this idea, which so I found the ending a little disappointing.</p> <p>I was worried that Briseis would remain a victim to circumstance. That as a woman and a slave, I would commit three hundred pages to someone simply experiencing and coping with the world. This is a poignant part of the story, and not one I would want to be glanced over. Barker acknowledges it but doesn't overdo it. At times our narrators fears feel a little repetitive, and without any real bite, but she's fleshed out. I am always wary of books which adopt a diary or confessional style, which this one does. However it doesn't get in the way.</p> <p>At times the pragmatism and frankness of her writing leave me wanting more. I always wanted a little bit more presence, a bit more flesh on the bones. The story is told almost entirely from the first person perspective, and it feels a little constrained by that, at times. This is entirely a personal preference, and Barker's style is consistent throughout. It just grated on me.</p> <p>This doesn't get in the way of exploring the world or the themes, however. Personal and violent trauma is explored carefully and with respect. We see Achilles, and other great characters portrayed with more humanity and dimensions that the typical archetypes they can become. From the opening sentence of the novel, "Great Achilles, brilliant Achilles, shining Achilles, godlike Achilles... how the epithets pile up", you know this is going to be tackled. And it is. The reimagining of a more human, faulted, prideful and unloved Achilles comes through.</p> <p>The themes were interesting, but delivered a little plainly. Nothing struck me suddenly, and little specific details or phrasing stays with me. Perhaps the book is too human and not godlike or mythical enough for my personal taste. What the narrative or style lack is made up for easily in the sturdy telling of a classic story. 3â</p>]]></description> <category domain="https://thomaswilson.xyz/blog">Book Review</category> </item> <item> <title><![CDATA[Book Review: First You Write a Sentence]]></title> <link>https://thomaswilson.xyz/blog/first-you-write-a-sentence</link> <guid>https://thomaswilson.xyz/blog/first-you-write-a-sentence</guid> <pubDate>Thu, 04 Feb 2021 00:00:00 GMT</pubDate> <description><![CDATA[<p>I loved this book. <em>Will</em> love this book again, because I know I'm going to read it again. And then probably again after that. Moran's two hundred page treatise on the process of writing and re-writing is meatier than you would expect. Every few pages serve you a meal, a new way to think about reading or writing: how active is the voice? Remember punctuation? Does this make sense? Moran shows you the importance of these questions, and the consequences of (not) adhering to them. I think this book does a superb job at explaining and dissecting written communication which, like a lot of human rules, are real but unspoken. It's not a dry style guide. Moran appeals to emotion and common sense to make his points, peppering his rationale with quotes and examples. More people should read this book, even if they "only" write e-mails, press-releases, statements, love letters, long instagram captions, or anything else longer than a few sentences.</p> <p>The thesis running through this book sounds something like "consider your sentences carefully and you'll probably write better". Although the book zooms in (to grammar, and Part of Speech) and out (to paragraphs and narratives) it always returns home, to sentences. A good essay, to me, draws your full attention to something overlooked or undervalued, but which is full of life and worthy of consideration. Examine something and, invariably, you'll see beauty or beauty reflected. Fortunately, a good sentence doesn't hide its reward behind expertise or mental gymnastics. Sentences can be intuitively seen as good or bad, and your reader <em>will</em> be judging them. The pleasing-ness of a particularly rhythmic, expressive, or concise sentence is something most readers would notice. Stephen King reportedly wrote <em>The Gunslinger</em>, his magnum opus, from the first sentence: "The man in black fled across the desert, and the gunslinger followed", one of the finer opening lines. So by considering the quality of our sentences, we begin to improve our writing from the grass-roots up.</p> <p>Writing a book on how to write must be daunting. You're describing a medium <em>in</em> that medium, so you've got nowhere to hide. By the end of the first chapter I was convinced that Moran had enough craft and flare to keep me invested, and that feeling didn't change. This is the first Moran book I have read, however, so I cannot speak for the quality of his entire portfolio. There's some truth to "those who cannot do, teach", but any trace of that is scent is overpowered by the waves of unconditional passion for writing and language that roll off this work. Moran fulfils the eccentric-university-lecturer stereotype we often see more in American media (we quite like grizzled and pessimistic educators here). There are times when you can hear him delivering these ideas in front of a whiteboard in a room built and decorated in the sixties, complete with grey-blue-black worn carpet. He's informed enough to be useful, and impassioned enough to make sure you know exactly <em>why</em> you're being taught something. The ideal traits of a Higher Education educator, which Moran is.</p> <p>The book is set out across seven chapters, though each chapter is almost self-contained. The book moves from a general introduction of the book's thesis, to the more detailed grammatical and linguistic specifics, before opening back up to the implications and power of a good sentence. This seems like a sensible structure, it's possible to come back to the forty or fifty pages at a later date, and dig into something again. However, even at only two hundred pages long, it does make certain passages or ideas hard to re-find. This is a problem easily remedied by scribbled underlinings and notes in the margin, but it is frustrating if you want to revisit something but aren't sure where exactly it is. I suppose this is the price of a more intuitive, rather than ontological structure for the book. The book is narrow in scope - the chapters aren't vastly different enough to be truly distinguishable. Each chapter is a meal best enjoyed whole, and not in bits. Even so, I would recommend no more than a chapter a day - a lot of these ideas need time to percolate.</p> <p>Moran strikes a difficult balance here: does he act as provost for platitudes, which the reader must take and apply as she sees fit, or does he provide us with the certainty of syntax, edge-cases, and rules. Too far into generalities and you're not actually offering anything useful, and you risk sounding self-aggrandising and vague. Too far into the specifics you've lost the more creative, or fresher, crowds. Reading, and to a lesser extent writing, are intuitive acts - by waylaying out readers and writers with rules, you're sucking the joy out of the acts. The best way I can can describe the effect of reading this book is the introduction of a little voice at the back of my head whenever I am writing, and sometimes when I am reading. The little voice chirps along to Moran's ideas of good writing: that we can't assume the reader is interested or invested, we must explain ourselves, we can use active voice, sentence length, and order of clauses (claus-der?) to make sentences clearer. Or conversely we could use our new found powers to obscure and bore.</p> <p>Broader than that, Moran has given me an appreciation for the sentence. I wouldn't be so bold as to say I'm never going to write a mediocre or bad sentence again in my life. That's obviously going to happen, probably daily. But when I put the book down (surprisingly long after I picked it up), I felt convinced that no single sentence should go into my writing un-interrogated. The sentence might not actually <em>be</em> the purest, platonic ideal of writing, but it's important. At the meta-level, I adore the careful consideration of something so singular. The result tells you about the object of study and the person doing the studying, so this book packs twice the delight. Learning the process is more actionable than learning the product. The result is one of the clearest, most actionable, and impassioned calls for better writing from someone who just wants there to be better writing. 4.5â</p>]]></description> <category domain="https://thomaswilson.xyz/blog">Book Review</category> </item> <item> <title><![CDATA[Book Review: Utopia Avenue]]></title> <link>https://thomaswilson.xyz/blog/utopia-avenue</link> <guid>https://thomaswilson.xyz/blog/utopia-avenue</guid> <pubDate>Tue, 09 Feb 2021 00:00:00 GMT</pubDate> <description><![CDATA[<p><em>Utopia Avenue</em> is David Mitchell's latest piece of fiction in the meta-novel he is writing. Which is to say this book is set in the same mild-fantasy universe as several of his others. It follows the motley crew of musicians and management which form the titular rock/folk/pop band in London in 1967, including cameos from near every famous London-based musician of the time. I've no strong attachment to the era or to early rock-n-roll music and the book never relied on nostalgia or knowledge. Mitchell does a fine job of creating a sense of a time of social and artistic revolution. Maybe it's because I read it eleven months into a global pandemic, but man... he really sold it to me. Despite the often dark and sometimes fantastical undertones of this book, it is foremost about people and their relationships. Romantic, platonic, and professional relationships to each other. Our connection to ideals and philosophies through the art that we make and consume ("appreciate" sounds less destructive but also less intense) and how that connects individuals to groups to societies. So I guess this is a book about... everything?</p> <p>This need to balance stories and dynamics at the individual, ideal, and population/crowd level is tough. It's a lot of plates to keep spinning. Or to mix metaphors it's a lot of cattle to herd. Mitchell mostly does a fine job, but every now and then somebody, some strand, some mention gets left behind and is picked up later, occasionally with a feeling of curtesy over curiosity. Giving space and attention to certain characters often rewards us, looking at you Jasper - you enigmatic guitar prodigy who spent time in a psych ward. Other times, characters flit between cast and side-character. At times, certain narratives felt simplified or condensed.</p> <p>These possible shortcomings are redressed by the weaving of <em>Utopia Avenue</em> into Mitchell's broader shared universe. The supernatural-cum-fantastical elements in this book are rewarding in their subtleties, unanswered-ness, and existential consequences. Utopia Avenue is a book which left me with a sense of animism: that the world is alive. That the separation of human, world, soul, and other aren't as strict as we see them here in the west. It's the same feeling that Studio Ghibli films leave me with, and it is one which is uncommon in western media. Little surprise, then, that Mitchell's wife (Keiko Yoshida) is a native Japanese speaker, and they met in Hiroshima. I've not done the requisite research to attribute these things together, however, maybe Mitchell was like this anyway and that's why he's so drawn to the Japanese culture. I digress.</p> <p>The final act of <em>Utopia Avenue</em> is as mystifying and bewitching. A feat it shares with <em>Bone Clocks</em>, Mitchell's 2014 novel. What I love dearly is both the magical elements, and how carefully they are placed and rationed, so that nothing can simply be dismissed as ✨magic✨.</p> <p>The book feels optimistic about humans, and about our ability to create for and inspire one and other. This quality is what draws me endlessly to John Green, who has entirely nothing to do with this book or David Mitchell but who proudly beats the same optimistic tune over a din of (not unreasonable) pessimism. One, perhaps forced and on-the-nose, moment has the aforementioned Jasper (or possibly Mitchell, through Jasper) consider aloud in front of a press conference if music can change the world:</p> <blockquote> <p>Which begs a question. "Who or what influences the minds of the people who change the world?" My answer is "Ideas and feelings." Which begs a question. "Where do ideas and feelings originate?" My answer is, "Others. One's heart and mind. The press. The arts. Stories. Last, but not least, songs." Songs. Songs, like dandelion seeds, billowing across space and time.</p> </blockquote> <p>Despite adoring <em>Bone Clocks</em>, I really struggled to get into <em>Cloud Atlas</em> (2004). But <em>Utopia Avenue</em> has reminded me of what I loved so much about Mitchell, and also how many of his books I have not read (six). Leaving a book feeling excited to read the author's existing body of work, despite previously failed attempts, is one of the finest endorsements of a book I can think of. Unfortunately it is a purely quantitative, personal review which isn't so translatable to others, but it is symptomatic. This book delivers worthwhile ideas with an unusually captivating language.</p> <p>So I hope you read this book and it reminds you of the wonder of the world. Of the joys of creativity and human connection, and of how you can bend genres because they're there to serve curators not creators. Even if you've read all Mitchell's work and hate it (but still find yourself here) then I don't know what I could say to dissuade you. 4.5â</p>]]></description> <category domain="https://thomaswilson.xyz/blog">Book Review</category> </item> <item> <title><![CDATA[Book Review: Magician]]></title> <link>https://thomaswilson.xyz/blog/magician</link> <guid>https://thomaswilson.xyz/blog/magician</guid> <pubDate>Mon, 15 Mar 2021 00:00:00 GMT</pubDate> <description><![CDATA[<p>The first in Feist's <em>Riftwar Saga</em>, Magician has the air of a pulp fantasy novel. First published, abridged, in 1982 and unabridged a decade later, this book oozes nerds in the '70s playing D&D and I love that. It has it's <em>bona fides</em> as a fantasy novel and that's what made me pick it up in the first place. Unfortunately, I could never find myself truly getting into Magician in a way that I have with more contemporary fantasy series (like Brent Week's <em>Lightbringer</em>, or Peter V. Brett's <em>Demon Cycle</em>). The piece was paced oddly, the characters undeveloped and shallow, and as a whole it felt too broad and unfocused. There's a fine line between telling an epic story with a sense of something larger than what the reader is being shown, and having an author move endlessly along a chain of "and then"s. Unfortunately, this series hit the wrong side of that line and I was never given anything good enough to forgive it.</p> <p>The book starts with two boys (one orphaned, naturally) growing up in a medieval-setting fantasy castle. I expected us to stay there a lot longer, <em>a la</em> Robin Hobb's Assassin's Apprentice series (a 4â series btw). Strong but cliché start. Almost immediately Feist whisks us off somewhere else, and before long we've covered seemingly large spaces of time and personal development in just a few chapters. This might speed up the pacing, but when you're writing fantasy you have to educate your readers, which is why "undiscovered genius" is a common and useful trope in fantasy: our protagonist can learn about the world with us, but do all the hard work (like studying for all those pesky magic exams). Instead, Feist introduces Pug and Tomas (our young keep boys) just before they start their apprenticeships and then comes back to them years later in the middle of their studies. We're not much wiser about their day-to-day lives, their skills, their character development. Later we spend seemingly endless pages on board a boat with characters who phase in-and-out of importance, and then maybe a dozen pages are given to Pug after he has his memory wiped and goes through an entirely new magic training in a parallel world. The pacing was way off - I could never infer importance from length or attention.</p> <p>This isn't even a review about Feist's book anymore. I don't want to spend time dissecting what I don't like about something if it doesn't lead to a productive understanding about what I do like, and how it could be better. Unfortunately I just don't think I like this kind of book. That also means I did not like this book very much, which is a shame because it seems like such a beloved classic.</p> <p>But I do like fantasy. So let me explain to you why both these things are true.</p> <p>There is a feeling that Feist has already go to the end of this book and is relaying it to you, almost haphazardly in the pub when really you'd rather be talking to the cute boy or girl you've been making eyes with. Good storytelling is joint discovery, you and the story teller are stumbling across things, surprising things, unexpected things, at the same time. Feist's writing in this book lacks that feeling, and it's a shame. A good plot, a rich political ecosystem, an interesting magic system are the core ingredients to a good fantasy epic, but there's nothing holding them together. Croissants might just be butter, flour, yeast, and milk but so are a lot of things - the art is in the mixing and waiting.</p> <p>As much as I want to love good old pulp fantasy, I don't know how much I actually enjoy it. A lot of my favourite fantasy series are more modern. It's only a forty-year gap, in the scheme of writing it's really not that long. Orwell's 1984 was published over seventy years ago, Steinbeck's East of Eden a few years after that, and Atwood's The Handmaids Tale a few years subsequent. All books that remain remarkably readable and excellently rich for modern readers.</p> <p>Reading this book acted more as a counter point for contemporary fantasy (things published in the last 10-15 years). Fantasy has become less of a distinct entity, separate from fiction. Writing fantasy isn't a necessarily a decision about niche or genre, it is a stylistic or world-building aspect. Sure, some modern writers are going deep on the epic and high fantasy (see: GRRM), but a lot of others are writing good books, with crafted characters, set in a world that has magic and swords and dragons. And that's great, I love swords, and magic, and taverns.</p> <p>More people can write and publish their books, and more people can find and access them. The barriers to everyone in this equation have gone down, and the result hasn't been the dilution of quality we probably feared it would be forty years ago. This means that if I want to read a book about men who make potions or women who can make magical illusions with their art, I don't have to pick the writer just because they're a fantasy writer.</p> <p>I like good books first, and fantasy second. I love good books written in a fantasy setting, but I (personally) cannot forgive a bad book because its characters inhabit a world where there is magic. No matter how well explored the consequences, or certain aspects of the political and economic ramifications of there being magicians.</p> <p>With so many new, creative voices in fantasy, many of who are women and People of Colour, I would rather spend my time exploring what's new in the genre. Our attention and our conversations are two of the best tools that we have to make meaning and change with out brief lives on earth, and I think those things are better spent on emerging and under-represented artists (if I was made to chose, which I am not).</p> <p>I'm glad I read a classic of the genre, but not because of the book itself - rather to get a better lay of the land. I'm glad I read it but I won't be reading the rest of the series. 1.5â</p>]]></description> <category domain="https://thomaswilson.xyz/blog">Book Review</category> </item> <item> <title><![CDATA[Book Review: Once Upon a River]]></title> <link>https://thomaswilson.xyz/blog/once-upon-a-river</link> <guid>https://thomaswilson.xyz/blog/once-upon-a-river</guid> <pubDate>Sun, 04 Apr 2021 00:00:00 GMT</pubDate> <description><![CDATA[<p>This is a lovely book where classically fairy tale things happen. Set on the River Thames in Oxford around the turn of the 20th century, it follows individuals and families as a girl is found not-quite-dead in the river. Everybody sees somebody different in this child, they see the lost daughter they wished they could re-find, or the lost sibling who died some thirty years ago. We follow the people of the village as they attempt to care for, claim stewardship over, and make counter-claims about her. This otherworldly, captivating child precipitates the best and the worst parts of our characters and their pasts.</p> <p>I've been describing Setterfield's book as "fairytales for grownups" which sounds like a good description to me, but I'm also worried it's a little dismissive. So please interpret it generously. This book made me feel like stories made me feel when I was younger: something wholly separate from real life. Something that I enjoy living in.</p> <p>The book opens on a pub somewhere along the Thames, near Oxford, where the local townsfolk gather to tell and hear stories. As beginnings go it's only a few steps over "once upon a time" but it works. It sets the tone and the expectation: this is a capital-S <em>Story</em> . And by knowing itself, its medium, and its limits, Setterfield gives us permission to get utterly lost and captivated in it.</p> <p>A difference, though, between this book and an actual fairytale is how it weaves in and out of fantastical elements. You can read it most literally as a piece of historical fiction, or more fantastically as a piece of light urban-fantasy set in the past.</p> <p>The core of the story is people: the big cycles of life and death, and the smaller infinite little plots that make up our lives, our families, and our communities. This book never loses focus on the individuals, which reminds me of Ken Follett's Kingsbridge series of novels. At times, the characters seem villainously evil and heroically chivalrous or noble, but archetypes have a place in stories.</p> <p>Each character seems a little reduced to one trait which dictates everything they do: maternal love, selfish greed, parental guilt, financial gain. It's a story about people, but those people seem a little simplified at times.</p> <p>Still, I love a character-focused book. I love going page-to-page asking how would people like this react in a situation like that? Like a fairytale, it's analogous to life: it gives us tools to recognise and understand the actions of people around us, and Setterfield does this well.</p> <p>So I mean it in no belittling way when I say that <em>Once Upon A River</em> is a lovely book.</p> <p>It doesn't try to introduce new ideas, cunning literary devices, or poetic prose. Sometimes you need this no-nonsense "imagine these people doing these things" story.</p> <p>There are still moments of gentle beauty and fantastical elements. The language is florally embellished in places, as if it were a well-crafted tale being told aloud to you in a pub in the early 1900s. It's never self-indulgent, either - the language or words never distract or get in the way.</p> <p>There are certainly a few times where characters seem to transform or shift in a moment. It's like they were vehicles towards the resolution of the story: for there to be a happy ending they must accept that this child isn't their daughter, or to be in love one must let their fears go. I did take particular issue with one character who, for very personal and rational reasons, decided that she did not want to have a child - but abandoned those beliefs when she met the right man. A narrative that queer/asexual and anti-children people often face. The "you just haven't met the right man" argument. It maybe would have been nice for the woman to not want children and realise it's because she wasn't maternal, or maybe was queer - and resolve the story that way. Setterfield had the chance to break an expectation or convention yet still fulfil a fairytale ending, sort of like a genie, but instead she took the predictable and easy route. But I can't criticise a book too harshly for wanting to stick to what's already known, and for sticking to its genre. Still, its a missed chance for more representation.</p> <p>On some deeper level, I think having the characters change so quickly is a nice reminder that sometimes we need to only give ourselves permission to change our beliefs or our action. But I think I'm looking into that a bit too much.</p> <p>It was a nice read, a nice escapism read. It's a book I'm going to remember because of how it made me feel, not because of the characters or writing. A good solid read for when you need something palatable and easily digestible. 3 â</p>]]></description> <category domain="https://thomaswilson.xyz/blog">Book Review</category> </item> <item> <title><![CDATA[Book Review: Mrs Death Misses Death]]></title> <link>https://thomaswilson.xyz/blog/mrs-death-misses-death</link> <guid>https://thomaswilson.xyz/blog/mrs-death-misses-death</guid> <pubDate>Sat, 17 Apr 2021 00:00:00 GMT</pubDate> <description><![CDATA[<p>Godden has been writing and performing poetry since she decided to move to London instead of going to university. "Godden is a poet" headlines my review because it is so evident in every page of this book. Every transition from unknown narrator, to fourth-wall breaking direct address, to poetry, to "normal" prose. Godden barely pays attention to consistency when she writes, because she is trying to get across an idea. All books are poor transcriptions of spoken word stories that buoyed humanity through tens of thousands of years, long before we invented written word, paper, and typesetting. This book just acknowledges that more than a lot of other books I have read.</p> <p>Mrs Death Misses Death was written almost entirely in service to an idea. Sometimes you're not sure what that idea is, and other times you're frustrated that it is <em>just</em> an idea, without resolution or arc, but most of the time you are spell-bound by how Godden writes. This is "exactly the sort of thing you expect when a poet writes a novel", to quote Sara Collins in <a href="https://www.theguardian.com/books/2021/feb/11/mrs-death-misses-death-by-salena-godden-review-the-poets-debut-novel">her review for The Guardian</a>.</p> <p>This is all to say that Mrs Death Misses Death is interesting at a meta level. Perhaps more interesting than it is at the direct substantive level. The characters and story are secondary. The book is written by Wolf, a "bi-gender" young poet in London who meets death when she sells him some tobacco at a local store. Death, who has always been personified as male, tall, and slender, is shown here by Godden as a young, poor, black woman in London. Because this is the most overlooked, the least seen, kind of person. Wolf is captivated, maddeningly so, by Mrs Death, and Mrs Death is glad of the chance to speak to someone about the endless and laboured process of collecting souls as they leave life. Told in part by Wolf through testimony or flashbacks, sometimes in poems, other times from the perspective of Mrs Death - we explore this idea and the consequences of being or meeting death.</p> <p>The book was written over the past five years, long before anyone could identify a spike protein, face mask, or socially distanced funeral out of a lineup. It was written before death figures filled our every news report for months and months on end. It was written independently of contract, i.e. Godden was writing without obligation to a publisher, and this freedom shows. Humanity and experience, largely unfiltered or unguided, are at the centre of this book, and I don't think the same result could be achieved if it was rushed or shaped by the need to fulfil or attract external attention. Despite this "business ruins art" talk, the book has already been <a href="https://www.thebookseller.com/news/mrs-death-misses-death-optioned-film-and-tv-1235318">snapped up for film or TV</a> by Green Door Productions (a company owned by Idris Elba), as well as receiving generally favourable reviews. It's not an art-or-money situation.</p> <p>Despite liking the idea of this book, and broadly adoring the language and sentiment, I didn't find it entirely engaging or sticky. Whenever I was reading it, I enjoyed it, but I did not find myself coming back to it unintentionally. If you can, read this book in as few sittings as possible, I think.</p> <p>It is not a book where things happen, or where particular ideas are explored explicitly. It seems to follow a very brief period of time, a snapshot. We get glimpses of some of the things Mrs Death has to deal with, and the sadness and anger she feels as being seen as a man, and as being the opposite of life — but we never see that in action. We are with Wolf for the entire book, and Wolf is your classic unreliable narrator, and starving poet. We explore the tension between a childhood trauma caused by the early death of Wolf's mother and their subsequent upbringing by their bitter and probably cruel grandparents. This idea of intergenerational trauma was something that <a href="/book-reviews/queenie">I loved in Queenie</a>, but here it is not explored in as much length or detail.</p> <p>I am glad I read this book, especially as somebody who loves books and poetry. I love that it wasn't a "traditional" book, and how Godden sees the world, or at least frames the world, in some interesting ways. The sentiment of grief and unresolved trauma runs consistently throughout this book, affecting both Wolf and Mrs Death, a supposedly other-worldly spirit or idea. It normalises the idea that death is a hard thing for those left alive to process. It treats that difficulty with patience and I hope lends sympathy and empathy. But there still weren't any moments which shone above all others in this book. I would recommend it to you if you love books and reading and language and ideas, but not if you love stories and characters. This from a man who can't sit easily through a Chekov or Pinter play though, so don't listen to me. â3.5</p>]]></description> <category domain="https://thomaswilson.xyz/blog">Book Review</category> </item> <item> <title><![CDATA[Book Review: After]]></title> <link>https://thomaswilson.xyz/blog/after</link> <guid>https://thomaswilson.xyz/blog/after</guid> <pubDate>Wed, 05 May 2021 00:00:00 GMT</pubDate> <description><![CDATA[<p><strong>Declaration of interest</strong> I am a spiritual person. I didn't come into this book desperately seeking answers, or in need of comfort or certainty. You're never going to get that from any book, I'm afraid. I believe that we are not just our bodies, and that consciousness exists (at least partially) separately to the brain. I came into this book because I was interested in hearing the experiences of a healthcare and scientific professional, and how they experience / grapple with these questions. And to hear from people who had almost died. That sounds pretty cool.</p> <p>Death, as we know, is the only inevitable thing in our life that isn't taxes. But people seem to spend a great deal more time and attention trying to cheat or bemoan taxes.</p> <p><em>After: A Doctor Explores What Near-Death Experiences Reveal About Life and Beyond</em> makes you think about death. Barely two pages pass where Greyson isn't telling us about a patient they saw who nearly died in some morbidly unique way. All throughout, Greyson approaches the subject of near death experiences (NDEs) as a practiced researcher and medical professional, and in doing so does what all good authors do: places their subject matter bang in the centre of something much larger. Death, living, almost dying, trauma, spirituality, and our relationships with ourselves, our families, and our mortality all come up. And while questions about the experience and impact of NDEs on someone's life comes relatively answered, these broader questions about how we live are left open.</p> <p>At its core, however, it is a book about NDEs. So let's talk about that first.</p> <p>Near death experiences are <em>experiences</em> that people have when they almost die. In some cases they do actually clinically die, but they eventually come back. The experiences themselves are vivid, and people who have them can tell them apart from dreams. Apparently they're not quite like anything else. The term NDE was coined 1975 with Raymond Moody's <em>Life After Life</em>, though reports of NDE-like events predate this. It has remained active grounds for research by people involved across neuroscience to philosophy and anthropology.</p> <p>Current research suggests that some 10-15% of people who almost die experience NDEs. They are present across cultures, religious/spiritual beliefs, ages, and lifestyles. Greyson takes us through the building block questions like "what <em>is</em> an NDE?" and why they're worth studying. We get an overview of a few common characteristics: from the relatively innocuous change in time perception and clarity of thought, to seeing one's body from from outside your self, the "life review" (the addled phrase "my life flashed before my eyes"), and meeting and interacting with deceased people.</p> <p>We are well-guided (though perhaps a little briefly) through the process of an NDE. From its immediate characteristics, to how it changes people in the weeks and years which follow. People who experience NDEs often live a different life after their experience, compared to those who almost died but did not have them. Sometimes they can cause conflict if the experience doesn't conform to somebody's pre-existing spiritual beliefs. In general, NDEs seem to be a force for good - leading people to live more patient and compassionate lives.</p> <p>This is a well structured non-fiction book. Any aspiring non-fiction writer would do well to pay attention to Greyson's ability to plant the seeds of one question in one chapter, and then answer it promptly in the next. In some cases he points at something he's just said and them tells you he'll clarify it much later. You're never left wondering about things - Greyson has clearly guided many a novice down this garden path. This makes for an engaging read, one that you could burn through.</p> <p>At times it is a little frustrating that the evidence seems to be "I met Jane who almost died, and here's what she reported… I met Alex who almost died and they said…". However, this does provide more personable that a table or chart might not. Still, it would have been nice to have a bit more formalisation.</p> <p>In fact the entire book seems to work hard to directly avoid an academic tone. Rigour is very clearly cut off in favour of conversation and engagement. We get glimpses into the fact that Greyson obviously has a wealth of experience in dealing with NDEs and their consequences on others. However, I never got the sense that he had truly mastered the gnarlier corners of the field, or was attempting to push the shape of research forward from a collection of personal testimonies.</p> <p>Depth is sacrificed for breadth in this book, even to the extent where I wonder if Greyson's success can be attributed more to the impact and consequences of his patients' experiences than to him as an individual or researcher. I get the sense he might give an excellent hour long seminar, or be lively company at a dinner party, but rather less that he fulfils the detail-oriented academic air. I suspect at least in part that this is because he has less literature to delve through, join together, or refute. He is a story teller, a founding father with a vision of a new nation. He is not a civil servant sorting through the minutia of allocating land and settling legal disputes.</p> <p>At the same time, the only way that you'll get a sense for the actual experience of an NDE is if you hear them spoken about. You can hear "out of body experience" and not think about it too much. These are loaded, emotionally- or spiritually-charged terms, for me at least. Having three or four concrete examples, each with undeniably odd situations around them (like noticing the state of someone's attire while dead and having your eyes covered) does a better job at making you confront these experiences. I don't think the same could be achieved with the cool, polished marble of figures and numbers.</p> <p>This becomes even more important when people talk about experiences which step past both our every-day lived experience, and the capacity of our language to communicate ideas.</p> <p>It is here that we depart the actual topic of the book, and start talking about the meta aspects. It is here that Greyson is able to throw out half a dozen or observations about medical and scientific research, each fundamental to the way we conduct, review, and communicate research. In short - all very interesting ideas. Certainly they are not ideas to adopt wholesale. This won't be the book that topples the peer-reviewed, double blind study, but it's a step towards there.</p> <p>The most interesting question this book raises isn't "what happens when we die?" it is "what is evidence?". Greyson works in the gate-kept, largely conforming and heterogeneous landscape of academic research. The focus for many practitioners is on getting enough published research out to justify their positions and move towards promotion and tenure. It is not in their interest, really, to rock the boat too heavily. It is a much wiser choice to make sure your research looks, broadly, as it is meant to look, which means it looks like everybody else's, and like everything that came before it.</p> <p>This is not the most effective way to study every part of the human experience. If you hold NDE experience to the same standard as a vaccine trial (double-blind gold standard control), you will never get any data or information. From that stand point, NDEs simply do not exist.</p> <p>With the prevailing attitude that NDEs do not exist, if you almost died (especially if you tried to take your own life), and you experienced going someplace else and meeting your deceased grandparents or parents, would you tell the doctors around you what happened? Nope, you'd probably stay quiet and maybe tell one other person in your life. Because NDEs do not exist, and there are no vehicles to get your NDE story outside of yourself.</p> <p>You would be worried the doctors would think you crazy, or judge you, and not listen. There's a high chance they'd diagnose you with some kind of psychotic episode and maybe keep you in hospital longer. You would have gone through two very impactful events in your life (nearly dying, then having an NDE) and you will have no professional support to guide you through processing these and integrating them into your life.</p> <p>The healthcare professionals made sure the mechanics of your body wouldn't fail, and then sent you off. This is not the gold standard, end-goal of medical care. The question of "what is data" is not just a philosophical one, it is one which impacts us and our healthcare system.</p> <p>Greyson makes a very convincing case for a human- and experience-centric approach to research. Both in the design of experiments and the consideration of publication. There is no point in doing research if it cannot be effectively conducted, reviewed, and published. If the standards for conducting, reviewing, and publishing research remain narrow, then only some kinds of studies will be published. Or things will be studied with inappropriate methods, because they suit the medium (research) not the subject (NDEs).</p> <p>Research should push our collective understanding forward, and medical research should (eventually) result in better care. To support people who have NDEs, regardless of what you think they actually <em>are</em>, you need to understand them. To understand them, you need to be flexible in how you collect data about them. We need peoples' testimonies and experiences to be treated as sacredly as though the were field observation or computational data.</p> <p>Even if you don't care the slightest about the spiritual or moral implications of this book, read it. You might think it all poppycock, but it's a well told poppycock. Perhaps the strokes are too-broad and the author too American, but this is a good, accessible non-fiction book that raises more insightful points about our (the West's) approach to healthcare and wellbeing.</p>]]></description> <category domain="https://thomaswilson.xyz/blog">Book Review</category> </item> <item> <title><![CDATA[Book Review: Hangover Square]]></title> <link>https://thomaswilson.xyz/blog/hangover-square</link> <guid>https://thomaswilson.xyz/blog/hangover-square</guid> <pubDate>Tue, 25 May 2021 00:00:00 GMT</pubDate> <description><![CDATA[<p>I was gifted this book by my mother, so I feel terrible for what I am about to say about it. It was gifted with the best of intentions: someone or other famous reported that it made them feel at home in London, a city I love. But a city that can feel indifferent to you. This book did not make me feel at home in this city. It showed how it is possible for a place to be the centre of art, politics, ambition and still allow anyone to shift un-affixed through their life.</p> <p>Credit where it's due: Hamilton captures this mood so well in <em>Hangover Square</em>, a book set in London in the winter of 1938. Written between 1939-1941, just as the Second World War loomed and then broke, the backdrop is bleak, and various characters' enthusiasm for the Nazi regime isn't particularly endearing.</p> <p>This is a bleak book. There is little in it to broadcast hope. We get a few weak flashes, but we know well enough that they're faltering and won't last the evening. Let alone the night. This is thanks to our hapless protagonist, George Harvey Bone: a man who seems rarely to have his own self interest at heart. A man who is in hapless love with Netta, a sometimes actress but always cruel woman who uses Bone for nothing more than social leverage and free drinks.</p> <p>The drudgery of unrequited love apparently runs in Hamilton's other works, namely <em>Twenty Thousand Streets Under The Sky</em>. He writes it incredibly well. Though I am largely unsympathetic to Bone, Hamilton draws out the sympathy, even when you're pretty stone-cold on the same narrative arc repeating itself for the fourth-or-fifth time in the book.</p> <p>Netta strings Bone, along with her two other drinking companions (and sometimes lovers) Micky and Peter through the pubs of Euston. Gin and beer and sandwiches appear cycle through this book. Unsurprisingly, Hamilton himself was a drunk. A lonely drunk. But golly can he write.</p> <p>This complete haplessness and lack of control over his whole life makes the book drag. There is little to no change in narrative style or characters throughout the book. We're introduced to Bone's "dead moods", what we might now recognise as schizophrenic or psychotic/depersonalisation episodes. Times when the illusion of self and consciousness are completely freed from him, and he is overwhelmed by a desire to kill Netta.</p> <p>But these are never explored. He's had dead moods for his entire life, but he's not known Netta his entire life. Are they an expression of things he truly wants, or some perfect negative of his "normal" self? We're never given any hint of an answer.</p> <p>At no point do you believe that Bone actually will change, or wants to change. He has no mastery of himself, he is subject to the abandonment of others. Romantically and platonically, people leave Bone. It's sad, but also I have no sense of who Bone was. He's taken advantage of by those around him, they see him as nothing more than the taxi fares and gin bottles he can buy. And they're not wrong. They're obviously callous and unkind and taking advantage, but... what else is Bone? Our poetic narrator.</p> <p>If nothing else, read sections of the book, just for the language. It is singularly the largest redeeming feature, making this book worth the (literally groan-inducing) effort that it took from me at other times. It reads as though freshly graduated from the school of Dickens, though with the bone-tired-from-the-effort-of-alcoholism that can't be bought at eighteen years old. A mature student of the Dickensian school, then.</p> <p>I'm unsure if the prose capture the 1940s accurately, or instead a few decades before. I'm not familiar with literature of the time. The little interactions between characters, or our narrators internal monologue all shine. Simply worth reading. Hamilton was a talented writer, and though I'll gladly turn my nose up at his choice of subject, the way he wrote it was good.</p> <p>Read it, but don't expect to be drawn in. 2.5 â</p>]]></description> <category domain="https://thomaswilson.xyz/blog">Book Review</category> </item> <item> <title><![CDATA[Book Review: Project Hail Mary]]></title> <link>https://thomaswilson.xyz/blog/project-hail-mary</link> <guid>https://thomaswilson.xyz/blog/project-hail-mary</guid> <pubDate>Thu, 03 Jun 2021 00:00:00 GMT</pubDate> <description><![CDATA[<p>When you read a Dan Brown book you leave it ready to put on your tin foil har. Andy Weir books make you feel ready to don a lab coat. He writes books that are clearly well researched and very involved, but they're still readable. Dan Brown gets (at most) one of these two things.</p> <p>Project Hail Mary is inevitably going to be compared to Weir's 2011 <em>The Martian</em>, a book which received (well deserved) critical and public acclaim. It's a good book (read it) and an okay movie (watch it with friends, drink if you want). Just like <em>The Martian</em>, we follow a lone human (Ryland Grace) confined in a spaceship in space and faced with a laundry list of life-threatening problems. Grace is there because there's an existential threat to the human race, and so he's got to get on a space ship to solve it.</p> <p>Whereas <em>The Martian</em>'s Mark Watney speaks to us through Captain's Log entries (v. enjoyable), Project Hail Mary has a more traditional narrative. Weir's 2017 <em>Artemis</em> follows a bigger cast of characters, so the narrative is more traditional. In fact, Artemis suffered a bit too much from bing "more traditional" which is why not a lot of people talk about it.</p> <p>The writing in this book is solid. It's caricatured in places, and rarely (if ever) poetic. I wouldn't highlight or want to remember any particular part of this book. But I didn't expect it to be. Weir presents us with some really interesting biological/evolutionary theories and ideas, which challenge what you might think of as "life". I don't need lyrical prose if you've good big thinkers like that one. Still, don't expect to have your morals shifted.</p> <p>Take his book as something to be enjoyed on its own. It's like a party: good for you to do, but hard for you to explain why.</p> <p>We follow Grace through various engineering and biological challenges, twists and turns, which he dutifully solves as he tries to save a) himself, and b) the rest of humanity. The pacing is textbook. It is predictable and unsurprising, but well-enough written that it never lags, though towards the end you certainly start to predict the rhythms.</p> <p>The other problem is that the stakes never differ, or feel actually on the line. A problem emerges which is a 6/10 emergency, Grace does something to solve it and it goes down to a 0-3/10, and then something unexpected happens and we're at an 8-9/10 before he solves things and we move on to the next cycle.</p> <p>Even though you might not understand the problems, you always know that Grace is going to solve the problem, because Grace always <em>has</em> solved the problem. Everything is going to be okay in the end,.</p> <p>The content of the problems is what makes them interesting each time, though. Weir brings a level of knowledge and a depth of research that make you feel glad that you're not on a spaceship and that humanity isn't depending on you. Weir has the great scientific quality of "X happened… so therefore Y". He's able to set the table rules in physics, chemistry, and biology and then explore problems close enough within those rules.</p> <p>If you're a practicing research scientists in any of these areas I'm sure you'll roll your eyes at it. I'm sure it doesn't withstand informed scrutiny, but I enjoy it.</p> <p>Despite all this heroism and know-how, Grace is a coward. Not an entire coward, not cripplingly. Humans can be many things in many contexts. Grace is a high school teacher in his 30-somethings (before he goes to space). His life has been shaped heavily by a lack of action or boldness in everything other than his academic career. Even in that he doesn't commit to it.</p> <p>We don't see any character development or changes in him. At the end of the book you know that he's the same person he was at the beginning, and I'm unsure if he's had any level of self-awareness or knowledge. But (low-level spoilers here) he does manage to save the world and humanity, so maybe he's earned the right to stay a flawed man.</p> <p>It's a reminder that "cowardly" people can do good things, and that Andy Weir can write excellent science fiction, just maybe not great character work.</p> <p>I listened to the audiobook of this one, and I would definitely recommend. There are parts of the book which play with sound/language, where having an audio component <em>really</em> made this shine. The production quality added in a few non-vocal aspects which really brought it to life. I would totally recommend picking this up on Audible if you even remotely like audiobooks.</p>]]></description> <category domain="https://thomaswilson.xyz/blog">Book Review</category> </item> <item> <title><![CDATA[Book Review: Sistersong]]></title> <link>https://thomaswilson.xyz/blog/sistersong</link> <guid>https://thomaswilson.xyz/blog/sistersong</guid> <pubDate>Sun, 13 Jun 2021 00:00:00 GMT</pubDate> <description><![CDATA[<p><em>Sistersong</em> is the debut novel from Lucy Holland. Set in Dumnonia, the Celtic kingdom which lasted between the 4th-8th century in what is now South West England, it follows the three children of the king (introduced as Riva, Synne, and Keyne), as they come of age and start to see the word "as it is".</p> <p>The world now is far from the one the siblings grew up in. Threatened by the surrounding Saxons, losing connection to the land's magic, and waining religious beliefs all give this book an excellent backdrop. The world that Holland constructs (and the people she puts in it) are granular and realised. Holland believes a world into being, almost effortlessly. Dialog never feels forced, and the relationships between the siblings are rendered wonderfully.</p> <p>"Fantasy" literature is a broad scope, and books like <em>Sistersong</em> do it justice by creating these complex, real characters. Although the book is set in an historical-fantasy setting, it is just a setting. I don't think I've read a book that gives such, almost casual, voice to figures who might otherwise be voiceless. The prominence of trans, or gender identity, themes in this book came across as far more important than anything else. But still, other elements and people and their relationships come through.</p> <p>Yeah, there's magic, but even if there's magic there's still siblings who argue, and parents who don't accept when their children grow up, and men who only want one thing (sex). I would have a hard time putting this book into any particular genre</p> <p>Despite this excellent character work and writing, the pacing was off for me. The first and last third of the book felt right: things moved along at the right pace. Though I definitely felt the book swerve after maybe 100 pages. I feel like a certain pathway for the plot was set up, and then we just hopped over to another story. This felt jarring.</p> <p>The middle third felt a little aimless at times, and without more of the world to investigate, or seeing things change, it felt like a slog to get through. The world painted is pretty bleak: the weather isn't great, there's a threat of a foreign invasion, and there's generally a lot of mistrust. I don't know if Holland is trying to create this feeling of claustrophobia or fear, but it's all tension with no real consequence. It's exaggerated by the more focused chapters on either side. For a long time… nothing happens.</p> <p>Removing content from a creative project is hard. Especially when you spent ages making it. I think this book could have benefited from a bit more even pacing, and more ruthless copy editor.</p> <p>Then again, maybe Holland wanted a book driven entirely by character, where plot is just a thing that happens in the background. That's a fine aspiration, but it didn't feel consistent.</p> <p>Despite that, I enjoyed the themes: family, relationships, coming of age, and identity. They're themes that are strong in our oldest stories and ballads as humans, and they're as relatable now as they've ever been (apparently). Holland his tried to give new depth or new voice to an existing story - and has done so without being preachy, or really without making it a thing.</p> <p>Read this book. 3.5 â</p>]]></description> <category domain="https://thomaswilson.xyz/blog">Book Review</category> </item> </channel> </rss>