From 985a470157fd4bbbb3bc833cce703b3a254ffb9b Mon Sep 17 00:00:00 2001 From: Thomas Date: Tue, 26 Apr 2022 07:23:15 +0100 Subject: [PATCH] - Blog Post: Complicated and not that useful web development - Source Blog posts from static file - Write python file to find all blog posts --- scripts/list-posts.py | 45 +++++++++ ...020-08-07-where-i-go-for-ui-inspiration.md | 1 - .../2021-04-08-just-enough-software-design.md | 1 - .../blog/2022-03-13-discover-complexity.md | 2 +- .../2022-04-10-recognise-and-reduce-risk.md | 4 +- .../blog/2022-04-17-why-is-this-pr-so-big.md | 2 +- ...2-04-26-complicated-and-not-that-useful.md | 98 +++++++++++++++++++ src/content/posts.json | 1 + src/routes/api/blog.json.ts | 18 +--- src/routes/blog.svelte | 14 ++- 10 files changed, 162 insertions(+), 24 deletions(-) create mode 100644 scripts/list-posts.py create mode 100644 src/content/blog/2022-04-26-complicated-and-not-that-useful.md create mode 100644 src/content/posts.json diff --git a/scripts/list-posts.py b/scripts/list-posts.py new file mode 100644 index 0000000..73f27b2 --- /dev/null +++ b/scripts/list-posts.py @@ -0,0 +1,45 @@ +import glob +import frontmatter +import json +from datetime import datetime +from datetime import date +from dateutil.parser import * + +""" +Build a hashamp of all blog posts and book reviews used in the blog. +This is used on both the blog/index page, and the blog/[svelte] pages to +render out a list of posts (and fetch more detail) to prevent the need +to re-fetch on every request +""" + +blog_posts = glob.glob('./src/content/**/*.md') +hash_map = {} + +for file in blog_posts: + post = frontmatter.load(file) + print(post['title']) + slug = post['slug'] + frontmatter_keys = post.keys() + + published_date = post['date'] + print(published_date) + + + # We want a datetime, note a date + if isinstance(published_date, date): + published_date = datetime.combine(published_date, datetime.min.time()) + + + + details = { + 'title': post['title'], + 'date': published_date.isoformat(), + 'book_review': 'book_review' in frontmatter_keys, + 'preview': post.content[0:180], + 'slug': slug + } + hash_map[slug] = details + + +with open('./src/content/posts.json', "w") as file: + json.dump(hash_map, file) diff --git a/src/content/blog/2020-08-07-where-i-go-for-ui-inspiration.md b/src/content/blog/2020-08-07-where-i-go-for-ui-inspiration.md index 6f13686..a4c31c0 100644 --- a/src/content/blog/2020-08-07-where-i-go-for-ui-inspiration.md +++ b/src/content/blog/2020-08-07-where-i-go-for-ui-inspiration.md @@ -1,5 +1,4 @@ --- - title: "Where I go for UI inspiration" author: Thomas Wilson date: 2020-08-07T12:00:00 diff --git a/src/content/blog/2021-04-08-just-enough-software-design.md b/src/content/blog/2021-04-08-just-enough-software-design.md index dbbfcf4..2d27de8 100644 --- a/src/content/blog/2021-04-08-just-enough-software-design.md +++ b/src/content/blog/2021-04-08-just-enough-software-design.md @@ -1,5 +1,4 @@ --- - title: "How much is just-enough system design for new apps and software?" author: "Thomas Wilson" date: 2021-04-08 diff --git a/src/content/blog/2022-03-13-discover-complexity.md b/src/content/blog/2022-03-13-discover-complexity.md index d4c347a..5b96d76 100644 --- a/src/content/blog/2022-03-13-discover-complexity.md +++ b/src/content/blog/2022-03-13-discover-complexity.md @@ -1,7 +1,7 @@ --- title: "Discover Complexity" author: "Thomas Wilson" -date: 2022-03-13T10:10 +date: 2022-03-13T10:10:00 slug: "2022-03-13-discover-complexity" draft: false --- diff --git a/src/content/blog/2022-04-10-recognise-and-reduce-risk.md b/src/content/blog/2022-04-10-recognise-and-reduce-risk.md index 61c8b19..e0936c5 100644 --- a/src/content/blog/2022-04-10-recognise-and-reduce-risk.md +++ b/src/content/blog/2022-04-10-recognise-and-reduce-risk.md @@ -1,7 +1,7 @@ --- title: "Recognise and reduce risk" author: "Thomas Wilson" -date: 2022-04-10T21:10 +date: 2022-04-10T21:10:00 slug: "2022-04-10-recognise-and-reduce-risk" draft: false --- @@ -30,4 +30,4 @@ Risk is risk. Risk from product (what) and risk from engineering (how) cannot b Your job is to reduce risk for yourself, your boss, or your company. If you have any interest beyond the pure craft of software, aim to reduce risk for the most number of people possible -[^1]: I think we (I) separate the _what_ from the _how_ 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. \ No newline at end of file +[^1]: I think we (I) separate the _what_ from the _how_ 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. diff --git a/src/content/blog/2022-04-17-why-is-this-pr-so-big.md b/src/content/blog/2022-04-17-why-is-this-pr-so-big.md index a52f0f1..13f6786 100644 --- a/src/content/blog/2022-04-17-why-is-this-pr-so-big.md +++ b/src/content/blog/2022-04-17-why-is-this-pr-so-big.md @@ -1,7 +1,7 @@ --- title: "'How did this PR get so big?' – Advice for separating aesthetic and functional changes in code" author: "Thomas Wilson" -date: 2022-04-17T10:48 +date: 2022-04-17T09:48:00Z slug: "2022-04-17-why-is-this-pr-so-big" draft: false tags: diff --git a/src/content/blog/2022-04-26-complicated-and-not-that-useful.md b/src/content/blog/2022-04-26-complicated-and-not-that-useful.md new file mode 100644 index 0000000..128e8ca --- /dev/null +++ b/src/content/blog/2022-04-26-complicated-and-not-that-useful.md @@ -0,0 +1,98 @@ +--- +title: "Complicated and Maybe Not That Useful – Modern frontend tooling" +author: "Thomas Wilson" +date: 2022-04-26T06:03:00Z +slug: "2022-04-26-complicated-and-not=-that-useful" +draft: false +tags: + - web + - product + - rails +--- + + +**Prologue** 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. + +--- + +Nearly ten years ago I was gifted a book called _Agile Web Development with Ruby on Rails_ 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. + +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. + +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. + +I don't think I've been set up for success. + +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. + +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. + +I've never had more tools help me do less. + +*Nah, software is just hard to build*. Nope, I think we made it too complicated. There's more to this than "man who learns frontend can't do backend", I promise. + +## Complexity! + +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. + +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? + +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. + +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. + +The structure of software mimics the structure of the organisation that creates it, that's [Conway's Law](https://en.wikipedia.org/wiki/Conway%27s_law). + +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 *start* building as though you were a rapidly scaling team. + +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 *despite* this complexity. We might even be able to build better software without it. + +## I want to build something + +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. + +The last side project I attempted in earnest was a native iOS app (RIP [Dash](/blog/2021-04-12-dash-cycle-01-reorganising)) in which I learned that native development is _not_ 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. + +Recently I've been trying to improve my French proficiency (*la pandémie ne m'a encuragé pas de tout*). 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. + +I figured that to do this I'd need: + +1. **UI/Client Side**: A modern-looking UI built using standard(ish) web tools, which can handle moderate complexity (like comboboxes and interactive search) +2. **Server Side**: 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) +3. **Inevitable Integrations**: things like transactional email, authentication stories, and media CDNs will always creep up on you. +3. **Data**: Persisted data storage, like a database +4. **Infrastructure & Tests**: 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. + +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? + +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. + +Anyway, I looked for a framework. A popular and easy choice for many would be a [NextJS](https://nextjs.org/). 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. + +After looking around, I found [Remix Run](https://remix.run/): + +> 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 + +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). + +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 _only_ way to generate a DOM isn't an unconditional advantage. + +## Back to the Checklist + +That technical / component checklist above could read the same for any medium+ complex application with a web-powered GUI. + +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 _and_ a product and you're only a team of two. + +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. + +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). + +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. + +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, *exactly* 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. + +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. + +And that's why I've started exploring Rails again. + +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. diff --git a/src/content/posts.json b/src/content/posts.json new file mode 100644 index 0000000..1863de0 --- /dev/null +++ b/src/content/posts.json @@ -0,0 +1 @@ +{"hangover-square": {"title": "Hangover Square", "date": "2021-05-25T00:00:00", "book_review": true, "preview": "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 mad", "slug": "hangover-square"}, "wow-no-thank-you": {"title": "wow, no thank you", "date": "2020-09-01T00:00:00", "book_review": true, "preview": "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. _We are never meeting in real life_, her previous set of e", "slug": "wow-no-thank-you"}, "project-hail-mary": {"title": "Project Hail Mary", "date": "2021-06-03T00:00:00", "book_review": true, "preview": "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 research", "slug": "project-hail-mary"}, "hamnet": {"title": "Hamnet", "date": "2020-10-18T00:00:00", "book_review": true, "preview": "_Hamnet_ 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 ", "slug": "hamnet"}, "kings-of-the-wyld": {"title": "Kings of the Wyld", "date": "2020-12-13T00:00:00", "book_review": true, "preview": "_Kings of the Wyld_ 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 play", "slug": "kings-of-the-wyld"}, "on-connection": {"title": "On Connection", "date": "2020-11-14T00:00:00", "book_review": true, "preview": "Kae Tempest is a London-based artist who works with words. I first discovered their work in 2016, with the release of _Let Them Eat Chaos_ - a conceptual spoken word album which im", "slug": "on-connection"}, "queenie": {"title": "Queenie", "date": "2020-09-26T00:00:00", "book_review": true, "preview": "_Queenie_ 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.", "slug": "queenie"}, "the-phoenix-project": {"title": "The Phoenix Project", "date": "2020-12-02T00:00:00", "book_review": true, "preview": "*The Phoenix Project* (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 jus", "slug": "the-phoenix-project"}, "an-absolutely-remarkable-thing": {"title": "An Absolutely Remarkable Thing", "date": "2020-11-08T00:00:00", "book_review": true, "preview": "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 t", "slug": "an-absolutely-remarkable-thing"}, "utopia-avenue": {"title": "Utopia Avenue", "date": "2021-02-09T00:00:00", "book_review": true, "preview": "_Utopia Avenue_ 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 ot", "slug": "utopia-avenue"}, "after": {"title": "After", "date": "2021-05-05T00:00:00", "book_review": true, "preview": "**Declaration of interest** I am a spiritual person. I didn\u2019t come into this book desperately seeking answers, or in need of comfort or certainty. You\u2019re never going to get that fr", "slug": "after"}, "magician": {"title": "Magician", "date": "2021-03-15T00:00:00", "book_review": true, "preview": "The first in Feist's *Riftwar Saga*, 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 '", "slug": "magician"}, "the-silence-of-the-girls": {"title": "The Silence of the Girls", "date": "2021-01-24T00:00:00", "book_review": true, "preview": "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 be", "slug": "the-silence-of-the-girls"}, "sistersong": {"title": "Sistersong", "date": "2021-06-13T00:00:00", "book_review": true, "preview": "_Sistersong_ 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 th", "slug": "sistersong"}, "first-you-write-a-sentence": {"title": "First You Write a Sentence", "date": "2021-02-04T00:00:00", "book_review": true, "preview": "I loved this book. _Will_ 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 w", "slug": "first-you-write-a-sentence"}, "once-upon-a-river": {"title": "Once Upon a River", "date": "2021-04-04T00:00:00", "book_review": true, "preview": "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 gi", "slug": "once-upon-a-river"}, "cats-cradle": {"title": "Cat's Cradle", "date": "2020-10-03T00:00:00", "book_review": true, "preview": "After _Slaughterhouse 5_, _Cat's Cradle_ is the second Vonnegut book I've read. I've heard wonderful things about Vonnegut, and this book exemplifies a lot of those, namely uncomfo", "slug": "cats-cradle"}, "mrs-death-misses-death": {"title": "Mrs Death Misses Death", "date": "2021-04-17T00:00:00", "book_review": true, "preview": "Godden has been writing and performing poetry since she decided to move to London instead of going to university. \u201cGodden is a poet\u201d headlines my review because it is so evident in", "slug": "mrs-death-misses-death"}, "how-do-we-know-were-doing-it-right": {"title": "how do we know we're doing it right?", "date": "2020-09-20T00:00:00", "book_review": true, "preview": "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 mil", "slug": "how-do-we-know-were-doing-it-right"}, "2020-08-29-apple-what-are-you-doing": {"title": "Apple, What are you doing?", "date": "2020-08-29T00:00:00", "book_review": false, "preview": "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", "slug": "2020-08-29-apple-what-are-you-doing"}, "2021-03-06-design-workflow-build-components": {"title": "The Frustrating Mismatch of Design by User Journey but Build with Components ", "date": "2021-03-06T00:00:00", "book_review": false, "preview": "How do you design a good app?\n\nIt'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.\n", "slug": "2021-03-06-design-workflow-build-components"}, "2020-09-25-things-i-learned-7": {"title": "Things I learned this week #7", "date": "2020-09-25T00:00:00", "book_review": false, "preview": "- **This unknown origin**: 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 wif", "slug": "2020-09-25-things-i-learned-7"}, "2021-02-19-things-i-learned-28": {"title": "Things I learned this week #28", "date": "2021-02-19T00:00:00", "book_review": false, "preview": "- **This collective noun**: 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 co", "slug": "2021-02-19-things-i-learned-28"}, "2020-11-19-figma-variants-without-buttons": {"title": "Introducing Figma Variants with 5 Components that aren't Buttons", "date": "2020-11-19T00:00:00", "book_review": false, "preview": "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", "slug": "2020-11-19-figma-variants-without-buttons"}, "2020-10-23-things-i-learned-11": {"title": "Things I learned this week #11", "date": "2020-10-23T00:00:00", "book_review": false, "preview": "- **This thing about how we sleep**: 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. ", "slug": "2020-10-23-things-i-learned-11"}, "back-to-bear": {"title": "Back to Bear, Goodbye Notion", "date": "2019-08-15T00:00:00", "book_review": false, "preview": "This piece turned out a little long than expected because I really want to clarify that this is not a \u201cWhy Bear is better than Notion\u201d article. It is a \u201cWhy Bear suits my needs rig", "slug": "back-to-bear"}, "2020-08-21-things-i-learned-2": {"title": "Things I learned this week #2", "date": "2020-08-21T00:00:00", "book_review": false, "preview": "- **This useful thinking tool**: 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 y", "slug": "2020-08-21-things-i-learned-2"}, "2020-10-16-things-i-learned-10": {"title": "Things I learned this week #10", "date": "2020-10-16T00:00:00", "book_review": false, "preview": "- **This Tiny City**: 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 neighbouri", "slug": "2020-10-16-things-i-learned-10"}, "2021-06-05-weekly-43-vision-problem-action": {"title": "The Weekly #43: Vision, problem, and action", "date": "2021-06-05T00:00:00", "book_review": false, "preview": "The Weekly is a weekly essay where I write about something I\u2019ve been thinking about in the last seven days. They\u2019re under 1000 words, and this week I want to talk about vision and ", "slug": "2021-06-05-weekly-43-vision-problem-action"}, "2020-09-06-javascript-promises-introduction": {"title": "Why are you like this, JavaScript? An introduction to Promises by using Fetch.", "date": "2020-09-06T00:00:00", "book_review": false, "preview": "Let's start with a correct, but pretty dense, definition: JavaScript Promises are a first-class abstraction for handling asynchronous actions, like:\n\n- Fetching data from a remote ", "slug": "2020-09-06-javascript-promises-introduction"}, "2021-10-28-how-to-onboard-new-software-engineers": {"title": "How to onboard new software engineers without paying high interest", "date": "2021-10-28T00:00:00", "book_review": false, "preview": "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 especia", "slug": "2021-10-28-how-to-onboard-new-software-engineers"}, "2021-05-06-weekly-39": {"title": "The Weekly #39 (or #1, whatever)", "date": "2021-05-06T00:00:00", "book_review": false, "preview": "I\u2019m going to stop writing my \u201cthings I learned\u201d blog posts. They don\u2019t serve me in the way that they used to. As [I wrote recently](/blog/2021-04-27-excommunicate-your-ideas): kill", "slug": "2021-05-06-weekly-39"}, "2020-10-31-things-i-learned-12": {"title": "Things I learned this week #12", "date": "2020-10-31T00:00:00", "book_review": false, "preview": "- **This high fat diet**: 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 mammar", "slug": "2020-10-31-things-i-learned-12"}, "2021-02-26-things-i-learned-29": {"title": "Things I learned this week #29", "date": "2021-02-26T00:00:00", "book_review": false, "preview": "- **This lineage of cats**: 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", "slug": "2021-02-26-things-i-learned-29"}, "2020-11-27-things-i-learned-16": {"title": "Things I learned this week #16", "date": "2020-11-27T00:00:00", "book_review": false, "preview": "- **These Tattoos**: 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", "slug": "2020-11-27-things-i-learned-16"}, "2020-12-05-things-i-learned-17": {"title": "Things I learned this week #17", "date": "2020-12-05T00:00:00", "book_review": false, "preview": "It's time of year again: Spotify have released their _Rewind_ - showing you what you listened to throughout this year. After the _year_ (or decade, or complete non-year, whatever h", "slug": "2020-12-05-things-i-learned-17"}, "2021-03-13-things-i-learned-31": {"title": "Things I learned this week #31", "date": "2021-03-13T00:00:00", "book_review": false, "preview": "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, acknow", "slug": "2021-03-13-things-i-learned-31"}, "2021-08-11-things-i-learned-35": {"title": "Things I learned this week #35", "date": "2021-04-11T00:00:00", "book_review": false, "preview": "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 t", "slug": "2021-08-11-things-i-learned-35"}, "2022-02-28-vibe-check-1": {"title": "Vibe Check #1", "date": "2022-02-28T00:00:00", "book_review": false, "preview": "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. Th", "slug": "2022-02-28-vibe-check-1"}, "2021-04-27-excommunicate-your-ideas": {"title": "Excommunicate your ideas", "date": "2021-04-27T00:00:00", "book_review": false, "preview": "Your side-projects deserve a decisive, merciful death at your hands. You dragged them into this world, you\u2019ll fling them out. And do it quickly.\n\nI want to talk about killing our m", "slug": "2021-04-27-excommunicate-your-ideas"}, "2022-03-02-concentrate-on-concentrated-tests": {"title": "Concentrate on Concentrated Tests", "date": "2022-03-02T00:00:00", "book_review": false, "preview": "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 ", "slug": "2022-03-02-concentrate-on-concentrated-tests"}, "2020-12-20-how-are-we-going-to-write-about-2020": {"title": "How are we going to write about 2020 from 2022 onwards?", "date": "2020-12-20T00:00:00", "book_review": false, "preview": "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 t", "slug": "2020-12-20-how-are-we-going-to-write-about-2020"}, "2020-09-04-things-i-learned-4": {"title": "Things I learned this week #4", "date": "2020-09-04T00:00:00", "book_review": false, "preview": "- **This world**: The Word _Kipple_ is a word invented by SciFi writer Phillip K. Dick, to mean the kind of rubbish/trash that accumulates if humans don't intervene. [source](https", "slug": "2020-09-04-things-i-learned-4"}, "2021-01-09-things-i-learned-22": {"title": "Things I learned this week #22", "date": "2021-01-09T00:00:00", "book_review": false, "preview": "This week the UK Government has brought us _Lockdown The Third_, a threequel in the franchise after the straight-to-TV movie that was the November lockdown. Cases, deaths, and hosp", "slug": "2021-01-09-things-i-learned-22"}, "2020-10-02-things-i-learned-8": {"title": "Things I learned this week #8", "date": "2020-10-02T00:00:00", "book_review": false, "preview": "This week's _Things I learned_ 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", "slug": "2020-10-02-things-i-learned-8"}, "2020-10-10-five-useful-questions-new-job": {"title": "Five (and a bit) useful questions to answer in your first week at a new job", "date": "2020-10-10T00:00:00", "book_review": false, "preview": "I've just had my first week at a new job (I'm now a frontend software engineer at [Oxwash](https://www.oxwash)), which is cool. I find first weeks intense because I have to balance", "slug": "2020-10-10-five-useful-questions-new-job"}, "2021-01-23-things-i-learned-24": {"title": "Things I learned this week #24", "date": "2021-01-23T00:00:00", "book_review": false, "preview": "- **This fitness research**: 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", "slug": "2021-01-23-things-i-learned-24"}, "2020-12-27-things-i-learned-20": {"title": "Things I learned this week #20", "date": "2020-12-27T00:00:00", "book_review": false, "preview": "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", "slug": "2020-12-27-things-i-learned-20"}, "2021-05-05-customer-centric-like-a-robot": {"title": "[LinkedIn Post] Being so customer-centric your customers think you\u2019re a robot", "date": "2021-05-05T00:00:00", "book_review": false, "preview": "(This is a cross-post of [a short article I wrote on LinkedIn](https://www.linkedin.com/pulse/being-so-customer-centric-your-customers-think-youre-robot-wilson))\n\nStop me if you\u2019ve", "slug": "2021-05-05-customer-centric-like-a-robot"}, "2020-03-22-why-i-chose-react-native-for-app-in-2020": {"title": "Why I chose React Native to build a new app in 2020", "date": "2020-03-22T00:00:00", "book_review": false, "preview": "I am currently in the process of building herabouts - an app that\u2019s like a tour guide, only cooler. Most of my previous engineering work has been web-based (react and vue) because ", "slug": "2020-03-22-why-i-chose-react-native-for-app-in-2020"}, "2020-10-24-writing-for-recipe-cards": {"title": "Tiny thought: Writing for recipe cards", "date": "2020-10-24T00:00:00", "book_review": false, "preview": "_Tiny Thoughts_ are little (500 word) essays. They're concise.\n\nI've spent the past three months consciously trying to write and read more. I want to improve my ability to refine a", "slug": "2020-10-24-writing-for-recipe-cards"}, "2021-04-12-dash-cycle-01-reorganising": {"title": "Dash Cycle #01: (re)organising", "date": "2021-04-12T00:00:00", "book_review": false, "preview": "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.\n\n## Goals\n\n", "slug": "2021-04-12-dash-cycle-01-reorganising"}, "2022-02-22-atomic-habits-is-a-really-good-book": {"title": "\ud83d\udcd6 Atomic Habits is a really good book", "date": "2022-02-22T00:00:00", "book_review": false, "preview": "I spoke to thirty founders, and they all do these three things before breakfast.\n\nMy nine journaling prompts for other CEOs and founders\n\nOne rule for flawless interviews.\n\n[and so", "slug": "2022-02-22-atomic-habits-is-a-really-good-book"}, "2020-02-24-hereabouts-devblog-1": {"title": "Hereabouts devblog #1", "date": "2020-02-24T00:00:00", "book_review": false, "preview": "Hi, my name\u2019s Thomas Wilson but I often go by my just my surname. I\u2019m 28 years old, currently based in London, England, and I design and build software for a living through my smal", "slug": "2020-02-24-hereabouts-devblog-1"}, "2020-09-20-interviewing-experience-2020": {"title": "My experience finding a new job as a software engineer in summer of 2020", "date": "2020-09-20T00:00:00", "book_review": false, "preview": "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", "slug": "2020-09-20-interviewing-experience-2020"}, "2020-04-02-hereabouts-devblog-2": {"title": "Hereabouts devblog #2 - March 2020", "date": "2020-04-01T00:00:00", "book_review": false, "preview": "Hi, I\u2019m Thomas Wilson, I\u2019m a web and mobile engineer building [Hereabouts](https://www.hereabouts.app) - an app that\u2019s like a tour guide if the tour guide was like [Roman Mars](htt", "slug": "2020-04-02-hereabouts-devblog-2"}, "2021-02-13-things-i-learned-27": {"title": "Things I learned this week #27", "date": "2021-02-13T00:00:00", "book_review": false, "preview": "- **This seventeenth century petition**: In 1674 in England, a pamphlet was made and published, titled _The Women's Petition Against Coffee_. The women (or alleged women, we don't ", "slug": "2021-02-13-things-i-learned-27"}, "2020-03-15-ugly-but-functional-ux-design": {"title": "Kickstarting UX Design with ugly working documents: Screens, Components, Actions, and State.", "date": "2020-03-15T00:00:00", "book_review": false, "preview": "UX design resists standardisation or templates. It can\u2019t be a one-size-fits-all approach, and the nature of the product, audience, and production team all mean that something diffe", "slug": "2020-03-15-ugly-but-functional-ux-design"}, "2020-08-07-where-i-go-for-ui-inspiration": {"title": "Where I go for UI inspiration", "date": "2020-08-07T00:00:00", "book_review": false, "preview": "Like anybody who makes interfaces for apps/websites, I spent a lot of time looking at _Design Inspiration_ (read: UIs, real or imaginary, made by other people). This is a really go", "slug": "2020-08-07-where-i-go-for-ui-inspiration"}, "2022-04-26-complicated-and-not=-that-useful": {"title": "Complicated and Maybe Not That Useful \u2013 Modern frontend tooling", "date": "2022-04-26T00:00:00", "book_review": false, "preview": "**Prologue** Hi there, this is \ud83d\udd2e Future Thomas \ud83d\udd2e 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 ", "slug": "2022-04-26-complicated-and-not=-that-useful"}, "2021-01-31-frontend-is-fullstack": {"title": "Tiny Thought: Frontend Engineering is a Fullstack Problem", "date": "2021-01-31T00:00:00", "book_review": false, "preview": "_Tiny Thoughts_ are little (500 word) essays. They're concise.\n\nHypothesis: Frontend engineering cannot exist in isolation from backend technologies.\n\nWhat sparked this: Thinking a", "slug": "2021-01-31-frontend-is-fullstack"}, "2022-04-17-why-is-this-pr-so-big": {"title": "'How did this PR get so big?' \u2013 Advice for separating aesthetic and functional changes in code", "date": "2022-04-17T00:00:00", "book_review": false, "preview": "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 c", "slug": "2022-04-17-why-is-this-pr-so-big"}, "2021-04-08-just-enough-software-design": {"title": "How much is just-enough system design for new apps and software?", "date": "2021-04-08T00:00:00", "book_review": false, "preview": "I wrote this because of a paralysing problem in coding: how much should I design my new app\u2019s architecture before I dive into code if I can only learn about my app\u2019s architecture b", "slug": "2021-04-08-just-enough-software-design"}, "2021-02-12-website-design-2-0-changelog": {"title": "Website Design 2.0 Changelog", "date": "2021-02-12T00:00:00", "book_review": false, "preview": "I've redesigned the blog. This post just covers the technical whats and hows of it all.\n\n## What's changed ?\n\n- **New Dark theme colours**: Look around. Look at this dark purply-gr", "slug": "2021-02-12-website-design-2-0-changelog"}, "2021-05-21-productivity-is-a-daily-ritual": {"title": "The Weekly #41: Productivity is a daily ritual", "date": "2021-05-21T00:00:00", "book_review": false, "preview": "The Weekly is a 1000-word-or-less essay on something I\u2019ve been thinking this week. Let\u2019s talk about how productivity is (basically) a scam and how daily and weekly rituals are the ", "slug": "2021-05-21-productivity-is-a-daily-ritual"}, "2021-01-29-things-i-learned-25": {"title": "Things I learned this week #25", "date": "2021-01-29T00:00:00", "book_review": false, "preview": "- **This etymology**: The word \"peculiar\" has come to mean odd or unique, so obviously its Latin root word (_\u200cpeculium_) means somebody's cattle. Cows were pretty valuable assets b", "slug": "2021-01-29-things-i-learned-25"}, "2021-02-27-github-actions-xcode-tests": {"title": "How to run Xcode tests for a SwiftUI iOS codebase with GitHub Actions", "date": "2021-02-27T00:00:00", "book_review": false, "preview": "Tl;dr\n\n1. Make sure you've got a repo on GitHub.\n2. Make sure you've got at least one set of tests in your Xcode codebase.\n3. Create the file below in `yourproject/.github/workflow", "slug": "2021-02-27-github-actions-xcode-tests"}, "culture-i-devoured-autumn-2019": {"title": "Culture I devoured in Autumn 2019", "date": "2019-10-30T00:00:00", "book_review": false, "preview": "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 p", "slug": "culture-i-devoured-autumn-2019"}, "2021-04-02-things-i-learned-34": {"title": "Things I learned this week #34", "date": "2021-04-02T00:00:00", "book_review": false, "preview": "# Things I Learned #34\n\nWe\u2019ve 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, win", "slug": "2021-04-02-things-i-learned-34"}, "2021-07-08-out-of-office": {"title": "Out of office: summer 2021", "date": "2021-07-08T00:00:00", "book_review": false, "preview": "Summer has always been a time for _doing_ 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 t", "slug": "2021-07-08-out-of-office"}, "loss-and-ed-2017": {"title": "Loss and my ED\u200a (\u200aED awareness week\u00a02017)", "date": "2017-03-03T00:00:00", "book_review": false, "preview": "