Results: 145
-
The Silent Majority of Engineering
A Bit of Perspective
2021-05-01 00:00
Most engineers aren't using all the new shiny tools. Most are quietly coming to <mark>work</mark> every day, writing code in tried and true ways, and getting things done.
I once heard a quote about software engineers. It went something like this:
Most engineers aren't using all the new shiny tools. Most are quietly coming to work every day, writing code in tried and true ways, and getting things done.
The sentiment has stuck with me. It's something that we don't think about all the time as developers.
There's always something new and interesting to learn and try out. There are never ending amounts of opinions and preferences, ergonomics and design.
It's good to keep up to date. It's good to be a lifelong learner.
But what happens when we need to get something done reliably and predictably?
We don't use all the new shiny tools.
We quietly come to work every day, write code in tried and true ways, and get things done.
-
Working in Public
A Way To Be More Open
2021-07-15 00:00
Finished things don't spring up out of the ground in their final state — people have to <mark>work</mark> hard on them. This is my way of pulling back the curtain on how I <mark>work</mark>.
Working in public is the idea that we should all share more of our work in progress. Finished things don't spring up out of the ground in their final state — people have to work hard on them. So working in public is an attempt to show that hard work. Or at least the time and effort that go into things, even if it's just a slow burn over some period of time.
Why would I want to work in public?
This is my way of pulling back the curtain on how I work. It's something that I feel is important and wish that there was more of on the internet.
The internet is such a big, corporate, impersonal, hate-filled mess, but there was a time when it wasn't and it could be cozy again. I consider mkalvas.com to be my version of a cozy little digital garden, safe from the ads, tracking, and noise of the rest of it. I don't know if anyone visits this site and I don't really care.
Another reason to work in public is that I believe that writing (more broadly doing) provides a final generative step in knowledge creation and retention). So anything that I can do to lower the barrier and promote more writing (code and words) is a good thing. One simple thing that can lower that barrier is to allow myself to be more comfortable with unfinished, unpolished things. I find that saying "this isn't done enough to go on the site" results in less doing in the first place.
-
Tech — Work — Ramblings
2016-10-27 00:00
#structure #microblog #tech #ramblings #work #blog
This page serves as a simple index of all my blog posts. This list should be roughly equivalent to searching for the #blog tag.
If you're looking for my shorter #microblog posts, see 202208270000 Microblog.
- 202208010000 Making a Rust Roguelike
- 202206171206 Delivery Performance vs Value Delivery
- 202205150000 Learning Rust
- 202205010000 Making a Fitbit Sense Watch Face
- 202109150000 Idea Gardening
- 202109010000 Prototype Expand Consolidate
- 202108010000 Designing for Big Screens
- 202107150000 Working in Public
- 202107010000 Unifying My Domain
- 202106010000 Rewrites Are (Almost) Never the Answer
- 202105010000 The Silent Majority of Engineering
- 202009010000 The Only Correct Way to Organize Code
- 202007010000 2019 Work Reads
- 202006150000 Gestalt Principles of Design
- 202006010000 Revamping My Blog
- 202004010000 CodeMash 2020 - Review
- 202001080000 CodeMash 2020 - Live
- 201911150000 What React and Kubernetes Teach Us About Resilient Code
- 201810010000 Development Estimates
- 201809010000 Piping Code With GitLab CI
- 201808010000 Cloud Native Computing
- 201807010000 Architecting a More Modern System
-
Leaders work to remove obstacles
2021-06-24 15:48
One of the most important thing that a leader can do for their team is to remove obstacles to their success. Anything that gets in the way of the members' abilities to perform at the peak of their potential is a damper on the output and creativity of the team. Since 202104291947 Our purpose as leaders is to serve others, we can do many things to remove obstacles for the team.
Common obstacles we can remove:
- Not knowing what the end goal is or how we'll know if we achieved it. 202106221151 Define done and 202106221152 Define success to avoid this.
- Being unsure, afraid, or hesitant to make decisions and take action. We can take responsibility and hold on to the accountability for decisions and actions of the team (202104291526 Make the hard decisions). This frees members to be their best and perform creative work from a place of safety (202107291132 Trust is a requirement for higher-level cognitive functions).
- Requiring all work to pass through the leader. It's a common pitfall for leaders to either not trust their team's work or try to be an expert at everything the team does. Because of that, the team is slowed, blocked, and ultimately shown that the leader doesn't trust them. We avoid this by acknowledging and embodying the core tenet that 202104291525 It's not a leader's job to be the best at everything.
-
Work on what matters
2022-06-11 23:10
Make the most out of your time.
Hamming has a good quote about this in 202205092134 The Art of Doing Science and Engineering.
To the extent you can choose, work on the problems that you think will be important.[^hamming2020]
[...] how to do great things. Among the important properties to have is the belief you can do important things. If you do not work on important problems, how can you expect to do important work?[^hamming2020]
Working on what matters is important because the only viable long term bet on your career is to focus on work that matters, do projects that develop you, and steer towards companies that value genuine experience. (202109251140 Play long term-games)
- Avoid snacking — 202204091039 Impact vs effort model of task value and 202106241531 Eisenhower matrix of task value
- 202206112313 Stop preening
- 202206112312 Stop chasing ghosts
What does matter?
This section was written specifically with the responsibilities of a 202206112233 Staff-plus engineer in mind, but is generally adaptable to other situations as well.[^larson2021staff]
Companies operate in eternal iterative elimination tournaments
- Existential issues — nothing else matters if your company stops existing. Note that this isn’t the most efficient place for effort but it should be swarmed on by everyone.
-
Notes are the fundamental unit of knowledge work
2022-09-09 11:42
The number of 202109091129 Evergreen notes written per day might be the most valuable metric for measuring the productivity of a knowledge worker.[^matuschak2017unit] Consider that 202209091141 The goal of note-taking is not to be better at taking notes, it's to be better at thinking. This sharply contrasts to taking transient notes which create busy work without accumulating knowledge (202209091140 Transient notes don't create knowledge).
There are a few good reasons for this metric's value:
- Evergreen note writing helps insight accumulate
- Evergreen note writing helps reading efforts accumulate
- Evergreen note writing helps writing accumulate
If writing is the medium of research and studying nothing else than research, then there is no reason not to work as if nothing else counts than writing.
Focusing on writing as if nothing else counts does not necessarily mean you should do everything else less well, but it certainly makes you do everything else differently. Having a clear, tangible purpose when you attend a lecture, discussion or seminar will make you more engaged and sharpen your focus.
Even if you decide never to write a single line of a manuscript, you will improve your reading, thinking and other intellectual skills just by doing everything as if nothing counts other than writing.[^ahrens2017]
-
Work with people who know they don't know
2022-08-21 14:26
If an expert says something can be done he is probably correct, but if he says it is impossible then consider getting another opinion.1
Experts bring their opinions and knowledge when looking at something new. Whatever doesn't fit into that understanding and frame of reference is dismissed. In this way, they can block innovation.2
The truly great leaps in a field come from novel thinking, not from incremental improvement on the existing paradigm. Note that this doesn't mean that the incremental improvements aren't important and don't set the stage for the bigger leaps. But in order to facilitate novel thinking, we need to approach things without these pre-conceived frameworks.
It's best to work with people who are consistently open to new ideas and humble to lifelong learning.
-
Hamming, R. W. (2020). The art of doing science and engineering: Learning to learn (pp. 336). Stripe Press. https://www.goodreads.com/book/show/53349431-the-art-of-doing-science-and-engineering ↩
-
Epstein, D. (2019). Range: How generalists triumph in a specialized world (1st ed.). Macmillan. https://www.goodreads.com/book/show/41795733-range ↩
-
-
The value of a great tech stack
Non-technical reasons to have a great tech stack
2022-08-13 09:54
I’ve been doing some thinking lately about how much value to place on a great tech stack. There are two lenses in particular that I’m looking at this through: value to a product organization and value to the individual engineer as a measure of the desirability and enjoyment of working there.
I’ve been doing some thinking lately about how much value to place on a great tech stack. There are two lenses in particular that I’m looking at this through: value to a product organization and value to the individual engineer as a measure of the desirability and enjoyment of working there.
-
CodeMash 2020 - Review
A More Formal Report on a Conference
2020-04-01 00:00
A review of the sessions I attended, what I learned, and how I liked the overall experience of CodeMash 2020.
Short Post
I said in my live blog post from CodeMash that I was going to do a follow up to the conference and review the experience. Since there were other people at Beam interested in writing about their experiences too, we decided to pool our effort as a team and write a single post for the Beam Engineering Blog. Because it was co-authored by other Beamers on Beam time, I'm not sure if I should cross-post it in its entirety. Instead, here's a link to the finished product, Yet Another CodeMash Blog Post. Go check it out.
On a final note, if you're on the fence about CodeMash, I'd strongly recommend going. I had a great time and would definitely go back in the future.
-
Unifying My Domain
A Question of Scope
2021-07-01 00:00
Bringing all my projects under one roof.
I've been working a lot of small projects lately, learning some cool things, and wanting to write about it all. At the same time, I want to host the projects so I can link to them and show them off.
So I started updating my old site so that I could use it for hosting these projects, but then thought better of it. Instead of blogging on my blog, putting my portfolio on my homepage, and other things on other sites and domains, I'm just going to put it all in one place.
I think this approach is a good idea for a few other reasons too:
- All the code will live in one place so I'll be much more likely to maintain it and keep evolving it over time to be the tool that I want it to be.
- Building things is quicker and easier because I don't have to bootstrap a new project every time.
- I can easily expose all of my ongoing work to the world.
- There's no question about where something new should live.
On the other hand, there are some downsides:
- The project will get big.
- I'll be constrained by the tech and framework I chose here. It'll be more difficult to show off something like a Haskell project.
- Rewrites are tricky to do well. Though I have a leg up here because I'm the demanding stakeholder as well as the developer and customer.
-
Prototype Expand Consolidate
A Method for Building Maintainable Systems
2021-09-01 00:00
Today we look at an efficient, sustainable engineering loop — prototype, expand, consolidate.
TODO: remove for regular zettel?
The Loop
An efficient, sustainable engineering loop can be describe through the motto prototype, expand, consolidate.[^foote1994] This loop consists of three eponymous phases. This has also been referred to as the Fractal Model of software development lifecycles.
Phases
Prototype
Our primary objectives during the prototyping phase are learning about the problem space and fitting a solution to that. We pick specific portions of the problem space to stake our understanding to and just start building something.
We deliberately don't spend time trying to build perfect understanding and systems during this phase. Doing so is a waste of time because we're inevitably blind to the realities at the end location without walking the path first.
Expand
Our next objective is to expand. Similar to prototyping, we expand our understanding of the problem space and the robustness of our solution. This is the phase where nuance comes in. People find themselves saying "I didn't know that worked like that" or "I didn't know it needed to be able to do that" which causes us to expand our knowledge and systems to incorporate new ideas and functions.
-
The four states of a team
2022-03-24 11:59
It’s hard and slow work, but stay the path to the end. Prioritize one team at a time.[^larson2019]
Falling Behind
- Description — Every week the backlog gets longer, the team is working super hard and not making progress, morale is low, and there’s vocal dissatisfaction from users.
- Fixing and Supporting — Hire net new people. Support by setting expectations with users and stakeholders. Find easy wins to inject optimism.
Treading Water
- Description — Can get critical work done but can’t pay down debt or start new major projects. Morale is a bit better but users know help won’t come when needed.
- Fixing and Supporting — Consolidate effort to finish more things and reduce WIP until the team can start repaying debt. Transfer people from personal view of productivity to team view.
Repaying Debt
- Description — Beginning to snowball when debt is payed down enabling more debt to be payed down.
- Fixing and Supporting — Add time. Your team is working. Find space for them to allow it to continue to work. Try to find overlap with user needs. Prevent backsliding.
Innovating
- Description — Debt is sustainably low, morale is high, and the majority of work is satisfying user needs.
-
2019 Work Reads
A Slew of Short Book Reviews
2020-07-01 00:00
My professional reads from last year, rated and reviewed.
Overview
I like to read. I read a lot about a lot of things, but I would say that I devote maybe 40% of my reading time to things that I'd consider “professionally oriented”. These are books, articles, blog posts, white papers, etc. that I probably wouldn't read if I didn't have a job. They aren't all directly related to my job, but they all make me better in some way.
So here's a list of professional books I read in 2019 (roughly in chronological order) along with a rating out of five possible stars and the two second summary of why you should or shouldn't read them. Spoiler — they weren't all winners.
Clean Code
by Robert “Uncle Bob” Martin
Rating: 3/5
A slightly dated look at how code can be simple and maintainable. There are some good gems that can be extracted for programmers of any language or experience level. A bit long to read all the way through and considerably better in paper format as opposed to e-book because of the code blocks. Definitely worth a look if you're a day-to-day coder.
-
Know what's good enough
2023-12-09 14:13
In most areas of work, there's a time when the work done is good enough.1 This point is reached when there's less value in continuing to work on the project than there is in finishing it.
The difficulty lies in knowing where this point is. It can be extremely challenging without concrete data or if we can't 202309011327 Define metric to value transfer functions using sensitivity analysis.
-
Thomas, D., & Hunt, A. (2019). The pragmatic programmer, 20th anniversary edition: Journey to mastery (Second edition) (pp. 11-12). Addison-Wesley. ↩
-
-
Impact vs effort model of task value
2022-04-09 10:39
The impact vs effort model of task value is a simple two axis graph that's split into quadrants.
Along one axis we have the value/impact of a task from low to high. Along the other we have the effort it takes to complete that task from low to high.
The quadrants then break down as follows:
- Pit of despair — low impact, high effort tasks. There's nothing good about a low value task that's incredibly difficult and time consuming. It's our job to stay out of this quadrant at all cost. The good news is that it's typically easy to detect these pits and avoid them.
- Snacks — low effort, low impact tasks. Tempting to indulge in because they're quick to build, but they don't offer much value and amount to busy-work. This is an easy and insidious quadrant to get trapped in. Many many organizations reward performative work #thread in this quadrant.
- Quick wins — low effort, high impact tasks. These are the best things to work on. The only downside is that a mature organization will soon run low on items here and need to fill their time with tasks in other quadrants.
- Deep work — high effort, high impact tasks. These are what we should be filling our time with when the low effort high value tasks are dried up. Instead of drifting to "snacks", we should deepen our efforts, dig in, and apply ourselves to long-term, valuable work. It can be hard to get buy-in for this type of work because many people favor short-term games, but as we know, we should be trying to 202109251140 Play long term-games
-
Humans can't multi-task
2021-10-18 12:47
Humans are notoriously terrible multitaskers. We have no ability to genuinely concentrate on two things at once. Focusing on a single task at a time and fully committing our attention to it is far more productive than trying to do multiple things at once.
Studies show that our performance on tasks completed during multitasking is much lower than when we focus on one at a time. They also show that regular multitasking can decrease your ability to focus over time.1
-
Brain and Spine Team. (2021, March 10). The Science is Clear: Why Multitasking Doesn’t Work. Cleveland Clinic. https://health.clevelandclinic.org/science-clear-multitasking-doesnt-work/ ↩
-
-
My next level
2021-09-06 08:25
I'm 30, what do I want to do by the time I'm 40? 10 years is a long time, but will be here before I know it.
Some candidate ideas that have consumed mind-share before now:
- Continue down the tech leadership path
- Blaze an entrepreneurial trail of my own
- Research and create something completely new
- Write a book
- Are any of these what I want?
- What would it take for me to pick one and follow it relentlessly?
- Is there a way to do more than one in a meaningful way?
The first thing is 202205231130 Knowing when to leave.
- Leave
- Stay
After that our paths diverge:
- If I leave, where do I go, how do I decide, what would I want to work on, what areas would I want to grow in?
- If I stay, what do I want to work on, what areas do I want to grow in, what is my future, what goals do I have?
A note on open-ended work
For much of the ground-breaking work, the challenge lies even in figuring out what to do. Not just how to do it. Breaking things down and checking things off a list day in and day out isn't satisfying looking back on a year's time span or more. If things can be broken down that easily and checked off, it must not be all that interesting.
-
Staff engineer promotion packet
2022-07-31 09:47
Here are some questions to ask yourself in order to prepare a promotion packet for a staff engineering position.
- What are your Staff projects? What did you do? What was the project’s impact (including a well-defined goal)? What made this project complex? Keep it very short and then link out to supporting design documents1
- What are the high-leverage ways you’ve improved the organization?
- What is the quantifiable impact of your projects? (Did you increase revenue by $10 million? Did you reduce year-on-year customer support tickets by 20%?)
- Who have you mentored and through what accomplishments?
- What glue work do you do for the organization? What’s the impact of that glue work?
- Which teams and leaders are familiar with and advocates for your work? What do they value about your work? One sentence, include data (e.g. survey data) when possible
- Do you have a real or perceived skill or behavior gaps that might hold you back? For each, how would you address the concern? One sentence each
-
Larson, W. (2021). Staff engineer: Leadership beyond the management track. https://staffeng.com/ ↩
-
Value of employee time
2022-11-12 12:53
A simple table to relate an employee’s time cost to proposed time savings.
All values are per $100,000 in total compensation cost to the business and use average values for time, which is calculated as follows.
Given $365.25$ days per year $= \frac{1461;\text{days}}{4;\text{year}}$ and $\frac{5;\text{weekdays}}{7;\text{days}}$.
We have $\frac{7305}{28}$ weekdays per year and $\frac{1461}{28}$ weeks per year.
Using this and the rate of 8 work hours per weekday our total work hours per years and weeks are
$$ \frac{58,440}{28} = \frac{14610}{7} = 2087 \frac{1}{7} = 2087.\overline{142857} ; \text{work hours per year} $$
and (unsurprisingly)
$$ \frac{14610;\text{work hours}}{7;\text{years}} \cdot \frac{28;\text{years}}{1461;\text{weeks}} = 40 ;\text{work hours per week} $$
Percent Weekly Total Total (Exact) Weekly Cost Total Cost 100.000% 40 hrs 2087 hrs $2087 \frac{1}{7}$ $1916.50 $100,000.00 50.000% 20 hrs 1044 hrs $1043 \frac{4}{7}$ $958.25 $50,000.00 25.000% 10 hrs 522 hrs $521 \frac{11}{14}$ $479.12 $25,000.00 -
Remote team management
2021-10-22 08:45
This structure note records my learnings from taking the Coursera How to Manage a Remote Team course.[^murph2020] These notes come from a time before my Zettelkasten and are longer, more verbose, and less atomic than I'd normally like, but I'm just going to leave them as they are. That way, I can link to them and search for their contents without investing the time in breaking them down more.
Managing a team of remote workers presents unique challenges and opportunities:
Communication is Crucial
Embracing Asynchronous Communication
In a world dictated by calendars and schedules, people are conditioned to operate in synchronicity — meaning that they inhabit the same physical or virtual space at the same time. Asynchronous communication is the art of communicating and moving projects forward without the need for collaborators or stakeholders to be available at the same time your message is sent.
In an all-remote setting, mastering asynchronous workflows is vital to avoiding dysfunction and increasing efficiency. The benefits include enabling your team to work effectively across time zones, reducing meetings, and enabling team members to work on a flexible schedule — all of which raise morale and productivity. However, shifting to this way of working requires a lot of large and small adjustments.
-
Limit WIP to increase throughput
2021-10-18 12:46
Limiting the amount of work in progress can increase the total throughput of the system. 202110181247 Humans can't multi-task in a literal sense of concentrating on two things at once. We also can't multi-task in the sense that trying to switch between two tasks repeatedly slows down our ability to understand and complete those tasks. We are much better off pursuing deep 202109091123 Flow state work.
Taking this one step further, we see that it's better to deeply focus on one thing at a time in order to actually increase our total output.
Another extrapolation is that teams of individuals should reduce their WIP as much as possible, but may be able to sustain multiple threads. The size of the team, the threads of work, and the knowledge/skills of the members likely contribute to the optimal number. Is there a way to estimate this ideal number of threads? #thread
-
Architecture as a form of procrastination
2024-07-18 10:26
Don't let architecting your application, library, or system prevent you from doing the actual work that needs to be done. It's better to have something working and shipped than to have it be perfect the first time.
Avoid architecture as a form of procrastination. [...] There's a lot of disguised procrastination in dev in general. Lots of working around the work, planning how to work, talking about the work, instead of actually working. And I know there's a balance to that because you want to think about what you're doing beforehand, before you do it, and have a good plan.1
202106221150 Procrastination is a complex subject with a range of causes and effects. Architectural 202109090909 Decision paralysis could mean that we need to just get something going in order to make progress and get a better feel for the problem space (throw one away #thread).
Knowing when to architect and plan ahead vs just get moving is something that comes with experience, and can be a good indicator of people who can operate at the 202206112236 Senior engineer or 202206112233 Staff-plus engineer level.
-
Otwell, T., & Stauffer, M. (2024, June 24). The Laravel Podcast | Listener Q&A: ChatGPT, Laravel Hangups & Best Practices, API Docs, Inertia Next Steps (S6:E13) [Broadcast]. https://laravelpodcast.com/episodes/listener-q-a-chatgpt-laravel-hangups-best-practices-api-docs-inertia-next-steps ↩
-
-
The quality of your decisions is the currency of leadership
2021-10-05 20:25
Check your work. Ask for help. Slow down.1
As a leader, our reputation and competence comes from our track record on decision making and trust situations. Often we're asked to 202104291526 Make the hard decisions and how we handle that situation ends up being our track record. You don't get an infinite number of chances at these things either. At some point, you'll lose the trust and confidence of the people you work with. That's a place that's very hard to come back from.
So we need to check our work, ask for help, and slow down even when people are screaming that everything is on fire and you're the only one who can make a decision.
-
Lopp, M. (2021, June 25). The Hotel Giraffe. Rands in Repose. https://randsinrepose.com/archives/the-hotel-giraffe/ ↩
-
-
Rewrites Are (Almost) Never the Answer
A Difference Between Desire and Reality
2021-06-01 00:00
Rewrites are tricky to get right. Despite how often we're drawn to them, they're almost never the right solution.
As a developer, my first reaction when getting into a legacy codebase is almost always to bulldoze and rewrite it. Unfortunately, rewriting code is commonly a huge mistake for software companies.
If you've been around long enough, you've probably read the classic article by Joel Spolsky, a founder and ex-CEO of StackOverflow where he names rewrites the "single worst strategic mistake that any software company can make." In this article he walks through a dot-com era rewrite by Netscape that was such a bad idea, it can track directly to the downfall of the company.
As developers, want to do rewrites because we get our excitement from building things that we can call our own — grand, shiny towers of our Legos that we can point to and say, "I did that." But according to Spolsky, there's more to it.
There's a subtle reason that programmers always want to throw away the code and start over. The reason is that they think the old code is a mess. And here is the interesting observation: they are probably wrong. The reason that they think the old code is a mess is because of a cardinal, fundamental law of programming:
-
Architecting a More Modern System
A Look at Microservices
2018-07-01 00:00
Making the move from one monolithic service to many microservices can be a complicated process. Here are some reasons why we decided to make the move anyway.
We have a need for external businesses to be able to embed parts of our apps into their front ends, connect with our APIs, and not bother the third parties with implementation or data handling details. We also don't want to have to maintain too many different solutions and technologies, so if possible the solution should overlap with our own internal needs.
The Solution
Microservice architecture to the rescue, but what really does that mean besides being a marketing buzzword? I'm going to cover three core ideas of microservices: decoupling, distribution, and technology agnosticism.
Decoupling
The obvious result of turning one application or service into many is that the resulting services are less tightly tied together. For people who aren't developers, it might not be obvious why services that are less reliant on each other might be better than the alternative.
As in all things, programmers deal with side effects of their actions, or more precisely, the actions of their code. Without getting into too many details, programming side effects can be nasty. There are a whole host of frameworks, technologies, and design patterns that are specifically built to avoid unwanted side effects. Microservice architecture isn't built with that sole goal in mind but it does help us mitigate side effects by requiring our service to have well-defined interfaces for interacting with other services. Basically, when turning one application into many that act as one, we need to take the time to define how they talk to each other including any security and permissions that exist as part of those interactions. We now have a single point of failure for these interactions. It also means that one service can't accidentally do something with another service that it's not supposed to. It's much easier to test our services' internal logic, test their interactions with other services, and even test adding new external services before they even exist. Decoupling leads to more secure, predictable, testable, and fault-tolerant systems.
-
First Reactions to React
A Review of Building My First React App
2018-06-01 00:00
We're moving our corporate site in house and I thought it would be the perfect time to try out a new javascript framework.
There are plenty of good javascript frameworks out there right now; among the most popular are Vue.js, Angular, and React. (Yes, I'm aware that React is a library not a framework, but for the sake of this article, I'm going to set that aside.) There's also a ton of posts and articles that can help you understand the differences between them if you're not familiar. Breaking down all the reasons we chose React over the other two would be a whole post in itself. Maybe I'll write something comparing the frameworks and our opinions on their features in the future. For now, it's enough to say that we took a hard look at all three of these and we felt that React was the best choice for our specific situation.
Diving In
We're using webpack for build tooling, a React front-end, and a C# .NET Core API backend. Getting started was the most challenging part of the whole process with the majority of the issues coming from the webpack configuration. I only ever used gulp before and we wanted to switch to webpack so that we could more easily bundle and ship specific components to third-party API consumers. I'm sure that someone more experienced with webpack could have gotten up and running in much less time than it took me, but it's always nice to have the opportunity to learn a new tool. Besides my personal inexperience, there were some versioning issues between the .NET world and the NPM world that we needed to resolve. We also added to our own headaches by using a slightly wonky legacy environment setup (that's hopefully going away shortly) and by having some external requirements from businesses we partner with. With all of the preliminaries out of the way, we could finally get coding.
-
Development Estimates
A Different Take on a Contentious Practice
2018-10-01 00:00
How to get value from development estimates and why I've learned to love them.
Working as a programmer, I can't count the number of times that I've heard colleagues complaining about development estimates. Some of the complaints are simply grumblings of people who aren't generally cooperative. There's not much you can say to these people to change their minds. Other complaints are valid reasons that a lot of estimates aren't valuable or realistic. Here are 5 common mistakes that I see and what you can do to avoid them.
A Story
Let's start with an all too familiar story.
TechCo needs to develop a new product that will fit in with their offerings.
Jane the manager asks John the developer how long it will take to build the product and how much it will cost.
John says he'll think about it and get back to Jane. The next week during their weekly developers' meeting, John gives Jane an estimate that he thinks is reasonable.
Jane gives John's info to upper management who make a decision to go ahead with the project.
Months later when the project is about to meet its deadline, John, Jane, and upper management realize it's not going to be done on time and start trying to figure out what happened. Upper management puts pressure on Jane to make John finish on time. Jane pushes John hard to finish on time. John ends up finishing on time after putting in an 80 hour week. John is burnt out, Jane is glad to have upper management off her back, and upper management are happy the product went out on time.
-
Care about your craft
2023-08-28 14:02
We feel that there is no point in developing software unless you care about doing it well.
Care about your craft.
Think! about your work.1
Think about what you're doing. Take pride in what you produce. Take joy in the craft, the puzzle, the mastery that you gain over time. Make code that works for you that other people will see, understand, and be able to work with.
This is a similar, highly overlapping concept to 202308282340 No broken windows. Don't let things slip even a bit, and care that it's all done well.
-
Thomas, D., & Hunt, A. (2019). The pragmatic programmer, 20th anniversary edition: Journey to mastery (Second edition) (pp. xxi). Addison-Wesley. ↩
-
-
Overcoming poor performance of a peer
2022-03-24 11:27
It is possible to fail in an organization primarily because we want to hold others to a higher standard than our organization's management is willing to enforce.
The basic pattern of one of these scenarios goes like this. We're trying to do our job effectively, but can't due to the low performance of a peer. We escalate our problem to our manager, but they transform the issue into one about interpersonal conflict or relationships instead of addressing the performance issue of the other individual. This (avoidant) transformation pushes the responsibility back onto us and if we persevere and insist on driving accountability for the peer, we block our own progress, becoming "hard to work with", without accomplishing anything.
Typically this scenario is not because the manager lacks the knowledge that there is an issue. It's more likely the manager knows about the problem but is unwilling or unable to address it directly.
There are two approaches for dealing with this scenario:[^larson2022peer]
- Have a direct discussion but frame it by asking your manager why they are comfortable maintaining the status quo. This can be uncomfortable for you and them, so be careful. If this is successful, it'll still be a slow change anyway.
-
Ten percent time
2023-04-11 22:03
The concept of "10% time" (or any given percent) is the idea that we set aside 10% of our work week for non-immediate work problems.
While it doesn't have to be each work week, it's important to do this 10% time on a regular basis. It could be daily or biweekly, but it shouldn't be less frequent than that.
This practice helps us avoid staying immersed in the sea of detail where almost everyone stays almost all of the time. We need to examine the big-picture on a consistent, frequent basis for many years (202304041619 Keep the whole in mind, 202203231646 Affecting long-term change) especially if we're going to be leaders instead of followers.
The well supported[^hamming2020] outcome is that the value we get out of this time is greatly repaid through the process in both direct (202304102048 Compounding Interest) and indirect (202106221146 Leverage) ways.
As a software developer, we might experiment with new tech, do some independent learning, get around to cleaning up that bug in the developer experience flow that is annoying you, or anything else. It's an open ended time for research and development, for thinking, for play and experimentation, and for inefficiency.
-
Creative accomplishments happen over time
2022-11-03 09:58
We need to allow our ideas to germinate (which requires time) in order to come to fundamental, novel understanding of interesting problems.
History shows that the typical pattern of creativity is as follows:[^hamming2020]
- There is at least some dim recognition of a problem.
- A short or long period of problem refinement. This stage is important because it's likely that our experience will phrase the problem in a conventional way leading only to mediocre or conventional solutions. We must give ourselves time to fully understand the problem for what it is outside of our pre-conceptions. We might even abandon the problem for some time (allowing our subconscious to work on it 202109090947 Idea gardening). However, we must be emotionally involved and want to find a fundamental, novel solution.
- The moment of insight or creativity. This may only be an attempt and might not work but it leads back into step 2. There are also times when we can change the problem itself to fit the solution or perhaps ask ourselves "If I had a solution, what would it look like?"
- Often there is still much work to be done cleaning and refining even the closest, most correct solutions once the problem has been "solved".
-
Knowledge is constructed
2021-09-06 08:35
Constructivism and also Constructionism are theories of knowledge that requires there to be a learner for knowledge to exist. Until someone learns information, connects it to things they already know, and internalizes the information in a personal context, knowledge cannot exist.
Supporting arguments
- Having a text or reference at hand does nothing to increase knowledge, we have to create something, do the work, wrestle with the ideas, and engage effortfully to create our own knowledge.
- Research works better one thing at a time. Find a source, process it to completion, then use your newfound knowledge to find another source. If we don't, we run the risk of picking sources that are useless by the time we get around to reading them. Processing to completion includes writing about what you've read. This is where these notes come in. We take transient notes as we're reading and then write our thoughts here or in drafts of actual writing. (Iterative accumulative approach to writing #thread and writing is important #thread)
- Consider that data patterns and descriptions mean nothing on their own. For instance, strongly correlated but spurious patterns may be obviously meaningless.[^vigen2013] Instead, we require a pattern or description (what), an interpretation of that pattern (why), and — critically — to synthesize multiple interpretations, hypotheses, theories, or models into a bigger picture and create something useful or interesting (why why or higher level why). Patterns and interpretations are the main work of our knowledge management system here. Synthesis happens when we write about (or just read and string together all the knowledge we accumulate in the system).
-
The Art of Doing Science and Engineering
2022-05-09 21:34
An excellent book by Richard Hamming on doing science, 202203210833 Systems thinking, 202208131327 System design, and having 202205231312 A Career.[^hamming2020]
- 202207271527 An order of magnitude of change produces new effects
- To the extent you can choose, work on the problems that you think will be important (202206112310 Work on what matters).
- 202207271530 Expertise is required to create useful simulations
- 202207271958 Stability or instability dominates a system
- 202207272000 Garbage in, garbage out
- 202208211340 Users can affect the validity of simulations
- 202208211331 Simpson's paradox
- 202208211352 There is no shortcut to learning
- 202208211358 Hawthorne effect
- 202208211404 Learning to follow and learning to lead
- 202208211426 Work with people who know they don't know
- 202211031026 The unreasonable effectiveness of mathematics
- 202211030958 Creative accomplishments happen over time
- 202110251122 Analogy is a highly effective communication method
- 202304031221 Breadth of knowledge fuels analogy
- 202308271108 Construct hooks for future knowledge
- 202304041100 Learn, don't memorize
-
Decision paralysis
2021-09-09 09:09
When we're paralyzed while making a decision, we might subconsciously know that there's a vital piece of evidence missing that would weigh into the decision.[^rands2021decide] In these situations, there's not much more conversation that's needed. This is the time for thinking. Go for a long bike ride, sweat, work, and think. Submerge the idea into the depths of your brain where your experience is speaking to you, trying to hint at a solution. Let it take root and grow back into the sunlight (202109090947 Idea gardening).
But maybe, we just need to decide and there isn't anything more to it.[^rands2021decide] Your brain might be hoping for another piece of information where none exists. As leaders, we must 202104291527 Live in the ambiguity and make decisions with imperfect information in 202109090945 Wicked learning environments. Over-analyzing the situation is a form of 202106221150 Procrastination driven by the difficult, stressful, ambiguous, and unstructured nature of these situations (202106221122 Procrastination is triggered by emotional aversions.
Either way, making a decision causes a great sense of relief and a desire to get to work.[^rands2021decide] Often, even if we make the wrong decision it turns out to be more reversible or equal than we build it up to be in our heads. Making any decision can be viewed as forward progress even if we end up feeling like it was the wrong decision.
-
Flow state
2021-09-09 11:23
A state of mental being characterized by extreme focus, productivity, and the ability to hold and traverse an enormous amount of context in your head. It can be described as being "in the zone" or "completely absorbed" in what you're doing.
The term was first coined by Mihály Csíkszentmihályi in his work Beyond Boredom and Anxiety: Experiencing Flow in Work and Play1 and later popularized in his widely regarded book Flow: The psychology of optimal experience.2
Despite its name, the 202109091124 Anti-flow state is more related to flow state than against it. The difference primarily arises in the activity that one is absorbed in. Anti-flow makes use of an absorption in something other than the idea we care about in order to allow that idea to have room to evolve in our subconscious mind.
-
Begin with the end in mind
2021-06-22 17:44
Do not just act. Think first. Before we act, we should act in our minds. Is this how I think it will go? Is that how I want it to go? Are those the consequences that we wish for?
This habit applies to all areas of life.
In business, it usually means that we should set a goal and stay true to measuring ourselves against those outcomes as we work. Are the projects we're undertaking helping us reach that outcome?
In life, we should envision the type of future that we want to have so that we can plan and work towards it. We must act based on principles and constantly review our mission: am I who I want to be right now, what is my opinion on how my current life aligns with my principles, how do I want to be remembered?1
-
Covey, S. R. (2004). The 7 habits of highly effective people: Restoring the character ethic (Rev. ed.). Free Press. ↩
-
-
Gestalt Principles of Design
A Crash Course on the Whole
2020-06-15 00:00
Today we're looking at 'die Gestalt', the result of early 20th century studies in psychology that described how humans perceive the world, and how it can help us make outstanding user interfaces.
Gestalt Psychology
Gestalt (ɡəˈʃtælt) feminine noun: 1. An organized whole that is perceived as more than the sum of its parts.
Around the turn of the century, German and Austrian psychologists were investigating the human mind's ability to perceive the world around it. Even though we're confronted with a world filled with exceptions and strange sights, we can somehow sort it all out. How do we come to form a meaningful, consistent perception of reality based on the chaotic conditions around us?
The prevailing conclusion of this school of psychology is that when perceiving the world, the mind sees eine Gestalt — or a "global whole" — instead of a collection of individual parts. The mind also has the ability to organize these wholes into even larger wholes. For instance, the mind can recognize a hat or a person as a whole object instead of a collection of lines and curves, but our mind can also perceive a larger whole of a person wearing a hat instead of seeing two smaller unrelated objects near each other. According to one of the founders of Gestalt psychology, Kurt Koffka,
-
Yearn for the vast and endless sea
2022-11-02 10:54
If you want to build a ship, don’t drum up the men to gather wood, divide the work, and give orders. Instead, teach them to yearn for the vast and endless sea.
— Antoine de Saint-Exupéry
This quote is a modern rendition that has been morphed over time from Saint-Exupéry's 1948 work Citadelle.1
One will weave the canvas; another will fell a tree by the light of his ax. Yet another will forge nails, and there will be others who observe the stars to learn how to navigate. And yet all will be as one. Building a boat isn’t about weaving canvas, forging nails, or reading the sky. It’s about giving a shared taste for the sea, by the light of which you will see nothing contradictory but rather a community of love.
-
Quote Investigator. (2015, August 25). Teach Them to Yearn for the Vast and Endless Sea – Quote Investigator. Quote Investigator. https://quoteinvestigator.com/2015/08/25/sea/ ↩
-
-
Learning to follow and learning to lead
2022-08-21 14:04
What you learn from others you can use to follow; What you learn for yourself you can use to lead.1
If you put in the hard work (202208211352 There is no shortcut to learning) to learn something for yourself, you'll know it through and through. You'll be able to make connections to other pieces of information. You will have constructed durable knowledge for your life (202109060835 Knowledge is constructed).
I often think of this in relation to 202109061338 Software Engineering where some of the simplest tools to learn end up causing the most pain down the road, whereas tools that teach you how they work even if it takes more effort end up being more stable, reliable, and maintainable. #thread (move to own zettel)
-
Hamming, R. W. (2020). The art of doing science and engineering: Learning to learn (pp.292). Stripe Press. https://www.goodreads.com/book/show/53349431-the-art-of-doing-science-and-engineering ↩
-
-
High performing teams
2021-09-25 10:35
A common term in the current 202104291523 Leadership zeitgeist is "High performing team". What that means exactly is hard to pin down. There are as many definitions as there are managers in the world.
Defining when a team is high performing
- They 202106241525 Synergize. The team works in a way that complements each others efforts.
- The team works on high 202106221146 Leverage projects to compound their returns over time.
- The team has...
- A common purpose (202108191025 Teams exist for a reason)
- Clear roles
- An accepted leadership structure
- Excellent communication
- Solid relationships
- An effective process in place for getting work done well (202104291524 Execution is the priority of team management) and understanding if that work is effective and valuable (202108191029 Measure what you do.
- Participative leadership – using a democratic leadership style that involves and engages team members
- Effective decision-making – using a blend of rational and intuitive decision making methods, depending on that nature of the decision task
- Open and clear communication – ensuring that the team mutually constructs shared meaning, using effective communication methods and channels
-
Aegri somnia
2022-09-12 13:42
Aegri somnia, meaning troubled (literally bitter) dreams.
A chapter title in Twenty Thousand Leagues Under the Sea.1
-
Verne, J. (2015). 20,000 leagues under the sea (L. P. Mercier, Trans.). Starbooks Classics Collection. (Original work published 1870) ↩
-
-
Teams abstract individuals over time
2022-02-01 14:05
Ideally, teams hold knowledge, distribute work, and amplify members' efforts. They do this by making the specific individual replaceable over time.
While each individual is critical to a team at a specific moment in time, a generic individual is not critical to team over a period of time. This is a good example of 202104291540 Emergence because this property does not exist in the particulars, only in the sum of their interactions.
The team as a whole is responsible for the creation and later 202110231449 Externalization of knowledge. When one person leaves, the whole of that team’s knowledge doesn’t leave with them and can be passed on to new members.
The team as a whole allows for individual variations in workload, knowledge, and expertise. Teams amortize ups and downs and average out the flow of work in and out of the team while allowing individuals to be human, learn, and grow, take time off, engage and disengage, and be passionate about different things.
The team amplifies individual efforts in the same way. Different perspectives, knowledge, and experience allow individuals to do more through mutual support than they could do individually.
A valuable corollary to this abstraction is that 202204301406 Teams should own critical knowledge.
-
Shades of Self
A Look at Who We Are
2018-05-01 00:00
A rambling, philosophical look at how we exist as distinctly separate individuals in different situations.
I was in an unusual debate at work the other day. I took a stance that was odd for me which led to some introspection. Why did I debate for a position that I wouldn't typically support? I felt that I was disingenuous or dishonest towards my co-workers, but is that true? Is it possible for me to maintain different perspectives on the same subject depending on the context of the debate? If so, can I do that without being self-serving or hypocritical?
I believe that it's not only possible to maintain these different levels of self without being unethical, but also that most people probably do it every day without even realizing it. I've identified five different levels of my self that I express based on where I am, what I'm doing, and who I'm with. In my head, I picture these as a pyramid where the topmost level is the most restricted, manicured, public version of ourselves and the bottom is the most personal, intimate version.
Professional Public
We start at the top of the pyramid with our most carefully crafted public identities. This is the persona that we show during an interview or formal meeting. I like to call it the Professional Public self. It's the level that we feel most comfortable with the world seeing. It's where we put the information that we want people to see and know about us: our professional accomplishments and things we're proud of.
-
Netflix cultural model
2021-09-27 14:32
Netflix's cultural model is about giving high performers the autonomy to creatively work towards solutions without roadblocks and process to slow them down (202106241548 Leaders work to remove obstacles).
The model is applied in 3 phases, with each phase consisting of the same 3 steps: increasing talent density (A), introducing candor (B), and removing controls (C).[^hastings2020]
This method revolves around The Keeper Test
Who on your team would you fight to keep and how hard would you fight to keep them?
This test is supposed to cut to the heart of the question, "why do we keep mediocre performers on our teams?" and answer it with a resounding, "if you wouldn't fight to keep them, you should remove them now and help them find a place where they can be successful." (202109251035 High performing teams)
Phase 1
- A. Hire high performers
- B. Encourage loads of feedback (202205021956 Feedback is for changing behavior)
- C. Remove vacation, travel, and expense policies
Phase 2
- A. Pay top of market
- B. Emphasize organizational transparency
- C. Remove decision making approvals
Phase 3
- A. Implement the Keeper Test
- B. Create circles of feedback (202110231515 Feedback loop)
-
The Art of using a Zettelkasten
2021-07-27 22:42
Using a Zettelkasten is more of an art than a science. It's a personal relationship with an extension of your knowledge. Above all, it's important to just consistently work and think in this system to get the most out of it.
Personal preferences
- 202109091129 Evergreen notes
- 202107272238 When to write a new Zettel
- 202107292312 Project structure notes should answer a question
- 202107292136 The context of a link should give you a reason to follow it
- 202109091133 Notes should associate organically
- 202109091131 Notes should surprise us
- Use a reference manager. The references in the manager should only be ones that have been read and processed, ready to be cited in Zettel as I write them as the last step to processing a source. Don't clutter the reference manager with things I would like to read some day.
- Use a plain text editor and files. This makes everything much more cross-compatible and future proof.
Workflow
There are categories of things that I do regularly, and my Zettelkasten has a specific single place in a broader workflow. It's important to understand how we think and how the processes we use to do that thinking and synthesizing affect your ultimate knowledge (202109080847 As We May Think).
-
Delegate to the floor
2021-06-24 15:30
In the 202108031351 Block model for maximum capacity, work that flows from the top down in an organization is delegated from level to level. We know that 202108031350 Delegating increases the significance of tasks, but one thing that's unclear from the model is how anything ever leaves the system. We obviously can't have infinite work piling up and never leaving.
Considering the model tells us there are only two options for tasks — do or delegate — we find one solution to balancing the flows in and out (202203210833 Systems thinking) is the obvious. Do the task. This is good for one off items. We do the task and it goes away. It's no longer taking up bandwidth and we can pick up something new.
This obviously doesn't solve the problem for ongoing or repeated tasks though. If ongoing and repeated tasks are never able to leave the system, wouldn't we still end up with an overflow of work for the available capacity?
This is where delegating to the floor comes in. We delegate to the floor when we simply decide we're not going to do something. By not doing certain things, we remove them from our capacity and create an exit flow for the system.[^auzenne2014floor1][^auzenne2014floor2]
-
Delegating increases the significance of tasks
2021-08-03 13:50
The 202108031351 Block model for maximum capacity has interesting ramifications on delegating work to direct reports.12
In the block model, each person has the two options: do a task or delegate it. What we don't get immediately from the definition is the corollary that the act of delegating a unit of work increases it from a small block to a large block.
This happens for two reasons:
- If you're told to do something by your boss, it becomes important even if it's not a big deal.
- If your boss is delegating it to you, it's likely a new experience and might require some growth or new skills to accomplish. Therefore it's more difficult, time consuming, or challenging.
Another behavior that the model describes implicitly is how we can 202106241530 Delegate to the floor.
-
Auzenne, M., & Horstman, M. (2014, October 11). Delegating To The Floor—Part 1. Manager Tools. https://www.manager-tools.com/2014/09/delegating-floor-directs ↩
-
Auzenne, M., & Horstman, M. (2014, October 26). Delegating To The Floor—Part 2. Manager Tools. https://www.manager-tools.com/2014/09/delegating-floor-directs-part-2-hall-fame-guidance ↩
-
Firmitas, utilitas, venustas
2022-05-04 11:05
Strength, Utility, Beauty.
202205041102 Vitruvius declared that all buildings should have these three characteristics in his work De Architectura. This concept was widely adopted in Roman architecture.
-
Science can only amplify
2022-09-20 14:14
Underneath the general optimism of Verne’s novels lies a kernel of pessimistic truth: science can do nothing but amplify the natural attributes of humankind, including hatred, violence, and vengeance.
— Victoria Blake, Introduction to Twenty Thousand Leagues Under the Sea1
-
Verne, J. (2015). 20,000 leagues under the sea (L. P. Mercier, Trans.). Starbooks Classics Collection. (Original work published 1870) ↩
-
-
Notes should be densely linked
2021-09-09 11:32
Pushing ourselves to add lots of links to our 202109091129 Evergreen notes makes us think deeply about the connections that a concept might have (202109091134 Notes should be concept-oriented).[^matuschak2017dense] Since 202209091130 Notes should be atomic, we can also make links across boundaries that might even surprise us (202109091131 Notes should surprise us).
Finding the right links is also valuable. It requires that we re-read old notes and approximate a spaced repetition pattern.
By recording connections manually and intentionally, we build fine-grained associations between our atomic notes. These fine-grained associations allow organic structures to emerge (202109091133 Notes should associate organically). The network of connections that emerges here is arguably more valuable for knowledge accumulation (202109060836 Knowledge should accumulate) and management (202109060845 Knowledge is a heterarchy) than the contents of the notes themselves.
202209091142 Notes are the fundamental unit of knowledge work and manually connecting them amounts to nothing short of interpreting the units and finding patterns. From there, it's trivial to synthesize our multiple interpretations and models into a final thought — for instance, a written work.
-
Minimum Viable Replacement
2024-05-03 14:00
About 100x as long as needed and poorly written. Did not even introduce a “framework” in the end, literally just set up the problem and ended with GLWTS. But the slides are good.
The problem: Replacing an existing system is the exact opposite of an MVP
If you’re trying to retire a legacy platform — instead of having the luxury of just solving very specific customer segment needs — you need to solve the needs for every customer segment using your software! [...] Instead of trying to solve the needs of just one small segment, you now have to deliver 20 years worth of software development for thousands of customers across multiple countries and segments to retire the system [...] Consequently, we need to prove that the new technology matches or exceeds the value of the old technology for our existing customer base.
Retiring systems takes longer and costs more than your executives want to hear
Stir Trek Talk
- Charlie Brown kicking the ball, but yet we think it’ll work this time
- Turns into deadline driven development
- Problem is that expectations are out of alignment with reality
- Ignore laggards and edge cases but laggards are biggest customers and edge cases are your critical risks
-
RGM development
2022-06-05 16:39
Rube-Goldberg Development is a term I’ve come up with to describe the trial and error development that poorly crafted systems often force upon us or result in.
In RGM development, we build one step at a time, requiring perfect synchronicity between each moving piece and acquiring that synchronicity only through tedious trial and error. Then, we add another step to the chain or pile.
This works to a point, but a) is tedious, time consuming, and error prone and b) will completely fall down when faced with change.
Imagine a Rube Goldberg machine built with a specific marble that will run its length. If we swap that marble for a different one with different weight, drag, or coefficient of friction, the machine won’t work. The only option is to rework the whole machine for the new constraints, going through the whole trial and error process again.
Similarly if you wanted something more drastic like a second machine or one that works with a bowling ball, it’s almost pointless to talk about similarities with our machine because there will be many more differences than things that work.
Avoid RGM development because it results in brittle, rigid, and unreliable systems, wasted effort, and inevitable large-scale changes or rewrites in order to reclaim the system (202109251102 Reclaiming software systems). But also be 202206112125 Zen in the face of programming because even the best written 202205131318 Software only supports one order of magnitude.
-
CodeMash 2020 - Live
An Informal Report on a Conference
2020-01-08 00:00
Live blogging from CodeMash 2020
Welcome to CodeMash
This is my first time attending CodeMash. I had some content about PASS SQL Summit (the only other big tech conference I've been to) when I attended back in 2016 but that all got "lost" when I overhauled my servers/blog/websites. I say "lost" but I still have a backup of all of that data somewhere. It's all compressed down into cold block storage in a backup of backups. It'd be an interesting project to try and do a restore of that version of my stuff. I don't know if I actually could remember how to get it all going again. If that's the case, what's the point in keeping the old backups? I suppose I could still get that data even if it's not on a functioning server. I could grab the text from those old posts and add them here or something. But I digress...
I'm really looking forward to all the sessions here. This is also going to be a new experience for me. I was the only person I knew at SQL Summit, whereas there are at least 30 Beamers here. It should be fun having people to go to talks and sit at meals with. Although, SQL Summit pushed me to do those things with people I didn't know and make the most of it. There's probably good and bad to both situations. I'm glad I'll be able to experience both of them.
-
Quarry workers' creed
2023-08-27 16:10
We who cut mere stones must always be envisioning cathedrals
An old saying of uncertain providence. Mentioned in Cal Newport's Deep Work and David Thomas and Andrew Hunt's The Pragmatic Programmer.1 This saying symbolizes the compounding effect of simple actions taken over a long period of time.
-
Thomas, D., & Hunt, A. (2019). The pragmatic programmer, 20th anniversary edition: Journey to mastery (Second edition) (pp. xvii). Addison-Wesley. ↩
-
-
Knowing when to leave
2022-05-23 11:30
How do we know when it's time to leave a job?
Signs to watch for
Growth
- You're no longer growing personally
- You're no longer growing professionally
- There are no opportunities for career growth
- You're underutilizing your skills or being underutilized
- You can’t picture yourself there long-term
Purpose
- You're not passionate about what you're doing
- Your values aren't aligned with your organization
Achievement
- You're perpetually procrastinating
- Your job is negatively affecting your confidence. E.g. you start struggling to 202110212231 Differentiate between self-doubt and idea-doubt.
- You already achieved what you set out to achieve
Burnout
- Everything feels overwhelming
- You need better work-life balance
- You feel exhausted, burnt-out, or dread working
- You actively look for ways to avoid your job
Toxicity
- It’s causing you to develop bad habits
- You wouldn’t want your friends to work there
- You're learning coping mechanisms instead of skills
- There are major issues with your boss
- Your workplace/environment is unhealthy
- Your ethics are being compromised
-
Block model for maximum capacity
2021-08-03 13:51
The block model for maximum working capacity is as follows:1[^auzenne2014floor2]
- There are small blocks and large blocks that represent tasks, projects, or any responsibility a person has to manage or work on.
- Small blocks take up 1 unit of capacity
- Large blocks take up 5 units of capacity.
- Each person in an organization has a box of maximum capacity equal to 15 regardless of how it's split up. A person could have 15 small blocks or 3 large ones or something in between.
- There are no exceptions or ways to expand that capacity.
- There are only two options for units of work: do or delegate. Nothing can move around or leave the system in any other way. If you do the task, it's in your capacity box. If you delegate it, it travels down a level and is in that person's capacity box.
This model is useful for describing a few phenomena such as how 202108031350 Delegating increases the significance of tasks and where we need to 202106241530 Delegate to the floor.
-
Auzenne, M., & Horstman, M. (2014, October 11). Delegating To The Floor—Part 1. Manager Tools. https://www.manager-tools.com/2014/09/delegating-floor-directs ↩
-
Ownership
2024-08-18 22:08
Notes on the meaning, implementation, and outcomes of ownership of our work.
The global network of capital essentially functions to separate the workers from the means of production.
Philosophically
- 202403131332 Techno-bourgeoisie
- 202112291821 The things we own end up owning us
In Engineering
- 202407081040 If you can't cancel the project you're not the product owner
- 202408060133 Caution and perfectionism hurt progress
- 202312091511 There is no such thing as sacred code
- 202206171206 Delivery Performance vs Value Delivery
-
Staff-plus engineer
2022-06-11 22:33
Staff engineering is a complex topic. As nebulous as it can be to get promoted to a 202206112236 Senior engineer role, it’s considerably harder to move into staff-plus roles. Whereas the definition varies a bit from company to company for senior engineering, the definition or even existence of staff-plus roles is completely irregular across the industry. Will Larson wrote an excellent book, Staff Engineer: Leadership Beyond the Management Track[^larson2021staff] on what it means to be a staff-plus engineer. This structure note and its children mostly come from that resource, but also other citations where noted. That book is also (mostly) publicly available at staffeng.com.
[!important] Being a staff engineer is not just a role. It’s the intersection of the role, your behaviors, your impact, and the organization’s recognition of all those things.
The value of the title
- Bypass informal gauges of seniority (especially useful for underrepresented groups)
- Facilitating access to “the room”
- Increase current and career earnings
- Access to interesting work
- Different rather than better
Archetypes
-
Three points on parenting
2021-12-20 13:14
- Imagine if we raised our children such that they weren’t perpetually stressed out.
- Imagine if we raised our children such that they got the sleep they need.
- Imagine if we raised our children such that they were able to introspect and work with their emotions and knew how alive and passionate and joyful they could be.
Asking ourselves questions like these can help point out 202201101943 The fundamental irony of many poor decisions.
-
Willful ignorance of reality in organizations
2024-08-22 08:51
In organizations, there's a tendency for people at higher levels or in roles further removed from the "doing" of a project to be vague to the point of harm. Some (bad) managers want something done and want other people to deal with how that gets done or indeed whether or not it's even possible to do it.
[I]t boils down to a psychological distance from the fact that true reality exists, and that someone lower status has to handle it.[^suresh2024pain]
I see this frequently in the interactions between (bad) product managers and engineers. The PM has an idea or a requirement to build something that they don't inspect closely or take the time to understand the reality of that idea. They don't understand what it would take to build it, what it would feel like to use, or whether it's a good idea once faced with all the edge cases involved. The idea of doing all that work is either too challenging or demeaning to these bad actors and it ends up falling on the individual contributor who actually produces the work output to solve these problems.
I've alternatively called this "compression of reality" and "where the rubber meets the road" to show that engineers don't have the luxury to hand wave or be vague when writing code. They have to specify — in exacting detail! — how it all works.
-
Microblog
2022-08-27 00:00
This page serves as a simple index of all my microblog posts. This list should be roughly equivalent to searching for the #microblog tag.
If you're looking for my longer #blog posts see 201610270000 Tech — Work — Ramblings.
- 202410220101 The Final Edition of Embedded Muse
- 202410201110 Engineering Multi-classing
- 202408250920 1BRC in rust in depth
- 202408220939 Go is not worth it
- 202405051458 Mobile Content Width
- 202405051251 Timeout Killer
- 202405021450 Ideating
- 202404232122 Masonry Layout CSS
- 202404232120 Hell yeah NASA
- 202208270311 Up too late
-
Trust is a requirement for higher-level cognitive functions
2021-07-29 11:32
People cannot perform higher-level cognitive functions in untrusting environments because they're hardwired to think about survival first and foremost.[^brown2019]
These teams were successful not because they were smarter, but because they were safer.[^coyle2019]
As social creatures, our instincts and awareness of danger extend beyond the realm of the purely physical threat. We're equally worried and concerned about social threats because they can result in the same existential threat to our survival as a physical fight. In ancestral times, the approval and support of the tribe was equivalent to survival.
This all combines to show that higher order mental processes like creativity, innovation, or imagination can only be consistently and effectively produced in a safe environment.[^brown2019] Trust is the substrate of our perception of safety. Environments without trust are perceived to be (and actually are) unsafe, and therefore unsuitable for higher-order thinking and knowledge work.
A very similar but different angle on this is that 202112180933 Psychological safety is the top indicator for group performance. The difference is that in this case a minimal amount of trust and safety are required for any higher level cognitive functioning to take place. It's not obvious that this can be extended to using the amount of trust and safety to measure the level of performance. It could just as likely have been a stair-step function of whether trust exists or doesn't, not a correlation of increased performance with increased trust.
-
Let myths that benefit you run
2022-08-10 10:02
When there's a myth that benefits you, you just let it go. You let it happen because it gets you further without you doing any work.
That's what the CIA does well [...] they don't answer any questions. They don't say anything. Wherever the myth goes, they let it go.1
-
lexteam. (2022, August 8). #310 – Andrew Bustamante: CIA Spy | Lex Fridman Podcast. Lex Fridman. https://lexfridman.com/andrew-bustamante/ ↩
-
-
Intellectual investment is like compound interest
2023-04-11 21:52
Intellectual investment is like compound interest: the more you do, the more you learn how to do, so the more you can do, etc. I do not know what compound interest rate to apply, but it must be well over 6% — one extra hour per day over a lifetime will much more than double the total output.[^hamming2020]
202109060836 Knowledge should accumulate and it does so at a 202304102048 Compounding Interest rate. 202304102024 Great people have a great deal of drive to do great things and applying that drive to intellectual pursuits is a high 202106221146 Leverage use of time over the long run (202109251140 Play long term-games).
Hamming would put aside Friday afternoons for "great thoughts" such as "what effect will computers have [...] on science generally?" 202110231433 Think week runs in a similar vein. Setting aside dedicated 202304112203 Ten percent time is well worth it. It helps us stay focused on important and interesting work as well as determine the best directions to work in.
Intellectual investment can also be done little and often. 202308141518 Be a pack rat for little facts and 202308271108 Construct hooks for future knowledge. The progress from continually learning small amounts is exponential.
-
Beauty will save the world
2022-08-22 16:35
Beauty will save the world.1
-
Dostoyevsky, F., McDuff, D., & Todd, W. M. (2004). The idiot. Penguin Books. (Original work published 1868) ↩
-
-
Make the hard decisions
2021-04-29 15:26
Possibly one of the most important tasks for a leader is to make the hard decisions. Leaders collect information from a wide area of context and take on the risk of setting the direction based on that information.
Experience has taught me that generally a decisive boss is better than a waffling one — you know where you stand and can get on with the work that needs to be done![^hamming2020]
It's particularly easy to give in to 202109090909 Decision paralysis when facing a hard decision.
[Remember that] the decision you made is entirely yours, and while the work preceding a hard decision can feel like an immense and endless chore, decisions and their subsequent consequences are, in fact, a privilege of leadership.[^rands2021decide]
Making the hard decisions comes at a heavy cost and the ultimate responsibility for these decisions rests on our shoulders. Sometimes this means that we need to shut up and own the bad results. How we 202104292040 Eat the losses is critical for setting the cultural tone for your team.
Another pitfall of making the hard decisions is getting an inflated sense of ego about our importance. Just because we're responsible for collecting information and setting a direction does not mean that we're the sole arbiter of what is right. We must remember that 202104291947 Our purpose as leaders is to serve others.
-
Make the future less painful
2023-08-14 15:44
202308141538 It's your life and you have the power to make things better. Never forget that we're the engineers that build, maintain, and change our systems. Don't feel trapped by the systems we've inherited, work towards the better and "make the future less painful".1
This can feel isolating sometimes (202112201317 The solitude of leadership), but the liberation of seizing your 202407010952 Freedom and Responsibility is unbelievably rewarding.
-
Thomas, D., & Hunt, A. (2019). The pragmatic programmer, 20th anniversary edition: Journey to mastery (Second edition) (pp. xxi). Addison-Wesley. ↩
-
-
Career checkup template
2022-06-12 20:47
Sourced from Will Larson's blog Irrational Exuberance[^larson2022checkup]
This is a simple template for checking in on your career. Here’s how to use it:
- Look through the sections. If there are any sections that don’t resonate with you at all (as opposed to just feeling hard to fill in), then remove or edit them.
- Fill in the sections. Feel free to jump around to answer the parts that you have the most energy for.
- Revisit a few days later: anything you want to change after sleeping on it?
- If possible, find peers or friends to share and discuss each others checkups together.
- Store it away somewhere to review a year from now.
Summary
Write this section last! How would you summarize everything else you wrote below? Try to keep it to max of two paragraphs.
<start writing here!>
How are you feeling about your career right now?
Write a few paragraphs about how you’re feeling about your career right now. Don’t worry about writing this for consumption, focus on finding words that resonate with you!
<start writing here!>
What did you expect / what happened in the last 5 years?
When you think back to five years ago, what did you expect to happen over the following five years? What has happened? How do you feel about the difference between those two?
-
Mobilis in mobili
2022-09-12 13:44
Mobilis in mobili, meaning moving in a moving thing, moving in the moving element, or changing in a changing medium.
This is the motto of Captain Nemo in Twenty Thousand Leagues Under the Sea. It is seen on his flag on the Nautilus as well as the one that he plants on the South Pole.1 It has a literal interpretation of moving through the ocean waters, but also of moving politically through humanity and geo-politics as a revolutionary attempting to move the tides of nations.
-
Verne, J. (2015). 20,000 leagues under the sea (L. P. Mercier, Trans.). Starbooks Classics Collection. (Original work published 1870) ↩
-
-
Resilient systems
2024-02-20 12:02
Systems that work well are resilient: they can recover after being stretched or strained. Most often, resilient systems have rich feedback loops and interactions that allow a system return to some equilibrium, state, or function even after a large disruption.1
Sometimes systems will exhibit even higher level resilience where they can repair, produce, or modify feedback loops themselves. These are 202402201203 Self-organizing systems.
Human bodies are remarkable examples of resilient, self-organizing systems.
Also, note that 202402241658 Stability and resilience are not the same thing.
-
Meadows, D. H., & Wright, D. (2011). Thinking in systems: A primer (Nachdr.) (pp. 76–78). Chelsea Green Pub. ↩
-
-
Immanuel Kant
2021-09-07 12:12
A German philosopher, central thinker of the 202109071219 Age of Enlightenment, and one of the most influential philosophers in all of western philosophy.1
Works
- Critique of Pure Reason
- Groundwork of the Metaphysics of Morals
- Metaphysics of Morals
- Critique of Practical Reason
- Critique of the Power of Judgement
Influence
- Kant popularized the phrase 202109060833 Sapere Aude as a motto for the 202109071219 Age of Enlightenment.
- Kant is most famous for his work in 202206051530 Deontology, the Critique of Pure Reason, and his 3 formulations of the x202206051544 Categorical imperative.
-
Immanuel Kant. (2023). In Wikipedia. https://en.wikipedia.org/w/index.php?title=Immanuel_Kant&oldid=1172510977 ↩
-
Moral desert
2022-06-05 22:02
Pronounced "dessert", coming from "deserve".
The concept in philosophy of "getting what you deserve" based on your actions. In the vein of karma or the final judgement of St. Peter.
Claims about desert are familiar and frequent in ordinary non-philosophical conversation. We say that a hard-working student who produces work of high quality deserves a high grade; that a vicious criminal deserves a harsh penalty; that someone who has suffered a series of misfortunes deserves some good luck for a change.1
-
Feldman, F., & Skow, B. (2020). Desert. In E. N. Zalta (Ed.), The Stanford Encyclopedia of Philosophy (Winter 2020). Metaphysics Research Lab, Stanford University. https://plato.stanford.edu/archives/win2020/entries/desert/ ↩
-
-
Externalization of knowledge
2021-10-23 14:49
Externalizing information is similar to 202110231448 Socialization of knowledge, but includes doing the hard work to have meaningful interactions that help uncover 202110231457 Tacit knowledge and communicate it. The efficacy of externalizing knowledge can be helped or hindered by the effectiveness of our communication. 202110251122 Analogy is a highly effective communication method.1
202107272242 The Art of using a Zettelkasten is a good examples of the externalization of knowledge. We proactively build a documented, discoverable network of ideas in a Zettelkasten. Similarly, we might build a knowledge base for a company's collective knowledge.
-
Diffey, S. (2020, October 26). The ‘Knowledge-creating’ Product Organisation. Medium. https://productcoalition.com/the-knowledge-creating-product-organisation-6ec80870647b ↩
-
-
Mobile Content Width
2024-05-05 14:58
I’d argue that there’s a greater chance that a website on mobile will have the wrong max width than the right one. These content overflows change scrolling — normally a 1 dimensional action up and down – into a fiddly, annoying 2D action.
A small amount of overflow can be fine because a lot of devices allow you to use the "zoom out" gesture to "lock" the screen to the full width. But that doesn't always work, and if the full width is very wide, the actual content becomes unreadably small.
It’s not that hard to do this correctly!
Scribbling furiously on my todo list to check every page in my site for this error to not look like a hypocrite 😬
-
Information and intelligence
2022-08-10 10:13
Information and intelligence are subtle concepts. Subterfuge, espionage, propaganda, mis-information, and narrative intent are just some of the areas that can cloud the truthfulness or usefulness of information and intelligence.
More than ever it's important that 202109060835 Knowledge is constructed in the receiver, but authors and gatherers of information and intelligence can work to induce an intended construction.
It's important to use tools like 202203210833 Systems thinking to try and understand things. It's vital to cut through what we would like to be true to the base facts of reality (202109251155 Desire vs expected outcome in decision making and 202203210830 When your model and reality conflict, reality is always right).
Thoughts on the topic
-
Effective staff engineering meetings
2022-11-01 10:39
The measure of an effective staff engineering meeting is the same as the measure of an effective 202206112233 Staff-plus engineer. The goals are the same and having a meeting simply facilitates people doing their jobs well. A huge portion of high-level engineering is communication and alignment. There's no better way to achieve those two things than regularly talking with people.
How to get started
Just schedule the first meeting with staff engineers to go over what this is and how the group would like to proceed.
- Set a cadence
- Assign an owner of the calendar meeting and agenda
Going forward, the agenda should be collaboratively set, allowing for leads from teams to bring things that their team and engineers on their team care about or are working on. Particularly, they should present things that would benefit from feedback from this group, things that people on their team are struggling with, or things that other teams would benefit from knowing about. This is primarily a communication meeting, though working sessions are valuable from time to time.
Purpose, benefits, and outcomes
- Setting company-wide technical direction.
- Coordinating mentorship and sponsorship for engineers across the company.
-
Lightning Talks
A Great Way to Teach and Learn
2018-05-15 00:00
Lightning talks are a great way to share knowledge in your organization. Here's how to get started and get everyone to love them.
A Lightning Talk is a short 5-10 minute presentation on any topic followed by about 5 minutes of open Q&A. A common format for a lightning talk is 6 minutes for presenting and 4 minutes for Q&A. The goal of a lightning talk is always to share knowledge, but can also be to convince people of the benefits of something or to take a particular action. Basically, lightning talks are lightning-fast knowledge sharing.
What's the Benefit?
Ok, so we know what a lightning talk is, but what's the point of doing them? There are plenty of obvious benefits and some that aren't so obvious. The important thing is that everyone who participates, from the speaker to the audience to the organization all benefit. It's an all-around win-win situation.
Share Knowledge
The IT industry is a knowledge industry and the vast majority of us who work in IT are knowledge workers. It's our job to gain, handle, and use information and it's impossible to be an effective knowledge worker without the ability to share that knowledge with others. We all gain insights and learn new things on a regular basis as we work on our projects. It's important that the knowledge gained is passed on to everyone even if they're working on a different part of the project or team.
-
Interactions with reality drive innovation
2023-04-10 20:10
The interaction with harsh reality tends to push you into significant discoveries which otherwise you would never have thought about while doing pure research in a vacuum of your private interests.1
It's important not to live in an ivory tower, separated from the muck of life. All the best research and thought can lead down paths that would never work when implemented in a real system. Not only that, but reality will strengthen your ideas or illuminate new paths and opportunities.
-
Hamming, R. W. (2020). The art of doing science and engineering: Learning to learn. Stripe Press. https://www.goodreads.com/book/show/53349431-the-art-of-doing-science-and-engineering ↩
-
-
Friedrich Nietzsche
2022-06-09 08:53
German philosopher (philologist by training) whose works centered around themes of 202206051528 Moral Philosophy and the history of morality.
On the genealogy of morals
Comprised of 3 essays, this is perhaps the most well known work of Nietzsche.[^nietzsche1887]
The first essay centers on the history of morality. Nietzsche contends (through some philological argumentation) that “good and bad” is not the same as “good and evil”.
”Good or bad” is a delineation between “good = aristocratic = beautiful = happy = loved by the gods = strong = vital” and “bad = common = plebeian = stupid = lacking”. The “knightly-aristocratic” caste are good insomuch as they have noble qualities whereas the “bad” people were simply people who lacked those qualities. It’s not a moral judgment in itself, it’s a descriptive categorization of humans.
“Good and evil” then comes from a “priestly” caste at a later date. The purpose of this new distinction is to reverse the judgment and to assign moral weight to it. The priestly caste creates a world in which the strong, dominant, rich, powerful are evil for using those traits (Nietzsche precisely sees no issue in “Man” wielding his strength and dominating others) and the new “good” are the downtrodden, meek, subservient people who require things like neighborliness, timidity, humility to survive against the “blonde beasts”. This results in the Judeo-Christian tradition and (according to Nietzsche) a self-abnegating inward focus of the mind and instincts. Instead of being strong, vital, active, and forgetful[^1] of wrongs done to us, we become cruel, resentful, vengeful people who spend our time thinking about the abuses of others and competing to be the most “debased” type of human.
-
A Career
2022-05-23 13:12
What does it take to have a long and prosperous career? What is success? What is happiness?
Entire careers in themselves
Strategy
- 202304041047 Do significant things with your life
- 202304041619 Keep the whole in mind
- 202205231130 Knowing when to leave
- 202304041100 Learn, don't memorize
- 202109060825 My next level
- 202206122047 Career checkup template
- 202109251140 Play long term-games
- 202106221713 Seven habits of highly effective people
- 202206112312 Stop chasing ghosts
- 202206112313 Stop preening
- 202110231433 Think week
- 202109081301 You'll never get what you don't ask for
- 202206112310 Work on what matters
Philosophy
- 202110212231 Differentiate between self-doubt and idea-doubt
- 202109060816 Do your own thinking
- 202112180923 Don't fear failing, fear failing to try
- 202109251152 How much is enough
- 202112291821 The things we own end up owning us
-
Staff tech-lead archetype
2022-06-11 22:52
A tech-lead staff archetype guides the approach and execution of a single particular team. Sometimes they partner across teams and are occasionally part of a Tech Lead Manager role or similar to that role but with less people management responsibilities.1
These are the most common of staff engineers. They do a lot of coordination and team process. They set roadmaps and work with product managers. They delegate more over time to grow others and their impact. They code less over time and acknowledge that when they code less, their team is growing more. They are still the vision behind the team’s direction though and step in to unblock and build alignment when needed.
-
Larson, W. (2021). Staff engineer: Leadership beyond the management track. https://staffeng.com/ ↩
-
-
You'll never get what you don't ask for
2021-09-08 13:01
Careers are long term games with compounding payouts (202304102048 Compounding Interest). The surest way to succeed in the long term is to work hard and build what you can as early as you can in your career. (202109251140 Play long term-games)
The simplest way to maximize lifetime earning is to earn more sooner. That is obviously not an easy thing to do, but it is a simple thing. The more that you earn early, the more time that you have to compound that earning into more value.
One real tactical approach for getting more sooner is to ask for it. If you're delivering valuable results, someone will reward you for it — whether that's your current company or a different one.
-
Staff right-hand archetype
2022-06-11 23:00
A right-hand staff archetype extends the reach of an executive by leaning on the executive’s scope and authority. These are typically found in complex organizations and provide extra leadership bandwidth for these large scale situations. Right Hands are the rarest of the archetypes since they are usually only found in large, complex organizations.1
Problems that the Right Hand deals with are never purely technical and usually involve an intersection of business, technology, people, culture, and process. They often dive into fires and edit approaches, align people, delegate things effectively, and get things moving again. They only work on absolutely essential problems, but they’re always putting out the next fire as soon as one has been solved.
-
Larson, W. (2021). Staff engineer: Leadership beyond the management track. https://staffeng.com/ ↩
-
-
Great people have a great deal of drive to do great things
2023-04-10 20:24
Richard Hamming's boss once said to him,
You would be surprised how much you would know if if you had worked as hard as he has for as many years.1
It's evident that great people have a great deal of drive to do great things. 202208211352 There is no shortcut to learning and putting in the hard work, day-in and day-out will lead to compounding gains (202304102048 Compounding Interest, 202109060836 Knowledge should accumulate).
-
Hamming, R. W. (2020). The art of doing science and engineering: Learning to learn. Stripe Press. https://www.goodreads.com/book/show/53349431-the-art-of-doing-science-and-engineering ↩
-
-
Models are necessarily incomplete
2022-03-21 08:32
Making a model is the process of simplifying reality into a useful reasoning tool. Our goal is not to capture all of reality perfectly (we already have that ability by existing in that reality). Our goal is to be more useful — to cut through the noise — but this is exactly why they’re incomplete and prone to failure or bias.1
Once the model is useful as a simplified description of reality, we can start using it for its purpose. However, the only way to tell if our incomplete models work is by continuously comparing them with messy reality (202203210831 Models are immutable but reality isn't and 202203210830 When your model and reality conflict, reality is always right).
-
Larson, W. (2021, October 7). How to safely think in systems. https://lethain.com/how-to-safely-think-in-systems/ ↩
-
-
The fastest code is no code
2022-04-27 22:19
It’s impossible for any line of code, no matter how fast and well written to be as performant as no line of code. There are two points here.
From a performance perspective, we obviously only want to do the work that’s absolutely essential. We want to optimize the source code and execution paths to be as minimal as possible.
From a philosophical perspective, we want our code to be simple and minimal, although there’s more leniency in this point than the performance one. Less code written is less code we have to read and less we have to understand: minimizing the amount of code minimizes what we have to reason about and maintain. Importantly though, we also want to make that code maximally understandable. We want to follow 202203221620 The golden rule of programming and value simplicity and understanding over minimizing code.
-
Types are not a substitute for tests
2022-08-11 22:28
Type systems cannot and should not be viewed as a replacement for testing. Types cannot ensure that the code you wrote produces the actual outcome that you want it to. Tests on the other hand, can be used to verify and maintain that correctness.
Tests can never provide an unbroken chain of checks, from the database all the way to the frontend React props, guaranteeing that all of the data has the right shape [emphasis mine]. Types can't (usually) tell us when we accidentally put a "!" in front of a conditional. Focusing on one or the other means sacrificing quality, work efficiency, or both.1
Conversely 202208112226 Tests are not a substitute for types.
-
Bernhardt, G. (2020, April 13). Execute Program. https://www.executeprogram.com/blog/are-tests-necessary-in-typescript ↩
-
-
Stop starting, start finishing
2023-10-24 15:10
Instead of starting many things and splitting your attention, you should focus on finishing things that you've started. Note that "finishing" doesn't have to be seeing that project to completion. For example you can finish a project by deciding that you don't have time for it and won't continue with it. This relates to 202110181246 Limit WIP to increase throughput.
How does this idea work with creativity learning or the fact that 202110212227 Moderate procrastination facilitates creativity? Creativity learning is about chasing the many interesting things that we see without worrying about becoming an expert in them. This leads to generalized knowledge (T-shaped etc.) #thread and this 202304031221 Breadth of knowledge fuels analogy.1
-
Epstein, D. (2019). Range: How generalists triumph in a specialized world (1st ed.). Macmillan. https://www.goodreads.com/book/show/41795733-range ↩
-
-
Making a Fitbit Sense Watch Face
Time for a Better Watch
2022-05-01 00:00
There are a lot of good first- and third-party watch faces out there for the Fitbit Sense, but none of them are exactly what I want.
Motivation
There are a lot of good first- and third-party watch faces out there for the Fitbit Sense, but none of them are exactly what I want. So instead of putting up with something slightly sub-optimal, I'm taking a look at what it takes to develop my own. Being a programmer is great isn't it?
This post is still a work in progress, but as I've said, I'm working on showing off more works in progress.
-
There is no shortcut to learning
2022-08-21 13:52
There is a story from ancient Greek times of a mathematician telling a ruler there were royal roads for him to walk on, and royal messengers to carry his mail, but there was no royal road to geometry.1
There is no shortcut to learning. It takes hard work over a long period of time to learn and know things. 202109060835 Knowledge is constructed, 202109060836 Knowledge should accumulate over time, 202109060816 Do your own thinking, think critically2, and most importantly, 202109060833 Sapere Aude!
Keep in mind how what we struggle to learn impacts 202208211404 Learning to follow and learning to lead.
-
Hamming, R. W. (2020). The art of doing science and engineering: Learning to learn (pp.286). Stripe Press. https://www.goodreads.com/book/show/53349431-the-art-of-doing-science-and-engineering ↩
-
Thomas, D., & Hunt, A. (2019). The pragmatic programmer, 20th anniversary edition: Journey to mastery (Second edition) (pp. 18). Addison-Wesley. ↩
-
-
Measure output instead of activity
2023-09-01 13:42
It's always better to measure the output of a worker or team than it is to measure their activity. The economic value added can be enormous for things that are traditionally viewed as waste. For instance, testing software may not increase value in certain ways, but the reliability and costs for failures factor in. We can see then that testing does add direct economic value.
In another light, as a leader it's important to keep this in mind for knowledge workers. Scrutinizing hours worked or other activities adds obstacles (when really 202106241548 Leaders work to remove obstacles) to employees days, making it harder for them to feel safe and become top performers (202112180933 Psychological safety is the top indicator for group performance) After all, 202110212227 Moderate procrastination facilitates creativity and 202211030958 Creative accomplishments happen over time.
This idea is discussed in a slightly different way at length in 202206171206 Delivery Performance vs Value Delivery.
-
A Life
2023-04-03 13:17
What does it take to have a long and prosperous life? What is success? What is happiness? What is meaning? What is a good life?
Inspiration
Praxis
- 202205231312 A Career
- 202308141518 Be a pack rat for little facts
- 202308141534 Be able to have a conversation about anything
- 202106221744 Begin with the end in mind
- 202304041047 Do significant things with your life
- 202109060816 Do your own thinking
- 202112180923 Don't fear failing, fear failing to try
- 202110181231 Don't tacitly endorse bad behaviors
- 202109251152 How much is enough
- 202109090947 Idea gardening
- 202308141538 It's your life
- 202304041619 Keep the whole in mind
- 202203231647 Leading from vision
- 202304041100 Learn, don't memorize
- 202109121530 Maturity of interdependence
- 202112221953 My bucket list
- 202104291947 Our purpose as leaders is to serve others
- 202109251140 Play long term-games
- 202106241524 Sharpen the saw and grow
- 202112291821 The things we own end up owning us
- 202109071223 The unexamined life is not worth living
- 202208211352 There is no shortcut to learning
-
The four types of leaders
2021-06-22 17:12
There's a theory that categorizes leaders into at least one of four archetypes.1 There can be overlap among these and we can work at being better in areas that aren't natural for us, but we all have at least one of them that comes without as much effort as the others.
As with other personality categorization frameworks, the value of putting ourselves in these categories is not to define what we will or must do, rather to give us insight into our behaviors. We can augment our strengths and mitigate our weaknesses only if we're aware of them.
Which of these types do I fall most naturally into?
I think I’m most naturally a visionary style leader with a need to improve my operator skills.
The Four Types
- 202107240951 Visionary leadership style
- 202107240952 Operator leadership style
- 202107240953 Processor leadership style
- 202107240954 Synergist leadership style
-
McKeown, L. (2017, June 27). What’s Your Leadership Style? The Do Book Company. https://medium.com/do-book-company/whats-your-leadership-style-fdc8bad45fe0 ↩
-
Our purpose as leaders is to serve others
2021-04-29 19:47
Contrary to the traditional approach to leadership which puts the company and the mission above all else, servant leadership focuses on employees and customers. Instead of employees working to serve a leader, the leader works to serve their employees and teams work to serve their customers.
Being a servant leader means that we share power, put the needs of our teams and employees first, and help people develop personally and professionally as highly as possible. It also means that we 202104291526 Make the hard decisions and follow up by taking on risk and 202104292040 Eat the losses when needed. It means suffering for the team sometimes.
Interesting thought: At first glance it looks like the principle that 202104291524 Execution is the priority of team management is at odds with being a servant leader. If we look closely though, it's clear that these are actually fundamentally tied together. True high performance execution requires this substrate of employee support in order to be possible. (202107291132 Trust is a requirement for higher-level cognitive functions and 202112180933 Psychological safety is the top indicator for group performance)
-
There is never time to fix things later
2023-04-03 12:44
There is a saying in software development:
There is never time to do the job right, but there is always time to fix it later.1
We all know that this is the attitude of many managers and developers, but we can plainly see that it's an obvious contradiction. If there's never time to work on something now, then there can't be any other time at any future "now".
Push back. Take your time. Get things done right or else you'll pay for it many times over in the long run.
This does contrast somewhat with the general philosophy that 202208151317 Incremental change is always better, but it isn't a contradiction. Each incremental change should be done slowly and thoroughly. Each piece of development should have all the steps that go into making something excellent.
-
Hamming, R. W. (2020). The art of doing science and engineering: Learning to learn. Stripe Press. https://www.goodreads.com/book/show/53349431-the-art-of-doing-science-and-engineering ↩
-
-
Operator leadership style
2021-07-24 09:52
In contrast to the 202107240951 Visionary leadership style who like to start new projects, Operators are most interested in finishing projects. Operators are great improvisers and can achieve the desired outcome from varied and difficult situations. Operators prefer being given clear direction even though they tend to be highly capable of motivating other people. Operators are extremely task focused which has its value and drawbacks. Operators' bias towards action can be valuable as a voice for reducing unnecessary overhead and processes.1
Operators have trouble delegating and often rely on their team to follow their lead instead. They will often work outside the system if necessary to accomplish tasks. Operators can be seen as aggressive, ruthless mavericks that aren't good team players.
They shouldn't be micromanaged and can be defensive and conflict prone. To better manage an operator, provide clear direction and autonomy and help them with prioritization and delgation.
Examples: Sam Walton, John D. Rockefeller, and Steve Ballmer.
-
McKeown, L. (2017, June 27). What’s Your Leadership Style? The Do Book Company. https://medium.com/do-book-company/whats-your-leadership-style-fdc8bad45fe0 ↩
-
-
Do significant things with your life
2023-04-04 10:47
As far as I know each of [us] has but one life to lead, and it seems to me it is better to do significant things than to just get along through life to its end. Certainly near the end it is nice to look back at a life of accomplishments rather than a life where you have merely survived and amused yourself. Thus in a real sense I am preaching the messages that (1) it is worth trying to accomplish the goals you set yourself and (2) it is worth setting yourself high goals.1
An excellent quote on living 202304031317 A Life and having 202205231312 A Career that you can be proud of and be happy to have lived.
A similar but less philosophical take on this is to 202206112310 Work on what matters. A similar but more philosophical take on this is 202109071223 The unexamined life is not worth living.
-
Hamming, R. W. (2020). The art of doing science and engineering: Learning to learn. Stripe Press. https://www.goodreads.com/book/show/53349431-the-art-of-doing-science-and-engineering ↩
-
-
Caution and perfectionism hurt progress
2024-08-06 01:33
Being overly cautious or too much of a perfectionist will undoubtedly limit progress and potentially even destroy the ultimate outcome of a project as a whole. Being overly cautious can manifest in different ways:
- Having meetings about meetings. This shows that there are issues with how the organization runs that need to be addressed pre- or post-hoc in order for something to actually get done.
- Meetings to discuss how we should do something in order to get consensus before getting things done. This shows that contributors do not have the authority, responsibility, or capability to do things individually and have to justify, wait, and ask others to do their job.
- A lack of desire from contributors to be associated with a particular project or task. This shows that risk and reward are not appropriately balanced in your organization. If people don't want to be a part of a risky project, then they know that they don't have the authority or latitude to address the project correctly or perhaps know that they won't be rewarded for working hard and taking a risk on something that could hurt them.
- Requiring large chains of approval and sign-off. If many people need to see something in order for it to be approved, then the contributors and the teams responsible for making something don't really have the authority or empowerment to do the job they were asked to do (202407081040 If you can't cancel the project you're not the product owner). If people who are not intricately involved in the project day-to-day get more say than as a potential source of feedback, they are in the way of that project's success and the team will revert to caution and perfectionism in order to avoid re-work and disapprovals.
-
Processor leadership style
2021-07-24 09:53
Processors are risk averse and skeptical. They thrive on systems and processes with well defined rules, boundaries, and responsibilities. Processors are analytic and prefer to use data when making decisions instead of relying on intuition or experimentation. Because of their analytic mind, they bring an objective, consistent, and scalable approach to the team.1
Processors have some drawbacks as well. They tend to overthink, overanalyze, and get stuck in analysis paralysis. They resist risk and change and can be frustrated during times where action needs to be taken before all the facts are available.
To lead a processor, build a tight relationship with them and respect their need for data and order. Make sure to listen to their opinions but challenge them to take action, give credit where it's do (both to them and others in the organization), and avoid hyperbole and emotional decision making. To see them succeed, make sure they have clear goals, priorities, and clarity in their work and purpose.
Examples: Charles Coffin (GE), Gordon Brown (UK Prime Minister).
-
McKeown, L. (2017, June 27). What’s Your Leadership Style? The Do Book Company. https://medium.com/do-book-company/whats-your-leadership-style-fdc8bad45fe0 ↩
-
-
Psychological safety is the top indicator for group performance
2021-12-18 09:33
Individual skills are not what matters. What matters is the interaction. Small behaviors — not measurable skills — make all the difference.
In a study of groups of differing skill levels all trying to accomplish the same task, groups succeeded not because they were smarter or better, but because they were safer. The only valid correlation between performance and behavior is whether the group was safe and connected.1
We make groups feel safe through belonging cues. These are small behaviors that add up to the statement “You’re safe, you belong here”.
This has been demonstrated in other sources as well, including the famous study from Google.2
A very similar but different angle on this is that 202107291132 Trust is a requirement for higher-level cognitive functions. That angle shows that a minimal amount of this metric is a requirement for base function, whereas this shows that it can be generalized as a continuous correlation to performance.
-
Coyle, D. (2019). The culture code: The secrets of highly successful groups. Random House Business Books. ↩
-
Rozovsky, J. (2015, November 17). Project Aristotle. Re:Work. https://rework.withgoogle.com/print/guides/5721312655835136/ ↩
-
-
Use values as the boundary
2022-05-12 10:23
Using values as the boundaries of your classes/objects/functions/services or w/e is important in testing because it gives you isolation for free.
This is a fairly functional approach. The idea is that there's not this class that has dependencies on a different thing that it calls inside of it. There is simply a passing of values in and out of the thing that does work on it.
For testing, we want a functional core with many decisions/paths, with none or few dependencies. These are easy to isolate and unit test. Then we want a shell that brings the dependencies together, but has very few decisions/paths. These are then the candidates for integration tests.
Values become messages. If values are messages, you get concurrency for free because you have a message passing system. Values afford shifting boundaries.
E.g. via the actor model
actor Sweeper User.all.each { ExpiredUsers.push(user) } die end actor ExpiredUsers user = pop late = user.active? && user.paid_at < 1.month.ago BillingProblemNotification.push(user) if late end actor BillingProblemNotification UserMailer.billing_problem(pop) end
-
Leadership
2021-04-29 15:23
- 202203231646 Affecting long-term change
- 202203241152 Ask for more from your people
- 202110181203 Be clear about expectations
- 202110181158 Coaching underperformers
- 202109090909 Decision paralysis
- 202203241428 Do more with less
- 202110181231 Don't tacitly endorse bad behaviors
- 202104292040 Eat the losses
- 202104291524 Execution is the priority of team management
- 202205021956 Feedback is for changing behavior
- 202407010952 Freedom and Responsibility
- 202208211358 Hawthorne effect
- 202110181205 Invest discretionary time in top performers
- 202104291527 Live in the ambiguity
- 202104291528 Leaders have to accept a slower feedback loop
- 202106241548 Leaders work to remove obstacles
- 202203231647 Leading from vision
- 202104291526 Make the hard decisions
- 202108191029 Measure what you do
- 202205031247 OODA loop of action
- 202206171206 Delivery Performance vs Value Delivery
- 202110052025 The quality of your decisions is the currency of leadership
- 202110220845 Remote team management
- 202104291529 Repeat the message in order to be heard
- 202110181215 Target praise carefully
-
Tests are not a substitute for types
2022-08-11 22:26
Tests cannot and should not be viewed as a replacement for a type system. Imagine needing to test all function arguments against all permutations of possible variable types in a dynamic language. It's certainly possible, but it's not done in practice and would bloat your test suite immensely. Instead tests should be used to verify the code under test is logically correct and produces the intended outcome.
Tests can never provide an unbroken chain of checks, from the database all the way to the frontend React props, guaranteeing that all of the data has the right shape. Types can't (usually) tell us when we accidentally put a "!" in front of a conditional [emphasis mine]. Focusing on one or the other means sacrificing quality, work efficiency, or both.1
The constraints, invariants, and information encoded in type systems also serve more purposes than just ensuring things like correct usage. They also serve as documentation and communication mechanisms about intent.
Conversely 202208112228 Types are not a substitute for tests. These two systems need to be used together to achieve the best outcome.
-
Bernhardt, G. (2020, April 13). Execute Program. https://www.executeprogram.com/blog/are-tests-necessary-in-typescript ↩
-
-
Evergreen notes
2021-09-09 11:29
Valuable notes are written and organized to evolve, contribute, and accumulate over time, across projects (202109060836 Knowledge should accumulate). This is different than taking transient notes because 202209091140 Transient notes don't create knowledge.[^khoe2016] 202209091141 The goal of note-taking is not to be better at taking notes, it's to be better at thinking. In order to make notes valuable we need them to be timeless.1
We can make our notes timeless by making sure that they adhere to a few key principles:
- 202209091130 Notes should be atomic
- 202109091131 Notes should surprise us
- 202109091132 Notes should be densely linked
- 202109091133 Notes should associate organically
- 202109091134 Notes should be concept-oriented
202209091142 Notes are the fundamental unit of knowledge work. This practice is similar and different to Niklas Luhmann's 202107272242 The Art of using a Zettelkasten.[^luhmann2021]
-
Matuschak, A. (2017). Evergreen notes. Andyʼs Working Notes. https://notes.andymatuschak.org/z4SDCZQeRo4xFEQ8H4qrSqd68ucpgE6LU155C ↩
-
My Brand New Blog
An Exercise in Futility?
2016-10-28 00:00
Maybe it's the infinite hubris of a millennial or maybe its just that I doubt anyone will actually read this, but I found a few reasons to convince myself to do it anyway.
I thought about that question a lot before building this. Most blogs are out of date, under-maintained, new year's resolution-esque things that wither and die after a few entries. Why create something that has a high likelihood of being abandoned? Beyond that, how could I possibly think that anything I have to say is worth writing about? Maybe it's the infinite hubris of a millennial or maybe its just that I doubt anyone will actually read this, but I found a few reasons to convince myself to do it anyway.
I'm Already Writing Anyway
I've been in the habit of keeping a journal for a long time. I keep it for a lot of reasons: it helps me think aloud, it helps me recap my days, weeks, months, years, it teaches me about myself, it gives me perspective on why things did or didn't break my way. However, a journal, at least how I write mine, doesn't work well for giving a single topic more attention. I still write about topics that interest me, but diving in and exploring those topics fully isn't something that fits in a medium whose primary purpose is to record and reflect. A blog, on the other hand, is the perfect medium to write in-depth on a single topic. A blog also gives me the flexibility to write about any topic that's currently interesting me.
-
Do your own thinking
2021-09-06 08:16
It's too easy to let other people's thoughts, opinions, and models dominate our own.
202109071331 Arthur Schopenhauer has some great quotes on this topic.
When we read, another person thinks for us: we merely repeat his mental process. In learning to write, the pupil goes over with his pen what the teacher has outlined in pencil: so in reading; the greater part of the work of thought is already done for us. This is why it relieves us to take up a book after being occupied with our own thoughts. And in reading, the mind is, in fact, only the playground of another’s thoughts. So it comes about that if anyone spends almost the whole day in reading, and by way of relaxation devotes the intervals to some thoughtless pastime, he gradually loses the capacity for thinking; just as the man who always rides, at last forgets how to walk. This is the case with many learned persons: they have read themselves stupid.[^schopenhauer1851]
For the more one reads the fewer are the traces left of what one has read; the mind is like a tablet that has been written over and over. Hence it is impossible to reflect; and it is only by reflection that one can assimilate what one has read if one reads straight ahead without pondering over it later, what has been read does not take root, but is for the most part lost. Indeed, it is the same with mental as with bodily food: scarcely the fifth part of what a man takes is assimilated; the remainder passes off in evaporation, respiration, and the like.[^schopenhauer1851]
-
The world wants new men
2022-09-12 10:25
The earth does not want new continents, but new men.[^verne1870]
Spoken by Captain Nemo in Twenty Thousand Leagues Under the Sea.
Captain Nemo is a supporter of revolutionaries around the world and a strong enemy of colonialism. He was a revolutionary in his own country (drafted originally by Verne as a Polish revolutionary against Russia, but later changed to an Indian one against Britain) and lost his family and friends to his oppressor. He renounced his citizenship of all nations of men and took to the seas, fighting (and sinking) colonial ships as well as accumulating riches and giving them to revolutionary causes around the world.
In this context, the quote is lamenting that land and nations are not needed to solve the problems of the world. Instead, men need to fundamentally change ethically and morally in favor of freedom, liberty, and self-determination.
In a broader context, this quote could be interpreted as a general sentiment to re-evaluate the direction something is going in. In tech, if someone said "we need better advertisements that respect people's privacy", I might reply with this quote meaning "we don't need better ads, we need a fundamental shift from this paradigm."
-
Learn, don't memorize
2023-04-04 11:00
Memorization is the easy way to get a good grade or look like you know something. However, as we know, 202208211352 There is no shortcut to learning, 202109060835 Knowledge is constructed, and 202109060836 Knowledge should accumulate. In order to have wide (202304031221 Breadth of knowledge fuels analogy), meaningful (202204301410 Criteria for durable knowledge storage) knowledge and ability to use that knowledge to communicate (202110251122 Analogy is a highly effective communication method), we have to understand the "why" behind the "what".
We are all lifelong learners (202208211426 Work with people who know they don't know) and should strive to get down to the fundamentals instead of just learning a rote piece of information. 202107272242 The Art of using a Zettelkasten is an attempt at habituating and recording some of this process.
If we look at 202107282144 Bloom's taxonomy of knowledge, we see that memorization is only the most basic level of knowledge. Understanding and using that knowledge is more advanced and valuable.
One aspect of memorization that can be useful is to 202308141518 Be a pack rat for little facts and 202308271108 Construct hooks for future knowledge. This isn’t memorization for memorization’s sake though. Rather, it’s memorizing — or more accurately remembering facts — in order to learn Things more widely and deeply in the future. It’s filling things away in order to be able to say “oh yeah, I’ve seen this before.”
-
Delivery Performance vs Value Delivery
2022-06-17 12:06
An alternate title for this essay is The "How" Matters.
I want to talk more about performance — the act of executing, building, delivering, how our team works together and with other teams, and how these stack up against our potential.
I don't want to stop talking about product value — the product, its value, our direction, how we choose what to build, or if what we built was valuable or not.
I just want to additionally talk more about performance.
Here's the way we typically talk about the product, its value, and our performance.
At an individual level you know if you’re doing a good job based on how effectively you’re contributing.
At a team level you see if the things the team built were valuable over a longer period of time.
Directors and executives plan for years out and it can take a long time to get feedback about the value of their decisions.
Therefore, we can’t know as easily or quickly if leaders (or groups of people as a whole) are doing a good job over these long, ambiguous timelines
See 202104291527 Live in the ambiguity and 202104291528 Leaders have to accept a slower feedback loop for more support of this position.
-
Transient notes don't create knowledge
2022-09-09 11:40
Transient notes do not create knowledge because — by definition — they are not meant to be kept. The notes don't add up to anything after they're taken.1 We know that 202109060835 Knowledge is constructed and that 202109060845 Knowledge is a heterarchy. Transient notes do not create any of these characteristics and most critically don't connect with each other like 202109091129 Evergreen notes do.
This is not to say that transient notes can't be useful. They certainly help us store information, remember things, and process our ongoing experiences, but they'll never accumulate to create knowledge. In this sense, we can view transient notes as "messy thought" inputs for "neat thought" notes that we'll store and connect in our long term knowledge system.[^khoe2016]
Remember that 202209091141 The goal of note-taking is not to be better at taking notes, it's to be better at thinking and we can see how transient notes are not helping us further that goal. As such, 202209091142 Notes are the fundamental unit of knowledge work, definitely not transient notes.
-
Matuschak, A. (2017). Most people take only transient notes. Andyʼs Working Notes. https://notes.andymatuschak.org/z2ZAGQBHuJ2u9WrtAQHAEHcCZTtqpsGkAsrD1 ↩
-
-
Second-order thinking
2021-10-22 08:53
Second-order thinking is the process of going beyond the immediate impact of a decision or event.
For example, if the USA shifts to renewable energy and electric cars in the 2020s, we'll have no need to be allied with Saudi Arabia anymore. This is a first-order consequence. Going further, we can see that things like a Saudi-Iranian war or general instability in the middle east could come from the dissolution of that alliance. Take it another step — if China and other East Asian cultures aren't able to modernize to renewable energy and electric transport in a similar time-span and the middle east's oil production is destabilized, then their economies could be disrupted. The possibilities in that event are vast and wide-ranging.[^dourado2020]
Here’s the thing about electric cars: they are better than regular cars. They have lower fuel costs. They have fewer moving parts and thus lower maintenance costs. They have higher low-end torque and faster acceleration. If you mainly drive to and from work and have a charger at home, you never have to stop for gas. Electric cars will win because they are better, and the shift will happen suddenly.
A list of specific 202211020929 Second-order thoughts about the 2020s.
-
Freedom and Responsibility
2024-07-01 09:52
People must have the freedom to act and the responsibility to act wisely. Without the freedom to act, responsibility is pointless; the system decides what actions can be taken and the responsibility or lack thereof for those actions is vested in the system, not the individual. Without the responsibility to act wisely, the freedom to act is risky and unfair; consequences for those free actions have to be upheld, both positive and negative; accountability for outcomes and whether the act was taken with proper consideration lie on the free person.
Note that this doesn't mean that we all have to be risk-averse. Just because you are responsible for your actions, doesn't mean we have to exact painful consequences. We can create a culture that gives freedom, demands responsibility in return, and then is benevolent with punishment for bad outcomes. If the action was taken in good faith — responsibly — and didn't work out, we can accept that as one of the tradeoffs for the other benefits we gain from FNR. If someone makes an honest mistake, they don't need to be shamed, hurt, or expelled. In fact, this honesty and transparency about outcomes combined with the lenient forgiveness of failure is what drives true freedom to do, build, create, innovate, and achieve.
-
Virtue ethics
2022-06-05 07:55
Virtue ethics defines ethical behavior as that which facilitates the fulfillment of a person’s telos of 202206050810 Eudaimonia through the attainment and proportioning of different virtues.
202206050754 Aristotle is the father of virtue ethics and developed the subject in his work Nichomachean Ethics.
More simply put, in order to explain what makes a person good, Aristotle defines
- Which qualities a good person ought to have
- In which amounts
- Whether every person has the capacity for those qualities
- How we acquire them
- What it will look (or feel) like when we actually have them[^schur2022]
Virtue ethics differs from 202206051530 Deontology by guiding us to try and be a specific type of person while deontological ethics guide us on which actions and choices we should make.
Virtue ethics also differs from 202206051524 Consequentialism by having less concern for the ends and more concern for the means than a pure consequentialist ethic would.
Virtue ethics [...] emphasizes the virtues, or moral character, in contrast to the approach that emphasizes duties or rules (deontology) or that emphasizes the consequences of actions (consequentialism).[^hursthouse2022]
-
The solitude of leadership
2021-12-20 13:17
People think leaders are individuals with others looking to them for direction. People think solitude is something like Thoreau, alone at Walden Pond. What could solitude have to do with leadership?
Leadership is the qualities of character and mind that will make you fit to command a platoon or a company, a battalion or a corporation, a foundation, a department, a government.
Solitude is the ability to be alone with your thoughts.
Solitude is therefore one of the most important necessities of true leadership.
On the mistaken idea of making it to the top means you're a leader
Many people can be energetic, accomplished, smart, or ferociously ambitious, but is that enough to make them leaders? No. These types of things are encouraged and developed in our generation of world-class hoop jumpers — they're "excellent sheep". Many institutions that talk about leadership are really talking about this. They're talking about educating people to make big names for themselves with impressive titles that they can brag about. They're talking about training people to climb the greasy pole of whatever hierarchy they decide to attach themselves to. But this idea is wrong and dangerous.
-
The goal of note-taking is not to be better at taking notes, it's to be better at thinking
2022-09-09 11:41
There are plenty of systems out there for note-taking. Many of these systems emphasize "lifehacks", focusing on questions like "how should I organize my notes", "what kind of journal should I use", and "how can I make it easy to capture things I read?"
Answering these questions will not help us get to a place where our notes are more useful for us because they miss the fundamental point. Note taking is about being better at thinking, not writing things down.[^matuschak2017better]
Better questions we could ask ourselves:
- How can I take notes that will help me to reliably develop insights over time?
- How can I shepherd my attention effectively?
- How can I surprise myself with unimagined connections?
- How can I make sure that my notes are adding up to something?
In this context, we can see how we come to the conclusion that 202209091142 Notes are the fundamental unit of knowledge work. 202109091129 Evergreen notes answer those questions.
Technology can play a large role in these misguided attempts to get better at note-taking. New technologies and techniques are available that make it easier for us to shove information into the computer. But as we know 202209091140 Transient notes don't create knowledge. We should be helping ourselves develop computer supported thinking instead of computer supported note-taking.
-
Go is not worth it
2024-08-22 09:39
I had to spend a lot of time recently — yet again — debugging weird edge case Go code in production. The person who wrote it had no idea how far off they were from writing something that behaved reliably and correctly. But they're also one of the people who I constantly hear proclaiming how easy it is to use Go, how simple it is, and how productive they are with it. To be fair, they're very productive at churning out bugs. But I'm tired of being on call for it.
This experience triggered me so hard, I almost wrote a whole blog post about how bad Go is. It constantly papers over real world complexity, has a whole arsenal of guns to shoot yourself with, and the people who don't realize that are the ones who love it and make my on-call shifts hell.
I hear the same arguments over and over about "simplicity" in the language that just don't hold up. I really don't understand if I'm just an absolute idiot or if there are loads of developers who don't realize that they're writing half-assed, buggy Go code while thinking it's "so easy and simple".
But honestly, I just couldn’t be bothered to write it all out. I'll never get through to those people. They'll have to learn it for themselves.
-
Notes should be concept-oriented
2021-09-09 11:34
Each of our 202109091129 Evergreen notes should be written about a concept, not about a book, project, or event. This is the only way to ensure that we're able to discover connections across books, projects, events etc. (202109091131 Notes should surprise us) and that our notes will form a web of tightly linked concepts (202109091132 Notes should be densely linked).[^matuschak2017concept]
This also ensures our principle that 202209091130 Notes should be atomic. If we write a single note about a book, we may write more than one concept into that note. Now recollection and linking requires remembering the book and the fact that the concept was in that book, instead of just the concept. If we keep it concept oriented, 202109091133 Notes should associate organically and similar concepts from individual books will still coalesce.
Another benefit of keeping notes concept-oriented is that we can build on our previous work. 202109060836 Knowledge should accumulate, and by ensuring we're noting concepts, we can accumulate our learnings from one book on a concept with other learnings on that same concept. Contrast this to just taking notes per book. In that situation, we never realize the connection between two books talking about the same concept, or if we do, we don't fully investigate the depth and breadth of that relationship — we just remember that they covered similar topics and yet were slightly different. An even more extreme example is two very different books that are related only by one subtle point. Would we notice that point if we weren't keeping our notes concept-oriented?
-
Making a Rust Roguelike
Making a Game Out of Learning
2022-08-01 00:00
In the process of learning Rust, I'm following a great tutorial for building a roguelike game.
Background
There are a lot of ways to learn a programming language: from docs and books to puzzles to fun side projects.
There's a really great community on Reddit called /r/roguelikedev and one of their coolest resources is a comprehensive tutorial for making a roguelike game from scratch in Python called The Complete Roguelike Tutorial or TCOD. A guy named Herbert Wolverson built a really amazing version of that tutorial in Rust (with some changes).
One of my friends who's into game development showed me all these things and how he was going through that Rust tutorial and porting it to his most comfortable language, C#. Since I was already learning Rust, I thought I would give the Herbert's Rust version a try.
So come along and join me as I document some progress and thoughts about Rust and game development. Hopefully I'll be able to build the final game to WASM and embed it as a project here on the site.
-
Repeated success requires adaptation
2023-04-03 12:33
What you did to become successful is likely to be counter-productive when applied at a later date.[^hamming2020]
There are two things at play here.
First, the "old expert" often fails to keep up with the times. The context around them shifts and the advancements even in their areas of expertise change what, how, and why things are done. They often become set in their ways and can end up not just irrelevant, but outright wrong. This can be for many reasons like ego, pride, lack of motivation, arrogance, or just rapid progress.
Second, because we have gained some success by doing things a certain way, we're likely to be biased to believing that we're capable of knowing the "correct" way more than others since there were people who were not successful while we were. This closes our minds to novel, creative solutions and fundamental changes in our fields.
It's important to use our time regardless of our successes to continue being creative (202211030958 Creative accomplishments happen over time). We should avoid being overly cautious for fear of losing our successful position (202408060133 Caution and perfectionism hurt progress). We should strive to 202208211426 Work with people who know they don't know and be one of those people ourselves! We need to adapt to the changing world in order to have more success and not be blockers for future generations of thinkers. 202308271043 Be an early adopter of interesting things to learn widely and integrate good new ideas.
-
Live in the ambiguity
2021-04-29 15:27
Great people can tolerate ambiguity; they can both believe and disbelieve at the same time.[^hamming2020]
Living in ambiguity is a skill that every leader should master. It becomes increasingly important as the scope of your responsibilities involves higher level decisions and information. 202104291525 It's not a leader's job to be the best at everything.
Ambiguity is abundant in the world of broad directional decision making. There's no such thing as certainty. 202104291528 Leaders have to accept a slower feedback loop. We need to be able to build reasonable mental models, act on them, and accumulate more information to continue steering the ship. Ambiguity is no excuse for not being able to 202108191029 Measure what you do.
In order to 202104291526 Make the hard decisions, we need to be comfortable knowing that these decisions are hard because of the ambiguity of our position. We have competing information, context, and goals vying to win out. There are only shades of grey working here. Don't fall into the trap of letting this ambiguity cause 202109090909 Decision paralysis.
Just as biology is a field about 202104291540 Emergence where the simple, predictive, mechanistic laws of physics create something unpredictable and greater than its pieces, leadership is a field where we can no longer follow cause and effect in a functionalist manner. Emergence is at play in the real world situations we see every day.
-
The things we own end up owning us
2021-12-29 18:21
He who possesses is possessed.[^nietzsche1887]
Important note about this Nietzsche quote: he said that this is the mindset of philosophers who strive for the "ascetic ideal". The third essay (of which this is a part) calls into question the entire value of that ideal entirely. He's not advocating for this idea per se, but also not suggesting that it's untrue.
The things you own end up owning you. It’s only after you lose everything that you’re free to do anything.[^palahniuk1996]
What matters isn’t what a person has or doesn’t have; it is what he or she are afraid of losing. [...] [T]hose who have more to lose are more fragile.[^taleb2017]
Objects, material possessions, or anything we feel ownership over consistently tether our lives, minds, and emotions to them.
This can be viewed as a good thing in some regards but the sentiment is much more often negative. We should strive to become unchained from objects so that we can live our lives and experience the world from a place of freedom. This freedom is physical freedom, yes, but also a freedom of the mind — a freedom from the shackles of closed mindsets. We are free to learn and see things for what they are rather than how they fit in our constructed world of chains.
-
I claim them all
2022-08-22 13:21
"What you need," the Savage went on, "is something with tears for a change. Nothing costs enough here." [...]
"Exposing what is mortal and unsure to all that fortune, death and danger dare, even for an eggshell. Isn't there something in that?" he asked, looking up at Mustapha Mond. "Quite apart from God—though of course God would be a reason for it. Isn't there something in living dangerously?"
"There's a great deal in it," the Controller replied. "Men and women must have their adrenals stimulated from time to time."
"What?" questioned the Savage, uncomprehending.
"It's one of the conditions of perfect health. That's why we've made the V.P.S. treatments compulsory."
"V.P.S.?"
"Violent Passion Surrogate. Regularly once a month. We flood the whole system with adrenin. It's the complete physiological equivalent of fear and rage. All the tonic effects of murdering Desdemona and being murdered by Othello, without any of the inconveniences."
"But I like the inconveniences."
"We don't," said the Controller. "We prefer to do things comfortably."
"But I don't want comfort. I want God, I want poetry, I want real danger, I want freedom, I want goodness. I want sin."
-
Affecting long-term change
2022-03-23 16:46
Affecting long-term change is one of the most challenging things that a leader can do.
For one, the feedback loop about a long-term change comes at a glacial pace (202104291528 Leaders have to accept a slower feedback loop).
Next, there's a constant need to 202104291529 Repeat the message in order to be heard. For long-term changes, this can literally span years of repeating the same message. In practice, this repetition requires vision and extreme conviction. We must be visionaries to see the goal and keep it in sight even when the going gets tough. We must have conviction that the goal is worth it; that view from the mountain top will be worth the climb. Having this 202107240951 Visionary leadership style and 202203231647 Leading from vision requires us to be comfortable with 202112201317 The solitude of leadership.
So how can we persevere?
- We need to 202104291527 Live in the ambiguity and allow these slower loops.
- We must be patient with our communication, re-communication, and re-re-communications ad nauseam.
- We need to remove obstacles to make the path as clear as possible (202106241548 Leaders work to remove obstacles).
- We need to 202104292040 Eat the losses.
-
Learning Rust
A Quick Lesson in Ownership
2022-05-15 00:00
I'm learning rust
A note on format
This is a little stream of consciousness post about my experience working through the official intro to rust book. There's not much point to it other than to help me evaluate how I feel working with the language.
Getting going
I started out by installing
rustup
, but immediately hit a problem. I already had a version of rust installed on my system. It was an old one installed through homebrew. Nevermind that, I just needed to uninstall the brew version and install a newer one via the recommended approach.Next, I installed
rust-analyzer
making sure to grab the VS Code extension which (at the time of writing this) is the recommended language server even though the RLS extension has many more downloads. There's been some sort of maintenance issue or something. I didn't look into it too much, but this is the community direction right now.I found that
rust-analyzer
only works when you have a wholecargo
project as the root of your workspace in VS Code though. It's a bummer that we can't have non-root rust projects and still get the benefit of the language server and all it's hover/intellisense/type goodies. I think there's a way to make this work with arust-project.json
file, but I didn't want to get sidetracked before even getting started. -
Zen in the face of programming
2022-06-11 21:25
There's a hill that we climb through our career as programmers.
We start at the bottom where everything is difficult, foreign, and new. We have all the energy, enthusiasm, and patience in the world.
We climb, learn, and grow strong. We enjoy climbing. We get better at it. We ascend at an increasing pace.
But then, we start to lose steam. We no longer have the enthusiasm for the climb that we once did. We want to get to the top at long last. We want the code to be good, complete, perfect. If only we could do that rewrite. If only everyone could write less buggy code.
I know best, I've been climbing for years, let me get to the top already!
We lose faith. We stumble. We despair at the infinitude of the climb in front of us. Surely there is no end. Surely there's no point to it all. The climb breaks us.
And yet, when we're broken, we find the truth — there is no top — there's always one more step. We find that the climb is the purpose. With revelation comes renewed joy and a peaceful, sustainable way to continue the climb.
We find joy in sending other climbers lifelines. We find joy in looking around and coming to know the people below, next to, and above us on the climb.
-
The Pragmatic Programmer
2023-07-24 10:42
Intro
- 202308141544 Make the future less painful
- 202308281423 Ship of Theseus
- What makes a pragmatic programmer?
- 202308271610 Quarry workers' creed
Chapter 1
- 202308282340 No broken windows
- 202312091400 Be the exemplar of change
- 202312091413 Know what's good enough
- Think critically
Chapter 2
- Good design is easier to change than bad design. Almost all other patterns boil down to "easier to change" or ETC or 202205031449 Optimize for change or 202204262114 Write code that's easy to delete, not extend.
- This is a value (spectrum) not a rule.
- This is why I don't like frameworks that lift a lot (tailwind style string classes everywhere in code) or rails magic. It's everywhere and pervasive and not good. Or things w/lots of non-standard tooling (bit or graphql)
-
Thinking in Systems
2024-01-29 14:11
- 202401291425 Definition of system
- 202401291441 Systems thinking benefits all thought
- 202401291458 The purpose of the parts may not be the purpose of the whole
- 202401291554 All systems thinking is a simplification
- 202308281423 Ship of Theseus
- 202205021252 Stock and flow
- 202110231515 Feedback loop
Chapter 2 - A Brief Visit to the Systems Zoo
- One Stock Systems
- 202402171439 One stock with two competing balancing loops
- 202402171455 Feedback can only affect future behavior
- 202402171507 A stock with one reinforcing loop and one balancing loop
- 202402171512 The principle of shifting dominance
- 202402171520 Ask questions to assess the validity of a model
- 202402241530 One stock with delays
- Two Stock Systems
Chapter 3 - Why Systems Work So Well
-
Zero to engineer
2022-08-10 19:44
How do get into 202109061338 Software Engineering?
Let's go at this from a specific angle.
What would it take for me to get an entry level job as a programmer?
- Get past the résumé screen
- Get past the recruiter screen
- Get past the coding exercise
- Get past the onsite interviews
Preparing for these takes different amounts of time and require different skillsets. If we include the dependencies between each step and sort them by preparation time, we get a new ordering.
- Getting past the coding exercise — is the basis for 2 and 3, so it must be solid and come first.
- Getting past the résumé screening — requires things like example projects and raw time spent coding.
- Getting past the onsite interviews — definitely the point where not knowing your shit can bite you, but it's also possible to be great at interviewing and compensate for your rough patches with things like work ethic and initiative.
- Getting past the recruiter screening — easy to bullshit past if the résumé checks out, but always easier if you're confident and capable than faking it.
Getting past the coding exercise
Helps if you know what it will be. Many companies make things like this available in advance. If so, you have an obvious path.
-
Software Engineering
2021-09-06 13:38
Maybe this should be a structure note of structure notes only since this is a huge topic that I'd like to really dive deep on. There is also the 202206191300 Computer Science structure note that I’ve split out to dig in to the more technical, theoretical stuff in order to keep this one focused more on the practice of writing software and careers or organizations in this field.
Topics
Documentation
- Co-locate tech docs with the code
- C4 Modeling
Abstraction
- You aren't gonna need it (YAGNI)
- 202204031033 Abstractions and future-coding are actively harmful
- 202204262054 Prefer duplication over the wrong abstraction
- On the spectrum of abstraction[^lou2016]
- Open for extension closed for modification O in SOLID. Means you can add new behavior without modifying any existing code. Always green, always confident in lack of side effects.[^metz2013]
Measurement
- 202304231046 List of SDLC metrics
- 202204272219 The fastest code is no code
- 202109251100 Verify behaviors and assert properties
- Thought experiment. Coding as function, what do the derivative and integral represent? Related to 202107291950 Optimizing requirements and implementations and 202110111901 Run to change ratio of a program.
-
Procrastination is triggered by emotional aversions
2021-06-22 11:22
To accomplish a task we must go through the stages of inception, planning, action, and termination. We decide to do something, plan out how to do it, do it, and decide when it's done. We sabotage our progress through these stages because of emotional aversions.[^cunff2021]
One strategy that's particularly effective against most of these aversions is to 202108191029 Measure what you do. By measuring your progress, and building measurements into the tasks, we can see that we are in fact making progress and accomplishing something.
Eight Aversions
- Boring — It's not intellectually stimulating enough and we're just not interested in doing it.
- Frustrating — For example, you may be using a tool that is difficult and inefficient and get frustrated with it. This could cause you to stop doing it or not start doing similar tasks in the future.
- Difficult — Challenging tasks take time and effort so we often work on simpler things first and put off the big tasks. This can be a killer of 202106221146 Leverage causing us to stay stuck on a treadmill of repeatable low-value tasks.
- Stressful — Stress is a huge emotional aversion. There are strong psycho-physiological consequences of experiencing stress. Stress typically delays our starting of the task and often is met with a less stressful reality once the task is being done.
-
Cloud Native Computing
A New Way to Build
2018-08-01 00:00
First Salesforce revolutionized IT with SaaS, then other service platforms extended those ideas for the full stack. Cloud Native Development is here to stay.
Eons ago, people developed enterprise software as standalone packages that were delivered to companies who then painstakingly installed and updated them. Often installation or upgrade projects could take over a year to complete. The software ran on servers that cost hundreds of thousands of dollars and were physically located at the company's headquarters. To the younger readers, I know this is sounding like some sort of nightmarish hellscape, but I promise that it really happened.
Software as a Service
In 1999 at the beginning of recorded history, a man named Marc Benioff founded a company called Salesforce that saw a better way forward. The goal was to provide a better experience and value to their consumers — enter the software as a service model (SaaS). SaaS aimed to improve on enterprise software delivery in a few key areas.
First, it decided on a subscription pricing structure so that customers were only paying for the features they were using. It also lowered the barrier to adoption and let users land on a platform for lower cost. The idea was that after the users landed, the quality of the product and the variety of features would incentivize them to increase their usage and feature adoption on a higher subscription tier.
-
Play long term-games
2021-09-25 11:40
Everything in here is a great #thread to pull on
The days are long but the decades are short.
In a lot of ways, our entire lives are unforgivably short. In other ways, they are long. We have the opportunity in some areas to play long-term games. We should be playing more long-term games and less short-term ones. Long term games take advantage of 202304102048 Compounding Interest.
- Investing is a game of long-term 202304102048 Compounding Interest.
- 202205231312 A Career is a long-term game of pace, people, prestige, profit, and learning.[^larson2019forty][^newport2021]
- Family and friends are a deeply rewarding long-term investment.
- 202304112152 Intellectual investment is like compound interest. Education is a high 202106221146 Leverage long-term game that can feed into other areas of your life.[^thorpe2017] Study math, physics, chemistry, astronomy, probability, chance, risk, reward, uncertainty, humanity and its societies, externality bias.
- Consistent hard work over time will compound to the point that you'll be surprised how much you can achieve (202304102024 Great people have a great deal of drive to do great things).
- The 202308271610 Quarry workers' creed
-
Category Theory in Life
2022-07-18 19:46
Category theory is abstract, but its abstraction makes it apply to many things around us in ordinary life.
What is category theory?
Category theory is the mathematics of mathematics
Mathematics is the logical study of how logical things work.
In order to study things logically, we have to ignore some details of reality that make things behave illogically. It's only in the abstract world where things do behave perfectly logically
Category theory is the logical theory study of the logical study of how logical things work.
The map of the London underground is a good example of a "mathematics", where the geographical map of the exact tubes are not the purpose. The slightly unreal, more representative version helps us in a certain situation navigate more easily. We choose to ignore certain details to represent things more logically.
Objects and morphisms
$A \rightarrow B$ means there's a $morphism$ between $A$ and $B$.
So if we have
$$A \xrightarrow{\text{is the mother of}} B \xrightarrow{\text{is the mother of}} C$$
We can deduce
$$A \xrightarrow{\text{is the grandmother of}} C$$
Instead of looking at things based on their intrinsic characteristics, we can learn a lot about them (and other things) by their relationships to other things: hence the "Category". This gives us more context
-
An Ode
2023-07-28 20:03
We are the music makers, And we are the dreamers of dreams, Wandering by lone sea-breakers, And sitting by desolate streams; — World-losers and world-forsakers, On whom the pale moon gleams: Yet we are the movers and shakers Of the world for ever, it seems. With wonderful deathless ditties We build up the world's great cities, And out of a fabulous story We fashion an empire's glory: One man with a dream, at pleasure, Shall go forth and conquer a crown; And three with a new song's measure Can trample a kingdom down. We, in the ages lying, In the buried past of the earth, Built Nineveh with our sighing, And Babel itself in our mirth; And o'erthrew them with prophesying To the old of the new world's worth; For each age is a dream that is dying, Or one that is coming to birth. A breath of our inspiration Is the life of each generation; A wondrous thing of our dreaming Unearthly, impossible seeming — The soldier, the king, and the peasant Are working together in one, Till our dream shall become their present, And their work in the world be done. They had no vision amazing Of the goodly house they are raising; They had no divine foreshowing [Continue reading](/notes/202307282003)
-
Revamping My Blog
A New Coat of Paint
2020-06-01 00:00
You may have noticed that the blog got a new look and feel recently. The changes weren't purely cosmetic though. Let's take a look at how I migrated from a Bootstrap and PHP based blog to React, Next.js, and Styled Components.
Motivation
It's probably not a surprise to most people that I'd want to switch from a PHP based blog to something a little more modern, but honestly — and perhaps controversially — I think PHP is still an amazing solution for simple use cases like mine. No, the shininess of tech isn't a good enough reason on its own for me to rebuild the blog from the ground up. So what reasons were there for updating things and switching tech?
Criteria
- Ease of Maintenance — My blog was running like a dream for years on a crazy simple setup, so any solution that I went with was going to have to at least match it in terms of maintenance effort.
- Ease of Writing — There was quite a bit to be desired in the old setup. I was using a rich text editor that was hard to get well formed rich text data out of. It was also really difficult to use on mobile. Wanting to use a simpler format (like markdown files) and the ability to use a plain text editor was a big reason to make a switch.
- Performance — My old setup was slow for a host of reasons. I was running PHP and MySQL on the same old machine sitting underneath my printer. The thing was ancient when I acquired it longer ago than I care to admit. It would be nice if I could take advantage of something out there that did lightning fast static site edge cached delivery.
-
Architecture Decision Records
2022-04-02 12:18
An Architecture Decision Record (ADR) is a document that captures a decision, including the context of how the decision was made and the consequences of adopting the decision.[^blake2020]
While the name implies that these would be used for mainly architecture level decisions, many people advocate for using them for nearly any decision, no matter how mundane.[^blake2020][^perkins2020] The purpose of recording as much as possible is to facilitate the 202110231449 Externalization of knowledge for software projects and product organizations. (202110231440 Knowledge is the backbone of a product organization)
ADRs are beneficial because they enable persistence and transfer of knowledge. They’re a great example of the 202110231445 The SECI model of organizational knowledge in action. They take 202110231457 Tacit knowledge and transform it into 202110231459 Explicit knowledge
ADRs can be used proactively to propose changes, or retroactively to record decisions that were already made.
My experience with ADRs has been split across two levels of use.
- Organization-wide — Valuable to an extent, but can be used poorly to push things that shouldn’t be approved under the guise of seeking wide consensus. The important thing for these to work are having good, competent coworkers and/or to have people who are not afraid to actively dissent in a widely public forum. They can be an invitation for people to engage in costly bike-shedding or an indispensable log of the collective mind of a group. Which side of this your group falls on is hard to tell and requires some radical candor to identify.
-
Types, and why you should care
2022-06-28 14:49
From a talk[^minsky2019] by Yaron Minsky of Jane Street.
Typed vs. Untyped
- Untyped — scripting, lightweight, friendly, and slow.
- Typed — Serious, professional, unfriendly, verbose, and fast.
Some definitions
- Values — data, things
- Variables — can be different values, part of the lexical portion of the language
- Expression — composed out of variables, values, and other things
- Types — categorization system for values; groups values into named groups; strings, integers etc.
- In untyped language, values have types
- In typed languages, values, variables, and expressions all have types. (For instance, variable is typed when it always contains a variable of that type)
Why types?
- Make programs faster, typically through compilation/interpretation loop having “hints” and more information.
- V8 for instance can be super fast, within a factor of 3 or so from a compiled language (but this is through herculean effort of thousands of people over tens of years and complicated things like tracing compilers and things)
- This is predictable performance vs V8
- Make programs more understandable
So why don’t people always use them?
- Often make programs more verbose — when the language doesn’t have a convenient way to express something, it’s difficult to express it at all or in a good way
-
Data-first pipe design
2021-07-27 23:07
Contrasts with 202107272306 Data-last pipe design.
Background
With data-last being the standard convention of most functional languages, why would we want to adopt a different data-first approach? The motivation comes from type inferences and compilers.
In OCaml, type inference works from left to right, top to bottom.[^chavarri2019] If we start a list with one type, then adding another item after the first will give us a type error.
let ints = ^^^ Error: This expression has type string but an expression was expected of type int
It’s easy to see that this will come into play with a data-last approach. The data object has the type that matters to us as programmers who are manipulating them. The functions are written to accept a known data object type and work on them. This causes confusion because it’s a reversal of the error messaging we receive.[^chavarri2019]
let words = let res = map ^^^^^ Error: This expression has type list but an expression was expected of type list Type string is not compatible with type int
This error is telling us that the authority of the typing is the function of the list.[^chavarri2019] Besides being conceptually backwards — which is a subjective point — there’s an objective issue here as well. It feels as if the type inference should be able to “override” this error because we’ve already nailed down the type of
words
in the line above themap
. -
Creating a monad from a set
2022-07-27 13:24
Say we have a set ($M$). What would make that set a monoid?
Our first step to Monads is to make the set a Magma. A magma is a set that has any binary operator ( $\cdot$ ) that takes two elements of that set and produces another element in that set.
$$a,b \in M \implies a \cdot b \in M$$
Next, we add associativity to turn our Magma into a Semigroup.
$$\forall a,b,c \in M \enspace [(a \cdot b) \cdot c = a \cdot (b \cdot c)]$$
Next, we add the identity constraint to turn our Semigroup into a Monoid.[^wikipedia2022monoid] Note that we specify the "left" and "right" identity since we don't have the commutativity constraint.
$$\exists i \in M \enspace [\forall x \in M : | : i \cdot x = x \land x \cdot i = x]$$
Notice also that as a category, a monoid contains only one item (hence the "mon-" prefix). All morphisms loop back onto the same object. This is an english language way of saying the same associativity and identity ideas.
This is where we take a turn away from sets. The (in)famous saying
A monad is just a monoid in the category of endofunctors.
shows that we need to look at the monoid through the lens of a functor to create a monad.[^lipovaca2012]
-
The Story of Mel, a Real Programmer
2024-08-12 18:14
A recent article devoted to the *macho* side of programming made the bald and unvarnished statement: Real Programmers write in FORTRAN. Maybe they do now, in this decadent era of Lite beer, hand calculators, and "user-friendly" software but back in the Good Old Days, when the term "software" sounded funny and Real Computers were made out of drums and vacuum tubes, Real Programmers wrote in machine code. Not FORTRAN. Not RATFOR. Not, even, assembly language. Machine Code. Raw, unadorned, inscrutable hexadecimal numbers. Directly. Lest a whole new generation of programmers grow up in ignorance of this glorious past, I feel duty-bound to describe, as best I can through the generation gap, how a Real Programmer wrote code. I'll call him Mel, because that was his name. I first met Mel when I went to work for Royal McBee Computer Corp., a now-defunct subsidiary of the typewriter company. The firm manufactured the LGP-30, a small, cheap (by the standards of the day) drum-memory computer, and had just started to manufacture the RPC-4000, a much-improved, bigger, better, faster --- drum-memory computer. Cores cost too much, and weren't here to stay, anyway. (That's why you haven't heard of the company, [Continue reading](/notes/202408121814)
-
The Only Correct Way to Organize Code
A Joking Rant About Keeping Code Neat
2020-09-01 00:00
Why we need a system for code organization and what that system should look like.
Highway to the Danger Zone
Though the pattern is full and it will definitely get me in trouble, I'm going to metaphorically buzz the tower by putting some pretty strong opinions out there today about file naming and code organization. So buckle up Goose, and don't hit that eject button.
First off, file naming. The correct answer here is
kebab-aka-hyphen-case
which is all lowercase and hyphen delimited. No exceptions, and no, your community standards aren't a good enough reason to change this one as we'll see in a minute. Looking at youComponentName.jsx
👀 .Second, code organization. The only correct answer is
folder-by-feature
as opposed tofolder-by-random-devs-logic
orfolder-by-tech
. We'll take an organic trip through all three of these systems and see where we end up.Either of these alone is enough to spark a holy war among devs, but unlike tabs vs spaces, I think there's good enough objective reasons to pick one over the others. Let's take a look.
File Naming
I don't want to spend too much time on this topic because it's much less important to a team of developers than having a consistent system for creating, finding, and maintaining the actual functionality of your product through its source code. Still, you can see how it's in the same vein and deserves an honorable mention.
-
Bloom's taxonomy of knowledge
2021-07-28 21:44
One of the three sections of 202110260923 Bloom's taxonomy of educational objectives. The taxonomy of knowledge focuses on the cognitive (knowledge-based) domain of development.[^wikipedia2021bloom]
All knowledge is built on prior knowledge, so I shouldn't worry about feeling like I'm only creating a collection of other people ideas. I can apply bloom's taxonomy to these ideas you've collected.[^nick2021]
Remember
Knowledge involves remembering facts, terms, basic concepts, or answers without necessarily understanding what they mean. One can remember specifics (terms or facts), ways and means of dealing with specifics (conventions, trends, categories), or universals and abstractions (principles, generalizations, theories, or structures).
Example: "Name three common varieties of apple."
Understand
We then have to demonstrate an understanding of the facts and ideas by organizing, summarizing, translating, generalizing, giving descriptions, or stating main ideas.
Example: "Summarize the identifying characteristics of a Golden Delicious and a Granny Smith apple."
Apply
After understanding comes application. We use our acquired knowledge to solve problems in new situations. We should be able to use our prior knowledge to solve problems, identify connections and relationships, and understand how the knowledge does or does not apply in this new situation.
-
What React and Kubernetes Teach Us About Resilient Code
A Similarity Among Widely Different Tech
2019-11-15 00:00
A brief intro to control theory and declarative programming
This post was initially published as part of the Beam Engineering Blog here and cross posted here on my blog.
Two Concepts
Here at Beam, we're on a quest to make our technology work for everyone. As part of this quest and as a need stemming from our hyper-growth, my development team is shifting our focus away from feature development toward platform technology and developer experience.
On the infrastructure side, we've been working on a CLI tool for our devs that will let them easily manage infrastructure from the command line. They can spin up entire AWS environments and deploy code from multiple repositories with a single command — no more waiting on other developers for testing and staging environments to be free, and no more inconsistency between production and testing environments. The quest for consistency led us to containerization, and our quest for easy infrastructure management led us to infrastructure as code. Our containers and infrastructure then lead us to a need for better orchestration of those containers. We needed tools that would make the often complex task of deploying, integrating, scaling, and managing services simple and routine — enter Kubernetes.
-
Computer Science
2022-06-19 13:00
The nitty-gritty of computation and technology. Contrasted with 202109061338 Software Engineering which is more about the practice of writing software and careers or organizations in that field.
Curriculum
- 202208101944 Zero to engineer
- 202206282018 Curriculum design for software engineering
- Maybe start here?: MIT OpenCourseWare for Computer Science
- Maybe I should make this yet another structure note that lays out the whole process and what order and how things are connected? Probably just start doing that in this note and maybe split it out later.
Programming language design
- 202107272307 Data-first pipe design
- 202107272306 Data-last pipe design
- Go kind of sucks?
Asynchronous computing
- How does asynchronous stuff really work in JS? Promises, async/await, under the hood etc. #thread answer: JS spec requires implementations of JS to implement an event queue which JS processes fifo. Could be fun to implement a JavaScript runtime in Rust or something. (Might already exist from Mozilla, V8 is written in C++)
-
As We May Think
2021-09-08 08:47
#structure #thread #source #new
A seminal essay on machine augmented thinking written by Vannevar Bush in 1945.[^bush1945]
He urges that men of science should turn to the massive task of making more accessibly our bewildering store of knowledge. For years inventions have extended man's physical powers rather than the powers of his mind. [These inventions] are new results, but not the end results, of modern science. Instruments are at hand which will give man access to and command over the inherited knowledge of the ages. The perfection of these pacific instruments should be the first objective of our scientists as they emerge from their war work. Like Emerson's famous address of 1837 on The American Scholar this paper calls for a new relationship between thinking man and the sum of our knowledge.
Consider a future device [...] in which an individual stores all his books, records, and communications, and which is mechanized so that it may be consulted with exceeding speed and flexibility. It is an enlarged intimate supplement to his memory.
Knowledge evolves and endures throughout the life of a race rather than that of an individual
Publication of research has been extended far beyond our present (1945) ability to make real use of the record.