Opinions
Lazy Content
Opinions are the low-hanging fruit for an online presence. To avoid feeling that I haven't conveyed these ill-considered, probably-shouldn't-be-expressed thoughts, here are a few opinions and positions.
The content on this page can change at any time. It isn't deceptive if I prune out a thought or change the wording, even if it wholly changes my position. My positions do change over time, and I have no compunction adapting to new information or perspective.
No opinions here are presented as absolutes, but instead are the laziest expression of a position minus the nuance that every real-world situation and scenario presents. I hold most opinions loosely, and am constantly reassessing based upon new information and situations.
Being a coder — even a great coder — doesn't make us an expert at all things. We should understand the limits of our knowledge, instead of believing we're experts on epidemiology, governance, etc. Too often we get caught up in our own hubris and think that we can casually become experts in any domain given an afternoon of Googling.
Coding
- Language idealism has very little correlation with productivity or effectiveness. Deeply imperfect languages, stacks, libraries, and implementations power most of our world. When finger hits keyboard it is the dedication to a goal and commitment to finding solutions that is the greatest predicate of success. Rust or Haskell or whatever is in favor have incredible advantages, but many solutions are built using deeply imperfect languages like C or PHP. You should choose the right tools, of course (I personally despise PHP with a fiery passion, though I have a reminiscent love for C), but we miss the forest for the trees when we assess the path to a successful project.
- TDD in practice is often evidence of Trivial Development Disease, and is best practiced in the sort of
make-work, robotic style implementations that should be pushed out of a template, redundantly
replicating library features.
We face enough unknowns in most projects that we haven't the slightest clue how we could test it at the outset, or even what the testable outputs would be. Having tests, ideally with 100% coverage, is ideal and of enormous value, but the TDD model of front-loaded tests is not compatible with novel development. It is a solution in theory that seldom solves anything in the real world. - Teams that operate as if all members are fungible cogs, with equal aptitudes, interests and
capabilities, are doomed to sub-perform.
Some people are in their element designing, some documenting, some focused on the small details, some cleaning and refactoring, some maintaining, some pushing the edges and setting directions. Some tasks have been correlated with unfortunate negative connotations — e.g. documentation and maintenance is destructively seen as lesser work, for instance — that make us pretend that it isn't true, and the end result is usually everyone doing everything poorly. - Don't sweat the up-front design too much because it's unlikely to survive engagement with the unknown. Your first version will likely be very different from what you have in place a year down the road, and software development has never been a field where you are building an asset pile. More often accumulated solutions become a debt that we hold too close when we need to constantly reassess what parts "bring us joy" and jettison the parts that don't.
- When confronted with substantial problems we often focus on the trivial edges (the foundation of procrastination): Changing fonts, repositioning things, some new refactoring to replace some slightly repetitive code, adding code injection to swap out database platforms though you never will and could directly substitute in a fraction of the time, switching from one framework to another to another, changing simple loops to map/reduce patterns, etc. This often bites in big up front design when we spend an eternity refining the easy parts while the novel, high-value portion sits untouched. Eventually we confront the actual difficulty and realize that all that we had done was no longer appropriate or relevant.
- A significant percentage of coding now is basically wiring (a less generous term would be "duct tape programming"). It's how you can build a tremendously performant solution in an interpreted language like Python, given that a lot of solutions are just gluing together high performance libraries in the correct sequence and with the correct connections to yield a solution for a given problem. This is true even in cutting edge realms like machine learning, inference, and so on: The language we spend most of our time working in has shockingly little influence on the performance of the end result.
- Motivation is overvalued. Discipline is undervalued. This post covers
it pretty well.
If you want to vanquish procrastination, forget about the futile hunt for motivation, wasting time seeking the perfect emotional state, the perfect background music, the perfect morning routine, the perfect environment and setup and situation that will pull you through obstacles and, the belief goes, make hard work easy. When we pray at the alter of motivation we use any diversion from the ideal as an excuse to waste another hour, day, week, month, year. "I'm just not feeling it right now. I'm going to browse Reddit for a bit, have a nap, go for a drive, etc, and after I'll be perfect. Until I won't then I'll distract myself." Tomorrow, you promise, will be different, but it won't.
Instead you need the discipline to simply force through the necessary work on the days when you might not feel into it. The former — believing that you need to focus on finding the right motivations — is the foundation of procrastination, easing you into wasting years while you hope for an idealized mindset to work on your goals. The latter is simply setting demands on yourself, denying yourself Facebook, Reddit, gaming, and all other distractions or rewards until you've put in the work.
Don't feel like it today? Tough shit. Sit down (or stand, roll on a ball, whatever) and get to work.
Some people would call being your own toughest boss the necessary motivation, all of this just a play on words and definitions. Alright. Just don't get caught in the futile quest for some external fuel when you can only make yourself do things, often against great personal resistance. And when you fail, blame yourself and learn from it, don't search for external scapegoats or "if only" explanations. - Software development is a great job and career, despite the many with negative prognostications: we often don't realize what we have, and when we don't have suffering we invent it or exaggerate minor inconveniences. Few careers offer the comfort and rewards, and potential for excelling individually. I personally don't enjoy traditional type of roles (e.g. work in an office doing something for years on end, listening to boring HR pitches, etc), and that to me is the greatest career danger of software development: I've had stints in my career where years have gone by in a blink, a procession of marginally challenging tasks in meaningless projects for banal employers, that it just felt like a waste of the precious little life that we are granted. If the project isn't important and rewarding, and the experience isn't enjoyable, the money had better be fantastic or look for better engagements.
- For the presentation tier I've long been a fan of client-side rendering, serving up static templates and
scripts and using server callbacks to populate data and generate client-side presentation. This
dramatically clarifies development and offers up enormous advantages for performance, management,
maintenance and security. One of the trends that has taken off in this regard is so-called "serverless"
frameworks where you use function-level granularity to avoid managing individual server stacks with all
of the overhead that entails. e.g. Amazon Lambda, Google Cloud Functions, etc. It's a fantastic
initiative for most web stacks, although it does have the risk of tying you to a specific
implementation/vendor if you aren't careful.
All of that is really just a segue to say that I recently started using Netlify and it is simply a fantastic service. I have been pretty deep in back-end and mobile systems so I didn't pay as much attention to this space as I should, so it went under my radar, but I discovered the service after thinking that the market had a gap to do exactly what Netlify does, so I did some market investigation to see if it's worth pursuing to discover there are already great options. For this sort of site it's just a brilliant solution. To amend the prior bit, I still think Netlify is a wonderful solution, but some new project needs had me rearchitect around serverless with a Cloudflare caching layer. It is astonishing the performance and reliability options available for little to nothing.
If you look at the source each page is the contents that is injected into a core template allowing me to change fundamental design / links / etc without regenerating anything (which was often a problem with static site generators, where a simple change would entail recreating and pushing thousands of pages). The whole root page is commented out to avoid the browser needlessly laying it all out and then doing that again, with the corresponding visual disturbance. - AI is incredibly disruptive and exciting, and is going to yield tremendous change in many industries. The state of AI is already so far ahead of actual utilization, with many of the extraordinary techniques and capacities barely being leveraged in industry. Having said that, right now there is an enormous amount of snake-oil and smoke and mirrors where people are overselling a bit. LLMs, for instance, are fascinating, but a lot of the narrative around their expertise is built on pretty tenuous foundations, and lacks the knowledge of how they work and were built to understand what parts are, in effect, illusions.
Technology Platforms and Social Media Platforms
- I've been a fan of Android since its inception, but if you're adopting a smartphone today it's hard to
beat the iPhone. Apple has incorporated the best elements of Android (notifications, widgets, intents,
freeze-drying of background processes, multitasking, larger handsets, etc), and largely abandoned many
of the restrictive policies that it once plied or openly considered. Android has moved sideways as
Google tries to find a way to make iPhone levels of money on the platform.
I went through the HTC Dream, Magic, Nexus One, GS2, GS3, GS4, Nexus 5, Nexus 6p, GS8, GS10, among others, before moving to the iPhone 8 then XR, 11, 12 Pro, then 14 as my daily driver. The iPhone is a faster device, the software is better quality, security and user privacy are much more pervasive, depreciation and continued utility over time is much more reasonable, and you have access to all the same great Google services without your platform being beholden and open to them. Given that the Android market has basically become the Samsung market, you'll also avoid the split-brain of Samsung trying to foist their duplicates of every Android application and service.
Android is huge and isn't going anywhere, and is also a great platform (with some advantages and some disadvantages), so choosing one or the other isn't going to lead to a destructive hegemony and there really isn't a need to be a platform activist for any industry health reason. - The whole Android ecosystem has gone nothing like I expected. Instead of having a vicious fight on the
processor side yielding excellence and dominance — with OMAP fighting with Tegra fighting with
Snapdragon fighting with Exynos — the field has narrowed down almost exclusively to a less than
impressive Snapdragon and a withering Exynos. Outside of that there are a few firms deploying stock ARM
cores (e.g. Mediatek - ARM makes great core foundations, but it limits the amount of competitive
innovation). It is pretty remarkable when the clear chip innovator continues to be Apple, who arguably
has the least need to do so.
Instead of handset makers doing innovative, novel things, we have a hundred minor variations on an identical theme. - On the pad side it is more absolute: Don't waste your time and money on anything other than an iPad for
home use. If you're tempted by the cheap knock off Android thing at the local ShopMart (even from makers
like Acer or Asus who are still heaving quickly abandoned junk loaded with crapware over a wall), just
save your coffee money for a couple of weeks and upgrade to the iPad. Google essentially abandoned this
market, and in every way the iPad is a better choice unless you plan on using emulators or something
else the platform doesn't support.
Even though our smartphones have gotten bigger, pads are still a great nice to have for casual at home use, not least because it avoids premature wear on our precious smartphone batteries. Grab a bluetooth keyboard and it's a complete computer for what many people do now (e.g. Facebook, websites and web apps, read the news and some books, and as an RDP client to a desktop).
The one major iPadOS deficiency I must note is the complete lack of multiuser support. In an ideal world there would be family pads that each user could authenticate to with their own isolated ecosystem, but this is something still unsupported on Apple iOS/iPadOS. - I'm rocking a series 4 Apple Watch (I've fallen pretty deep into that ecosystem, with my day now
dominated by a MacBook Pro, Apple Silicon Mac Mini, iPhone 14, iPad Pro, Apple TV, and now my
smartwatch is an
Apple Watch — the halo effect at work). After discovering some acute high blood pressure the
cardio
features drew me in. Overall I'm incredibly impressed by the device — polished
and
full-featured and wonderfully integrated with the ecosystem, including unlocking my MBP when I sit at it
(the watch autolocks once removed from the wrist so this isn't the weakness it seems like), though the
battery is what I consider the biggest downside of the device.
I don't take it travelling, for instance, as yet another battery to manage, with yet another oddball charger, is just too much of an aggravation. [As one update, after years of constant use, including tracking sleep for most of it, the battery on my Apple Watch seems to be as strong as ever. It still takes just a brief charge in the morning and occasionally a brief charge in the evening, and has easily been incorporated into my life. At some point I'll upgrade, but thus far I've had no need to] - Windows remains a fantastic platform for development and is my work platform of choice when not using macOS (which, admittedly, has been taking more and more of my development time). The Windows Subsystem for Linux is technically neat, but I just end up using a Linux Hyper-V instance because of minor nuisances and edge incompatibility, to very little additional overhead (to be fully honest, 9 times out of ten I stick to my cloud instances). Don't let anyone grief you about using Windows. For XCode development I primarily lean on an AS Mac Mini, which absolutely blows me away in its effortless performance. I am very much looking forward to what comes next in Apple Silicon. On the go I use an MBP.
- I used to despise macOS (the artist previously known as OSX): the performance on the old Mac Mini, with
5400RPM magnetic disk, was atrocious. Windows made better use of anemic storage speed
making the macOS device feel absolutely glacial in comparison. Using it felt like stepping back in time.
With a fast SSD, especially the ridiculously fast storage in the new Macs, and it is
an entirely different beast. I've actually come to like it quite a bit, and regret harsh words I might
have dropped regarding it. I hope it forgives me. Getting accustomed to the common shortcuts made
working with the OS much more intuitive.
It is, however, positively ridiculous that Apple still sells magnetic disk devices. - The overweight yet "minimalist" text editors that have become the rage (e.g. VS Code, Atom), are suboptimal. Use a real IDE, even if you have to pay a couple of dollars for it. I've become partial to the various JetBrains tools (e.g. IDEA, CLion, GoLand, PyCharm, etc), and am a heavy user and fan of Visual Studio and XCode.
- Microsoft Edge is a pretty decent browser, and is currently my daily driver across all my devices (Windows, macOS, iPadOS, iOS). To make it usable you have to disable a lot of the scumware nonsense they ply it with, such as "coupon finders" or purchase trackers, but when configured it is a great browser with some fantastic usability benefits over the base Chromium. It also gives you a bit of distance from Google's all-seeing eye, at least creating silos of privacy invasion instead of one giant pile.
- I grabbed an nvidia Jetson Nano to control, record, and provide services for a couple of IP security cameras. It works absolutely gloriously. The simplicity of patching together some gstreamer processes, recompressing, running neural networks on the sharpened and cleaned images, etc...just brilliant. I've gone through a lot of embedded/development kits before and this is the first one that truly delights me, offering so much headroom and capacity that I've yet to hit its limits. I hung a fat magnetic drive off it for persistent storage, and a small SSD for processing storage, and it works marvelously. It has just perfectly, and silently, worked with zero problems.
- Developers are, as a group, a profoundly cheap bunch. It's a problem. If you have a legitimate freedom
reason for choosing gratis products that's commendable, but many do it simply because they're too cheap
to pay a penny for development or other tools in our life, tolerating enormous inefficiencies for
imaginary savings.
Optimize your own life and productivity and use the best tools, not just the ones that are free (as in beer). My current subscriptions are many, including the entire Jetbrains suite (absolutely *fantastic* tools), Visual Studio professional, Office, the Adobe suite — it's surprising how often we have a quick graphical need, even if it's just to convert a picture to an SVG — and countless small utilities. I'm a paying user of Logic Pro. I'm a member of the Royal Ontario Museum, the Art Gallery of Ontario, the zoo, and my local conservation authority. In the grand scheme of things these are all very small expenses, but they add considerably to my productivity, personal state of mind, and creative enterprise. It supports a healthy environment around the tooling and the culture of our lives. - I used LinkedIn earlier in my career, but then it reached a point where it felt entirely pathetic. As with most platforms, people's engagement with LinkedIn turned to serving LinkedIn rather than any personal benefit, and people generally only interacted with the system when tenuously employed. It became a negative signal. After an incident where LinkedIn messaged my contacts with "connection" requests (through a dark pattern they used liberally, finally catching me out while clumsily finishing some tasks boarding a train), that was time to remove the apps and delete the account. Anyone who I communicated with only through LinkedIn I didn't actually know at all, so there was no loss. I get that it is a critical tool in some industries, but in software development it is not.
- I tried to get into Twitter years ago but found the experience extremely unrewarding. Musk's
mismanagement and childish antics
make people reminisce about a Twitter that never was: Twitter was
hyper-toxic, did absolutely nothing to inform or educate, and was algorithmically designed to anger and
push people further apart long before Musk took over. 140
characters was perfectly designed to be useless for discourse, but excellent at causing disagreement and
misunderstandings.
Elon Musk is Twitterstein's Monster. He is the perfect example of Twitter-brain, and it is perfect harmony that he purchased the platform.
There is a bitter irony that now that Twitter is failing everyone is jumping to Zuckerberg's Threads.
Food and Drink
- Grind arabica coffee beans with a cheap spice grinder and toss your desired quantity — determined
through trial and error — into an
insulated French press. If it isn't insulated that's fine, I just find that uninsulated French presses
leave you with lukewarm coffee even just to seep. Add just under boiling water and leave for a couple of
minutes. This gets you
96.5% of the way to perfect coffee, and despite seeming artisanal — e.g. "don't have time for that" —
takes seconds of effort and is easily incorporated into the busiest schedule. I've made my coffee like
this for years now.
No filters. No pods. The only daily price is the beans which I then can focus on getting the best (for my tastes). No waste but some wet coffee grinds that go in the compost.
If you're using a spice grinder -- I've had great success doing this for coffee -- occasionally toss in a couple of rough chopped hazelnuts with the beans for a wonderful delight. Probably shouldn't do that if you're using a burr grinder though. - It's amazing how easy a great pasta, pulled pork, roasted chicken or "gourmet" grilled cheese is
(mustard and ripe fresh tomatoes on a nice ciabatta bread with old cheddar...just glorious). These
incredible little spice-of-life things are so achievable by everyone, but whole generations like mine
largely went without even the absolute basics of culinary skills.
Learn the basics because the basics are 95% of great food. It really is amazing what is achievable with ease. - Every kitchen needs a good set of knives. I go with the Henckels' Twin Signature line, and it makes for meditative moments precisely chopping some green peppers, etc. Knife sets are one of those things where people underspend incrementally, buying a bunch of low-quality single purpose junk that clogs up their drawers, and spend more and more buying replacements. Eventually they've spent more for less. Just buy a knife set of good quality. The same theme goes for pots and pans...just get good stuff.
Life
- I've had social anxiety for as long as I remember, and moderate general anxiety. Anxiety medication has
a profound effect on this: while many medications have debatable efficacy, there is no question
regarding the overwhelming effect of anxiety meds. One unexpected effect is that it made me more
"liberal". Irrational fears about remote chances or risks — and overreactions to them — and
a tendency
to view other people uncharitably (always sure of bad intentions, or overly focused on the possibility
of being made the fool or being taken advantage of in some way) have dramatically reduced.
Anxiety is something that we all suffer with, though to dramatically different degrees: the butterflies someone feels giving a presentation to the local user's group isn't the same as the overwhelming fear someone else might have calling a pizza order line. For me this anxiety was absolutely debilitating, and made me repeatedly make self-sabotaging choices to avoid anxiety triggering situations, sometimes destroying enormous opportunities if it required as little as a phone call. - My fitness band has a target of 10,000 steps a day (as an update, now I use the three bands of the Apple
Watch where it motivates you to ensure you regularly get up and about, and in my settings have at least
630 kcal of active movement, and 30 minutes of exercise, which in an average day usually does
coincidentally yield about 10000 steps). For many occupations that isn't a lot but for software
developers it's easy to fall far short and default to an overly sedentary existence. But I always manage
to hit the goal, and feel great doing it. Some laps around the yard, impromptu walks down the street, or
just pounding out a couple thousand steps on the elliptical. It is great to have a steady goal like that
to ensure that days don't go by with the basics of good health being skipped. It also made me hop up
from the computer more often to get little bursts in to ensure that I don't leave too much for the end
of the day.
It's a low bar to set, and I hit the gym as much as I can, but it does help elevate the worst case days where I'm head down in the code and time just rolls past. - After switching to an Apple Watch I set the target to "moderate", which for me is 30 minutes of exercise a day, 630 active calories, and getting up at least once and for a minute per hour at least 12 times during the day. It's a really well thought out target, and in the end I'm usually somewhere around 10,000 steps, albeit with a more diverse, broad set of activities to get there.
- Move on when it's time to move on. I have few regrets in life, but they are dominated by being in situations that were no longer rewarding, yet continuing because it's easier to just keep doing the same thing than change. In my case this was specifically jobs where there was no challenge left, no enjoyment in the situation, and no personal fulfillment, but I kept showing up, sometimes for years on end.
- ...But don't move to the countryside unless you're sure it's right for you. We moved to a house maybe
twenty minutes outside of the city and it
was, in retrospect, not the best lifestyle choice. Suddenly doing anything required lengthy
drives.
The miles quickly accumulate on vehicles,
and with four children everything becomes a giant hassle. Once kids are old enough to have jobs (of the
normal kind teens want to engage in), the cost of the
commute eats most of their wages and drains their initiative. School is a forty-minute bus ride. Ticks,
mosquitoes, mice, and every other countryside delight. Spring is a delight, but there is about a three
day period before black flies start swarming, and once the black flies start fading away, mosquitoes and
deer flies are out in numbers. A constant Sisyphean cycle of lawn maintenance. Rural roads
with zero excess space on the sides, and an endless procession of cars on their miserable commutes
driving far too fast...I walked far more when we lived in the city proper. The
period we
spent in the rural ex-exurbs was time that would have been better spent in a more built-up area, with
more amenities nearby. We moved back into a proper suburb and what a glorious improvement. Being able to actually walk to amenities is such an incredible luxury.
As another in the country vs the city difference, our well water in the country was five-stage filtered and UV light treated, but one incredible difference I've noticed back in the city is that municipal, chlorinated, fluoridated water means that everything -- laundry, dishes, even people -- stay cleaner longer. - Be charitable. Assume the best of others. Reassess and rebase when you predict negative behavior and instead see positive behavior (it will gradually retrain your propensity to assume the worst), and eventually you won't be tuned to only pay attention to negative actions. Don't engage with negative people unless there is significant reason. It likely isn't worth your attention or focus.
- Relax. Breathe. Smell the roses. Live the moment. Don't seek out negative experiences, arguments, or define yourself by your dislikes or negative emotions. Don't intentionally seek out venues to argue, or worse venues where the group is defined by negativity.