Compare commits
No commits in common. "main" and "2022-09-04-vite-upgrade" have entirely different histories.
main
...
2022-09-04
323 changed files with 5692 additions and 24824 deletions
1
.gitattributes
vendored
1
.gitattributes
vendored
|
|
@ -1 +0,0 @@
|
||||||
static/snout-street-studios/** filter=lfs diff=lfs merge=lfs -text
|
|
||||||
4
.gitignore
vendored
4
.gitignore
vendored
|
|
@ -1,6 +1,5 @@
|
||||||
.DS_Store
|
.DS_Store
|
||||||
.idea
|
/.idea
|
||||||
.vscode
|
|
||||||
|
|
||||||
node_modules
|
node_modules
|
||||||
/build
|
/build
|
||||||
|
|
@ -9,3 +8,4 @@ node_modules
|
||||||
.env
|
.env
|
||||||
.env.*
|
.env.*
|
||||||
!.env.example
|
!.env.example
|
||||||
|
.netlify
|
||||||
|
|
|
||||||
|
|
@ -1,2 +0,0 @@
|
||||||
[lfs]
|
|
||||||
url = https://edca2249-1d87-4543-9842-0d5f3b1ee753.netlify.app/.netlify/large-media
|
|
||||||
6
.prettierrc
Normal file
6
.prettierrc
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"useTabs": true,
|
||||||
|
"singleQuote": true,
|
||||||
|
"trailingComma": "none",
|
||||||
|
"printWidth": 100
|
||||||
|
}
|
||||||
|
|
@ -1,8 +1,4 @@
|
||||||
# Thomas Wilson-Cook
|
# Thomas Wilson
|
||||||
|
|
||||||
The source code for `thomaswilson.xyz` written in SvelteKit.
|
The source code for `thomaswilson.xyz` written in SvelteKit
|
||||||
|
|
||||||
## Drafts
|
|
||||||
|
|
||||||
The `drafts/` directory contains a list of work-in-progress writing
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,27 +0,0 @@
|
||||||
# Sometimes you should try to spend as little time as possible. Sometimes, you need to spend as much time as you can.
|
|
||||||
|
|
||||||
Working in, and with, teams who build and maintain software has taught me over and over again that cycle times should be short. That is: the time between "we could do X" to "we have done X" should be as short as possible.
|
|
||||||
|
|
||||||
That doesn't mean "try harder and build quicker". It _can_ mean that, but it's more helpful (and sustainable) to think ask questions like "could I actually build 20% of this in an hour, and get _some_ value?" or "do I even need to do this?".
|
|
||||||
|
|
||||||
No matter what you (think you) need to build it's always easier and faster to build nothing.
|
|
||||||
|
|
||||||
Inside of a professional setting, this kind of thinking means that your (paid) staff are being utilised, and that they are more constantly delivering value to the folks and robots who use their software.
|
|
||||||
|
|
||||||
But what about when you're doing a thing because you enjoy it?
|
|
||||||
|
|
||||||
It can be appealing to just start _doing_ the thing. Like: start sewing the garment, taking the photos, running the route, or writing the software (but this software is for fun, totally different to software for work).
|
|
||||||
|
|
||||||
Maybe doing the thing brings you joy, or maybe the result of the project, or perhaps (like running) it's good to have done the task, rather than the act of doing the task.
|
|
||||||
|
|
||||||
I've been thinking about what "fast cycles" means for the personally fulfilling work that i do. Does it mean optimising the time-to-completion, or does it mean optimising for time-spent-doing?
|
|
||||||
|
|
||||||
In all these cases a shorter cycle time is still worth thinking about. What's the smallest amount of time I can dedicate to having done a 5k run? That doesn't necessarily mean running as fast as I can, but maybe it means all the ceremonies and rituals around route planning, garment preparation, and personal hygiene are sorted out.
|
|
||||||
|
|
||||||
Or maybe I really enjoy the process of doing: like how I love sewing garments and taking photos - both processes that benefit hugely from being present in a moment. I think "cycle time" means something different here. Because I'm not concerned so much about showing my work to others, or justifying my time. I can still be concerned about the quality of my output, but I'm the judge of it.
|
|
||||||
|
|
||||||
Sometimes I might want a short and snappy project (not that I've ever actually achieved one), but other times I might luxuriate in four hours at a sewing machine, so thinking about cycle times... they're more hindrance than help there. In those cases, the mental model of cycle time is about asking what we can do to reduce the friction between "I want to do X" and "I am doing X".
|
|
||||||
|
|
||||||
What that means is probably quite boring: making sure that the non-negotiable, but important, parts of life (staying happy, healthy, wealthy) are taken care of.
|
|
||||||
|
|
||||||
Sometimes I want to spend as little time as possible doing before I have something tangible to show for my time. Other times, I want to spend as little time as possible _not_ doing a task.
|
|
||||||
|
|
@ -1,19 +0,0 @@
|
||||||
# For the joy of tinkering
|
|
||||||
|
|
||||||
I have always given myself license to take Summer Hours during the longer months.
|
|
||||||
|
|
||||||
To me that means getting "out there" (wherever that is) and "doing something" (whatever that happens to be).
|
|
||||||
|
|
||||||
As a reluctant creature of habit, I think I benefit a lot from doing unusual (for me) things, at odd schedules. It's nice to see people at weird times and in weird places. It's great to be able to spend long, uninterrupted spells with good folk.
|
|
||||||
|
|
||||||
But as I start coming back to my Regularly Scheduled Behaviour, as the months get shorter and Summer Hours come to an end - I've noticed one particular joy I have missed: the joy of tinkering.
|
|
||||||
|
|
||||||
The summer is about _doing_ and _going_, but there's not a lot of tinkering. When you're going away somewhere for four days, or you only have a couple of Actually Restful (TM) weekend days a month, that doesn't lend itself towards tinkering.
|
|
||||||
|
|
||||||
To tinker, you have to hang around a problem. You have to walk all the paths, try all the doors. And then change some small corner of your tiny world. Like shifting where the spices live in the kitchen, or the layout of the app icons on your phone.
|
|
||||||
|
|
||||||
I think it's one of the many small rewards you get when you pay sustained attention to a problem. When you stop noticing the absence of some minute pain point that _only_ you had.
|
|
||||||
|
|
||||||
There's a lot of joy in tinkering, and I think you learn a lot about yourself by seeing what you want tinker with, and also figuring out what pain is bearable or ignorable.
|
|
||||||
|
|
||||||
Or maybe it's all wasted time, and really you're just making things unnecessarily complicated. But it _is_ enjoyable.
|
|
||||||
3
netlify.toml
Normal file
3
netlify.toml
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
[build]
|
||||||
|
command="yarn build"
|
||||||
|
publish="build"
|
||||||
66
package.json
66
package.json
|
|
@ -13,49 +13,33 @@
|
||||||
"test": "vitest"
|
"test": "vitest"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@sveltejs/kit": "^2.51.0",
|
"@sveltejs/adapter-auto": "^1.0.0-next.71",
|
||||||
"@sveltejs/vite-plugin-svelte": "^5.0.3",
|
"@sveltejs/adapter-netlify": "^1.0.0-next.76",
|
||||||
"@types/leaflet": "^1.9.15",
|
"@sveltejs/kit": "^1.0.0-next.468",
|
||||||
"@types/sanitize-html": "^2.13.0",
|
"@types/sanitize-html": "^2.6.2",
|
||||||
"@typescript-eslint/eslint-plugin": "^8.55.0",
|
"@typescript-eslint/eslint-plugin": "^5.32.0",
|
||||||
"@typescript-eslint/parser": "^8.55.0",
|
"@typescript-eslint/parser": "^5.32.0",
|
||||||
"eslint": "^9.17.0",
|
"eslint": "^7.32.0",
|
||||||
"eslint-config-prettier": "^10.1.1",
|
"eslint-config-prettier": "^8.3.0",
|
||||||
"eslint-plugin-svelte": "^3.15.0",
|
"eslint-plugin-svelte3": "^3.2.1",
|
||||||
"prettier": "^3.4.2",
|
"prettier": "^2.5.1",
|
||||||
"prettier-plugin-svelte": "^3.3.2",
|
"prettier-plugin-svelte": "^2.5.0",
|
||||||
"svelte": "^5.50.3",
|
"svelte": "^3.50.0",
|
||||||
"svelte-check": "^4.3.6",
|
"svelte-check": "^2.8.1",
|
||||||
"svelte-preprocess": "^6.0.0",
|
"svelte-preprocess": "^4.10.7",
|
||||||
"tslib": "^2.8.1",
|
"tslib": "^2.3.1",
|
||||||
"typescript": "^5.7.2",
|
"typescript": "^4.7.4",
|
||||||
"vite": "^6.0.7",
|
"vite": "^3.1.0-beta.1",
|
||||||
"vitest": "^3.0.8"
|
"vitest": "^0.22.1"
|
||||||
},
|
},
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@sveltejs/adapter-node": "^5.5.3",
|
"date-fns": "^2.29.2",
|
||||||
"@types/js-yaml": "^4.0.9",
|
"mdsvex": "^0.10.5",
|
||||||
"date-fns": "^4.1.0",
|
"mongodb": "^4.8.1",
|
||||||
"feed": "^4.2.2",
|
"nanoid": "3.3.4",
|
||||||
"js-yaml": "^4.1.0",
|
"node-fetch": "^3.2.10",
|
||||||
"just-shuffle": "^4.2.0",
|
"sanitize-html": "^2.7.0",
|
||||||
"leaflet": "^1.9.4",
|
"zod": "^3.18.0"
|
||||||
"node-fetch": "^3.3.2",
|
|
||||||
"rehype-stringify": "^10.0.1",
|
|
||||||
"remark": "^15.0.1",
|
|
||||||
"remark-frontmatter": "^5.0.0",
|
|
||||||
"remark-gfm": "^4.0.0",
|
|
||||||
"remark-parse": "^11.0.0",
|
|
||||||
"remark-rehype": "^11.1.1",
|
|
||||||
"remark-stringify": "^11.0.0",
|
|
||||||
"sanitize-html": "^2.14.0",
|
|
||||||
"sass": "^1.85.1",
|
|
||||||
"strip-markdown": "^6.0.0",
|
|
||||||
"unified": "^11.0.5",
|
|
||||||
"zod": "^3.24.1"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=22.0.0"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
3772
pnpm-lock.yaml
3772
pnpm-lock.yaml
File diff suppressed because it is too large
Load diff
|
|
@ -1,9 +0,0 @@
|
||||||
{
|
|
||||||
"trailingComma": "es5",
|
|
||||||
"tabWidth": 4,
|
|
||||||
"semi": true,
|
|
||||||
"singleQuote": true,
|
|
||||||
"printWidth": 120,
|
|
||||||
"arrowParens": "always",
|
|
||||||
"bracketSpacing": true
|
|
||||||
}
|
|
||||||
48
scripts/list-posts.py
Normal file
48
scripts/list-posts.py
Normal file
|
|
@ -0,0 +1,48 @@
|
||||||
|
import glob
|
||||||
|
import frontmatter
|
||||||
|
import json
|
||||||
|
from datetime import datetime
|
||||||
|
from datetime import date
|
||||||
|
from dateutil.parser import *
|
||||||
|
from markdown import markdown
|
||||||
|
|
||||||
|
"""
|
||||||
|
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:
|
||||||
|
try:
|
||||||
|
post = frontmatter.load(file)
|
||||||
|
slug = post['slug']
|
||||||
|
frontmatter_keys = post.keys()
|
||||||
|
|
||||||
|
published_date = post['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'],
|
||||||
|
'author': post['author'],
|
||||||
|
'date': published_date.isoformat(),
|
||||||
|
'book_review': 'book_review' in frontmatter_keys,
|
||||||
|
'preview': post.content[0:180],
|
||||||
|
'content': markdown(post.content),
|
||||||
|
'slug': slug
|
||||||
|
}
|
||||||
|
hash_map[slug] = details
|
||||||
|
except:
|
||||||
|
print("!!!")
|
||||||
|
print("Caught Error in following file, ignoring")
|
||||||
|
print(file)
|
||||||
|
print("---")
|
||||||
|
|
||||||
|
with open('./src/content/posts.json', "w") as file:
|
||||||
|
json.dump(hash_map, file)
|
||||||
1
scripts/sunrise_sunset_images/.gitignore
vendored
1
scripts/sunrise_sunset_images/.gitignore
vendored
|
|
@ -1 +0,0 @@
|
||||||
environment_variables.py
|
|
||||||
|
|
@ -1,62 +0,0 @@
|
||||||
import json
|
|
||||||
import datetime
|
|
||||||
import utils
|
|
||||||
import photos
|
|
||||||
|
|
||||||
class DailyPhoto:
|
|
||||||
def __init__(self, date: datetime.date, photo: photos.SunriseOrSunsetPhoto):
|
|
||||||
self.date = date
|
|
||||||
self.photo = photo
|
|
||||||
|
|
||||||
def as_dict(self) -> dict:
|
|
||||||
return {
|
|
||||||
"date": self.date.strftime("%Y-%m-%d"),
|
|
||||||
"photo": self.photo.as_json()
|
|
||||||
}
|
|
||||||
|
|
||||||
class DailyPhotoSet:
|
|
||||||
def __init__(self, start_date: datetime.date = datetime.date(2023, 1, 21)):
|
|
||||||
self._date = start_date
|
|
||||||
self._photos = []
|
|
||||||
|
|
||||||
def add_photo(self, photo: photos.SunriseOrSunsetPhoto):
|
|
||||||
self._photos.append(DailyPhoto(self._date, photo))
|
|
||||||
self.photos.sort(key=lambda photo: photo.photo.id)
|
|
||||||
self._date += datetime.timedelta(days=1)
|
|
||||||
|
|
||||||
def as_json(self) -> str:
|
|
||||||
return json.dumps({
|
|
||||||
"photos": [photo.as_dict() for photo in self.photos]
|
|
||||||
})
|
|
||||||
|
|
||||||
@property
|
|
||||||
def photos(self) -> list[DailyPhoto]:
|
|
||||||
return list(sorted(self._photos, key=lambda photo: photo.date))
|
|
||||||
|
|
||||||
@property
|
|
||||||
def current_date(self) -> datetime.date:
|
|
||||||
return self._date;
|
|
||||||
|
|
||||||
def get_all_photos() -> list[photos.SunriseOrSunsetPhoto]:
|
|
||||||
file_name = utils.make_relative_file_name('data/all_photos.json')
|
|
||||||
print(f"Reading {file_name}...")
|
|
||||||
|
|
||||||
with open(file_name, "r") as infile:
|
|
||||||
photo_set = photos.SunriseOrSunsetPhotoSet.from_json(infile.read())
|
|
||||||
print(f"Returning {len(photo_set.photos_sorted_by_id)} photos...")
|
|
||||||
return photo_set.photos_sorted_by_id
|
|
||||||
|
|
||||||
def main():
|
|
||||||
print("Creating daily photo mapping...")
|
|
||||||
all_photos = get_all_photos()
|
|
||||||
|
|
||||||
daily_photos = DailyPhotoSet()
|
|
||||||
|
|
||||||
for photo in all_photos:
|
|
||||||
daily_photos.add_photo(photo)
|
|
||||||
|
|
||||||
with open(utils.make_relative_file_name('data/daily_photos.json'), 'w') as outfile:
|
|
||||||
outfile.write(daily_photos.as_json())
|
|
||||||
|
|
||||||
main()
|
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
|
@ -1,37 +0,0 @@
|
||||||
import environment_variables
|
|
||||||
import unsplash_api_gateway
|
|
||||||
import photos
|
|
||||||
import utils
|
|
||||||
import json
|
|
||||||
|
|
||||||
def main():
|
|
||||||
"""Get sunrise and sunset images from Unsplash API."""
|
|
||||||
api = unsplash_api_gateway.UnsplashApi(environment_variables.UNSPLASH_ACCESS_KEY, environment_variables.UNSPLASH_SECRET_KEY)
|
|
||||||
|
|
||||||
sunrise_images = api.search_results_for_query(query="sunrise", page_size=25, page_number=20)
|
|
||||||
sunset_images = api.search_results_for_query(query="sunset", page_size=25, page_number=20)
|
|
||||||
|
|
||||||
unfiltered_length = len(sunrise_images.unfiltered_results) + len(sunset_images.unfiltered_results)
|
|
||||||
filtered_length = len(sunrise_images.results) + len(sunset_images.results)
|
|
||||||
print(f"Found {unfiltered_length} unfiltered images...")
|
|
||||||
print(f"Found {filtered_length} filtered images")
|
|
||||||
|
|
||||||
all_photos = photos.SunriseOrSunsetPhotoSet.from_unsplash_search_results(sunrise_images, sunset_images)
|
|
||||||
file_name = utils.make_relative_file_name("data/all_photos.json")
|
|
||||||
|
|
||||||
print(f"Found {len(all_photos.photos)} photos")
|
|
||||||
|
|
||||||
file_contents = json.loads(open(file_name, "r").read())
|
|
||||||
with open(file_name, "w") as outfile:
|
|
||||||
photos_in_file = [photos.SunriseOrSunsetPhoto.from_json(photo) for photo in file_contents["photos"]]
|
|
||||||
print(f"Found {len(photos_in_file)} photos in {file_name}...")
|
|
||||||
|
|
||||||
photos_without_opposite_daytime = [photo for photo in photos_in_file if not photo.does_description_contain_opposite_daytime]
|
|
||||||
print(f"Found {len(photos_without_opposite_daytime)} photos without opposite daytime...")
|
|
||||||
|
|
||||||
all_photos.add_photos(photos_without_opposite_daytime)
|
|
||||||
|
|
||||||
print(f"Writing {len(all_photos.photos)} photos to {file_name}")
|
|
||||||
outfile.write(all_photos.as_json())
|
|
||||||
|
|
||||||
main()
|
|
||||||
|
|
@ -1,102 +0,0 @@
|
||||||
import json
|
|
||||||
import unsplash_search_results
|
|
||||||
|
|
||||||
class SunriseOrSunsetPhoto:
|
|
||||||
def __init__(
|
|
||||||
self,
|
|
||||||
unsplash_search_result: unsplash_search_results.UnsplashSearchResult,
|
|
||||||
sunrise_or_sunset: str
|
|
||||||
):
|
|
||||||
self.id = unsplash_search_result.id
|
|
||||||
self.description = unsplash_search_result.description
|
|
||||||
self.username = unsplash_search_result.username
|
|
||||||
self.username_url = unsplash_search_result.username_url
|
|
||||||
self.small_url = unsplash_search_result.small_url
|
|
||||||
self.sunrise_or_sunset = sunrise_or_sunset
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def from_json(data: dict) -> "SunriseOrSunsetPhoto":
|
|
||||||
unsplash_search_result = unsplash_search_results.UnsplashSearchResult(
|
|
||||||
data={
|
|
||||||
"id": data["id"],
|
|
||||||
"description": data["description"],
|
|
||||||
"user": {
|
|
||||||
"username": data["username"],
|
|
||||||
"links": {
|
|
||||||
"html": data["username_url"]
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"urls": {
|
|
||||||
"small": data["small_url"]
|
|
||||||
},
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
return SunriseOrSunsetPhoto(
|
|
||||||
unsplash_search_result=unsplash_search_result,
|
|
||||||
sunrise_or_sunset=data["sunrise_or_sunset"],
|
|
||||||
)
|
|
||||||
|
|
||||||
def as_json(self) -> object:
|
|
||||||
return {
|
|
||||||
"id": self.id,
|
|
||||||
"description": self.description,
|
|
||||||
"username": self.username,
|
|
||||||
"username_url": self.username_url,
|
|
||||||
"small_url": self.small_url,
|
|
||||||
"sunrise_or_sunset": self.sunrise_or_sunset
|
|
||||||
}
|
|
||||||
|
|
||||||
@property
|
|
||||||
def does_description_contain_opposite_daytime(self) -> bool:
|
|
||||||
opposite_word = "sunrise" if self.sunrise_or_sunset == "sunset" else "sunset"
|
|
||||||
return opposite_word in self.description.lower()
|
|
||||||
|
|
||||||
class SunriseOrSunsetPhotoSet:
|
|
||||||
def __init__(self, photos: list[SunriseOrSunsetPhoto]):
|
|
||||||
self.photos = photos
|
|
||||||
self.unique_photos = self.get_unique_photos(photos)
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def from_no_data() -> "SunriseOrSunsetPhotoSet":
|
|
||||||
return SunriseOrSunsetPhotoSet(photos=[])
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def from_unsplash_search_results(sunrise_images: unsplash_search_results.UnsplashSearchResultSet, sunset_images: unsplash_search_results.UnsplashSearchResultSet):
|
|
||||||
photos = []
|
|
||||||
photos.extend([SunriseOrSunsetPhoto(result, "sunrise") for result in sunrise_images.results])
|
|
||||||
photos.extend([SunriseOrSunsetPhoto(result, "sunset") for result in sunset_images.results])
|
|
||||||
return SunriseOrSunsetPhotoSet(photos)
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def from_json(json_string: str) -> "SunriseOrSunsetPhotoSet":
|
|
||||||
loaded_json = json.loads(json_string)
|
|
||||||
photos = [SunriseOrSunsetPhoto.from_json(photo) for photo in loaded_json["photos"]]
|
|
||||||
return SunriseOrSunsetPhotoSet(photos)
|
|
||||||
|
|
||||||
def add_photos(self, photos: list[SunriseOrSunsetPhoto]):
|
|
||||||
self.photos.extend(photos)
|
|
||||||
self.unique_photos = self.get_unique_photos(self.photos)
|
|
||||||
|
|
||||||
def get_unique_photos(self, photos: list[SunriseOrSunsetPhoto]) -> list[SunriseOrSunsetPhoto]:
|
|
||||||
"""
|
|
||||||
Some results are duplicates (identified by `id`). This could mean they're
|
|
||||||
not definitely a sunrise or sunset, so neither image should be included.
|
|
||||||
"""
|
|
||||||
all_ids: list[str] = list(map(lambda photo: photo.id, photos))
|
|
||||||
unique_results = []
|
|
||||||
for result in photos:
|
|
||||||
is_id_present_once: bool = 1 == len(list(filter(lambda id: id == result.id, all_ids)))
|
|
||||||
if is_id_present_once:
|
|
||||||
unique_results.append(result)
|
|
||||||
|
|
||||||
return unique_results
|
|
||||||
|
|
||||||
def as_json(self) -> str:
|
|
||||||
return json.dumps({
|
|
||||||
"photos": list(map(lambda photo: photo.as_json(), self.unique_photos))
|
|
||||||
})
|
|
||||||
|
|
||||||
@property
|
|
||||||
def photos_sorted_by_id(self) -> list[SunriseOrSunsetPhoto]:
|
|
||||||
return sorted(self.unique_photos, key=lambda photo: photo.id)
|
|
||||||
|
|
@ -1,11 +0,0 @@
|
||||||
# Sunrise or Sunset Images
|
|
||||||
|
|
||||||
You need to create an Unsplash developer account with API key ([link](https://unsplash.com/developers)).
|
|
||||||
|
|
||||||
To authenticate calls to the Unsplash API, you need to create a file called `environment_variables.py` to store your access and secret key:
|
|
||||||
|
|
||||||
```py
|
|
||||||
# environment_variables.py
|
|
||||||
UNSPLASH_ACCESS_KEY = "access_key"
|
|
||||||
UNSPLASH_SECRET_KEY="secret_key"
|
|
||||||
```
|
|
||||||
|
|
@ -1,25 +0,0 @@
|
||||||
import requests
|
|
||||||
import unsplash_search_results
|
|
||||||
|
|
||||||
class UnsplashApi:
|
|
||||||
def __init__(self, access_key, secret_key):
|
|
||||||
"""Initialize the Unsplash API wrapper."""
|
|
||||||
self.access_key = access_key
|
|
||||||
self.secret_key = secret_key
|
|
||||||
|
|
||||||
def search_results_for_query(self, query, page_size=1, page_number=1):
|
|
||||||
"""Search for photos."""
|
|
||||||
response = requests.get(
|
|
||||||
"https://api.unsplash.com/search/photos",
|
|
||||||
params={
|
|
||||||
"query": query,
|
|
||||||
"page": page_number,
|
|
||||||
"per_page": page_size
|
|
||||||
},
|
|
||||||
headers={
|
|
||||||
"Authorization": f"Client-ID {self.access_key}"
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
return unsplash_search_results.UnsplashSearchResultSet(response.json(), query)
|
|
||||||
|
|
||||||
|
|
@ -1,67 +0,0 @@
|
||||||
class UnsplashSearchResult:
|
|
||||||
"""
|
|
||||||
This class represents a single photo from Unsplash.
|
|
||||||
"""
|
|
||||||
def __init__(self, data: dict):
|
|
||||||
self.id = data["id"]
|
|
||||||
self._description = data["description"] or "No description"
|
|
||||||
self.username = data["user"]["username"]
|
|
||||||
self.username_url = data["user"]["links"]["html"]
|
|
||||||
self.small_url = data["urls"]["small"]
|
|
||||||
self.json = data
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def from_json(data: dict) -> "UnsplashSearchResult":
|
|
||||||
formatted_data = {
|
|
||||||
"id": data["id"],
|
|
||||||
"description": data["description"],
|
|
||||||
"user": {
|
|
||||||
"username": data["username"],
|
|
||||||
"links": {
|
|
||||||
"html": data["username_url"],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
return UnsplashSearchResult(data=formatted_data)
|
|
||||||
|
|
||||||
@property
|
|
||||||
def description(self):
|
|
||||||
return self._description
|
|
||||||
|
|
||||||
def as_json(self):
|
|
||||||
return {
|
|
||||||
"id": self.id,
|
|
||||||
"description": self.description,
|
|
||||||
"username": self.username,
|
|
||||||
"username_url": self.username_url,
|
|
||||||
"small_url": self.small_url
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
class UnsplashSearchResultSet:
|
|
||||||
"""
|
|
||||||
This class collects a set of UnsplashSearchResults, i.e. a set of photos from Unsplash.
|
|
||||||
We use this to filter our duplicate photos, or those which have a description which
|
|
||||||
suggests they are the opposite of the day time we are looking for (e.g. a sunset photo
|
|
||||||
with the word "sunrise" in the description).
|
|
||||||
"""
|
|
||||||
def __init__(self, json, sunrise_or_sunset: str):
|
|
||||||
self.total = json["total"]
|
|
||||||
self.total_pages = json["total_pages"]
|
|
||||||
self.json = json
|
|
||||||
self.unfiltered_results = [UnsplashSearchResult(photo) for photo in json["results"]]
|
|
||||||
self.results = self.filter_out_photos_with_word_in_description("sunrise") if sunrise_or_sunset == "sunrise" else self.filter_out_photos_with_word_in_description("sunset")
|
|
||||||
self.sunrise_or_sunset = sunrise_or_sunset
|
|
||||||
|
|
||||||
def filter_out_photos_with_word_in_description(self, word: str):
|
|
||||||
lower_word = word.lower()
|
|
||||||
return [search_result for search_result in self.unfiltered_results if lower_word not in search_result.description.lower()]
|
|
||||||
|
|
||||||
def as_json(self):
|
|
||||||
return {
|
|
||||||
"total": self.total,
|
|
||||||
"sunrise_or_sunset": self.sunrise_or_sunset,
|
|
||||||
"total_pages": self.total_pages,
|
|
||||||
"results": [result.as_json() for result in self.results]
|
|
||||||
}
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
||||||
import os
|
|
||||||
|
|
||||||
def make_relative_file_name(path: str) -> str:
|
|
||||||
dirname = os.path.dirname(__file__)
|
|
||||||
return os.path.join(dirname, path)
|
|
||||||
|
|
@ -1,55 +0,0 @@
|
||||||
<script lang="ts">
|
|
||||||
interface Props {
|
|
||||||
isActive: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
let { isActive }: Props = $props();
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<div class="summer-hours">
|
|
||||||
<p class="summer-hours__emoji">☀️🥂🌻</p>
|
|
||||||
<p class="summer-hours__text" class:inactive={!isActive}>
|
|
||||||
I'm currently out of office for the summer. I'm getting married in July, and
|
|
||||||
I'll be spending as much time as possible out-of-doors in August. I'll be
|
|
||||||
back at keyboard in September.
|
|
||||||
</p>
|
|
||||||
{#if !isActive}
|
|
||||||
<p class="summer-hours__text">
|
|
||||||
Summer hours are over, slowly rebooting, bear with.
|
|
||||||
</p>
|
|
||||||
{/if}
|
|
||||||
<p class="summer-hours__signature">--TJW 2024-08-26</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.summer-hours {
|
|
||||||
border: 2px solid var(--brand-orange);
|
|
||||||
padding: var(--spacing-md) var(--spacing-lg);
|
|
||||||
border-radius: 8px;
|
|
||||||
margin-top: var(--spacing-base);
|
|
||||||
gap: 0px;
|
|
||||||
font-size: var(--font-size-sm);
|
|
||||||
}
|
|
||||||
|
|
||||||
.summer-hours__emoji {
|
|
||||||
font-family: sans-serif;
|
|
||||||
font-size: var(--font-size-xl);
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.summer-hours__text {
|
|
||||||
margin: 0;
|
|
||||||
font-size: var(--font-size-base);
|
|
||||||
line-height: 150%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.summer-hours__text.inactive {
|
|
||||||
text-decoration: line-through;
|
|
||||||
}
|
|
||||||
|
|
||||||
.summer-hours__signature {
|
|
||||||
margin: 0;
|
|
||||||
font-size: var(--font-size-sm);
|
|
||||||
text-align: right;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
@ -1,50 +1,49 @@
|
||||||
<div class="out-of-office">
|
<div class="out-of-office">
|
||||||
<h2 class="title">Summer Hours 2022</h2>
|
<h2 class="title">Summer Hours 2022</h2>
|
||||||
<p class="text">
|
<p class="text">
|
||||||
I am currently out-of-office for summer 2022. That means instead of writing
|
I am currently out-of-office for summer 2022. That means instead of writing and documenting, I'm
|
||||||
and documenting, I'm going to spend time with great people, in great places,
|
going to spend time with great people, in great places, hopefully eating great food.
|
||||||
hopefully eating great food.
|
</p>
|
||||||
</p>
|
|
||||||
|
|
||||||
<p class="text">Long days and pleasant nights, friend.</p>
|
<p class="text">Long days and pleasant nights, friend.</p>
|
||||||
|
|
||||||
<p class="text">Thomas, 2022-07-06</p>
|
<p class="text">Thomas, 2022-07-06</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<link href="https://fonts.bunny.net/css?family=amiko:700" rel="stylesheet" />
|
<link href="https://fonts.bunny.net/css?family=amiko:700" rel="stylesheet" />
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
.out-of-office {
|
.out-of-office {
|
||||||
font-size: 1.5rem;
|
font-size: 1.5rem;
|
||||||
max-width: 750px;
|
max-width: 750px;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
|
|
||||||
text-align: center;
|
text-align: center;
|
||||||
padding: 1rem;
|
padding: 1rem;
|
||||||
background-color: #ffcb00;
|
background-color: #ffcb00;
|
||||||
border: 5px solid #f8aa4b;
|
border: 5px solid #f8aa4b;
|
||||||
border-radius: 12px;
|
border-radius: 12px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.title,
|
.title,
|
||||||
.text {
|
.text {
|
||||||
color: inherit;
|
color: inherit;
|
||||||
font-family: inherit;
|
font-family: inherit;
|
||||||
}
|
}
|
||||||
|
|
||||||
.title {
|
.title {
|
||||||
font-family: "Amiko", var(--font-family-title);
|
font-family: 'Amiko', var(--font-family-title);
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
font-size: 1.35rem;
|
font-size: 1.35rem;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
color: #072448;
|
color: #072448;
|
||||||
}
|
}
|
||||||
|
|
||||||
.text {
|
.text {
|
||||||
font-size: var(--font-size-base);
|
font-size: var(--font-size-base);
|
||||||
color: #072448;
|
color: #072448;
|
||||||
font-family: var(--font-family-sans);
|
font-family: var(--font-family-sans);
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
||||||
49
src/components/games/ApiPasswordForm.svelte
Normal file
49
src/components/games/ApiPasswordForm.svelte
Normal file
|
|
@ -0,0 +1,49 @@
|
||||||
|
<script lang="ts">
|
||||||
|
import { writable } from 'svelte/store';
|
||||||
|
import { onMount, onDestroy, createEventDispatcher } from 'svelte';
|
||||||
|
|
||||||
|
const dispatch = createEventDispatcher<{ change: string }>();
|
||||||
|
|
||||||
|
let apiPassword = '';
|
||||||
|
let state: 'edit' | 'view' = 'edit';
|
||||||
|
let unsubscribe: () => void;
|
||||||
|
|
||||||
|
function onSubmit() {
|
||||||
|
state = 'view';
|
||||||
|
if (localStorage) {
|
||||||
|
localStorage.setItem('apiPassword', apiPassword);
|
||||||
|
}
|
||||||
|
dispatch('change', apiPassword);
|
||||||
|
}
|
||||||
|
|
||||||
|
function onEdit() {
|
||||||
|
state = 'edit';
|
||||||
|
}
|
||||||
|
|
||||||
|
onMount(() => {
|
||||||
|
if (localStorage !== undefined) {
|
||||||
|
apiPassword = localStorage.getItem('apiPassword') || '';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (apiPassword.length > 0) {
|
||||||
|
dispatch('change', apiPassword);
|
||||||
|
state = 'view';
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
{#if apiPassword.length === 0}
|
||||||
|
<p>
|
||||||
|
To save things to the ledger you need to enter the password. Right now you haven't set one.
|
||||||
|
</p>
|
||||||
|
{/if}
|
||||||
|
{#if state === 'view'}
|
||||||
|
<button on:click={onEdit}>Edit Password</button>
|
||||||
|
{:else}
|
||||||
|
<form on:submit|preventDefault={onSubmit}>
|
||||||
|
<input type="text" bind:value={apiPassword} />
|
||||||
|
<input type="submit" value="Set Password" />
|
||||||
|
</form>
|
||||||
|
{/if}
|
||||||
|
</section>
|
||||||
63
src/components/games/FloriferousPlayerForm.svelte
Normal file
63
src/components/games/FloriferousPlayerForm.svelte
Normal file
|
|
@ -0,0 +1,63 @@
|
||||||
|
<script lang="ts">
|
||||||
|
import { FloriferousPlayer } from '$lib/floriferous';
|
||||||
|
import { createEventDispatcher } from 'svelte';
|
||||||
|
|
||||||
|
const dispatch = createEventDispatcher();
|
||||||
|
|
||||||
|
let nameInput: HTMLInputElement;
|
||||||
|
let name = '';
|
||||||
|
let score = 0;
|
||||||
|
let rowAtEndOfGame = 1;
|
||||||
|
|
||||||
|
function handleFormSubmit() {
|
||||||
|
const player = new FloriferousPlayer({
|
||||||
|
name,
|
||||||
|
score,
|
||||||
|
rowAtEndOfGame: rowAtEndOfGame
|
||||||
|
});
|
||||||
|
|
||||||
|
dispatch('submit', player);
|
||||||
|
|
||||||
|
name = '';
|
||||||
|
score = 0;
|
||||||
|
rowAtEndOfGame = 1;
|
||||||
|
nameInput.focus();
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<form on:submit|preventDefault={() => handleFormSubmit()}>
|
||||||
|
<div class="field">
|
||||||
|
<label for="player-name">Name</label>
|
||||||
|
<input bind:this={nameInput} bind:value={name} type="text" id="player-name" />
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label for="player-score">Score</label>
|
||||||
|
<input bind:value={score} type="number" step="1" min="0" id="player-score" />
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label for="player-score">Finishing Row</label>
|
||||||
|
<input bind:value={rowAtEndOfGame} type="number" step="1" min="0" id="player-score" />
|
||||||
|
<p class="example-text">"1" for the highest row, "2" for the second highest, etc.</p>
|
||||||
|
</div>
|
||||||
|
<input type="submit" value="add" />
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
form {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
padding: var(--spacing-sm);
|
||||||
|
border: 1px solid var(--gray-600);
|
||||||
|
}
|
||||||
|
|
||||||
|
.field {
|
||||||
|
display: flex;
|
||||||
|
flex-flow: column;
|
||||||
|
padding: var(--spacing-sm) 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.example-text {
|
||||||
|
color: var(--grey800);
|
||||||
|
font-size: var(--font-size-sm);
|
||||||
|
}
|
||||||
|
</style>
|
||||||
3
src/components/games/index.ts
Normal file
3
src/components/games/index.ts
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
import FloriferousPlayerForm from './FloriferousPlayerForm.svelte';
|
||||||
|
|
||||||
|
export { FloriferousPlayerForm, PreviousGameScores };
|
||||||
|
|
@ -1,77 +1,69 @@
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { createEventDispatcher } from "svelte";
|
import { createEventDispatcher } from 'svelte';
|
||||||
|
|
||||||
interface Props {
|
export let id: string;
|
||||||
id: string;
|
export let name: string;
|
||||||
name: string;
|
export let salary: number;
|
||||||
salary: number;
|
export let count: number;
|
||||||
count: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
let {
|
const dispatch = createEventDispatcher<{
|
||||||
id,
|
change: { name: string; salary: number; count: number };
|
||||||
name = $bindable(),
|
remove: { id: string };
|
||||||
salary = $bindable(),
|
}>();
|
||||||
count = $bindable(),
|
|
||||||
}: Props = $props();
|
|
||||||
|
|
||||||
const dispatch = createEventDispatcher<{
|
function handleChange() {
|
||||||
change: { name: string; salary: number; count: number };
|
console.log('handleChange', { name, salary, count });
|
||||||
remove: { id: string };
|
dispatch('change', { name, salary, count });
|
||||||
}>();
|
}
|
||||||
|
|
||||||
function handleChange() {
|
function handleRemove() {
|
||||||
dispatch("change", { name, salary, count });
|
console.log('handleRemove', { id });
|
||||||
}
|
dispatch('remove', { id });
|
||||||
|
}
|
||||||
function handleRemove() {
|
|
||||||
console.log("handleRemove", { id });
|
|
||||||
dispatch("remove", { id });
|
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<form>
|
<form>
|
||||||
<div class="form__field">
|
<div class="form__field">
|
||||||
<label for="name">Job Title</label>
|
<label for="name">Job Title</label>
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
placeholder="Junior Software Engineer"
|
placeholder="Junior Software Engineer"
|
||||||
bind:value={name}
|
bind:value={name}
|
||||||
oninput={handleChange}
|
on:input={handleChange}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class="form__field">
|
<div class="form__field">
|
||||||
<label for="name">Salary (Year)</label>
|
<label for="name">Salary (Year)</label>
|
||||||
<input
|
<input
|
||||||
type="number"
|
type="number"
|
||||||
step="1"
|
step="1"
|
||||||
placeholder="30,000"
|
placeholder="30,000"
|
||||||
bind:value={salary}
|
bind:value={salary}
|
||||||
onchange={handleChange}
|
on:change={handleChange}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class="form__field">
|
<div class="form__field">
|
||||||
<label for="name"># of them </label>
|
<label for="name"># of them </label>
|
||||||
<input
|
<input
|
||||||
type="number"
|
type="number"
|
||||||
step="1"
|
step="1"
|
||||||
placeholder="30,000"
|
placeholder="30,000"
|
||||||
bind:value={count}
|
bind:value={count}
|
||||||
onchange={handleChange}
|
on:change={handleChange}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<button type="button" onclick={handleRemove}> Remove </button>
|
<button type="button" on:click={handleRemove}> Remove </button>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
form {
|
form {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: 1fr;
|
grid-template-columns: 1fr;
|
||||||
row-gap: 8px;
|
row-gap: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.form__field {
|
.form__field {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: 1fr;
|
grid-template-columns: 1fr;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
||||||
|
|
@ -13,29 +13,29 @@ tags:
|
||||||
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.
|
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>
|
</aside>
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
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.
|
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 resources - 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)
|
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.
|
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).
|
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.
|
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.
|
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).
|
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.
|
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 long-term 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.
|
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.
|
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.
|
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)
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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)
|
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)
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
|
|
||||||
title: "Loss and my ED (ED awareness week 2017)"
|
title: "Loss and my ED ( ED awareness week 2017)"
|
||||||
author: "Thomas Wilson"
|
author: "Thomas Wilson"
|
||||||
draft: true
|
draft: true
|
||||||
date: 2017-03-03
|
date: 2017-03-03
|
||||||
|
|
@ -21,9 +21,9 @@ To recap, twelve months ago I was several months out of an abrupt breakup, which
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
## Losing dance
|
## Losing dance
|
||||||
|
|
||||||
|
|
@ -33,11 +33,11 @@ For me, dance has always required a monastic devotion: ultimate focus on my curr
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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?
|
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?
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
|
|
@ -56,7 +56,7 @@ I've recently been involved in a number of creative projects, and I've got sever
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
|
|
@ -64,7 +64,7 @@ I am constantly aware that nothing is permanent, which includes my feelings and
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
|
|
@ -77,7 +77,7 @@ I ain't got the time to be your enemy
|
||||||
That shit is draining, they're taking up too much energy
|
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
|
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
|
So for Simz to waste it is something you'll never see, hold me to it
|
||||||
Wings -Little Simz.
|
Wings - Little Simz.
|
||||||
</blockquote>
|
</blockquote>
|
||||||
|
|
||||||
<blockquote class="hip-hop-lyric">
|
<blockquote class="hip-hop-lyric">
|
||||||
|
|
@ -86,7 +86,7 @@ How impossibly big it be, this symmetry
|
||||||
This brutality, and beauty and synergy
|
This brutality, and beauty and synergy
|
||||||
And beyond what we'll live to see, I know nothing can limit me
|
And beyond what we'll live to see, I know nothing can limit me
|
||||||
Just take everything ever and we are that times infinity
|
Just take everything ever and we are that times infinity
|
||||||
<cite>Tiny Glowing Screens pt. 3-Watsky</cite>
|
<cite>Tiny Glowing Screens pt. 3 - Watsky</cite>
|
||||||
</blockquote>
|
</blockquote>
|
||||||
|
|
||||||
<blockquote class="hip-hop-lyric">
|
<blockquote class="hip-hop-lyric">
|
||||||
|
|
@ -95,7 +95,7 @@ Just know that it passes, but you'll collect scars
|
||||||
They never go away, but they will make you who you are
|
They never go away, but they will make you who you are
|
||||||
This is a beautiful struggle, I share it in song cause
|
This is a beautiful struggle, I share it in song cause
|
||||||
I can't control this, remember: the moment's beyond us
|
I can't control this, remember: the moment's beyond us
|
||||||
<cite>Hold Your Head Up-Macklemore</cite>
|
<cite>Hold Your Head Up - Macklemore</cite>
|
||||||
</blockquote>
|
</blockquote>
|
||||||
|
|
||||||
<blockquote class="hip-hop-lyric">
|
<blockquote class="hip-hop-lyric">
|
||||||
|
|
@ -103,5 +103,5 @@ I feel the waves getting far too big to handle
|
||||||
Fail to turn this shit the other way
|
Fail to turn this shit the other way
|
||||||
Sail back to the harbor like your average Joe and play it safe
|
Sail back to the harbor like your average Joe and play it safe
|
||||||
But that's not life it's not what I chose
|
But that's not life it's not what I chose
|
||||||
<cite>Reflection-ATO X EDEN</cite>
|
<cite>Reflection - ATO X EDEN</cite>
|
||||||
</blockquote>
|
</blockquote>
|
||||||
|
|
|
||||||
|
|
@ -11,38 +11,38 @@ tags:
|
||||||
- notion
|
- notion
|
||||||
---
|
---
|
||||||
|
|
||||||
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.
|
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.
|
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.
|
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.
|
||||||
|
|
||||||
## A brief love letter to Apps
|
## A brief love letter to Apps
|
||||||
|
|
||||||
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.
|
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).
|
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.
|
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.
|
||||||
|
|
||||||
## Bear
|
## Bear
|
||||||
|
|
||||||
[Bear](https://bear.app) 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. `post/post` versus `blog/portfolio`. It's been [recognised](https://blog.bear.app/2017/06/thank-you-yes-you-for-our-2017-apple-design-award/) 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.
|
[Bear](https://bear.app) 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. `post/post` versus `blog/portfolio`. It’s been [recognised](https://blog.bear.app/2017/06/thank-you-yes-you-for-our-2017-apple-design-award/) 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.
|
||||||
|
|
||||||
### In Praise of Bear
|
### In Praise of Bear
|
||||||
|
|
||||||
There are a couple of things I really liked about using Bear:
|
There are a couple of things I really liked about using Bear:
|
||||||
|
|
||||||
- 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.
|
- 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.
|
||||||
- Both apps are visually beautiful, but that doesn't mean I shouldn't mention it twice: the UI is very nicely designed.
|
- Both apps are visually beautiful, but that doesn’t mean I shouldn’t mention it twice: the UI is very nicely designed.
|
||||||
- It specialises in one kind of content: slightly-enhanced text, and executes on that one idea well.
|
- It specialises in one kind of content: slightly-enhanced text, and executes on that one idea well.
|
||||||
- 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.
|
- 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.
|
||||||
|
|
||||||
### My time with Bear (2017-2018)
|
### My time with Bear (2017-2018)
|
||||||
|
|
||||||
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.
|
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.
|
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.
|
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.
|
||||||
|
|
||||||
## Notion
|
## Notion
|
||||||
|
|
||||||
Describing [Notion](https://www.notion.so) 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.
|
Describing [Notion](https://www.notion.so) 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 [funfunfunction](https://www.youtube.com/channel/UCO1cgjhGzsSYb1rsB4bFe4Q) , and then finding this [profile by invision](https://www.invisionapp.com/inside-design/ivan-zhou-notion-interview/) 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 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 [funfunfunction](https://www.youtube.com/channel/UCO1cgjhGzsSYb1rsB4bFe4Q) , and then finding this [profile by invision](https://www.invisionapp.com/inside-design/ivan-zhou-notion-interview/) 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 [Cortex](https://www.relay.fm/cortex/79) for introducing me to the idea of yearly and seasonal themes.)
|
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 [Cortex](https://www.relay.fm/cortex/79) for introducing me to the idea of yearly and seasonal themes.)
|
||||||
|
|
||||||
|
|
@ -51,10 +51,10 @@ I used it to help me organise my first ever cycle tour across France in 2019 (I
|
||||||
I initially got on really well with Notion, it had a number of really nice features:
|
I initially got on really well with Notion, it had a number of really nice features:
|
||||||
|
|
||||||
- It is beautifully designed by people who care deeply about visual and software design.It is very obviously a well-considered piece of software.
|
- It is beautifully designed by people who care deeply about visual and software design.It is very obviously a well-considered piece of software.
|
||||||
- It's cross platform, and even has a fully functional web-app, meaning I could access it from anywhere, at any time.
|
- It’s cross platform, and even has a fully functional web-app, meaning I could access it from anywhere, at any time.
|
||||||
- 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.
|
- 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.
|
||||||
- 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
|
- 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
|
||||||
- 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.
|
- 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.
|
||||||
|
|
||||||
### Moving away from Notion
|
### Moving away from Notion
|
||||||
|
|
||||||
|
|
@ -63,14 +63,14 @@ After 4-5 months, I started to notice some noteworthy drawbacks to using Notion
|
||||||
- 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.
|
- 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.
|
||||||
- I rarely reached for the vast array of functionality available to me. I largely stuck with headings, web page embedding, and some tables, sometimes.
|
- I rarely reached for the vast array of functionality available to me. I largely stuck with headings, web page embedding, and some tables, sometimes.
|
||||||
- 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.
|
- 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.
|
||||||
- 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.
|
- 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.
|
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.
|
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 _is_ the thinking.
|
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 _is_ 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.
|
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.
|
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.)
|
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.) [f1](#footnote-1)
|
||||||
|
|
||||||
## Returning To Bear
|
## Returning To Bear
|
||||||
|
|
||||||
Since moving back to Bear, I've found writing a lot more pleasant and less intimidating. I actually managed to start _and then finish_ 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, _vive l'ors_.
|
Since moving back to Bear, I’ve found writing a lot more pleasant and less intimidating. I actually managed to start _and then finish_ 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, _vive l’ors_.
|
||||||
|
|
|
||||||
|
|
@ -10,39 +10,39 @@ tags:
|
||||||
- frontend
|
- frontend
|
||||||
---
|
---
|
||||||
|
|
||||||
The elders tell us of a time where you would build websites by literally writing your `.html` files. If you wanted to add some styles, you'd write them in a `.css` file and then `<link rel="stylesheet">` 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 `ftp` 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.
|
The elders tell us of a time where you would build websites by literally writing your `.html` files. If you wanted to add some styles, you’d write them in a `.css` file and then `<link rel="stylesheet">` 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 `ftp` 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.
|
||||||
|
|
||||||
## Component-orientated architectures arrive
|
## Component-orientated architectures arrive
|
||||||
|
|
||||||
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.
|
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 _just_ 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 `.html` file, find the navigation header, and add an item. And what happens if you miss one file by accident?
|
However, at some point people started to realise that writing _just_ 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 `.html` 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.
|
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.
|
||||||
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.
|
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.
|
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.
|
||||||
|
|
||||||
## Where does CSS come into this?
|
## Where does CSS come into this?
|
||||||
|
|
||||||
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 `<style ref="stylesheet>` into our application.
|
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 `<style ref=“stylesheet>` 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.
|
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.
|
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.
|
||||||
|
|
||||||
## Why not CSS-in-CSS?
|
## Why not CSS-in-CSS?
|
||||||
|
|
||||||
(First off, let's acknowledge the fact that it's now completely valid to specify that I'm talking about CSS as in a `.css` file - how weird is web development?)
|
(First off, let’s acknowledge the fact that it’s now completely valid to specify that I’m talking about CSS as in a `.css` 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.
|
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.
|
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:
|
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:
|
||||||
|
|
||||||
- **Name collision:** Different parts of you application share the same logical name, like `.navigation-item` - 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…
|
- **Name collision:** Different parts of you application share the same logical name, like `.navigation-item` - 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…
|
||||||
- **Over-specific selectors:** To combat the above, you might start chaining your selectors (e.g. `header > .navigation-item`) 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.
|
- **Over-specific selectors:** To combat the above, you might start chaining your selectors (e.g. `header > .navigation-item`) 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.
|
||||||
- **Keeping styles in just-in-case:** 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 `header > .navigation > .navigation-item > .navigation-icon`. 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…
|
- **Keeping styles in just-in-case:** 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 `header > .navigation > .navigation-item > .navigation-icon`. 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…
|
||||||
- **Unpredictable side effects from modifying or deleting code**: 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 _where_ 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 `!important` tag.
|
- **Unpredictable side effects from modifying or deleting code**: 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 _where_ 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 `!important` tag.
|
||||||
- **Source order specificity**: 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 _source order specificity_ and can override styles declared earlier. So styles can be unpredictably overridden by the way our users use the application.
|
- **Source order specificity**: 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 _source order specificity_ and can override styles declared earlier. So styles can be unpredictably overridden by the way our users use the application.
|
||||||
|
|
||||||
## CSS-in-JS as a solution ?
|
## CSS-in-JS as a solution ?
|
||||||
|
|
||||||
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 `.css` files (or `.less` and `.scss` 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)
|
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 `.css` files (or `.less` and `.scss` 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 [can be scoped](https://medium.com/@pioul/modular-css-with-react-61638ae9ea3e) 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.
|
It’s briefly worth mentioning here that CSS [can be scoped](https://medium.com/@pioul/modular-css-with-react-61638ae9ea3e) 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 _not_ 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:
|
CSS-in-JS is _not_ 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:
|
||||||
|
|
||||||
- [styled-components](https://www.styled-components.com)
|
- [styled-components](https://www.styled-components.com)
|
||||||
|
|
@ -52,15 +52,15 @@ CSS-in-JS is _not_ a singly library or package, and it is not an agreed syntax.
|
||||||
|
|
||||||
## Why do people keep using CSS-in-JS ?
|
## Why do people keep using CSS-in-JS ?
|
||||||
|
|
||||||
Fundamentally: **It's a component-first way of thinking**. 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 `.navigation-item` that they _really_ mean.
|
Fundamentally: **It’s a component-first way of thinking**. 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 `.navigation-item` that they _really_ mean.
|
||||||
This makes it easy and familiar to think about, and it **centralises our visual code into one place**. This is a nice philosophical benefit, but it pragmatically helps us by constraining where a set of styles are used. This means **they could be edited or deleted with more certainty that we aren't about to accidentally change styles across the DOM**.
|
This makes it easy and familiar to think about, and it **centralises our visual code into one place**. This is a nice philosophical benefit, but it pragmatically helps us by constraining where a set of styles are used. This means **they could be edited or deleted with more certainty that we aren’t about to accidentally change styles across the DOM**.
|
||||||
For me, the strongest advantage of CSS-in-JS is the addition of functionality from a programming language, like JS. **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.** 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.
|
For me, the strongest advantage of CSS-in-JS is the addition of functionality from a programming language, like JS. **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.** 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 **developers don't have to worry about creating unique, or strictly-structured class names for their css** - they can just declare styles, and assume they will be correctly scoped.
|
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 **developers don’t have to worry about creating unique, or strictly-structured class names for their css** - they can just declare styles, and assume they will be correctly scoped.
|
||||||
What's more, **the build chain which does all of these is integrated into the existing build process for the website**. We can keep our JS project as purely JS, and don't have to worry about building and bundling `.scss` or `.less` files.
|
What’s more, **the build chain which does all of these is integrated into the existing build process for the website**. We can keep our JS project as purely JS, and don’t have to worry about building and bundling `.scss` or `.less` files.
|
||||||
|
|
||||||
## Articles I found useful
|
## Articles I found useful
|
||||||
|
|
||||||
I came across a couple of really nicely written articles when I was researching this piece. I'd recommend them if you're curious:
|
I came across a couple of really nicely written articles when I was researching this piece. I’d recommend them if you’re curious:
|
||||||
|
|
||||||
- [Why I Write CSS in JavaScript](https://mxstbr.com/thoughts/css-in-js/)
|
- [Why I Write CSS in JavaScript](https://mxstbr.com/thoughts/css-in-js/)
|
||||||
- [What actually is CSS in JS?](https://medium.com/dailyjs/what-is-actually-css-in-js-f2f529a2757)
|
- [What actually is CSS in JS?](https://medium.com/dailyjs/what-is-actually-css-in-js-f2f529a2757)
|
||||||
|
|
|
||||||
|
|
@ -10,28 +10,28 @@ tags:
|
||||||
- arts
|
- arts
|
||||||
---
|
---
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
## Historic Centre of Florence
|
## Historic Centre of Florence
|
||||||
|
|
||||||
Italy, UNESCO World Heritage Site
|
Italy, UNESCO World Heritage Site
|
||||||
|
|
||||||
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 [is a UNESCO World Heritage site](https://whc.unesco.org/en/list/174/), 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.
|
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 [is a UNESCO World Heritage site](https://whc.unesco.org/en/list/174/), 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.
|
||||||
|
|
||||||
## House of MinaLima
|
## House of MinaLima
|
||||||
|
|
||||||
Soho, London
|
Soho, London
|
||||||
|
|
||||||
[MinaLima are a design studio](https://minalima.com/about/) 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.
|
[MinaLima are a design studio](https://minalima.com/about/) 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.
|
||||||
|
|
||||||
## Faith Hope and Charity
|
## Faith Hope and Charity
|
||||||
|
|
||||||
The National Theatre, London
|
The National Theatre, London
|
||||||
|
|
||||||
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. _Faith Hope and Charity_ 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. [Susan Lynch, one of the actresses](https://www.nationaltheatre.org.uk/shows/faith-hope-and-charity) 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.
|
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. _Faith Hope and Charity_ 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. [Susan Lynch, one of the actresses](https://www.nationaltheatre.org.uk/shows/faith-hope-and-charity) 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.
|
||||||
|
|
||||||
## Akram Khan's Giselle
|
## Akram Khan’s Giselle
|
||||||
|
|
||||||
Sadlers Wells, London
|
Sadlers Wells, London
|
||||||
|
|
||||||
I feel lucky that I got a chance to see [this piece](https://www.ballet.org.uk/production/akram-khan-giselle/). 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.
|
I feel lucky that I got a chance to see [this piece](https://www.ballet.org.uk/production/akram-khan-giselle/). 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.
|
||||||
|
|
|
||||||
|
|
@ -12,30 +12,30 @@ tags:
|
||||||
- react
|
- react
|
||||||
---
|
---
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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 (https://thomaswilson.xyz) from [Nuxt](https://nuxtjs.org) (a Vue.JS application framework) into [Gatsby](https://www.gatsbyjs.org) (a React.JS static site generator). It took me like to evenings and I'm happy with my decision.
|
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 (https://thomaswilson.xyz) from [Nuxt](https://nuxtjs.org) (a Vue.JS application framework) into [Gatsby](https://www.gatsbyjs.org) (a React.JS static site generator). It took me like to evenings and I’m happy with my decision.
|
||||||
|
|
||||||
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.
|
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](/albums-2019). There was a lot going on, and I was finding a lot of friction in the process of writing blog posts for this site.
|
||||||
|
|
||||||
## Why React, not Vue ?
|
## Why React, not Vue ?
|
||||||
|
|
||||||
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 _just_ 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.
|
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 _just_ 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.
|
||||||
|
|
||||||
It definitely didn't help that I was having _big_ 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.
|
It definitely didn’t help that I was having _big_ 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.
|
||||||
|
|
||||||
Additionally, at the time of writing, the proposed [V3 of Vue.JS](https://medium.com/the-vue-point/plans-for-the-next-iteration-of-vue-js-777ffea6fabf?ref=madewithvuejs.com) 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. _A la_ AngularJS vibes.
|
Additionally, at the time of writing, the proposed [V3 of Vue.JS](https://medium.com/the-vue-point/plans-for-the-next-iteration-of-vue-js-777ffea6fabf?ref=madewithvuejs.com) 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. _A la_ AngularJS vibes.
|
||||||
|
|
||||||
## Why Gatsby?
|
## Why Gatsby?
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
I want to give a special shoutout here to the `gastby-image` package for lazy-loading images (alongside the GraphQL support and `image-sharp` 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.
|
I want to give a special shoutout here to the `gastby-image` package for lazy-loading images (alongside the GraphQL support and `image-sharp` 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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
Recently the core-team has been pushing [Gatsby Themes](https://www.gatsbyjs.org/docs/themes/what-are-gatsby-themes/) (as I heard about on [here](http://www.fullstackradio.com/115), [here](https://syntax.fm/show/150/gatsby-themes), and [here](https://syntax.fm/show/150/gatsby-themes)). 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.
|
Recently the core-team has been pushing [Gatsby Themes](https://www.gatsbyjs.org/docs/themes/what-are-gatsby-themes/) (as I heard about on [here](http://www.fullstackradio.com/115), [here](https://syntax.fm/show/150/gatsby-themes), and [here](https://syntax.fm/show/150/gatsby-themes)). 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.
|
||||||
|
|
||||||
Lastly, I wanted to quickly/easily deploy my personal site on [Netflify](https://www.netlify.com) - 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.
|
Lastly, I wanted to quickly/easily deploy my personal site on [Netflify](https://www.netlify.com) - 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.
|
||||||
|
|
|
||||||
24
src/content/blog/2020-02-20-introducing-eating-disorders.md
Normal file
24
src/content/blog/2020-02-20-introducing-eating-disorders.md
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
---
|
||||||
|
|
||||||
|
title: "Re-publishing my writing on my experiences with food and eating disorders"
|
||||||
|
author: "Thomas Wilson"
|
||||||
|
draft: false
|
||||||
|
date: 2020-02-20
|
||||||
|
slug: "introducing-eating-anthology"
|
||||||
|
tags:
|
||||||
|
- eating-disorder
|
||||||
|
---
|
||||||
|
|
||||||
|
**tl;dr** - I have moved the writing I have created on my experiences with eating disorders to this site (and off of Medium.). You can find them [here](/eating-anthology).
|
||||||
|
|
||||||
|
For at least the past five years, my mental health has been affected through and alongside a weird relationship with food, exercise, and eating. I find writing helps me clarify my thoughts and my situation to me. While a lot of this writing is intentionally private, there are a couple of piece I want to be publicly available.
|
||||||
|
|
||||||
|
Back when I published my first piece on this subject, I put it on medium.com - however that site has recently favoured the advertiser over the reader. Back in 2016 it was very much the opposite, and while I understand they need to make money from people reading their writing - I don't, and so I can afford to favour the reader experience. When I've written something so personal and meaningful, I wanted people to read it in the same way.
|
||||||
|
|
||||||
|
So I have collated my writing into a small anthology, which you can find on my personal site, [here](/eating-anthology) or each piece individually at:
|
||||||
|
|
||||||
|
- 2016: [My Eating Disorder Was Dangerous Because It Was Powerful](/eating-anthology/2016)
|
||||||
|
- 2017: [Loss and my ED](/eating-anthology/2017)
|
||||||
|
- 2020: [My eating disorder will always remind me of the person I was, and am](/eating-anthology/2020)
|
||||||
|
|
||||||
|
I've left the initial pieces as untouched - with only some minor styling changes to bring some of the long lyrics I mention into life.
|
||||||
|
|
@ -9,32 +9,32 @@ tags:
|
||||||
- hereabouts
|
- hereabouts
|
||||||
---
|
---
|
||||||
|
|
||||||
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 [tinyfox studio](https://www.tinyfox.studio). At the beginning of 2020 I quit my job to do this independently, and now I'm building _hereabouts_ - an app that provides self-paced walks, tours, hunts, and races for travel adventurers
|
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 [tinyfox studio](https://www.tinyfox.studio). At the beginning of 2020 I quit my job to do this independently, and now I’m building _hereabouts_ - 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.
|
In this devblog series I want to record to the process of building something modern and beautiful from the ground up.
|
||||||
|
|
||||||
## My problem/frustration
|
## My problem/frustration
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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 [blue plaques](https://www.english-heritage.org.uk/visit/blue-plaques/) but really what's a sentence to describe a life's work?
|
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 [blue plaques](https://www.english-heritage.org.uk/visit/blue-plaques/) but really what’s a sentence to describe a life’s work?
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
## Hereabouts: self-paced walks, tours, hunts, and races for travel adventurers
|
## Hereabouts: self-paced walks, tours, hunts, and races for travel adventurers
|
||||||
|
|
||||||
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.
|
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.
|
I want to reach adventurous travellers and sate their appetite to learn more about what makes a place beautiful.
|
||||||
|
|
||||||
I don't know what exactly it will look like or do. That's part of the development process.
|
I don’t know what exactly it will look like or do. That’s part of the development process.
|
||||||
|
|
||||||
## What I want to achieve
|
## What I want to achieve
|
||||||
|
|
||||||
By building this idea out there are two things I want to achieve, neither of which are overtly technical:
|
By building this idea out there are two things I want to achieve, neither of which are overtly technical:
|
||||||
|
|
||||||
1. I want people to experience joy and connection form the place they're in or connected to
|
1. I want people to experience joy and connection form the place they’re in or connected to
|
||||||
2. I want to provide high quality story telling and information resources
|
2. I want to provide high quality story telling and information resources
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
|
|
@ -42,13 +42,13 @@ I hate that when I go to learn about a certain place, or person, or idea - the i
|
||||||
|
|
||||||
## Why build an app?
|
## Why build an app?
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
And to be honest, I think the things I want to achieve can _only_ 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 _could_ 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.
|
And to be honest, I think the things I want to achieve can _only_ 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 _could_ 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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
I also want to call out a couple of very influential sources to me when thinking about if this is something that I _can_ or _should_ even be doing:
|
I also want to call out a couple of very influential sources to me when thinking about if this is something that I _can_ or _should_ even be doing:
|
||||||
|
|
||||||
- [Basecamp's books](https://basecamp.com/books) - 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.
|
- [Basecamp’s books](https://basecamp.com/books) - 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.
|
||||||
- The [indie hacker](https://www.indiehackers.com/start) movement have been excellent at showing me countless examples of people who have built businesses at various speeds and with various goals.
|
- The [indie hacker](https://www.indiehackers.com/start) movement have been excellent at showing me countless examples of people who have built businesses at various speeds and with various goals.
|
||||||
|
|
|
||||||
|
|
@ -11,98 +11,98 @@ tags:
|
||||||
- figma
|
- figma
|
||||||
---
|
---
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
## Tl;dr
|
## Tl;dr
|
||||||
|
|
||||||
1. 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
|
1. 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
|
||||||
2. First, make a list of all the **Screens** 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).
|
2. First, make a list of all the **Screens** 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).
|
||||||
3. You're going to make a note of all the high level **Components** 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".
|
3. You’re going to make a note of all the high level **Components** 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”.
|
||||||
4. 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 **do not lay them out nicely**.
|
4. 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 **do not lay them out nicely**.
|
||||||
5. Take your Screens and Components, and list all the variants in **State** that you can have: can a TextField be `selected` or `disabled` ? Can an event in a calendar be `upcoming` or `passed` ? Can the Screen for editing an article be in `edit` mode or `read` mode ?
|
5. Take your Screens and Components, and list all the variants in **State** that you can have: can a TextField be `selected` or `disabled` ? Can an event in a calendar be `upcoming` or `passed` ? Can the Screen for editing an article be in `edit` mode or `read` mode ?
|
||||||
6. You're going to look at all the components you have that are **Actions** - 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.
|
6. You’re going to look at all the components you have that are **Actions** - 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.
|
||||||
7. 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.
|
7. 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.
|
||||||
|
|
||||||
## Why even do UX?
|
## Why even do UX?
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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?
|
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?
|
||||||
|
|
||||||
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?".
|
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?”.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
From an engineering perspective, as someone who _makes_ 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.
|
From an engineering perspective, as someone who _makes_ 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.
|
||||||
|
|
||||||
## 0: Screens & Components, State & Actions
|
## 0: Screens & Components, State & Actions
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
- **Screens** - 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).
|
- **Screens** - 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).
|
||||||
- **Components** - are also really hard to define - they're visual _things_ on the screen. The [ReactJS](https://reactjs.org/docs/components-and-props.html) 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).
|
- **Components** - are also really hard to define - they’re visual _things_ on the screen. The [ReactJS](https://reactjs.org/docs/components-and-props.html) 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).
|
||||||
- **State** - 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?
|
- **State** - 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?
|
||||||
- **Actions** - are the things a user can _do_ 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 .
|
- **Actions** - are the things a user can _do_ 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 .
|
||||||
|
|
||||||
### You are creating a low-fidelity working document.
|
### You are creating a low-fidelity working document.
|
||||||
|
|
||||||
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 **I am creating a working document** - 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.
|
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 **I am creating a working document** - 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.
|
||||||
|
|
||||||
Your working document will probably be ugly. Mine _definitely_ 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.
|
Your working document will probably be ugly. Mine _definitely_ 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.
|
||||||
|
|
||||||
Trying to optimise for visual and semantic consistency at this stage makes you _feel_ busy, without having to address the important questions. So long as I know what a component or screen means, then it doesn't matter.
|
Trying to optimise for visual and semantic consistency at this stage makes you _feel_ busy, without having to address the important questions. So long as I know what a component or screen means, then it doesn’t matter.
|
||||||
|
|
||||||
I also really encourage you to **work with pencil and paper next to you**. 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.
|
I also really encourage you to **work with pencil and paper next to you**. 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.
|
||||||
|
|
||||||
### Oh my plants
|
### Oh my plants
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
## 1: Identify Screens
|
## 1: Identify Screens
|
||||||
|
|
||||||
So let's imagine the following user journey in _oh my plants_ - 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 _Home_ we can end up at _Plant Details_ by going through either of the three possible routes.
|
So let’s imagine the following user journey in _oh my plants_ - 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 _Home_ we can end up at _Plant Details_ by going through either of the three possible routes.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
## 2: Identify the Components
|
## 2: Identify the Components
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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 `SearchBar` component distinct from a `TextField` - 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.
|
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 `SearchBar` component distinct from a `TextField` - 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.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
## 3: Identify State
|
## 3: Identify State
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
### Wait, why do I need state on my components AND screens?
|
### Wait, why do I need state on my components AND screens?
|
||||||
|
|
||||||
Yeah, this is a very fine line - and totally _is_ a matter of opinion. This is one of the points that makes product and UX design a skilled profession.
|
Yeah, this is a very fine line - and totally _is_ a matter of opinion. This is one of the points that makes product and UX design a skilled profession.
|
||||||
|
|
||||||
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 _way_ it's presented that makes the difference between a good and a great experience.
|
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 _way_ it’s presented that makes the difference between a good and a great experience.
|
||||||
|
|
||||||
Enough talk, let's give an example. Imagine _oh my plants_ knows when's the perfect time to plant each garden herb. It has a `PlantList` screen - which is a simple list view of `PlantListItem`s.
|
Enough talk, let’s give an example. Imagine _oh my plants_ knows when’s the perfect time to plant each garden herb. It has a `PlantList` screen - which is a simple list view of `PlantListItem`s.
|
||||||
|
|
||||||
A `PlantListItem` 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".
|
A `PlantListItem` 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”.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|
@ -112,18 +112,18 @@ In practice, however, the fact that all the plants are highlighted means that no
|
||||||
|
|
||||||
An action is normally something that changes the state of a component or screen, or that navigates the user around the app.
|
An action is normally something that changes the state of a component or screen, or that navigates the user around the app.
|
||||||
|
|
||||||
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 `button` or `select` or `switch` or `tab`... you get the idea.
|
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 `button` or `select` or `switch` or `tab`... you get the idea.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
Conversely, if you recognise there are actions that are triggered by clicking non-typical components, like undecorated `text` or `header` - then maybe these are interaction patterns you need to make discoverable to your users.
|
Conversely, if you recognise there are actions that are triggered by clicking non-typical components, like undecorated `text` or `header` - then maybe these are interaction patterns you need to make discoverable to your users.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
## 5: Go forth
|
## 5: Go forth
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
Take this blueprint forward and make something you're proud of, or ignore my opinions and become successful anyway - I truly do not mind.
|
Take this blueprint forward and make something you’re proud of, or ignore my opinions and become successful anyway - I truly do not mind.
|
||||||
|
|
|
||||||
|
|
@ -10,48 +10,48 @@ tags:
|
||||||
- react
|
- react
|
||||||
---
|
---
|
||||||
|
|
||||||
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 _possible_ on the web, but they're much more native functionality.
|
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 _possible_ on the web, but they’re much more native functionality.
|
||||||
|
|
||||||
I've made the decision to write the app in [React Native](https://reactnative.dev) - a library for creating applications for native platforms (like iOS and Android) using React and JavaScript.
|
I’ve made the decision to write the app in [React Native](https://reactnative.dev) - a library for creating applications for native platforms (like iOS and Android) using React and JavaScript.
|
||||||
|
|
||||||
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 [abandoned React Native in 2018](https://medium.com/airbnb-engineering/sunsetting-react-native-1868ba28e30a) citing a couple of pretty damning reasons: long initialisation and first-render times; lack of code-sharing between platforms; mixed developer experience.
|
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 [abandoned React Native in 2018](https://medium.com/airbnb-engineering/sunsetting-react-native-1868ba28e30a) citing a couple of pretty damning reasons: long initialisation and first-render times; lack of code-sharing between platforms; mixed developer experience.
|
||||||
|
|
||||||
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 [expo](https://expo.io/)) have made the development experience of making a native app a _lot_ better. Big tech companies, like [Shopify, have also adopted](https://www.theregister.co.uk/2020/01/30/shopify_shifts_its_mobile_development_to_react_native/) React Native.
|
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 [expo](https://expo.io/)) have made the development experience of making a native app a _lot_ better. Big tech companies, like [Shopify, have also adopted](https://www.theregister.co.uk/2020/01/30/shopify_shifts_its_mobile_development_to_react_native/) React Native.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
## Why not native-native?
|
## Why not native-native?
|
||||||
|
|
||||||
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 [SwiftUI](https://developer.apple.com/xcode/swiftui/). The API for SwiftUI is still in beta (currently beta 4) and still has a few quirks (e.g. see [this Reddit post](https://www.reddit.com/r/iOSProgramming/comments/fd7mpz/holy_shit_how_the_hell_do_i_use_swiftui_its_the/)) 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 [seen as the future](https://www.macrumors.com/2019/06/03/apple-unveils-swiftui-framework/) 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.
|
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 [SwiftUI](https://developer.apple.com/xcode/swiftui/). The API for SwiftUI is still in beta (currently beta 4) and still has a few quirks (e.g. see [this Reddit post](https://www.reddit.com/r/iOSProgramming/comments/fd7mpz/holy_shit_how_the_hell_do_i_use_swiftui_its_the/)) 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 [seen as the future](https://www.macrumors.com/2019/06/03/apple-unveils-swiftui-framework/) 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.
|
||||||
|
|
||||||
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) [more money](https://www.businessofapps.com/data/app-revenues/) [is spent](https://sensortower.com/blog/average-publisher-revenue) 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.
|
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) [more money](https://www.businessofapps.com/data/app-revenues/) [is spent](https://sensortower.com/blog/average-publisher-revenue) 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.
|
||||||
|
|
||||||
## Reason #0: I already know React
|
## Reason #0: I already know React
|
||||||
|
|
||||||
The simplest reason for me choosing React Native, over say [NativeScript](https://www.nativescript.org/) or [Flutter](https://flutter.dev/), 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 [TypeScript](https://www.typescriptlang.org/), comes quite naturally to me now.
|
The simplest reason for me choosing React Native, over say [NativeScript](https://www.nativescript.org/) or [Flutter](https://flutter.dev/), 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 [TypeScript](https://www.typescriptlang.org/), comes quite naturally to me now.
|
||||||
|
|
||||||
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 _good_) community. I know how to handle complexity in React, and I have opinions about styling and architecture that React doesn't fight.
|
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 _good_) community. I know how to handle complexity in React, and I have opinions about styling and architecture that React doesn’t fight.
|
||||||
|
|
||||||
Additionally, Google has a reputation for sunsetting projects with little notice, which makes me a little apprehensive about Flutter.
|
Additionally, Google has a reputation for sunsetting projects with little notice, which makes me a little apprehensive about Flutter.
|
||||||
|
|
||||||
## Reason #1: React Native isn't a hybrid WebView app
|
## Reason #1: React Native isn’t a hybrid WebView app
|
||||||
|
|
||||||
Many people's gut reaction to creating a cross-platform app is to think of something laggy, and distinctly _un-native_. 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 [Ionic](https://ionicframework.com/) and [Cordova](https://cordova.apache.org/) work - and they're great for very simple apps, but they're notoriously [not very performant](https://www.netguru.com/blog/why-you-should-migrate-your-app-from-ionic-cordova-or-phonegap-to-react-native).
|
Many people’s gut reaction to creating a cross-platform app is to think of something laggy, and distinctly _un-native_. 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 [Ionic](https://ionicframework.com/) and [Cordova](https://cordova.apache.org/) work - and they’re great for very simple apps, but they’re notoriously [not very performant](https://www.netguru.com/blog/why-you-should-migrate-your-app-from-ionic-cordova-or-phonegap-to-react-native).
|
||||||
|
|
||||||
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 _will_ notice.
|
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 _will_ notice.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
Let's just take a second to clarify some of these words: first **[JSX](https://facebook.github.io/jsx/)** 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:
|
Let’s just take a second to clarify some of these words: first **[JSX](https://facebook.github.io/jsx/)** 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:
|
||||||
|
|
||||||
```
|
```
|
||||||
import React from ‘react'
|
import React from ‘react’
|
||||||
|
|
||||||
const Message = () => {
|
const Message = () => {
|
||||||
return (
|
return (
|
||||||
<div style={{colour: ‘blue'}}>
|
<div style={{colour: ‘blue’}}>
|
||||||
<h1>Hello!</h1>
|
<h1>Hello!</h1>
|
||||||
<p className="message__text">Welcome, friend</p>
|
<p className=“message__text”>Welcome, friend</p>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
@ -59,22 +59,22 @@ const Message = () => {
|
||||||
export default Message
|
export default Message
|
||||||
```
|
```
|
||||||
|
|
||||||
**JSX** is [syntactic sugar](https://en.wikipedia.org/wiki/Syntactic_sugar) - 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 `createElement()` but we're not talking about that here.
|
**JSX** is [syntactic sugar](https://en.wikipedia.org/wiki/Syntactic_sugar) - 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 `createElement()` but we’re not talking about that here.
|
||||||
|
|
||||||
The second term I want to bring out and talk about is **bridging**. 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.
|
The second term I want to bring out and talk about is **bridging**. 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.
|
||||||
|
|
||||||
The part of the architecture that lets a JS thread, where a React Native application runs, talk to the native Threads, [is called the Bridge](https://hackernoon.com/understanding-react-native-bridge-concept-e9526066ddb8). The details of how this works are covered for both [iOS](https://reactnative.dev/docs/communication-ios) and [Android](https://reactnative.dev/docs/native-modules-android) in the React Native docs and aren't really relevant for this discussion - just know they happen.
|
The part of the architecture that lets a JS thread, where a React Native application runs, talk to the native Threads, [is called the Bridge](https://hackernoon.com/understanding-react-native-bridge-concept-e9526066ddb8). The details of how this works are covered for both [iOS](https://reactnative.dev/docs/communication-ios) and [Android](https://reactnative.dev/docs/native-modules-android) in the React Native docs and aren’t really relevant for this discussion - just know they happen.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
## Reason #3: The performance and benchmarking discussions are nuanced
|
## Reason #3: The performance and benchmarking discussions are nuanced
|
||||||
|
|
||||||
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 _feel_ like a first class citizen on a mobile phone because that is what I would expect from an app that I paid for.
|
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 _feel_ like a first class citizen on a mobile phone because that is what I would expect from an app that I paid for.
|
||||||
|
|
||||||
I've seen a couple of blog posts that (like [this one](https://medium.com/swlh/flutter-vs-native-vs-react-native-examining-performance-31338f081980) from inVerita, and [this one](https://thoughtbot.com/blog/examining-performance-differences-between-native-flutter-and-react-native-mobile-development) 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.
|
I’ve seen a couple of blog posts that (like [this one](https://medium.com/swlh/flutter-vs-native-vs-react-native-examining-performance-31338f081980) from inVerita, and [this one](https://thoughtbot.com/blog/examining-performance-differences-between-native-flutter-and-react-native-mobile-development) 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.
|
||||||
|
|
||||||
Fundamentally, though, good performance in React Native _is_ possible. It requires a [thoughtful consideration around what you're doing](https://reactnative.dev/docs/performance), and building with the tools that let you investigate and profile your app to let you know when there's a problem.
|
Fundamentally, though, good performance in React Native _is_ possible. It requires a [thoughtful consideration around what you’re doing](https://reactnative.dev/docs/performance), and building with the tools that let you investigate and profile your app to let you know when there’s a problem.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
So I'm not overly concerned about poor performance in hereabouts _just_ 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.
|
So I’m not overly concerned about poor performance in hereabouts _just_ 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.
|
||||||
|
|
|
||||||
|
|
@ -9,93 +9,93 @@ tags:
|
||||||
- hereabouts
|
- hereabouts
|
||||||
---
|
---
|
||||||
|
|
||||||
Hi, I'm Thomas Wilson, I'm a web and mobile engineer building [Hereabouts](https://www.hereabouts.app) - an app that's like a tour guide if the tour guide was like [Roman Mars](https://99percentinvisible.org) 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.
|
Hi, I’m Thomas Wilson, I’m a web and mobile engineer building [Hereabouts](https://www.hereabouts.app) - an app that’s like a tour guide if the tour guide was like [Roman Mars](https://99percentinvisible.org) 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.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
## Notable things
|
## Notable things
|
||||||
|
|
||||||
- The Covid-19 Pandemic.
|
- The Covid-19 Pandemic.
|
||||||
- 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.
|
- 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.
|
||||||
- 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 _actually_ take to design and build to a certain quality.
|
- 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 _actually_ take to design and build to a certain quality.
|
||||||
- Started building more formal documentation (in Notion and Figma) for use case + market summaries, user journeys, business entities, and visual design language.
|
- Started building more formal documentation (in Notion and Figma) for use case + market summaries, user journeys, business entities, and visual design language.
|
||||||
|
|
||||||
* Purchased hereabouts.app domain, built a [simple landing page](https://www.hereabouts.app) (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).
|
* Purchased hereabouts.app domain, built a [simple landing page](https://www.hereabouts.app) (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).
|
||||||
* Started building the app. Started in Swift, moved to React Native. Enrolled in Apple Developer Programme (arguably too early - it's a motivator)
|
* Started building the app. Started in Swift, moved to React Native. Enrolled in Apple Developer Programme (arguably too early - it’s a motivator)
|
||||||
|
|
||||||
## What an Emotional Rollercoaster, feat. The Covid-19 Pandemic
|
## What an Emotional Rollercoaster, feat. The Covid-19 Pandemic
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
Can you imagine finally deciding on a side project you want to carry through to production/publication, and then a [global pandemic breaks out](https://www.who.int/dg/speeches/detail/who-director-general-s-opening-remarks-at-the-media-briefing-on-covid-19---11-march-2020). 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 [increasing](https://www.bloomberg.com/news/articles/2020-03-14/spain-s-coronavirus-cases-jump-36-to-5-753-deaths-rise-to-136) policing and [enforcement](https://www.aljazeera.com/news/2020/03/europe-edging-total-coronavirus-lockdown-200316131203376.html).
|
Can you imagine finally deciding on a side project you want to carry through to production/publication, and then a [global pandemic breaks out](https://www.who.int/dg/speeches/detail/who-director-general-s-opening-remarks-at-the-media-briefing-on-covid-19---11-march-2020). 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 [increasing](https://www.bloomberg.com/news/articles/2020-03-14/spain-s-coronavirus-cases-jump-36-to-5-753-deaths-rise-to-136) policing and [enforcement](https://www.aljazeera.com/news/2020/03/europe-edging-total-coronavirus-lockdown-200316131203376.html).
|
||||||
|
|
||||||
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 _and then did something about_. 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.
|
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 _and then did something about_. 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.
|
||||||
|
|
||||||
Yes, a pandemic with strong government response _is_ 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.
|
Yes, a pandemic with strong government response _is_ 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.
|
||||||
|
|
||||||
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 [global recession](https://www.theguardian.com/business/2020/mar/15/prepare-for-the-coronavirus-global-recession) [threatening](https://www.economist.com/finance-and-economics/2020/03/05/a-recession-is-unlikely-but-not-impossible) 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.
|
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 [global recession](https://www.theguardian.com/business/2020/mar/15/prepare-for-the-coronavirus-global-recession) [threatening](https://www.economist.com/finance-and-economics/2020/03/05/a-recession-is-unlikely-but-not-impossible) 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.
|
||||||
|
|
||||||
I am aware that I don't want to continue under the guise of [hustle porn](https://www.inc.com/serhat-pala/alexis-ohanian-says-hustle-porn-is-most-dangerous-trend-in-silicon-valley-heres-how-to-eradicate-it.html) - I don't want to see this hardship and fight against it _just_ 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.
|
I am aware that I don’t want to continue under the guise of [hustle porn](https://www.inc.com/serhat-pala/alexis-ohanian-says-hustle-porn-is-most-dangerous-trend-in-silicon-valley-heres-how-to-eradicate-it.html) - I don’t want to see this hardship and fight against it _just_ 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.
|
||||||
|
|
||||||
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 _need_ 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.
|
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 _need_ 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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
## Thinking about development cycle and Topic Lock
|
## Thinking about development cycle and Topic Lock
|
||||||
|
|
||||||
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 _feels_ important but I forget about it quickly, and didn't latch on and flesh it out - it probably wasn't actually that important.
|
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 _feels_ important but I forget about it quickly, and didn’t latch on and flesh it out - it probably wasn’t actually that important.
|
||||||
|
|
||||||
This is especially true for right now: creating the idea for a new product, and then putting that into concrete UIs and code. What _is_ 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.
|
This is especially true for right now: creating the idea for a new product, and then putting that into concrete UIs and code. What _is_ 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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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 [Double Diamond](https://www.designcouncil.org.uk/news-opinion/what-framework-innovation-design-councils-evolved-double-diamond) 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.
|
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 [Double Diamond](https://www.designcouncil.org.uk/news-opinion/what-framework-innovation-design-councils-evolved-double-diamond) 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.
|
||||||
|
|
||||||
Alongside that, I am thinking about Topic Lock. This is something I first heard from CGP Grey said in the [Cortex podcast](https://www.relay.fm/cortex/95), 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.
|
Alongside that, I am thinking about Topic Lock. This is something I first heard from CGP Grey said in the [Cortex podcast](https://www.relay.fm/cortex/95), 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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
## User Journeys, Internal Documentation, and Design Language
|
## User Journeys, Internal Documentation, and Design Language
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
[Notion](https://www.notion.so) is hard to describe: it's like a Google Doc meets a database. I actually wrote about [why I gave up using Notion](https://thomaswilson.xyz/blog/back-to-bear) 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 [Bear](https://bear.app).
|
[Notion](https://www.notion.so) is hard to describe: it’s like a Google Doc meets a database. I actually wrote about [why I gave up using Notion](https://thomaswilson.xyz/blog/back-to-bear) 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 [Bear](https://bear.app).
|
||||||
|
|
||||||
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:
|
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:
|
||||||
|
|
||||||
- Writing that I don't intend to share but need to refer back to, e.g. business models, elevator pitch. Like a classic Wiki.
|
- Writing that I don’t intend to share but need to refer back to, e.g. business models, elevator pitch. Like a classic Wiki.
|
||||||
- Articulating and formalising the goals I have for a particular development cycle.
|
- Articulating and formalising the goals I have for a particular development cycle.
|
||||||
- Keeping track of the business entities or key "things" in the code base, like what is a "Tour" and "Place", etc.
|
- Keeping track of the business entities or key “things” in the code base, like what is a “Tour” and “Place”, etc.
|
||||||
- Noting down research for both the content of Hereabouts (like interesting places), and the meta research around running a business.
|
- Noting down research for both the content of Hereabouts (like interesting places), and the meta research around running a business.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
### User Journeys and Design Language - Another blog post (in Figma and Notion)
|
### User Journeys and Design Language - Another blog post (in Figma and Notion)
|
||||||
|
|
||||||
I've done a _lot_ 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.
|
I’ve done a _lot_ 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.
|
||||||
|
|
||||||
## React Native
|
## React Native
|
||||||
|
|
||||||
I wrote a more in-depth post about [why I choose React Native](https://thomaswilson.xyz/blog/2020-03-22-why-i-chose-react-native-for-app-in-2020), also on my blog. So yeah, I'll be writing this thing in TypeScript, using React Native, and the [Expo platform](https://expo.io).
|
I wrote a more in-depth post about [why I choose React Native](https://thomaswilson.xyz/blog/2020-03-22-why-i-chose-react-native-for-app-in-2020), also on my blog. So yeah, I’ll be writing this thing in TypeScript, using React Native, and the [Expo platform](https://expo.io).
|
||||||
|
|
||||||
Let's take a whole paragraph to acknowledge how good a job the Expo team are doing. Honestly, such brilliant tooling.
|
Let’s take a whole paragraph to acknowledge how good a job the Expo team are doing. Honestly, such brilliant tooling.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
Moving to UIKit very briefly made sense, but SwiftUI is the future of development on Apple platforms so why waste time working through that.
|
Moving to UIKit very briefly made sense, but SwiftUI is the future of development on Apple platforms so why waste time working through that.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
---
|
---
|
||||||
title: "I don't want to be a unicorn, an engineer or a designer - I just want to build things better"
|
|
||||||
|
title: "I don't want to be a unicorn 🦄, an engineer or a designer - I just want to build things better"
|
||||||
author: Thomas Wilson
|
author: Thomas Wilson
|
||||||
date: 2020-05-31
|
date: 2020-05-31
|
||||||
draft: false
|
draft: false
|
||||||
|
|
@ -13,7 +14,7 @@ I like building software, or parts of software, which are visual and interactive
|
||||||
|
|
||||||
A lot of people either design _or_ code. People with feet in both sides of this skillset are often referred to as Unicorns 🦄, because people who do this are rare.
|
A lot of people either design _or_ code. People with feet in both sides of this skillset are often referred to as Unicorns 🦄, because people who do this are rare.
|
||||||
|
|
||||||
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 (_Engineer, Designer, Manager_). I don't _want_ 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 _why is that so difficult to convey in a way which is taken seriously?_
|
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 (_Engineer, Designer, Manager_). I don't _want_ 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 _why is that so difficult to convey in a way which is taken seriously 🤷♀️?_
|
||||||
|
|
||||||
## Unicorns 🦄
|
## Unicorns 🦄
|
||||||
|
|
||||||
|
|
@ -27,7 +28,7 @@ Despite this criticism, I think the relatively recent [expansion and funding](ht
|
||||||
|
|
||||||
## Specialisation and language
|
## Specialisation and language
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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 - [it's division of labour](https://en.wikipedia.org/wiki/Division_of_labour). 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 👎
|
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 - [it's division of labour](https://en.wikipedia.org/wiki/Division_of_labour). 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 👎
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,14 +12,14 @@ tags:
|
||||||
|
|
||||||
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 good way to look at visual conventions that other people made, and have used in their UIs and UX.
|
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 good way to look at visual conventions that other people made, and have used in their UIs and UX.
|
||||||
|
|
||||||
If I were to examine the time I spent "designing" more closely, and divided it between _actually pushing pixels around in Figma_, and _looking at other people's work on Dribbble_ I would be shocked and ashamed.
|
If I were to examine the time I spent “designing” more closely, and divided it between _actually pushing pixels around in Figma_, and _looking at other people’s work on Dribbble_ I would be shocked and ashamed.
|
||||||
|
|
||||||
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.
|
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
|
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
|
||||||
|
|
||||||
**A quick caveat though.** 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, _just because a designer fancied it_? 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" _is_ enough of a reason - but this might not fly so well on a village GP surgery.
|
**A quick caveat though.** 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, _just because a designer fancied it_? 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” _is_ enough of a reason - but this might not fly so well on a village GP surgery.
|
||||||
|
|
||||||
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 (_Inception Horn_).
|
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 (_Inception Horn_).
|
||||||
|
|
||||||
**Here are some sites that put words to visual design patterns**:
|
**Here are some sites that put words to visual design patterns**:
|
||||||
|
|
||||||
|
|
@ -33,7 +33,7 @@ Anyway, this post isn't about that, it's about some sweet sweet list of cool sit
|
||||||
- [mobbin.design](https://mobbin.design/) : Another nicely curated list of mobile app designs
|
- [mobbin.design](https://mobbin.design/) : Another nicely curated list of mobile app designs
|
||||||
- [UI Movement](https://uimovement.com/) : Primarily mobile and animated interactions.
|
- [UI Movement](https://uimovement.com/) : Primarily mobile and animated interactions.
|
||||||
- [Muzli search](https://search.muz.li/) : Find designs by searching words or colours, a cool little tool run by Adobe.
|
- [Muzli search](https://search.muz.li/) : Find designs by searching words or colours, a cool little tool run by Adobe.
|
||||||
- [Dribbble](https://dribbble.com/) : I'm putting these guys on the list, but they don't need the recommendation.
|
- [Dribbble](https://dribbble.com/) : I’m putting these guys on the list, but they don’t need the recommendation.
|
||||||
|
|
||||||
**And for Colour Palettes**:
|
**And for Colour Palettes**:
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,6 @@ tags:
|
||||||
---
|
---
|
||||||
|
|
||||||
- **This tidbit about a literary villa**: Over three days in June of 1816 at a villa in Geneva, Mary Shelley started writing _Frankenstein, or The Modern Prometheus_ and John William Polidori started _The Vampyre_ (which preceded the modern romantic image of vampires). The latter inspired Lord Byron (who was also at the villa, by the way) to write _A Fragment_. Imagine being 2am whiskey drunk at that, wow.
|
- **This tidbit about a literary villa**: Over three days in June of 1816 at a villa in Geneva, Mary Shelley started writing _Frankenstein, or The Modern Prometheus_ and John William Polidori started _The Vampyre_ (which preceded the modern romantic image of vampires). The latter inspired Lord Byron (who was also at the villa, by the way) to write _A Fragment_. Imagine being 2am whiskey drunk at that, wow.
|
||||||
- **This way to think about css/styling**: The decisions we make about the naming, structure, and languages/frameworks for modern styling tools just _move complexity_, 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. _Be consistent_ and _know where the complexity in your codebase is_ ([source](https://shoptalkshow.com/425/))
|
- **This way to think about css/styling**: The decisions we make about the naming, structure, and languages/frameworks for modern styling tools just _move complexity_, 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. _Be consistent_ and _know where the complexity in your codebase is_ ([source](https://shoptalkshow.com/425/))
|
||||||
- **This thing about viruses during a pandemic**: 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. ([source](https://www.nhs.uk/news/medical-practice/hiv-evolving-into-less-deadly-form/))
|
- **This thing about viruses during a pandemic**: 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. ([source](https://www.nhs.uk/news/medical-practice/hiv-evolving-into-less-deadly-form/))
|
||||||
- **This puur-fectly fitting French word**: The\** French word for the verb ‘to purr' is *ronronner\* - which sounds simply excellent with a French guttural accent.
|
- **This puur-fectly fitting French word**: The\** French word for the verb ‘to purr’ is *ronronner\* - which sounds simply excellent with a French guttural accent.
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@ tags:
|
||||||
- **My three decades alone, basking in the company of a mountain**, Susanne Sener for Psyche ([link](https://psyche.co/ideas/my-three-decades-alone-basking-in-the-company-of-a-mountain)). 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.
|
- **My three decades alone, basking in the company of a mountain**, Susanne Sener for Psyche ([link](https://psyche.co/ideas/my-three-decades-alone-basking-in-the-company-of-a-mountain)). 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.
|
||||||
- **Popular Writers: A Stephen King interview**, Neil Gaiman on his own blog ([link](https://journal.neilgaiman.com/2012/04/popular-writers-stephen-king-interview.html)). 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:
|
- **Popular Writers: A Stephen King interview**, Neil Gaiman on his own blog ([link](https://journal.neilgaiman.com/2012/04/popular-writers-stephen-king-interview.html)). 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:
|
||||||
|
|
||||||
> 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...
|
> 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...
|
||||||
|
|
||||||
## What I've had on Rotation
|
## What I've had on Rotation
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -23,4 +23,4 @@ tags:
|
||||||
## Cool Articles
|
## Cool Articles
|
||||||
|
|
||||||
- [Mark in the Middle](https://www.theverge.com/21444203/facebook-leaked-audio-zuckerberg-trump-pandemic-blm) by Casey Newton for _The Verge_. 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.
|
- [Mark in the Middle](https://www.theverge.com/21444203/facebook-leaked-audio-zuckerberg-trump-pandemic-blm) by Casey Newton for _The Verge_. 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.
|
||||||
- [After 15 Years as a Product Leader, CEO and Now VC, Here's the Advice I Always Share with Future Founders](https://firstround.com/review/after-15-years-as-a-product-leader-ceo-and-now-vc-heres-the-advice-i-always-share-with-future-founders/) on the _First Round_ 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).
|
- [After 15 Years as a Product Leader, CEO and Now VC, Here’s the Advice I Always Share with Future Founders](https://firstround.com/review/after-15-years-as-a-product-leader-ceo-and-now-vc-heres-the-advice-i-always-share-with-future-founders/) on the _First Round_ 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).
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ A few months ago a prominent figure in the tech and software space was uninvited
|
||||||
|
|
||||||
[^1]: 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.
|
[^1]: 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.
|
||||||
|
|
||||||
> 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.
|
> 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.
|
||||||
|
|
||||||
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 _Role Models_. 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.
|
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 _Role Models_. 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.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -30,4 +30,4 @@ I don't know how well these items hold for longer pieces, or opinion pieces. Som
|
||||||
|
|
||||||
You can see the full transcript for the episode on the[ episode page](https://changelog.com/jsparty/141), but the original quote comes from [Stephanie Morillo](https://www.stephaniemorillo.co/) that sent me on this thought is:
|
You can see the full transcript for the episode on the[ episode page](https://changelog.com/jsparty/141), but the original quote comes from [Stephanie Morillo](https://www.stephaniemorillo.co/) that sent me on this thought is:
|
||||||
|
|
||||||
> 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.
|
> 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.
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@ I just assumed that the JS runtime was the browser or server where the JS actual
|
||||||
|
|
||||||
JS runtimes get a bit of flack for causing bad performance, whatever that generic term means. Take this [critique from Sebastian De Deyne](https://sebastiandedeyne.com/going-deep):
|
JS runtimes get a bit of flack for causing bad performance, whatever that generic term means. Take this [critique from Sebastian De Deyne](https://sebastiandedeyne.com/going-deep):
|
||||||
|
|
||||||
> We're adding heavy runtimes to support multiple platforms instead of staying close to the metal, and we pay the price in performance.
|
> We’re adding heavy runtimes to support multiple platforms instead of staying close to the metal, and we pay the price in performance.
|
||||||
|
|
||||||
This criticism brings us a little closer to a useful definition of a Runtime: it **includes the libraries and frameworks which act as the intermediary between the code you've written, and the operating system it is running on**. 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 ([StackOverflow source](https://softwareengineering.stackexchange.com/questions/304427/what-really-is-the-runtime-environment)).
|
This criticism brings us a little closer to a useful definition of a Runtime: it **includes the libraries and frameworks which act as the intermediary between the code you've written, and the operating system it is running on**. 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 ([StackOverflow source](https://softwareengineering.stackexchange.com/questions/304427/what-really-is-the-runtime-environment)).
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -25,4 +25,4 @@ It's time of year again: Spotify have released their _Rewind_ - showing you what
|
||||||
## Cool articles
|
## Cool articles
|
||||||
|
|
||||||
- [Why Religion Is Not Going Away and Science Will Not Destroy It](https://getpocket.com/explore/item/why-religion-is-not-going-away-and-science-will-not-destroy-it) by Peter Harrison for _Aeon_. 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
|
- [Why Religion Is Not Going Away and Science Will Not Destroy It](https://getpocket.com/explore/item/why-religion-is-not-going-away-and-science-will-not-destroy-it) by Peter Harrison for _Aeon_. 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
|
||||||
- [The UK has approved a COVID vaccine — here's what scientists now want to know](https://www.nature.com/articles/d41586-020-03441-8?utm_source=pocket-newtab-global-en-GB) by Heidi Ledford, David Cyranoski, and Richard Van Noorden for _Nature_. 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)?
|
- [The UK has approved a COVID vaccine — here’s what scientists now want to know](https://www.nature.com/articles/d41586-020-03441-8?utm_source=pocket-newtab-global-en-GB) by Heidi Ledford, David Cyranoski, and Richard Van Noorden for _Nature_. 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)?
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ Happy New Year 🎊🥳🍾 It's been one hell of a ride, 2020, and I hope that
|
||||||
|
|
||||||
## Cool reads
|
## Cool reads
|
||||||
|
|
||||||
- [Seasons in a Pandemic: Mary Shelley on What Makes Life Worth Living and Nature's Beauty as a Lifeline to Regaining Sanity](https://www.brainpickings.org/2020/04/16/mary-shelley-the-last-man) by Maria Popova for _Brain Pickings_. A beautiful little tribute to Mary Shelly' semi-autobiographical _The Last Man_, 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 [here](https://www.brainpickings.org/).
|
- [Seasons in a Pandemic: Mary Shelley on What Makes Life Worth Living and Nature’s Beauty as a Lifeline to Regaining Sanity](https://www.brainpickings.org/2020/04/16/mary-shelley-the-last-man) by Maria Popova for _Brain Pickings_. A beautiful little tribute to Mary Shelly' semi-autobiographical _The Last Man_, 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 [here](https://www.brainpickings.org/).
|
||||||
|
|
||||||
## Fun things
|
## Fun things
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -23,4 +23,4 @@ tags:
|
||||||
- [State of JS 2020 Results](https://2020.stateofjs.com/en-US/). 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 [Svelte](https://svelte.dev/) framework really shone through this year, and TypeScript continued its dominance in the wider ecosystem.
|
- [State of JS 2020 Results](https://2020.stateofjs.com/en-US/). 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 [Svelte](https://svelte.dev/) framework really shone through this year, and TypeScript continued its dominance in the wider ecosystem.
|
||||||
- [Dense Discovery Issue #120](https://www.densediscovery.com/issues/120). I've mentioned Dense Discovery in previous editions of _things I learned_, but I want to give a shoutout to this week's edition in particular. It's such a well curated, thoughtful newsletter run by [Kai Brach](https://twitter.com/KaiBrach). I really advise [signing up for the newsletter](https://www.densediscovery.com/). 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:
|
- [Dense Discovery Issue #120](https://www.densediscovery.com/issues/120). I've mentioned Dense Discovery in previous editions of _things I learned_, but I want to give a shoutout to this week's edition in particular. It's such a well curated, thoughtful newsletter run by [Kai Brach](https://twitter.com/KaiBrach). I really advise [signing up for the newsletter](https://www.densediscovery.com/). 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:
|
||||||
|
|
||||||
> ... 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.
|
> ... 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.
|
||||||
|
|
|
||||||
0
src/content/blog/2021-01-27-albums-2020.md
Normal file
0
src/content/blog/2021-01-27-albums-2020.md
Normal file
|
|
@ -5,7 +5,6 @@ author: Thomas Wilson
|
||||||
date: 2021-02-12
|
date: 2021-02-12
|
||||||
draft: false
|
draft: false
|
||||||
tags:
|
tags:
|
||||||
- changelog
|
|
||||||
- redesign
|
- redesign
|
||||||
- technical
|
- technical
|
||||||
slug: "2021-02-12-website-design-2-0-changelog"
|
slug: "2021-02-12-website-design-2-0-changelog"
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ tags:
|
||||||
## Cool Articles
|
## Cool Articles
|
||||||
|
|
||||||
- [This tweet from weetabix](https://twitter.com/weetabix/status/1359074254789165059?s=20). A light-hearted tweet that I think did the rounds a few weeks ago. Truly horrifying, I'm not okay.
|
- [This tweet from weetabix](https://twitter.com/weetabix/status/1359074254789165059?s=20). A light-hearted tweet that I think did the rounds a few weeks ago. Truly horrifying, I'm not okay.
|
||||||
- [Shit's Broken: Why we need mindful notification and how to design them](https://thistooshallgrow.com/blog/mindful-notifications/) by Clo S for _This Too Shall Grow_. 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 _mindful notifications_ that align the urgency and prominence of a notification with that of its content.
|
- [Shit's Broken: Why we need mindful notification and how to design them](https://thistooshallgrow.com/blog/mindful-notifications/) by Clo S for _This Too Shall Grow_. 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 _mindful notifications_ that align the urgency and prominence of a notification with that of its content.
|
||||||
|
|
||||||
## Fun Things
|
## Fun Things
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ tags:
|
||||||
|
|
||||||
- **This cassette revival**: 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? ([link](https://theconversation.com/audio-cassettes-despite-being-a-bit-rubbish-sales-have-doubled-during-the-pandemic-heres-why-157097))
|
- **This cassette revival**: 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? ([link](https://theconversation.com/audio-cassettes-despite-being-a-bit-rubbish-sales-have-doubled-during-the-pandemic-heres-why-157097))
|
||||||
- **This money making chimp**: 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. ([link](https://www.guinnessworldrecords.com/world-records/most-successful-chimpanzee-on-wall-street))
|
- **This money making chimp**: 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. ([link](https://www.guinnessworldrecords.com/world-records/most-successful-chimpanzee-on-wall-street))
|
||||||
- **This paper computer**: _Magic: The Gathering_ is the oldest collectible card game, which had its first set of cards released in 1993. There are literally billions of _Magic_ cards in circulation right not, which is cool. It's actually a really fun game, you should totally play some time. Anyway, _Magic_ 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) _Magic: The Gathering_ 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. ([source](https://arxiv.org/abs/1904.09828)).
|
- **This paper computer**: _Magic: The Gathering_ is the oldest collectible card game, which had its first set of cards released in 1993. There are literally billions of _Magic_ cards in circulation right not, which is cool. It's actually a really fun game, you should totally play some time. Anyway, _Magic_ 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) _Magic: The Gathering_ 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. ([source](https://arxiv.org/abs/1904.09828)).
|
||||||
|
|
||||||
## What I've had on rotation
|
## What I've had on rotation
|
||||||
|
|
||||||
|
|
@ -21,5 +21,5 @@ tags:
|
||||||
|
|
||||||
## Cool articles
|
## Cool articles
|
||||||
|
|
||||||
- [Nothing breaks hearts like A.I](https://pudding.cool/2021/03/love-and-ai/) 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?
|
- [Nothing breaks hearts like A.I](https://pudding.cool/2021/03/love-and-ai/) 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?
|
||||||
- [Why growing mushrooms at home is everyone's new pandemic hobby](https://www.theguardian.com/lifeandstyle/2021/mar/17/mushrooms-as-houseplant) 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.
|
- [Why growing mushrooms at home is everyone's new pandemic hobby](https://www.theguardian.com/lifeandstyle/2021/mar/17/mushrooms-as-houseplant) 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.
|
||||||
|
|
|
||||||
|
|
@ -12,16 +12,16 @@ tags:
|
||||||
|
|
||||||
# Things I Learned #34
|
# Things I Learned #34
|
||||||
|
|
||||||
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, _al la_ my middle-aged housewife dream).
|
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, _al la_ my middle-aged housewife dream).
|
||||||
|
|
||||||
- **This product search duopoly**: 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. ([source](https://www.emarketer.com/content/do-most-searchers-really-start-on-amazon)).
|
- **This product search duopoly**: 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. ([source](https://www.emarketer.com/content/do-most-searchers-really-start-on-amazon)).
|
||||||
- **This Victorian butterfly collector** 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. ([source](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4321127/))
|
- **This Victorian butterfly collector** 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. ([source](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4321127/))
|
||||||
- **This imaginary designer** 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 [portfolio of work](https://www.artlebedev.com/nikolay-ironov/)): 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. ([source](https://www.rbth.com/science-and-tech/332370-russian-ai-graphic-designer-fooled))
|
- **This imaginary designer** 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 [portfolio of work](https://www.artlebedev.com/nikolay-ironov/)): 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. ([source](https://www.rbth.com/science-and-tech/332370-russian-ai-graphic-designer-fooled))
|
||||||
|
|
||||||
## What I've had on rotation
|
## What I've had on rotation
|
||||||
|
|
||||||
-**Something New** _Justice_ by Justin Bieber (pop, 2021). After 2020's frankly insulting _Changes_, 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. ([links](https://songwhip.com/justin-bieber/justice)) -**Something Old** _Ocean Avenue_ 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. ([links](https://songwhip.com/yellowcard/oceanavenue))
|
-**Something New** _Justice_ by Justin Bieber (pop, 2021). After 2020’s frankly insulting _Changes_, 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. ([links](https://songwhip.com/justin-bieber/justice)) -**Something Old** _Ocean Avenue_ 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. ([links](https://songwhip.com/yellowcard/oceanavenue))
|
||||||
|
|
||||||
## Cool articles
|
## Cool articles
|
||||||
|
|
||||||
- [Squark Notes #7 (newsletter)](https://squarknotes.substack.com/p/squarknote-7 "Squark Notes #7") 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 _one_ 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"
|
- [Squark Notes #7 (newsletter)](https://squarknotes.substack.com/p/squarknote-7 "Squark Notes #7") 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 _one_ 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”
|
||||||
|
|
|
||||||
|
|
@ -9,39 +9,39 @@ tags:
|
||||||
- software-architecture
|
- software-architecture
|
||||||
---
|
---
|
||||||
|
|
||||||
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?
|
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?
|
||||||
|
|
||||||
I'm building Dash Dot, an interval timer iOS app from scratch, and this is the problem I've been facing this month.
|
I’m building Dash Dot, an interval timer iOS app from scratch, and this is the problem I’ve been facing this month.
|
||||||
|
|
||||||
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 _only_ answer questions, then you've got only theoretical answers.
|
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 _only_ answer questions, then you’ve got only theoretical answers.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
Code _is_ discovery.
|
Code _is_ discovery.
|
||||||
|
|
||||||
Design _is_ discovery.
|
Design _is_ discovery.
|
||||||
|
|
||||||
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:
|
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:
|
||||||
|
|
||||||
- **Obvious**: 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.
|
- **Obvious**: 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.
|
||||||
|
|
||||||
- **Emergent:**: 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?
|
- **Emergent:**: 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?
|
||||||
|
|
||||||
As you become a more experienced software engineer and architect, more things are in the Obvious bucket, and less things are in the Emergent.
|
As you become a more experienced software engineer and architect, more things are in the Obvious bucket, and less things are in the Emergent.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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? **Do just enough design so that you can maximise your learning by building**. How do you know how much is "just enough"? That's the whole problem, mate.
|
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? **Do just enough design so that you can maximise your learning by building**. How do you know how much is “just enough”? That’s the whole problem, mate.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
## The Takeaways
|
## The Takeaways
|
||||||
|
|
||||||
We're all busy, here's what I'd recommend:
|
We’re all busy, here’s what I’d recommend:
|
||||||
|
|
||||||
- **Work over dogma**: 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.
|
- **Work over dogma**: 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.
|
||||||
- **Design and develop with your brain in mind**: 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.
|
- **Design and develop with your brain in mind**: 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.
|
||||||
- **Good systems change fast**: 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.
|
- **Good systems change fast**: 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.
|
||||||
|
|
||||||
## Swinging the pendulum
|
## Swinging the pendulum
|
||||||
|
|
||||||
|
|
@ -53,36 +53,36 @@ My thoughts and approaches to building a new codebase have swung quite a bit ove
|
||||||
|
|
||||||
### TDD
|
### TDD
|
||||||
|
|
||||||
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 _any_ 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".
|
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 _any_ 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”.
|
||||||
Why was I doing TDD? Because I liked the idea of the finished product. I liked having a codebase which I _knew_ worked, it was inarguable. I had green ticks on my CLI, and the knowledge that a particular ticket or branch were complete.
|
Why was I doing TDD? Because I liked the idea of the finished product. I liked having a codebase which I _knew_ worked, it was inarguable. I had green ticks on my CLI, and the knowledge that a particular ticket or branch were complete.
|
||||||
|
|
||||||
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 _highlly_ 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.
|
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 _highlly_ 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.
|
||||||
|
|
||||||
"But Thomas, write your tests first to help design your API". Yeah, actually good criticism. I agree - I think having code _and_ tests consume the API of a class forces you to think about abstraction early. It forces you to decouple things. However, **you don't know everywhere your code is going to be consumed**, 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.
|
“But Thomas, write your tests first to help design your API”. Yeah, actually good criticism. I agree - I think having code _and_ tests consume the API of a class forces you to think about abstraction early. It forces you to decouple things. However, **you don’t know everywhere your code is going to be consumed**, 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.
|
||||||
|
|
||||||
"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.
|
“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.
|
||||||
As a tool for writing the first bits of a new project, TDD just did not work for me.
|
As a tool for writing the first bits of a new project, TDD just did not work for me.
|
||||||
|
|
||||||
### Interpretive movement design
|
### Interpretive movement design
|
||||||
|
|
||||||
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.
|
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
It didn't force me to notice similarities in my codebase. **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**. 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.
|
It didn’t force me to notice similarities in my codebase. **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**. 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.
|
||||||
|
|
||||||
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 _very_ 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).
|
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 _very_ 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).
|
||||||
|
|
||||||
The interpretive-movement style of development was useful. It helped patterns emerged and it also helped me _do_ 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.
|
The interpretive-movement style of development was useful. It helped patterns emerged and it also helped me _do_ 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.
|
||||||
|
|
||||||
### UML-driven development:
|
### UML-driven development:
|
||||||
|
|
||||||
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, _do_ a timer).
|
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, _do_ a timer).
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
For me, facing myself to write this broad-outline UML diagrams was _just enough_ 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 _Dependency Inversion_ or _Inversion of Control_ but these didn't need to be specified in the diagram before hand
|
For me, facing myself to write this broad-outline UML diagrams was _just enough_ 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 _Dependency Inversion_ or _Inversion of Control_ but these didn’t need to be specified in the diagram before hand
|
||||||
|
|
||||||
**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**. 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.
|
**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**. 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.
|
||||||
|
|
|
||||||
|
|
@ -10,17 +10,17 @@ tags:
|
||||||
- things-i-learned
|
- things-i-learned
|
||||||
---
|
---
|
||||||
|
|
||||||
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 _very_ 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:
|
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 _very_ 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:
|
||||||
|
|
||||||
- **This fact about parachutes**: 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. ([source](https://www.bmj.com/content/363/bmj.k5094))
|
- **This fact about parachutes**: 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. ([source](https://www.bmj.com/content/363/bmj.k5094))
|
||||||
- **This (yet) another impact of the pandemic**: 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 [MAMIL](https://en.wikipedia.org/wiki/Mamil)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. ([source](https://theconversation.com/cycling-is-ten-times-more-important-than-electric-cars-for-reaching-net-zero-cities-157163?utm_source=labnotes.org))
|
- **This (yet) another impact of the pandemic**: 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 [MAMIL](https://en.wikipedia.org/wiki/Mamil)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. ([source](https://theconversation.com/cycling-is-ten-times-more-important-than-electric-cars-for-reaching-net-zero-cities-157163?utm_source=labnotes.org))
|
||||||
- **This hat piracy**: 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. ([source](https://www.thevintagenews.com/2017/07/07/notorious-pirate-benjamin-hornigold-once-attacked-a-merchant-ship-only-to-steal-the-crews-hats/))
|
- **This hat piracy**: 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. ([source](https://www.thevintagenews.com/2017/07/07/notorious-pirate-benjamin-hornigold-once-attacked-a-merchant-ship-only-to-steal-the-crews-hats/))
|
||||||
|
|
||||||
## What I've had on rotation
|
## What I’ve had on rotation
|
||||||
|
|
||||||
- **Something New** _The Wind_ 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 _them_ 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. ([links](https://songwhip.com/balmorhea/the-wind))
|
- **Something New** _The Wind_ 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 _them_ 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. ([links](https://songwhip.com/balmorhea/the-wind))
|
||||||
- **Something Old** _The Resistance_ by Muse (2009, Rock). I don't know why I completely ignored Muse while they were pumping out albums like _The Resistance_, 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. ([links](https://songwhip.com/muse/the-resistance))
|
- **Something Old** _The Resistance_ by Muse (2009, Rock). I don’t know why I completely ignored Muse while they were pumping out albums like _The Resistance_, 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. ([links](https://songwhip.com/muse/the-resistance))
|
||||||
|
|
||||||
## Cool Articles
|
## Cool Articles
|
||||||
|
|
||||||
- [How to avoid death by PowerPoint](https://www.youtube.com/watch?v=Iwpi1Lm6dFo) 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.
|
- [How to avoid death by PowerPoint](https://www.youtube.com/watch?v=Iwpi1Lm6dFo) 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.
|
||||||
|
|
|
||||||
|
|
@ -10,17 +10,17 @@ tags:
|
||||||
- things-i-learned
|
- things-i-learned
|
||||||
---
|
---
|
||||||
|
|
||||||
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
|
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
|
||||||
|
|
||||||
- **This Breaking Bad character**: 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. ([source](https://screenrant.com/how-met-mother-breaking-bad-connection-mike/))
|
- **This Breaking Bad character**: 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. ([source](https://screenrant.com/how-met-mother-breaking-bad-connection-mike/))
|
||||||
- **This one book**: 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. ([source](https://scifi.stackexchange.com/questions/47419/is-lord-of-the-rings-a-trilogy-of-books-in-tolkiens-opinion))
|
- **This one book**: 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. ([source](https://scifi.stackexchange.com/questions/47419/is-lord-of-the-rings-a-trilogy-of-books-in-tolkiens-opinion))
|
||||||
- **This demographic fact**: 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. ([source](https://fullfact.org/immigration/parents-born-outside-uk/))
|
- **This demographic fact**: 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. ([source](https://fullfact.org/immigration/parents-born-outside-uk/))
|
||||||
|
|
||||||
## What I've had on rotation
|
## What I’ve had on rotation
|
||||||
|
|
||||||
- **Something New** _King's Disease_ 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. _King's Disease_ 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. ([links](https://songwhip.com/nas/kings-disease))
|
- **Something New** _King’s Disease_ 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. _King’s Disease_ 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. ([links](https://songwhip.com/nas/kings-disease))
|
||||||
- **Something Old** _Summer Suite, Vol 1_ 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. ([links](https://songwhip.com/chad-lawson/summer-suite-vol-1))
|
- **Something Old** _Summer Suite, Vol 1_ 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. ([links](https://songwhip.com/chad-lawson/summer-suite-vol-1))
|
||||||
|
|
||||||
## Cool Articles
|
## Cool Articles
|
||||||
|
|
||||||
- [Greta Thunberg: ‘It just spiralled out of control'](https://www.irishtimes.com/news/world/greta-thunberg-it-just-spiralled-out-of-control-1.4528477 "Greta Thunberg: ‘It just spiralled out of control'") by Leslie Hook for _The Irish Times_. 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.
|
- [Greta Thunberg: ‘It just spiralled out of control’](https://www.irishtimes.com/news/world/greta-thunberg-it-just-spiralled-out-of-control-1.4528477 "Greta Thunberg: ‘It just spiralled out of control’") by Leslie Hook for _The Irish Times_. 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.
|
||||||
|
|
|
||||||
|
|
@ -9,17 +9,17 @@ tags:
|
||||||
- things-i-learned
|
- things-i-learned
|
||||||
---
|
---
|
||||||
|
|
||||||
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:
|
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:
|
||||||
|
|
||||||
- **This misunderstood emperor**: 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. ([source](https://www.artlyst.com/previews/notorious-roman-emperor-nero-explored-new-british-museum-show/))
|
- **This misunderstood emperor**: 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. ([source](https://www.artlyst.com/previews/notorious-roman-emperor-nero-explored-new-british-museum-show/))
|
||||||
- **This health benefit of tea**: 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. ([source](https://www.nature.com/articles/d41586-019-00398-1))
|
- **This health benefit of tea**: 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. ([source](https://www.nature.com/articles/d41586-019-00398-1))
|
||||||
- **This bee weapon**: 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. ([source](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))
|
- **This bee weapon**: 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. ([source](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))
|
||||||
|
|
||||||
## What I've had on rotation this week
|
## What I’ve had on rotation this week
|
||||||
|
|
||||||
- **Something New** _Wake_ 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. ([links](https://songwhip.com/wvnder/wake))
|
- **Something New** _Wake_ 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. ([links](https://songwhip.com/wvnder/wake))
|
||||||
- **Something Old** _Perotin_ 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. ([links](https://songwhip.com/the-hilliard-ensemble/perotin))
|
- **Something Old** _Perotin_ 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. ([links](https://songwhip.com/the-hilliard-ensemble/perotin))
|
||||||
|
|
||||||
## Cool articles
|
## Cool articles
|
||||||
|
|
||||||
- [Neuroscientist Christof Koch on How the "Qualia" of Our Experience Illuminate the Central Mystery of Consciousness](https://www.brainpickings.org/2017/05/25/christof-koch-consciousness-qualia/) by Maria Popova for _Brain Pickings_. 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 _Romantic Reductionist_ 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").
|
- [Neuroscientist Christof Koch on How the “Qualia” of Our Experience Illuminate the Central Mystery of Consciousness](https://www.brainpickings.org/2017/05/25/christof-koch-consciousness-qualia/) by Maria Popova for _Brain Pickings_. 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 _Romantic Reductionist_ 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”).
|
||||||
|
|
|
||||||
|
|
@ -10,61 +10,61 @@ tags:
|
||||||
- side-projects
|
- side-projects
|
||||||
---
|
---
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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:
|
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:
|
||||||
|
|
||||||
1. ** 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. _Vive l'empoi_.
|
1. ** 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. _Vive l’empoi_.
|
||||||
2. **I like to commit** - 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.
|
2. **I like to commit** - 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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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 _stop_, 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.
|
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 _stop_, 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.
|
||||||
|
|
||||||
Though the _killing_ 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.
|
Though the _killing_ 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.
|
||||||
|
|
||||||
## You might be ready to excommunicate when…
|
## You might be ready to excommunicate when…
|
||||||
|
|
||||||
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
|
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
|
||||||
|
|
||||||
- **Does it spark joy?** - 2019 internet meme aside, Marie Kondo [has a good point](https://www.youtube.com/watch?v=9AvWs2X-bEA): 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?
|
- **Does it spark joy?** - 2019 internet meme aside, Marie Kondo [has a good point](https://www.youtube.com/watch?v=9AvWs2X-bEA): 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?
|
||||||
- **Is it worth it?** - 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?
|
- **Is it worth it?** - 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?
|
||||||
- **Where is this going?** - 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?
|
- **Where is this going?** - 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?
|
||||||
|
|
||||||
## But what if I just keep picking things up and putting them down?
|
## But what if I just keep picking things up and putting them down?
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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 [hedonism](https://plato.stanford.edu/entries/hedonism/), which I think gets a bad wrap and has a lot less to do with Roman orgies that you'd think.
|
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 [hedonism](https://plato.stanford.edu/entries/hedonism/), which I think gets a bad wrap and has a lot less to do with Roman orgies that you’d think.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
Vasari, the first art historian and also debut biographer of Leonardo, [wrote in reference](https://academic.oup.com/brain/article/142/6/1842/5492606) 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.
|
Vasari, the first art historian and also debut biographer of Leonardo, [wrote in reference](https://academic.oup.com/brain/article/142/6/1842/5492606) 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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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 _The Last Supper_ and _Mona Lisa_, possibly two of the most recognised pieces of western art. This is compared to the literally [dozens of paintings by Raphael](https://en.wikipedia.org/wiki/List_of_paintings_by_Raphael) (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 _David_. To be fair, Michelangelo was probably a bit too dedicated, and maybe could have loosened up a bit.
|
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 _The Last Supper_ and _Mona Lisa_, possibly two of the most recognised pieces of western art. This is compared to the literally [dozens of paintings by Raphael](https://en.wikipedia.org/wiki/List_of_paintings_by_Raphael) (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 _David_. To be fair, Michelangelo was probably a bit too dedicated, and maybe could have loosened up a bit.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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 [The Gap](https://vimeo.com/85040589) by Ira Glass.
|
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 [The Gap](https://vimeo.com/85040589) by Ira Glass.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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 _really_ enjoying the work of a journeyman.
|
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 _really_ enjoying the work of a journeyman.
|
||||||
|
|
||||||
Similarly, with writing I deeply enjoy the feeling of _having_ 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.
|
Similarly, with writing I deeply enjoy the feeling of _having_ 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.
|
||||||
|
|
||||||
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 _see_ 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.
|
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 _see_ 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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
|
||||||
|
|
@ -11,18 +11,18 @@ tags:
|
||||||
|
|
||||||
# (Not) Things I learned this week #38
|
# (Not) Things I learned this week #38
|
||||||
|
|
||||||
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 _Year of Discourse_ 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.
|
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 _Year of Discourse_ 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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
## What I've had on rotation
|
## What I’ve had on rotation
|
||||||
|
|
||||||
- **Something New** _if I could make it go quiet_ 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. ([links](https://songwhip.com/girl-in-red/if-i-could-make-it-go-quiet))
|
- **Something New** _if I could make it go quiet_ 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. ([links](https://songwhip.com/girl-in-red/if-i-could-make-it-go-quiet))
|
||||||
- **Something Old** _Blink-182_ by Blink-182 (2003, Pop Punk). _I Miss You_ 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. ([links](https://songwhip.com/blink-182/blink-182))
|
- **Something Old** _Blink-182_ by Blink-182 (2003, Pop Punk). _I Miss You_ 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. ([links](https://songwhip.com/blink-182/blink-182))
|
||||||
|
|
||||||
## Cool articles
|
## Cool articles
|
||||||
|
|
||||||
- [Breaking Camp](https://www.theverge.com/2021/4/27/22406673/basecamp-political-speech-policy-controversy) 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 _is_ 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.
|
- [Breaking Camp](https://www.theverge.com/2021/4/27/22406673/basecamp-political-speech-policy-controversy) 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 _is_ 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.
|
||||||
- [A 23-year-old coder kept QAnon online when no one else would](https://www.bloomberg.com/news/features/2021-04-14/qanon-daily-stormer-far-right-have-been-kept-online-by-nick-lim-s-vanwatech) 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:
|
- [A 23-year-old coder kept QAnon online when no one else would](https://www.bloomberg.com/news/features/2021-04-14/qanon-daily-stormer-far-right-have-been-kept-online-by-nick-lim-s-vanwatech) 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:
|
||||||
|
|
||||||
> 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---.'"
|
> 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---.’ ”
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
|
|
||||||
title: "[LinkedIn Post] Being so customer-centric your customers think you're a robot"
|
title: "[LinkedIn Post] Being so customer-centric your customers think you’re a robot"
|
||||||
author: "Thomas Wilson"
|
author: "Thomas Wilson"
|
||||||
date: 2021-05-05T20:07:00
|
date: 2021-05-05T20:07:00
|
||||||
slug: "2021-05-05-customer-centric-like-a-robot"
|
slug: "2021-05-05-customer-centric-like-a-robot"
|
||||||
|
|
@ -13,15 +13,15 @@ tags:
|
||||||
|
|
||||||
(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))
|
(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))
|
||||||
|
|
||||||
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…"
|
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…”
|
||||||
|
|
||||||
Have you literally ever believed anybody when you've heard or read these things? I have not. Not even once.
|
Have you literally ever believed anybody when you’ve heard or read these things? I have not. Not even once.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
👇 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 **four tips on how to talk with your customers like you're a human who actually cares about them**
|
👇 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 **four tips on how to talk with your customers like you’re a human who actually cares about them**
|
||||||
|
|
||||||
1. 🕵️♂️ **Focus on who you want to talk to**: 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.
|
1. 🕵️♂️ **Focus on who you want to talk to**: 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.
|
||||||
2. 🤖 **Automate (but not too much)**: 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, _always_ put something hand-crafted into a reply, especially when someone's taken the time to send you useful feedback.
|
2. 🤖 **Automate (but not too much)**: 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, _always_ put something hand-crafted into a reply, especially when someone’s taken the time to send you useful feedback.
|
||||||
3. 🎁 **Share your findings**: 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.
|
3. 🎁 **Share your findings**: 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.
|
||||||
4. ⏳ **Respect people's time**: 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.
|
4. ⏳ **Respect people’s time**: 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.
|
||||||
|
|
|
||||||
|
|
@ -9,26 +9,26 @@ tags:
|
||||||
- weekly
|
- weekly
|
||||||
---
|
---
|
||||||
|
|
||||||
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 [I wrote recently](/blog/2021-04-27-excommunicate-your-ideas): kill your ideas and side projects, gladly and without delay.
|
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 [I wrote recently](/blog/2021-04-27-excommunicate-your-ideas): kill your ideas and side projects, gladly and without delay.
|
||||||
|
|
||||||
Death is more of a transition, though. The _things I learned this week_ post is becoming simply \_The Weekly.
|
Death is more of a transition, though. The _things I learned this week_ post is becoming simply \_The Weekly.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
I hate homework, and browsing the internet, fighting against the gain of _The Feed_ , 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).
|
I hate homework, and browsing the internet, fighting against the gain of _The Feed_ , 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).
|
||||||
|
|
||||||
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).
|
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).
|
||||||
|
|
||||||
**What now?** 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.
|
**What now?** 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.
|
||||||
|
|
||||||
So I'm going to continue writing weekly, and call them _The Weekly_. 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.
|
So I’m going to continue writing weekly, and call them _The Weekly_. 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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
This _is_ 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.
|
This _is_ 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.
|
||||||
|
|
||||||
**You should write** 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.
|
**You should write** 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.
|
||||||
|
|
|
||||||
|
|
@ -9,9 +9,9 @@ tags:
|
||||||
- weekly
|
- weekly
|
||||||
---
|
---
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
Garlic (_Allium Sativum_, of the*Allium* 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.
|
Garlic (_Allium Sativum_, of the*Allium* 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.
|
||||||
|
|
||||||
## The Ancients
|
## The Ancients
|
||||||
|
|
||||||
|
|
@ -19,33 +19,33 @@ Records of our obsession with this tiny _Allium_ starts some three thousand year
|
||||||
|
|
||||||
### The Egyptians
|
### The Egyptians
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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).
|
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).
|
||||||
|
|
||||||
### Medieval Europe
|
### Medieval Europe
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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 _way_ before it was cool for anybody (especially a woman) to do those things.
|
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 _way_ before it was cool for anybody (especially a woman) to do those things.
|
||||||
|
|
||||||
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 _viriditas_, 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.
|
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 _viriditas_, 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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
### Judaism
|
### Judaism
|
||||||
|
|
||||||
This idea of garlic as a hot food isn't unique to Europe. It spread to the middle-east, back to Egypt. The _Talmud_, 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.
|
This idea of garlic as a hot food isn’t unique to Europe. It spread to the middle-east, back to Egypt. The _Talmud_, 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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
## Garlic is a spiritual force
|
## Garlic is a spiritual force
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
|
|
@ -53,7 +53,7 @@ The Ancient Greek goddess Hectate (goddess of crossroads, night, magic, and witc
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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
|
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
|
||||||
|
|
||||||
## Bibliography
|
## Bibliography
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,21 +9,21 @@ tags:
|
||||||
- weekly
|
- weekly
|
||||||
---
|
---
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
But we don't _do_ visions. We reach them. But actually we don't reach them because the [Hedonic Treadmill](https://en.wikipedia.org/wiki/Hedonic_treadmill) keeps us all both in motion and stationary at the same time.
|
But we don’t _do_ visions. We reach them. But actually we don’t reach them because the [Hedonic Treadmill](https://en.wikipedia.org/wiki/Hedonic_treadmill) keeps us all both in motion and stationary at the same time.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
But we all want to be just a little bit…_more_.
|
But we all want to be just a little bit…_more_.
|
||||||
|
|
||||||
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 _doing things you actually wanted to do_.
|
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 _doing things you actually wanted to do_.
|
||||||
|
|
||||||
I'm going to share what that actually looks like.
|
I’m going to share what that actually looks like.
|
||||||
|
|
||||||
## My ritual
|
## My ritual
|
||||||
|
|
||||||
|
|
@ -31,31 +31,31 @@ There are two ways I store my productivity system: in my physical notebook ([the
|
||||||
|
|
||||||
I use these to do two things:
|
I use these to do two things:
|
||||||
|
|
||||||
1. **Weekly Note** — 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').
|
1. **Weekly Note** — 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’).
|
||||||
2. **Daily Notes** — 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.
|
2. **Daily Notes** — 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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
## /Puts on the tinfoil hat/
|
## /Puts on the tinfoil hat/
|
||||||
|
|
||||||
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 [personal development market is valued at around \$38b](https://www.grandviewresearch.com/industry-analysis/personal-development-market). There's a lot of money to be made by helping people be more productive.
|
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 [personal development market is valued at around \$38b](https://www.grandviewresearch.com/industry-analysis/personal-development-market). There’s a lot of money to be made by helping people be more productive.
|
||||||
|
|
||||||
A pessimist would say there's a lot of money in making people feel unproductive, and that you can make them productive.
|
A pessimist would say there’s a lot of money in making people feel unproductive, and that you can make them productive.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
Or worse, there are the Vaynerchuck-esque "hacks" which promise, as [Pilta Clark writes in the FT](https://www.ft.com/content/d4e5d722-d6d3-4cca-bc89-4e596821295f) puts it, "to transform useless, Solitaire-addicted sloths into hard-charging models of efficiency".
|
Or worse, there are the Vaynerchuck-esque “hacks” which promise, as [Pilta Clark writes in the FT](https://www.ft.com/content/d4e5d722-d6d3-4cca-bc89-4e596821295f) puts it, “to transform useless, Solitaire-addicted sloths into hard-charging models of efficiency”.
|
||||||
|
|
||||||
Learning the click-baity _14 Must Know Tricks For Productivity From A Wall Street Manager_ isn't going to help you.
|
Learning the click-baity _14 Must Know Tricks For Productivity From A Wall Street Manager_ isn’t going to help you.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
When there's \$39b dollars at stake, and you want to keep it there, there are two things you can do:
|
When there’s \$39b dollars at stake, and you want to keep it there, there are two things you can do:
|
||||||
|
|
||||||
1. **Keep everyone feeling unproductive** — 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.
|
1. **Keep everyone feeling unproductive** — 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.
|
||||||
2. **Keep giving people new goals** — as soon as you've achieved one goal, move immediately to the next. Or why even achieve it, just drop it and move on.
|
2. **Keep giving people new goals** — as soon as you’ve achieved one goal, move immediately to the next. Or why even achieve it, just drop it and move on.
|
||||||
|
|
||||||
Most worthwhile goals require sustained effort. Fat comes back, muscles decay, French words _disparaissent_ , and your fingers will forget a G-minor scale very quickly.
|
Most worthwhile goals require sustained effort. Fat comes back, muscles decay, French words _disparaissent_ , and your fingers will forget a G-minor scale very quickly.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,26 +9,26 @@ tags:
|
||||||
- weekly
|
- weekly
|
||||||
---
|
---
|
||||||
|
|
||||||
_The Weekly_ 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.
|
_The Weekly_ 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.
|
||||||
|
|
||||||
I read two (fantastic) pieces on the web this week:
|
I read two (fantastic) pieces on the web this week:
|
||||||
|
|
||||||
1. [What even is a website anyway?](https://manuelmoreale.com/thoughts/what-even-is-a-website-anyway) by Manuel Moreale, who cited,
|
1. [What even is a website anyway?](https://manuelmoreale.com/thoughts/what-even-is-a-website-anyway) by Manuel Moreale, who cited,
|
||||||
2. [Brutalist Web Design](https://cmhb.de/brutalist-web-design) by Carl Barenbrug
|
2. [Brutalist Web Design](https://cmhb.de/brutalist-web-design) by Carl Barenbrug
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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 _our_ audience, not the public.
|
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 _our_ audience, not the public.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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 _not_ grow.
|
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 _not_ grow.
|
||||||
|
|
||||||
Barenbrug's piece (mentioned at the top) argues that we can see websites like Brutalist Architecture: created and inhabited by humans…
|
Barenbrug’s piece (mentioned at the top) argues that we can see websites like Brutalist Architecture: created and inhabited by humans…
|
||||||
|
|
||||||
> Brutalist architecture not only reduces construction to its basic materials, but it also finds beauty in that simplicity.
|
> Brutalist architecture not only reduces construction to its basic materials, but it also finds beauty in that simplicity.
|
||||||
|
|
||||||
|
|
@ -42,13 +42,13 @@ I heard about [this quote](https://www.goodreads.com/quotes/749309-i-think-there
|
||||||
|
|
||||||
> 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.
|
> 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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
## The Video Game Metaphor
|
## The Video Game Metaphor
|
||||||
|
|
||||||
I can't remember where I heard this first. I found some [good](https://evilmartians.com/chronicles/level-up-for-ux-design-lessons-from-videogames) [articles](https://www.nngroup.com/articles/usability-heuristics-applied-video-games/)[on](https://www.invisionapp.com/inside-design/the-ux-lessons-i-learned-from-video-games/) it, though.
|
I can’t remember where I heard this first. I found some [good](https://evilmartians.com/chronicles/level-up-for-ux-design-lessons-from-videogames) [articles](https://www.nngroup.com/articles/usability-heuristics-applied-video-games/)[on](https://www.invisionapp.com/inside-design/the-ux-lessons-i-learned-from-video-games/) it, though.
|
||||||
|
|
||||||
Video games are expertly and intentionally designed. Everyone who designs things can learn something from them. I like the analogy for two main lessons:
|
Video games are expertly and intentionally designed. Everyone who designs things can learn something from them. I like the analogy for two main lessons:
|
||||||
|
|
||||||
|
|
@ -59,12 +59,12 @@ Video games are expertly and intentionally designed. Everyone who designs things
|
||||||
|
|
||||||
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 _get the hell out of there_. 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.
|
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 _get the hell out of there_. 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.
|
||||||
|
|
||||||
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 _could_ get cleaned. They go there to get their things cleaned then get out. People don't want to notice my new Receipt component design.
|
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 _could_ get cleaned. They go there to get their things cleaned then get out. People don’t want to notice my new Receipt component design.
|
||||||
|
|
||||||
**Reduce friction.** Video games are challenging. It makes them rewarding. Hollow Knight is maybe the most frustrated I have felt in 2021 so far and _we are in a pandemic_. Hades is so frustrating I could cry at times.
|
**Reduce friction.** Video games are challenging. It makes them rewarding. Hollow Knight is maybe the most frustrated I have felt in 2021 so far and _we are in a pandemic_. Hades is so frustrating I could cry at times.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
Don't solve the puzzle, be a good puzzle piece.
|
Don’t solve the puzzle, be a good puzzle piece.
|
||||||
|
|
|
||||||
|
|
@ -10,21 +10,21 @@ tags:
|
||||||
- weekly
|
- weekly
|
||||||
---
|
---
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
I'm building [the lexicon](https://www.thelexicon.app), 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.
|
I’m building [the lexicon](https://www.thelexicon.app), 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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
But I don't think I solved the high value problems.
|
But I don’t think I solved the high value problems.
|
||||||
|
|
||||||
In his essay _how to get startup ideas_ Paul Graham says:
|
In his essay _how to get startup ideas_ Paul Graham says:
|
||||||
|
|
||||||
> 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.
|
> 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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
|
|
@ -32,12 +32,12 @@ What Graham says is (probably) true, but I also think they miss out on another d
|
||||||
|
|
||||||
## Getting Specific: Flashcards
|
## Getting Specific: Flashcards
|
||||||
|
|
||||||
Let's get specific.
|
Let’s get specific.
|
||||||
|
|
||||||
I produced some flashcards sets. These keeps within the vision, but what problems do flashcards solve?
|
I produced some flashcards sets. These keeps within the vision, but what problems do flashcards solve?
|
||||||
|
|
||||||
1. Target-language translations of words (_être_ ➡️ "to be")
|
1. Target-language translations of words (_être_ ➡️ “to be”)
|
||||||
2. They decide what word's you're learning
|
2. They decide what word’s you’re learning
|
||||||
3. The can be used in [Active Recall](https://en.wikipedia.org/wiki/Active_recall)
|
3. The can be used in [Active Recall](https://en.wikipedia.org/wiki/Active_recall)
|
||||||
|
|
||||||
This list, broadly, runs from most generic to most opinionated solutions.
|
This list, broadly, runs from most generic to most opinionated solutions.
|
||||||
|
|
@ -46,19 +46,19 @@ This list, broadly, runs from most generic to most opinionated solutions.
|
||||||
|
|
||||||
Have you just learned _to pour/contribute_, _protest_ (noun), and _vaccine_ ? No. You maybe could have guessed the latter, though.
|
Have you just learned _to pour/contribute_, _protest_ (noun), and _vaccine_ ? No. You maybe could have guessed the latter, though.
|
||||||
|
|
||||||
To remove the bilingual elements of language-learning flashcards would be an unexpected feature. Maybe replacing them with image/sound [can help](https://link.springer.com/article/10.1007/s11145-018-9906-x) (an auditory component for French ↔️ English translations would be beneficial) but largely, you need the bilingual text. This isn't a high-value problem.
|
To remove the bilingual elements of language-learning flashcards would be an unexpected feature. Maybe replacing them with image/sound [can help](https://link.springer.com/article/10.1007/s11145-018-9906-x) (an auditory component for French ↔️ English translations would be beneficial) but largely, you need the bilingual text. This isn’t a high-value problem.
|
||||||
|
|
||||||
**2. Decide what words**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.
|
**2. Decide what words**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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
**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.
|
**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.
|
||||||
|
|
||||||
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?".
|
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?”.
|
||||||
|
|
||||||
A foolish assumption that was probably false (no one teaches these skills _de facto_ in schools) which essentially let the user determine exactly how effective or useful the language-learning resource was going to be
|
A foolish assumption that was probably false (no one teaches these skills _de facto_ in schools) which essentially let the user determine exactly how effective or useful the language-learning resource was going to be
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
I left the hard work of solving the problem to the customer. I shifted responsibility.
|
I left the hard work of solving the problem to the customer. I shifted responsibility.
|
||||||
|
|
||||||
|
|
@ -66,12 +66,12 @@ I left the hard work of solving the problem to the customer. I shifted responsib
|
||||||
|
|
||||||
I was guided by a vision, without thinking about the unique and important problems.
|
I was guided by a vision, without thinking about the unique and important problems.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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 _pivot_) or maybe you won't.
|
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 _pivot_) or maybe you won’t.
|
||||||
|
|
||||||
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,
|
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,
|
||||||
|
|
||||||
Set vision, solve problems.
|
Set vision, solve problems.
|
||||||
|
|
|
||||||
|
|
@ -10,29 +10,29 @@ tags:
|
||||||
- weekly
|
- weekly
|
||||||
---
|
---
|
||||||
|
|
||||||
_The Weekly_ 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
|
_The Weekly_ 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
|
||||||
|
|
||||||
Alongside the actual pandemic of Covid-19, the World Health Organisation (WHO) has declared an [infodemic](https://www.who.int/health-topics/infodemic#tab=tab_1): the "false or misleading information in digital and physical environments during a disease outbreak".
|
Alongside the actual pandemic of Covid-19, the World Health Organisation (WHO) has declared an [infodemic](https://www.who.int/health-topics/infodemic#tab=tab_1): the “false or misleading information in digital and physical environments during a disease outbreak”.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
## Compassion & Sympathy
|
## Compassion & Sympathy
|
||||||
|
|
||||||
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. [They are typically associated with](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) lower education, lower trust in the government, lower income, and lower scientific trust.
|
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. [They are typically associated with](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) lower education, lower trust in the government, lower income, and lower scientific trust.
|
||||||
|
|
||||||
[An American study](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC8083329/) 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".
|
[An American study](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC8083329/) 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”.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
## Belief in multiple conspiracy theories
|
## Belief in multiple conspiracy theories
|
||||||
|
|
||||||
I'm near the end of R. Brotherton's [Suspicious minds: why we believe conspiracy theories](https://www.bloomsbury.com/us/suspicious-minds-9781472915641/). 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.
|
I’m near the end of R. Brotherton’s [Suspicious minds: why we believe conspiracy theories](https://www.bloomsbury.com/us/suspicious-minds-9781472915641/). 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.
|
||||||
|
|
||||||
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?
|
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?
|
||||||
|
|
||||||
You might be (probably) wrong, but you're also (probably) not hurting anybody with your beliefs.
|
You might be (probably) wrong, but you’re also (probably) not hurting anybody with your beliefs.
|
||||||
|
|
||||||
The Wikipedia page for [Covid-19 Misinformation](https://en.wikipedia.org/wiki/COVID-19_misinformation) runs several thousand words, and details at least ten broad categories of misinformation. These fall into a few groups:
|
The Wikipedia page for [Covid-19 Misinformation](https://en.wikipedia.org/wiki/COVID-19_misinformation) runs several thousand words, and details at least ten broad categories of misinformation. These fall into a few groups:
|
||||||
|
|
||||||
|
|
@ -44,22 +44,22 @@ These are _massively_ different types of arguments. But they all push behaviour
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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?
|
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?
|
||||||
|
|
||||||
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 [cognitive dissonance](https://en.wikipedia.org/wiki/Cognitive_dissonance), and it saves us from a lot of distress and time wasted in examining everything we believe and do before we assimilate something new.
|
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 [cognitive dissonance](https://en.wikipedia.org/wiki/Cognitive_dissonance), and it saves us from a lot of distress and time wasted in examining everything we believe and do before we assimilate something new.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
Belief in one conspiracy theory makes you more likely to believe another, even when they're not related. Even when they're directly opposing.
|
Belief in one conspiracy theory makes you more likely to believe another, even when they’re not related. Even when they’re directly opposing.
|
||||||
|
|
||||||
## Conspiracy theories fill a vacuum
|
## Conspiracy theories fill a vacuum
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
This need for caution, of not overstepping our boundary or certainty, has left gaps in people's understanding of the disease.
|
This need for caution, of not overstepping our boundary or certainty, has left gaps in people’s understanding of the disease.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
So they're causing unnecessary deaths.
|
So they’re causing unnecessary deaths.
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
---
|
---
|
||||||
|
|
||||||
title: "The infinite coast of problem solving"
|
title: "The infinite coast of problem solving"
|
||||||
author: "Thomas Wilson"
|
author: "Thomas Wilson"
|
||||||
date: 2021-06-13T19:48:00
|
date: 2021-06-13T19:48:00
|
||||||
|
|
@ -10,28 +11,28 @@ tags:
|
||||||
- product
|
- product
|
||||||
---
|
---
|
||||||
|
|
||||||
I'm currently designing and building the lexicon, ambitiously explained as "the most useful language learning resources in the world".
|
I’m currently designing and building the lexicon, ambitiously explained as “the most useful language learning resources in the world”.
|
||||||
|
|
||||||
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"?
|
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”?
|
||||||
|
|
||||||
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?".
|
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?”.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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 _just so_. 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.
|
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 _just so_. 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.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
It's like how [the coastline has theoretically infinite length].
|
It’s like how [the coastline has theoretically infinite length].
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
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 _actually_ look like" and then demand a concrete answer from myself.
|
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 _actually_ look like” and then demand a concrete answer from myself.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||

|

|
||||||
|
|
||||||

|

|
||||||
|
|
|
||||||
|
|
@ -28,10 +28,10 @@ But still, the problem isn't knowing what three things to do before breakfast, i
|
||||||
|
|
||||||
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:
|
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:
|
||||||
|
|
||||||
1. The rules for forging and breaking a habit.
|
1. [The rules for forging and breaking a habit.](#1-the-rules)
|
||||||
2. Call out your automatic actions / lazy behaviours.
|
2. [Call out your automatic actions / lazy behaviours.](#2-call-out-your-automatic-or-lazy-behaviours)
|
||||||
3. Decide what kind of person you want to be.
|
3. [Decide what kind of person you want to be.](#3-decide-what-kind-of-person-you-want-to-be)
|
||||||
4. Monkey brain makes decisions but is easy to trick.
|
4. [Monkey brain makes decisions but is easy to trick.](#4-monkey-brain-is-tricky)
|
||||||
|
|
||||||
## 1. The Rules
|
## 1. The Rules
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,8 +4,6 @@ author: "Thomas Wilson"
|
||||||
date: 2022-02-28T19:58:00
|
date: 2022-02-28T19:58:00
|
||||||
slug: "2022-02-28-vibe-check-1"
|
slug: "2022-02-28-vibe-check-1"
|
||||||
draft: false
|
draft: false
|
||||||
tags:
|
|
||||||
- vibe-check
|
|
||||||
---
|
---
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ slug: "2022-03-13-discover-complexity"
|
||||||
draft: false
|
draft: false
|
||||||
---
|
---
|
||||||
|
|
||||||
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).
|
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).
|
||||||
|
|
||||||
An (understandable) response to this need for change is to predict the need for change by forecasting changes to customer, business, or engineering requirements.
|
An (understandable) response to this need for change is to predict the need for change by forecasting changes to customer, business, or engineering requirements.
|
||||||
|
|
||||||
|
|
@ -16,12 +16,12 @@ Discovered complexity is unearthed in the actual use of the software by the inte
|
||||||
|
|
||||||
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 *could* happen, because it dilutes focus on solving the *actual* problem.
|
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 *could* happen, because it dilutes focus on solving the *actual* problem.
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
Solving for non-discovered complexity can lead to things like:
|
Solving for non-discovered complexity can lead to things like:
|
||||||
|
|
||||||
|
|
||||||
- Adding a lot of flexibility to functions, even though they're only used in one case
|
- Adding a lot of flexibility to functions, even though they're only used in one case
|
||||||
- Creating a lot of indirection in layers of software, even though there's only one actual path in use
|
- Creating a lot of indirection in layers of software, even though there’s only one actual path in use
|
||||||
- Naming things with less tangible names to accommodate future siblings, even though you're building an only child.
|
- Naming things with less tangible names to accommodate future siblings, even though you’re building an only child.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,8 +4,6 @@ author: "Thomas Wilson"
|
||||||
date: 2022-04-03T07:37:00Z
|
date: 2022-04-03T07:37:00Z
|
||||||
slug: "2022-04-03-vibe-check-02"
|
slug: "2022-04-03-vibe-check-02"
|
||||||
draft: false
|
draft: false
|
||||||
tags:
|
|
||||||
- vibe-check
|
|
||||||
---
|
---
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,6 @@ If you know your customer is extremely price sensitive, then building a $99/yr s
|
||||||
|
|
||||||
Risk is risk. Risk from product (what) and risk from engineering (how) cannot be meaningfully separated once you take more than three steps backwards.
|
Risk is risk. Risk from product (what) and risk from engineering (how) cannot be meaningfully separated once you take more than three steps backwards.
|
||||||
|
|
||||||
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.
|
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.
|
[^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.
|
||||||
|
|
|
||||||
|
|
@ -4,8 +4,6 @@ author: Thomas Wilson
|
||||||
date: 2022-05-06T21:08:00Z
|
date: 2022-05-06T21:08:00Z
|
||||||
slug: 2022-05-06-vibe-check-3
|
slug: 2022-05-06-vibe-check-3
|
||||||
draft: false
|
draft: false
|
||||||
tags:
|
|
||||||
- vibe-check
|
|
||||||
---
|
---
|
||||||
|
|
||||||
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, _some_ rain would be nice.
|
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, _some_ rain would be nice.
|
||||||
|
|
|
||||||
|
|
@ -4,8 +4,6 @@ author: Thomas Wilson
|
||||||
date: 2022-06-05T11:46:00Z
|
date: 2022-06-05T11:46:00Z
|
||||||
draft: false
|
draft: false
|
||||||
slug: 2022-06-05-vibe-check-4
|
slug: 2022-06-05-vibe-check-4
|
||||||
tags:
|
|
||||||
- vibe-check
|
|
||||||
---
|
---
|
||||||
|
|
||||||
Every year my brain tricks me. *June*, it says, *June is summer*. 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.
|
Every year my brain tricks me. *June*, it says, *June is summer*. 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.
|
||||||
|
|
|
||||||
|
|
@ -4,8 +4,6 @@ author: Thomas Wilson
|
||||||
date: 2022-07-06T20:38:00Z
|
date: 2022-07-06T20:38:00Z
|
||||||
slug: 2022-07-06-vibe-check-5
|
slug: 2022-07-06-vibe-check-5
|
||||||
draft: false
|
draft: false
|
||||||
tags:
|
|
||||||
- vibe-check
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,19 +0,0 @@
|
||||||
---
|
|
||||||
title: Listing all the Wainwrights
|
|
||||||
author: Thomas Wilson
|
|
||||||
date: 2022-09-13T09:04:00Z
|
|
||||||
slug: 2022-09-13-wainwrights
|
|
||||||
draft: false
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
On a recent holiday in The Lake District I wasn't able to find a complete list of the [Wainwright fells](https://en.wikipedia.org/wiki/List_of_Wainwrights) online, in a concise way that I could use to track the height and location of the hills.
|
|
||||||
|
|
||||||
A few hours in the morning later and I've compiled a list [here](https://github.com/thomaswilsonxyz/wainwright-peaks) on GitHub. It gives you all 214 fells with their
|
|
||||||
|
|
||||||
* Name
|
|
||||||
* Height (Metres and Feet)
|
|
||||||
* Col & Drop heights (Metres)
|
|
||||||
* Location (Latitude/Longitude, Ordnance Survey Reference)
|
|
||||||
|
|
||||||
enjoy !
|
|
||||||
|
|
@ -1,90 +0,0 @@
|
||||||
---
|
|
||||||
title: Is it a bug, or do you just not like it?
|
|
||||||
author: Thomas Wilson
|
|
||||||
date: 2022-09-24T11:09:00Z
|
|
||||||
slug: 2022-09-24-change-failure
|
|
||||||
draft: false
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
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".
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
The more a team ships software (deploys a new version of software), the better.
|
|
||||||
|
|
||||||
Some deploys are going to introduce bugs, i.e. problematic and unexpected behaviour.
|
|
||||||
|
|
||||||
This is called *Change Failure*, because a change to the system was proposed but incorrectly implemented.
|
|
||||||
|
|
||||||
Change failure *should* be 0%.
|
|
||||||
|
|
||||||
Change failure will rarely be 0%, because designing and crafting software is hard.
|
|
||||||
|
|
||||||
Change failure and deploy frequency are related, and do you want to trade off one for the other.
|
|
||||||
|
|
||||||
Nevertheless, it's important to know how much of the work your team does releases bugs.
|
|
||||||
|
|
||||||
So you need to know:
|
|
||||||
|
|
||||||
1. how often the team ships, and
|
|
||||||
2. how often the team ships bugs.
|
|
||||||
|
|
||||||
Best case scenario: your team ships N times a day which includes 0 bugs.
|
|
||||||
|
|
||||||
Worse case scenario, the team ships N times a day and introduces >N bugs (i.e. each deploy contains multiple bugs).
|
|
||||||
|
|
||||||
Bugs are bad for users for obvious reasons.
|
|
||||||
|
|
||||||
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 *Recovery Effort* (though time != effort != work != complexity).
|
|
||||||
|
|
||||||
Change Failure and Recovery Effort should be low and/or trending down.
|
|
||||||
|
|
||||||
Getting accurate figures for Change Failure and Recovery Effort rely on knowing what a *bug* is.
|
|
||||||
|
|
||||||
When we define and measure terms like Change Failure and Recovery Effort, we incentivise people to make those numbers low.
|
|
||||||
|
|
||||||
People can learn if you can something a "bug", they can get it through the pipeline quickly and seriously.
|
|
||||||
|
|
||||||
Engineers might consider a bug anything which throws an unhandled exception.
|
|
||||||
|
|
||||||
Product might consider a bug anything which deviates from the flow they imagined or documented.
|
|
||||||
|
|
||||||
Users might consider a bug anything that deviates from their expectations.
|
|
||||||
|
|
||||||
Strategy might consider a bug anything which doesn't align to macro business directions.
|
|
||||||
|
|
||||||
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?
|
|
||||||
|
|
||||||
Sometimes a customer might expect to see a confirmation toast pop up, but don't. Is this experienced ambiguity a bug?
|
|
||||||
|
|
||||||
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?
|
|
||||||
|
|
||||||
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?
|
|
||||||
|
|
||||||
The spirit of bugs, change failure, and recovery effort is something which _should_ work, but did not.
|
|
||||||
|
|
||||||
Bugs are undesirable in an unambiguous way.
|
|
||||||
|
|
||||||
Some of the other examples above are unambiguous, but that's a fuzzy word.
|
|
||||||
|
|
||||||
Some of the above can be framed as learning.
|
|
||||||
|
|
||||||
We have learned something about the product, or about the process of building.
|
|
||||||
|
|
||||||
Paired with rapid incremental deployments, and empowered team members - this learning is part of development nirvana.
|
|
||||||
|
|
||||||
Development nirvana happens when a lot of people push the overall quality and reliability of final product uphill.
|
|
||||||
|
|
||||||
Calling everything a bug isn't the way to get there.
|
|
||||||
|
|
||||||
Make sure you have words in your collective vocabulary to describe these kinds of (necessary) changes. I've used the following:
|
|
||||||
|
|
||||||
* Tweak
|
|
||||||
* Alteration
|
|
||||||
* Feature iteration
|
|
||||||
* 1% improvement
|
|
||||||
* Quality of Life change
|
|
||||||
* Missing feature
|
|
||||||
|
|
||||||
I've not found any one of these to be especially good or resonant just yet.
|
|
||||||
|
|
@ -1,20 +0,0 @@
|
||||||
---
|
|
||||||
title: "Vibe Check #6"
|
|
||||||
date: 2022-10-02T16:08:56Z
|
|
||||||
slug: 2022-10-02-vibe-check-6
|
|
||||||
author: Thomas Wilson
|
|
||||||
tags:
|
|
||||||
- vibe-check
|
|
||||||
---
|
|
||||||
|
|
||||||
It's been two months since [my last vibe check](/blog/2022-07-06-vibe-check-5). 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.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
Life continues, more than well enough for now.
|
|
||||||
|
|
@ -1,30 +0,0 @@
|
||||||
---
|
|
||||||
title: "Is it correct? Is it easy to use? Is it easy to change?"
|
|
||||||
date: 2022-10-09T09:00:52Z
|
|
||||||
slug: 2022-10-09-correct-use-change
|
|
||||||
author: Thomas Wilson
|
|
||||||
---
|
|
||||||
|
|
||||||
Software is improved iteratively. Large changes come through in many small changes. Good software can flex easily.
|
|
||||||
|
|
||||||
I like to think of the large changes as the brightest stars in the sky - they help you navigate the ship.
|
|
||||||
|
|
||||||
You do not want to lose the brightest stars in the sky. Finding them again takes time and effort.
|
|
||||||
|
|
||||||
You need to know what could make you lose the stars just like you need to know how to move towards them.
|
|
||||||
|
|
||||||
You need to know what keeps the stars exactly where they are (what changes are not meaningful or important in the long term).
|
|
||||||
|
|
||||||
The three stars I always care about are:
|
|
||||||
|
|
||||||
1. Is it correct?
|
|
||||||
2. Is it easy to use?
|
|
||||||
3. Is it easy to change?
|
|
||||||
|
|
||||||
**Is it correct?** 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.
|
|
||||||
|
|
||||||
**Is it easy to use?** 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?
|
|
||||||
|
|
||||||
**Is it easy to change?** 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?
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,53 +0,0 @@
|
||||||
---
|
|
||||||
title: "Making your software opinionated is maintenance++"
|
|
||||||
date: 2022-10-22T12:18:45Z
|
|
||||||
slug: 2022-10-22-maintenance-plus-plus
|
|
||||||
author: Thomas Wilson
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
Good software adds value to the people who use it.
|
|
||||||
|
|
||||||
So good software engineers make software that adds value to peoples' lives.
|
|
||||||
|
|
||||||
People get value from what software does for them, not how it does it (obvious caveats about correctness aside).
|
|
||||||
|
|
||||||
It's possible for highly valuable software to be terrible in quality.
|
|
||||||
|
|
||||||
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".
|
|
||||||
|
|
||||||
A lot of engineers will tell you that poor quality software _is_ low value software. I think this is most common in journeyman craftsperson (2-5 years). I've worked hard to stop being that person.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
Over time, poor quality software can become low value software. It is our job to stop, or at least slow, this.
|
|
||||||
|
|
||||||
The two words in my head for this are *Rot* and *Maintenence*.
|
|
||||||
|
|
||||||
[Software Rot](https://en.wikipedia.org/wiki/Software_rot) was introduced to me by [The Pragmatic Programmer](https://www.oreilly.com/library/view/the-pragmatic-programmer/9780135956977/f_0020.xhtml). 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.
|
|
||||||
|
|
||||||
Rot is a more primal word. You sense rot.
|
|
||||||
|
|
||||||
If you leave parts of your software alone for long enough, they will rot.
|
|
||||||
|
|
||||||
Maintenance is the **active** process of preventing or undoing code rot. I think this really entered my mind in following an episode of the *Freakonomics* podcast, [Praise of Maintenance](https://freakonomics.com/podcast/in-praise-of-maintenance/).
|
|
||||||
|
|
||||||
If you've ever taken care of a garden, machinery, or your body, you know maintenance *is* active. It means pulling things out of the ground, delimescaling, oiling, doing squats and stretching.
|
|
||||||
|
|
||||||
Maintenance is what you'll spend the vast majority of time doing.
|
|
||||||
|
|
||||||
Over the seasonal (quarterly) time period, maintenance isn't enough. There's a strong flavour of maintenance in my head that I'm calling *maintenance++*.
|
|
||||||
|
|
||||||
Maintenance++ is the act making pre-existing bits of software more opinionated about the business domain.
|
|
||||||
|
|
||||||
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 (*draft* and *archive*, as opposed to `isPublished` and `deletedAt`).
|
|
||||||
|
|
||||||
If the source code of software doesn't mirror the business or problem domain, the software is not of good quality.
|
|
||||||
|
|
||||||
You will learn more about a problem or process by writing the code. Code often does not come out of the oven with opinions.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
Part of maintaining software should be to introduce or refine business-level opinions within the software.
|
|
||||||
|
|
@ -1,38 +0,0 @@
|
||||||
---
|
|
||||||
title: "Communicate Clearly"
|
|
||||||
date: 2022-11-05T17:08:10Z
|
|
||||||
slug: 2022-11-05-communicate-clearly
|
|
||||||
author: Thomas Wilson
|
|
||||||
---
|
|
||||||
|
|
||||||
The hard thing about most ideas is arriving at them.
|
|
||||||
|
|
||||||
Most ideas themselves are easy. For example:
|
|
||||||
|
|
||||||
* Many smaller changes to software reduces the chance that a single change can break things.
|
|
||||||
* People who exercise more are more likely to live longer.
|
|
||||||
* Everyday somebody is discriminated against because of where they were born, who they love, or what they believe.
|
|
||||||
|
|
||||||
Always try to communicate clearly. This is especially true when you're communicating with other people.
|
|
||||||
|
|
||||||
I am a recovering over-explainer.
|
|
||||||
|
|
||||||
By always explaining and contextualising, I was communicating less clearly.
|
|
||||||
|
|
||||||
For a long time I would say (or write) an idea alongside the journey of how I got there, or the consequences/next steps.
|
|
||||||
|
|
||||||
I thought I was making my point clearer.
|
|
||||||
|
|
||||||
I thought you always wanted to help someone think how you think, or understand why something is/not good/bad.
|
|
||||||
|
|
||||||
Sometimes you can dilute an idea, suggestion, or observation by explaining it. It makes your point less clear.
|
|
||||||
|
|
||||||
Other times, the explanation is just too unfamiliar, and _you_ are the one with the expertise.
|
|
||||||
|
|
||||||
Either way, the explanation of the thing you're trying to say probably isn't as interesting (or relevant) as the thing itself.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
As you become more of an expert, people (rightfully or not) expect you to have made the explanation or assertion.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,43 +0,0 @@
|
||||||
---
|
|
||||||
title: "Vibe Check #7"
|
|
||||||
date: 2022-11-06T08:26:11Z
|
|
||||||
slug: 2022-11-06-vibe-check-7
|
|
||||||
author: Thomas Wilson
|
|
||||||
tags:
|
|
||||||
- vibe-check
|
|
||||||
---
|
|
||||||
|
|
||||||
I got a Steam Deck in September (huge flex), and so October 2022 saw the resurgence of video games into my life.
|
|
||||||
|
|
||||||
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 *Onimusha*, *Halo*, and others way past my bed time. I think for a while I imagined a career in games journalism.
|
|
||||||
|
|
||||||
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 *Mario Kart* and *Overcooked* 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 *into* gaming on the Switch. I poured some hours into *Breath of the Wild* and *Hades* (obviously), but it never felt like a thing I kept doing.
|
|
||||||
|
|
||||||
For some reason, the Steam Deck has made games fun again for my brain. Maybe it's because the Steam library is *huge*, and I can find the games I love to play (*Stray* and *Deaths Door* 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.
|
|
||||||
|
|
||||||
## Wedding Chat
|
|
||||||
|
|
||||||
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, *Martin*, who started the tour by saying "do not interrupt me or ask questions while I'm showing you around").
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
Still, that feels cool.
|
|
||||||
|
|
||||||
## Sewing chat
|
|
||||||
|
|
||||||
I've started making my first *real* shirt (after three muslin toiles). The folk over at [freesewing](https://www.freesewing.org) 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.
|
|
||||||
|
|
||||||
I picked up some certified sustainable fabrics from [Offset Warehouse](https://www.offsetwarehouse.com/) which turned out to be a little more summery than I was expecting. Perhaps not November-December style dress.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
## Work chat
|
|
||||||
|
|
||||||
In October I celebrated my second anniversary at my current job at Oxwash. This is the longest single job I have ever had.
|
|
||||||
|
|
||||||
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 *deep* problems in the codebase, and also within the organisation in general.
|
|
||||||
|
|
||||||
Oxwash in late 2022 is *very* 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.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
|
|
@ -1,41 +0,0 @@
|
||||||
---
|
|
||||||
title: "All Problems are People Problems"
|
|
||||||
date: 2022-11-28T22:52:49Z
|
|
||||||
slug: 2022-11-28-all-problems
|
|
||||||
author: Thomas Wilson
|
|
||||||
---
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
As a novice software engineering leader, I believe that all problems are actually people problems.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
There is a _low_ 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 _say_ nothing.
|
|
||||||
|
|
||||||
If you want to understand a problem, do the work of understanding the people facing, fixing, or creating a problem.
|
|
||||||
|
|
||||||
To understand people, talk with them.
|
|
||||||
|
|
||||||
You should talk honestly.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
You should try to remove as much discomfort from dishonesty as possible. Or honesty should be the most comfortable state.
|
|
||||||
|
|
||||||
Do things that invite or encourage honesty with people. This might look like asking someone if and why they feel frustrated.
|
|
||||||
|
|
||||||
It might look like telling someone that it would feel uncomfortable to give them an honest answer.
|
|
||||||
|
|
||||||
If something prevents you from understanding a person, it stops you from understanding (at least some of) a problem.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,34 +0,0 @@
|
||||||
---
|
|
||||||
title: "Vibe Check #8"
|
|
||||||
date: 2022-12-04T21:59:53Z
|
|
||||||
slug: 2022-12-04-vibe-check-8
|
|
||||||
author: Thomas Wilson
|
|
||||||
tags:
|
|
||||||
- vibe-check
|
|
||||||
---
|
|
||||||
|
|
||||||
Winter came to Oxford in the last seven or ten days. The other day I stepped out of my house and got that _Winter in England_ 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.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
In November I worked hard at making wearable garments. Two shirts, to be precise. With a fifty per cent success rate.
|
|
||||||
|
|
||||||
The first shirt (white muslin with a blue print) came out well, though a little baggy. My imprecise (one could say _slapdash_) alterations to the pattern produced a bulge-at-the-buttons and pinched biceps sibling (in an equally nice white-grey pinstripe pattern).
|
|
||||||
|
|
||||||
I look like q tiny hulk, bursting out of a tiny shirt.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
So on to trousers I go. I'll be mocking up the [Wardrobe By Me mens Chinos](https://wardrobebyme.com/products/chino-pants-sewing-pattern) soon. This is the first trouser pattern I found that went down to a 28" waist (even down to a 26!).
|
|
||||||
|
|
||||||
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 [freesewing](https://www.freesewing.org)) but I want something prefabbed to tweak, not something rough that needs shaping.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
Sometimes you want more immediate gratification.
|
|
||||||
|
|
||||||
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 _another_ shirt.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,47 +0,0 @@
|
||||||
---
|
|
||||||
title: "My favourite albums of 2022"
|
|
||||||
date: 2023-01-01T21:46:10Z
|
|
||||||
slug: 2023-01-01-2022-albums
|
|
||||||
author: Thomas Wilson
|
|
||||||
---
|
|
||||||
|
|
||||||
This is a list of my favourite albums of 2022. They're not the _best_ records, they're my favourite.
|
|
||||||
|
|
||||||
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 *favourite* post until the other ones were back online and beautiful.
|
|
||||||
|
|
||||||
I don't have to resurrect those past pages to start at making another one.
|
|
||||||
|
|
||||||
So this is a brutalist, small list of albums I loved that were released in 2022.
|
|
||||||
|
|
||||||
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 _good_.
|
|
||||||
|
|
||||||
## The Albums
|
|
||||||
|
|
||||||
- Underwater, Ludovico Einaudi. January 21 2022 (Classical, [YouTube link](https://www.youtube.com/watch?v=zj5stEte5zI)).
|
|
||||||
- aubades, Jean-Michel Blais. February 4, 2022 (Classical, [Bandcamp link](https://jeanmichelblais.bandcamp.com/album/aubades-2)).
|
|
||||||
- Cognition, Wilkinson. February 11, 2022 (Electronic, [YouTube Link](https://www.youtube.com/playlist?list=PLSvU1a-6HYLOhxaoWuid9BGcQtF1Noq1H)).
|
|
||||||
- The Line is a Curve, Kae Tempest. April 8 2022 (Poetry? Hip Hop? [YouTube Link](https://www.youtube.com/playlist?list=PLZqsyBiYZFQ0g8_BXA8XV6Ck5vre0nTuF)).
|
|
||||||
- Exercise Your Demons, CLIFFDIVER. May 6 2022 (Pop Punk, [Bandcamp link](https://cliffdiverok.bandcamp.com/album/exercise-your-demons)).
|
|
||||||
- How To Be Alone, All Better. May 6 2022 (Pop Punk, [Bandcamp Link](https://allbetter.bandcamp.com/album/how-to-be-alone)).
|
|
||||||
- Blue Hours, Bears Den. May 13 2022 (Folk/Rock, [YouTube link](https://www.youtube.com/watch?v=S4Cs9PynKrA)).
|
|
||||||
- Kings of the New Age, State Champs. May 13 2022 (Pop Punk, [Bandcamp link](https://statechamps.bandcamp.com/album/kings-of-the-new-age)).
|
|
||||||
- Sondar, The Wrecks. June 10 2022 (Rock, [YouTube Link](https://www.youtube.com/playlist?list=PLjGa9Rt2jeSjrjSJAkRQ5O-Ql7V0S-4Mn)).
|
|
||||||
- Leap, James Bay. July 2022 (Singer Songwriter, [YouTube link](https://www.youtube.com/watch?v=JFkuW2mN-jI&list=PLxA687tYuMWiw48ZFJAP14-RXLC2P5iYJ)).
|
|
||||||
- End of an era, Loveless. September 2022 (Pop Punk, [YouTube link](https://www.youtube.com/watch?v=VGfWnluaTnQ&list=PLS4jAfE9d3aJePlld21jlZbB9qA2XCvC_)).
|
|
||||||
- hugo, Loyle Carner. October 21 2022 (Hip Hop, [Bandcamp link](https://loylecarnerband.bandcamp.com/album/hugo)).
|
|
||||||
- Midnights, Taylor Swift. October 22 2022 ([Pop, YouTube link](https://www.youtube.com/playlist?list=PLxA687tYuMWgXjGLvPvOWqXWgHEIA2JW6)).
|
|
||||||
- Into the Past, Driveways. October 28 2022 (Pop Punk, [Bandcamp link](https://driveways.bandcamp.com/album/into-the-past)).
|
|
||||||
- King's Disease III, Nas. November 11 2022 (Hip Hop, [YouTube link](https://www.youtube.com/watch?v=PSs0HeTG9cA&list=PLxA687tYuMWgdtdodLiBISjifKS2qsDYJ)).
|
|
||||||
- Tender, Lady Maisery. November 11 2022 (Folk, [Bandcamp link](https://ladymaisery.bandcamp.com/album/tender-2)).
|
|
||||||
- NO THANK YOU, Little Simz. December 12 2022 (Hip Hop, [YouTube link](https://www.youtube.com/playlist?list=OLAK5uy_nT7_vca0br-RmVk0vkc8yIp3iXtRROsmk)).
|
|
||||||
|
|
||||||
## Albums I want to spend more time with
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
- five seconds flat, Lizzy McAlpine. April 8, 2022 (Singer-Songwriter, [YouTube link](https://www.youtube.com/watch?v=GFumHG4Wt1g&list=PL_u1w9wImcNCsAjqoxlQqwP3tBZZN7cYV)).
|
|
||||||
- Incase We Crash, Incase we Crash. July 15 2022 (Pop Punk, [Bandcamp link](https://incasewecrash1.bandcamp.com/album/incase-we-crash)).
|
|
||||||
- Stick Season, Noah Kahan. October 14 2022 (Folk, [YouTube link](https://www.youtube.com/watch?v=nJAiOSN5bnQ&list=PLfiMjLyNWxeZZYD6q1cAni5MzWQCywfHl)).
|
|
||||||
- Escape That, Sam Sweeney. October 21 2022 (Folk, [Bandcamp link](https://samsweeney.bandcamp.com/album/escape-that)).
|
|
||||||
- worm food, Cavetown. November 4, 2022 (Singer-Songwriter, [YouTube link](https://www.youtube.com/watch?v=dkd_pa3_DGg&list=PLxA687tYuMWhqR1I997DtR_OwnpPJisQX)).
|
|
||||||
- Conditions of a Punk, half-alive. December 2 2022 (Alt Rock?, [YouTube link](https://www.youtube.com/watch?v=TspJmMZH_Os&list=PLmrKws9W-mZMcpsQ4ZOAcAyv7u5nm_zQQ)).
|
|
||||||
|
|
@ -1,34 +0,0 @@
|
||||||
---
|
|
||||||
title: "Vibe Check #9"
|
|
||||||
date: 2023-01-01T15:02:04Z
|
|
||||||
slug: 2023-01-01-vibe-check-9
|
|
||||||
author: Thomas Wilson
|
|
||||||
tags:
|
|
||||||
- vibe-check
|
|
||||||
---
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
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 *knowing*.
|
|
||||||
|
|
||||||
I'll find that restful, peaceful time - but it'll probably be when others are more distracted by the hubbub of normal routine.
|
|
||||||
|
|
||||||
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%.
|
|
||||||
|
|
||||||
It's a a delightful shirt and in black-and-white hand-woven cotton, sourced from the lovely folk at [Offset Warehouse](https://www.offsetwarehouse.com/). 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.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
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 *definitely* important, versus what *could* be important.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
||||||
---
|
|
||||||
title: "Little Project: Oddbox Scraper"
|
|
||||||
date: 2023-01-12T19:59:32Z
|
|
||||||
slug: 2023-01-12-2023-01-12-little-project-oddbox-scraper
|
|
||||||
author: Thomas Wilson
|
|
||||||
---
|
|
||||||
|
|
||||||
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. [Here's the github link](https://github.com/thomaswilsonxyz/oddbox-scraper).
|
|
||||||
|
|
||||||
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 *odd*), or there's too much to sell.
|
|
||||||
|
|
||||||
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 `oddbox upcoming deliveries`, and be taken to the [same page](https://www.oddbox.co.uk/box-contents) 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 *du jour*.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
All of the infrastructure is defined in Terraform (with sensitive information variablised) and can be deployed on AWS.
|
|
||||||
|
|
||||||
Once again, [here's the GitHub link](https://github.com/thomaswilsonxyz/oddbox-scraper).
|
|
||||||
|
|
@ -1,122 +0,0 @@
|
||||||
---
|
|
||||||
title: "Seven Days with Terraform – Building Serverless Applications and their Infrastructure"
|
|
||||||
date: 2023-01-15T19:45:37Z
|
|
||||||
slug: 2023-01-15-seven-days-with-terraform
|
|
||||||
author: Thomas Wilson
|
|
||||||
---
|
|
||||||
|
|
||||||
Earlier this month I wrote about a side project I built which tells me about my upcoming vegetable box delivery ([link](https://thomaswilson.xyz/blog/2023-01-12-2023-01-12-little-project-oddbox-scraper)).
|
|
||||||
|
|
||||||
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 *somehow* (this site just generates then serves those files via Netlify).
|
|
||||||
|
|
||||||
The Oddbox Scraper application makes it into the 1% of deployed code which isn't running inside of a monolith.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
Why? Because it felt like a blind spot, and because there's a difference between knowing something and *knowing* something. One of those things you only learn by doing.
|
|
||||||
|
|
||||||
I wrote the app for the AWS serverless environment, and managed the necessary infrastructure with [terraform](https://developer.hashicorp.com/terraform/intro):
|
|
||||||
|
|
||||||
> 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.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
I gave myself seven (non-consecutive) days to build and deploy _something_ in a serverless/distributed way, without rushing past important AWS or Infrastructure decision/concepts.
|
|
||||||
|
|
||||||
This post is a (tiny) tidy up of the log I kept during those seven days.
|
|
||||||
|
|
||||||
|
|
||||||
## Known unknowns
|
|
||||||
|
|
||||||
I left this project with things that I now know that I don't know enough about:
|
|
||||||
|
|
||||||
- **Roles, Policies, Accounts, Permissions, and Assuming Roles in AWS**. 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.
|
|
||||||
- **Testing AWS Services**: 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 *implementation* 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.
|
|
||||||
|
|
||||||
|
|
||||||
## Things I didn't do but would want to
|
|
||||||
|
|
||||||
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:
|
|
||||||
|
|
||||||
- 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.
|
|
||||||
- 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. [GitHub Issue Link](https://github.com/thomaswilsonxyz/oddbox-scraper/issues/2).
|
|
||||||
|
|
||||||
|
|
||||||
## Day One: Terraform quick start
|
|
||||||
|
|
||||||
We mostly use AWS at work, so I got going with Terraform's [Get Started - AWS](https://developer.hashicorp.com/terraform/tutorials/aws-get-started) guide.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
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).
|
|
||||||
|
|
||||||
By the end of an hour or so I had a function written in TypeScript (compiled to JS with esbuild), and deployed to AWS.
|
|
||||||
|
|
||||||
I also had a lot of fun figuring how AWS credentials are stored locally, using [AWS's docs on the AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html).
|
|
||||||
|
|
||||||
## Day Two: Triggering the Lambda on a Schedule
|
|
||||||
|
|
||||||
Today I decided on _what_ 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.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
## Day Three: Lambda => SQS Communication
|
|
||||||
|
|
||||||
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 `eu-west-2` and also worked first time without complaint.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
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).
|
|
||||||
|
|
||||||
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).
|
|
||||||
|
|
||||||
I spent most of today learning about all the granular activities, like pushing and reading messages from an SQS queue.
|
|
||||||
|
|
||||||
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 `data` objects (?) in terraform them, then JSON-ify them out in the resources (e.g.a `aws_iam_policy`). This felt a lot cleaner than defining inline JSON with `EOF` markers
|
|
||||||
|
|
||||||
|
|
||||||
## Day Four: DynamoDB
|
|
||||||
|
|
||||||
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 _huge_ volumes of data and staggering speed, and I'm popping some data in there once a day.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
I learned that you cannot have multiple `aws_iam_role_policy_attachment` resources targeting the same IAM role (thanks, [StackOverflow](https://stackoverflow.com/questions/45486041/how-to-attach-multiple-iam-policies-to-iam-roles-using-terraform)) so I got to do my first programatic for-each loop in Terraform, which was cool.
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
## Day Five: Lambda-SQS-DynamoDB-SES
|
|
||||||
|
|
||||||
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 _wanted_ turn up in your e-mail inbox.
|
|
||||||
|
|
||||||
Domain validation for SES (Simple E-mail Service), so that I could use `@thomaswilson.xyz` 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.
|
|
||||||
|
|
||||||
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 _whole_ 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.
|
|
||||||
|
|
||||||
I also learned the difference between a Query and a Scan ([official docs](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-query-scan.html)) in DynamoDB. I found the [DynamoDB Guidebook](https://www.dynamodbguide.com/key-concepts) useful for explaining some of the big words.
|
|
||||||
|
|
||||||
DynamoDB is the least abstracted interaction I've had with a database. It's good to get exposed to some of these things.
|
|
||||||
|
|
||||||
## Day Six: GitHub repo
|
|
||||||
|
|
||||||
I spent today getting the [code onto GitHub](https://github.com/thomaswilsonxyz/oddbox-scraper).
|
|
||||||
|
|
||||||
This largely meant following [Terraform's own docs](https://developer.hashicorp.com/terraform/tutorials/configuration-language/sensitive-variables) on removing sensitive information from the code, and variable-ising all of it.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
## Day Seven: AWS IAM Identity Centre
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
The words I *see* used, but struggle *to* use are roles, policies, users, accounts, and credentials.
|
|
||||||
|
|
||||||
So I dragged up the AWS [documentation on the AWS IAM Identity Center](https://docs.aws.amazon.com/singlesignon/latest/userguide/users-groups-provisioning.html) and started reading.
|
|
||||||
|
|
||||||
I also found the [Best Practices in IAM page](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html) quite useful.
|
|
||||||
|
|
||||||
The question in specific I wanted to answer was: could I create a completely separate *place* (account? environment?) for integration testing. I don't think I'll have time to address in the seven day countdown.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
@ -1,104 +0,0 @@
|
||||||
---
|
|
||||||
title: "Eight days to build Sunrise, Sunset?"
|
|
||||||
date: 2023-01-30T22:20:19Z
|
|
||||||
slug: 2023-01-30-building-sunrise-sunset
|
|
||||||
author: Thomas Wilson
|
|
||||||
---
|
|
||||||
|
|
||||||
[I recently wrote](https://thomaswilson.xyz/blog/2023-01-30-sunrise-sunset) about the *Sunrise, Sunset?* game. It's a Wordle-style daily game where you have to decide if a photo is a sunrise or a sunset.
|
|
||||||
|
|
||||||
This is a (very rough) log I wrote while building that.
|
|
||||||
|
|
||||||
## Day Zero: What ?
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
This someone (again, definitely not my fiancée) doubled down on their conviction.
|
|
||||||
|
|
||||||
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: *Sunrise or Sunset?*
|
|
||||||
|
|
||||||
## Day One: Can I get some photos?
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
Shockingly, I can.
|
|
||||||
|
|
||||||
## Day Two: Build the photo-fetching pipeline.
|
|
||||||
|
|
||||||
Build out the scripts for fetching (and saving) images from the Unsplash API.
|
|
||||||
|
|
||||||
Type hinting syntax in Python seems pretty intuitive, huh?
|
|
||||||
|
|
||||||
## Day Three: Filter out misleading photos or descriptions
|
|
||||||
|
|
||||||
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 `sunrise` (and vice versa).
|
|
||||||
|
|
||||||
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).
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
It turns out this was affecting about 8% (22/254) of the pictures I had previously downloaded.
|
|
||||||
|
|
||||||
I ended today with 215 photos, so enough for seven months of the game, which will do for now :)
|
|
||||||
|
|
||||||
## Day Four: Make the photos accessible via API
|
|
||||||
|
|
||||||
Took all the data from yesterday and did some triple checking with my human eyes. Looks good.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
Decided to go for `/api/sunrise-sunset-photo.json`
|
|
||||||
|
|
||||||
Now we need to make sure that that data is accessible from a web page. Let's stand up an API endpoint in Sveltekit
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
## Day Five: Creating the UI for guessing + showing results
|
|
||||||
|
|
||||||
Today was all about storing the user's previous guesses, and also about shamelessly stealing a colour palette from Dribbble (thank you [Brielle Killeen](https://dribbble.com/shots/17508382-Wordle-Redesign-Rebound) for the orange and greys on this Wordle redesign).
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
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 *little* jank, which never feels great.
|
|
||||||
|
|
||||||
Only managed an hour or so today, so feels nice to take it from 1% to maybe 20% (after 0-1% yesterday).
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
## Day Six: Creating a guessing micro-interaction
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
I used Svelte's own Spring and Transition tools.
|
|
||||||
|
|
||||||
## Day Seven: Design Details
|
|
||||||
|
|
||||||
Yesterday we got to a UI I'm 20% happy with. Today I wanted to take that to 40-50%.
|
|
||||||
|
|
||||||
**(Gardening) Components.** 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.
|
|
||||||
|
|
||||||
I love how CSS variables are reachable by the child components - it made consistent theming on this page really nice.
|
|
||||||
|
|
||||||
**Link Previews.** 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:
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
I popped this as the preview image, and added some basic meta tags (thanks [metatags.io](https://metatags.io/)) for suggesting metatags, and [opengraph.dev](https://opengraph.dev/panel?url=https://www.thomaswilson.xyz/sunrise-sunset) for letting me preview the link.
|
|
||||||
|
|
||||||
**Reveal Animation.** 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.
|
|
||||||
|
|
||||||
Lastly, I made the notification persist between sessions on a set day. So if you open up the window *after* guessing, it shows you if you were right or wrong.
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
## Day Eight: Current Streak Length
|
|
||||||
|
|
||||||
I want to wrap this up. But I absolutely need to know what the user's *current* streak is. That is: how many days in a row have they guessed correctly?
|
|
||||||
|
|
||||||
I wrote this code out today (test-driven, thankfully), and this _really_ feels like one of those problems that I just don't have the vocabulary to effectively solve. The fun part being that I record _all_ the guessing history, so just have a list of days where the answer was right, and where it was wrong.
|
|
||||||
|
|
||||||
Fun fact, while writing the above section, I realised I could solve the problem in a slightly more intelligent way, so I did.
|
|
||||||
|
|
||||||
I think I'm ready to wrap up this Little Project for now :)
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
||||||
---
|
|
||||||
title: "Sunrise, Sunset? A daily guessing game (and another 2023 Little Project)"
|
|
||||||
date: 2023-01-30T22:03:41Z
|
|
||||||
slug: 2023-01-30-sunrise-sunset
|
|
||||||
author: Thomas Wilson
|
|
||||||
---
|
|
||||||
|
|
||||||
tl;dr - I made a daily game to guess if a picture is sunrise or sunset. [Here's the link](https://www.thomaswilson.xyz/sunrise-sunset).
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
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?".
|
|
||||||
|
|
||||||
That's it. That's the whole game. [Go and check it out](https://www.thomaswilson.xyz/sunrise-sunset).
|
|
||||||
|
|
||||||
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 !
|
|
||||||
|
|
@ -1,43 +0,0 @@
|
||||||
---
|
|
||||||
title: "Vibe Check #10"
|
|
||||||
date: 2023-02-03T07:16:41Z
|
|
||||||
slug: 2023-02-03-vibe-check-10
|
|
||||||
author: Thomas Wilson
|
|
||||||
tags:
|
|
||||||
- vibe-check
|
|
||||||
-
|
|
||||||
---
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
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 (_dangerously_ good, thanks Anna Jones), and played a new board game. It's nice to take a day to oneself.
|
|
||||||
|
|
||||||
**Music and Film Recs**
|
|
||||||
|
|
||||||
- [Never Going Under, Circa Waves](https://songwhip.com/circa-waves/never-going-under) (Album, Indie Rock, 2023). I think I'm going through my indie rock phase, and that's cool.
|
|
||||||
- [30, Adele](https://songwhip.com/adele/302021) (Album, Pop, 2021). There's so much to love in this Album, Adele's just a great artist.
|
|
||||||
- [Take Off Your Colours, You Me At Six](https://songwhip.com/you-me-at-six/take-off-your-colours) (Album, Pop Punk, 2008). This album holds up to what sixteen year-old me loved.
|
|
||||||
- [The Menu](https://letterboxd.com/film/the-menu-2022/) (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.
|
|
||||||
|
|
||||||
**Photography.** 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 [Fujifilm SQ1](https://instax.com/sq1/en/). I try not to get too lost in deep research over new-ish hobbies, in case I drop it four weeks later.
|
|
||||||
|
|
||||||
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).
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
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 *really* worth the extra shot, and the waste of throwing one away? Is the photo bad, or are you just not happy with it?
|
|
||||||
|
|
||||||
I'm experimenting with putting these in journals and displaying them in a grid photo frame ([this one](https://www.etsy.com/uk/listing/1228774146/instax-square-multi-aperture-wooden), 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).
|
|
||||||
|
|
||||||
**Sewing.** 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. *oh well*, 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.
|
|
||||||
|
|
||||||
**Other Projects.** The creative ghost of new year ran through me this month, and I managed two make *two* little projects:
|
|
||||||
|
|
||||||
- [Oddbox Noifier](/blog/2023-01-12-2023-01-12-little-project-oddbox-scraper) - a scheduled web scraper that notifies me of my Veg Box's contents via e-mail.
|
|
||||||
- [Sunrise, Sunset?](/blog/2023-01-30-sunrise-sunset) - a daily game where you have to guess if a picture is sunrise or sunset.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
Whatever, I shipped some fun little side projects that made my life more joyful. Ain't that the whole point?
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,48 +0,0 @@
|
||||||
---
|
|
||||||
title: The exceptions are more interesting
|
|
||||||
date: 2023-02-13T22:29:48.797Z
|
|
||||||
slug: 2023-02-13-the-exceptions-are-more-interesting
|
|
||||||
author: Thomas Wilson
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
Edit: Ironically, this post is a little too generic. My thinking got a bit clearer in [The Meta is More Appealing](/blog/2023-02-19-the-meta-is-more-appealing/). Thomas 2023-02-19.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
I'm going to open with three buzzwords and a bland sentiment:
|
|
||||||
|
|
||||||
Theories, policies, and frameworks are useful.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
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\" *but only when* or *otherwise you should* shrinks the on-the-ground usefulness of a policy.
|
|
||||||
|
|
||||||
Always be honest... except with children about some things.
|
|
||||||
|
|
||||||
Judge people by their actions not their words... unless their words are hateful.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
Earlier in my career I loved the rules. I loved the certainty of knowing what to do, and when.
|
|
||||||
|
|
||||||
Later in my career, my ears perk when I hear about exceptions to rules. Then I'll spend some time talking about them.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
Everything has a limit to what it can help you with.
|
|
||||||
|
|
||||||
Everything has a long tail of exceptions. Taken alone, these exceptions will feel like a one off. Taken together, they make up the majority.
|
|
||||||
|
|
||||||
And left alone, a lot of people will simplify, and try to make a theory expand.
|
|
||||||
|
|
||||||
But otherwise *all* we have is One Off Exceptions. I reckon we could group some of them into similar buckets, and stop re-inventing the wheel...
|
|
||||||
"
|
|
||||||
|
|
@ -1,23 +0,0 @@
|
||||||
---
|
|
||||||
title: Medium.com as my "a website can do that?" moment
|
|
||||||
date: 2023-02-14T22:31:08.484Z
|
|
||||||
slug: 2023-02-14-medium-can-do-that
|
|
||||||
author: Thomas Wilson
|
|
||||||
|
|
||||||
---
|
|
||||||
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 *excellent*.
|
|
||||||
|
|
||||||
I think that was one of my earliest \"a website can do that?!\" moments. I don't want to forget that feeling.
|
|
||||||
|
|
||||||
The buttery spacious experience of writing and laying out your piece felt like what every WYSIWYG editor should want to be. The words *looked* beautiful and it did Just Work™️. It wasn't clunky buttons, and impossible-to-escape-or-indent lists (looking at you Notion and JIRA).
|
|
||||||
|
|
||||||
It's like the first time you *smell* fresh cookies coming out of the oven, or watch someone make music up close, or witness someone really *use* photoshop.
|
|
||||||
|
|
||||||
It's one step before \"I think I could make something like this\".
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
|
|
@ -1,24 +0,0 @@
|
||||||
---
|
|
||||||
title: Will what drove you here drive you away from here?
|
|
||||||
date: 2023-02-15T20:37:35.854Z
|
|
||||||
slug: 2023-02-15-tests-drive
|
|
||||||
author: Thomas Wilson
|
|
||||||
|
|
||||||
---
|
|
||||||
Tests should drive the development of software (*caveat caveat backtrack backtrack*). That means if you find yourself somewhere in the codebase making some kind of change, it should be because the test took you there.
|
|
||||||
|
|
||||||
If you're not careful, you're somewhere because it was nearby and it looked or smelled off.
|
|
||||||
|
|
||||||
Unfortunately, this looks an awful lot like tidying up after yourself or moving things around to make an incoming change easier.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
It's very easy to let a *this didn't quite feel right* feeling take you down the [Yak Shaving](https://en.wiktionary.org/wiki/yak_shaving) route.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
You might be improving things, but it's happening by random sprawl.
|
|
||||||
|
|
||||||
Tests are a vehicle that drive you, and they're also a tool to get you out.
|
|
||||||
|
|
@ -1,29 +0,0 @@
|
||||||
---
|
|
||||||
title: Don't make it, make it good.
|
|
||||||
date: 2023-02-17T20:58:22.949Z
|
|
||||||
slug: 2023-02-17-make-it-good
|
|
||||||
author: Thomas Wilson
|
|
||||||
|
|
||||||
---
|
|
||||||
Let's say there's two kinds of work:
|
|
||||||
|
|
||||||
1. The kind where you take something not good and make it good.
|
|
||||||
2. The kind where you take nothing, and make it into something.
|
|
||||||
|
|
||||||
I have spent a lot more time doing the first kind of work, making something better.
|
|
||||||
|
|
||||||
I have spent a lot less time trying to make something out of nothing.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
There are exceptions, obviously. But they are not the rule.
|
|
||||||
|
|
||||||
If it seems easier to start fresh than to make something better, something is wrong.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
This can mean a few things. If you're worried about your own work, _force_ yourself into collaboration. Make it very hard to stray, and to start completely anew.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
@ -1,26 +0,0 @@
|
||||||
---
|
|
||||||
title: The Meta is More Appealing
|
|
||||||
date: 2023-02-19T19:33:01.450Z
|
|
||||||
slug: 2023-02-19-the-meta-is-more-appealing
|
|
||||||
author: Thomas Wilson
|
|
||||||
|
|
||||||
---
|
|
||||||
Earlier this week I wrote a piece, [The exceptions are more interesting](/blog/2023-02-13-the-exceptions-are-more-interesting). Tl;dr - unless you're extremely careful at work, ideas/advice/theories become platitudes, and therefore less useful.
|
|
||||||
|
|
||||||
My brain isn't finished with the idea, I think the point I want to make is:
|
|
||||||
|
|
||||||
> 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 *then* try to make it general.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
This means that a lot of the conversations at the moment have to be *really* 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?".
|
|
||||||
|
|
||||||
I think some people see this level of specificity as a bad thing.
|
|
||||||
|
|
||||||
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".
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
Those things feel and sound useful, but they take every problem one step above where it is. Sometimes you really do just have to *do the thing*™️.
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
@ -1,28 +0,0 @@
|
||||||
---
|
|
||||||
title: What is the anti-principle?
|
|
||||||
date: 2023-02-24T22:04:10.835Z
|
|
||||||
slug: 2023-02-24-what-is-the-anti-principle
|
|
||||||
author: Thomas Wilson
|
|
||||||
|
|
||||||
---
|
|
||||||
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?".
|
|
||||||
|
|
||||||
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 *really* useful.
|
|
||||||
|
|
||||||
I think Hacker News surfaced the blog post *[Invert, always invert](https://www.anup.io/p/invert-always-invert)* (in turn inspired by [this Farnam Street piece](https://fs.blog/inversion/)) to me about three years ago, and now I reach for Inversion almost daily.
|
|
||||||
|
|
||||||
I also find that inversion can help combat vague platitudes (say, *strive for excellence*, or *keep it simple*). I think these hand-wavy big theories [are appealing but not very valuable](/blog/2023-02-19-the-meta-is-more-appealing).
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
For example:
|
|
||||||
|
|
||||||
* "Design with the context in mind" becomes "Design with your quiet office and MacBook Pro in mind"
|
|
||||||
* "Measure what matters" becomes "Measure what's easiest to measure"
|
|
||||||
* "Actively resolve complexity" becomes "Preserve effort and prolong complexity".
|
|
||||||
|
|
||||||
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 *just* the principles.
|
|
||||||
|
|
||||||
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).
|
|
||||||
|
|
||||||
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.
|
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue