Results: 88
-
Homoiconic programming languages
2022-06-12 13:09
A language is homoiconic if a program written in it can be manipulated as data using the language, and thus the program's internal representation can be inferred just by reading the program itself. This property is often summarized by saying that the language treats "code as data".[^wikipedia2022homoiconicity]
One of the most commonly cited homoiconic languages is Lisp. Clojure (a modern dialect of Lisp) and Julia are also homoiconic.
Example
The following Lisp S-expression creates a list of 3 elements with values 1, 2, and 3, and is precisely equivalent to the code required to create the object itself.
; => (1 2 3)
More broadly, all Lisp programs are lists (a.k.a. objects which can be manipulated with the Lisp language). Slightly more concretely, the string representation of a Lisp program is valid Lisp data. Passing a hard coded value or passing a Lisp program as input to a Lisp function would behave identically.
An example of non-homoiconicity in JavaScript:
const arr = ; arr.; // => '1,2,3'
Here, the string representation (even if we print it more nicely as
[1, 2, 3]
) is not the same as the code required to create the object (for instance, the variable declaration part). This is a simple example that might fall down on a deeper level, but gets the idea across. -
Seven habits of highly effective people
2021-06-22 17:13
The seven habits of highly effective people are described in the eponymous book by Stephen R. Covey.[^covey2004] Covey discusses how people can see the same things and have different perspectives. He also discusses how maturity is a continuum that can be describes as moving from dependence to independence to interdependence.
An observation: 202109251019 Highly effective people are leaders.
Circles of Influence
Maturity Continuum
- 202109121550 Maturity of dependence
- 202109121536 Maturity of independence
- 202109121530 Maturity of interdependence
The Seven Habits
Habits for building independence
- 202106241529 Be proactive
- 202106221744 Begin with the end in mind
- 202106241528 First things first (Covey uses the 202106241531 Eisenhower matrix of task value as an example of how to define what should be put first)
Habits for interdependence
- 202106241527 Think win-win
- 202106241526 Seek first to understand, then to be understood
- 202106241525 Synergize
Habits for continual improvement
-
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 -
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
. -
Hell yeah NASA
2024-04-23 21:20
NASA engineers never fail to amaze as they get Voyager 1 sending data again from interstellar space.
-
Invest discretionary time in top performers
2021-10-18 12:05
A 1% increase in their performance amounts to more output than a 1% increase in your bottom performers' outputs.1[^auzenne2011coaching1][^auzenne2011coaching2] By this logic, you should only invest your time in increasing the performance of your top performers.
This does not mean that you shouldn't coach the others and give them feedback. It's a statement of what to do with any discretionary time you have as well as one about maximizing returns on investment in overall team performance. When 202110181158 Coaching underperformers, it's important to understand that there's a level where good enough is fine, but they will need to personally invest more into being a top performer before it makes sense for you to invest more time and effort with them.
Another way of saying this is if 202104291524 Execution is the priority of team management, then the best way to increase execution is to focus on increasing the execution of top performers.
-
Kislik, L. (2020, December 2). Managing an Underperformer Who Thinks They’re Doing Great. Harvard Business Review. https://hbr.org/2020/12/managing-an-underperformer-who-thinks-theyre-doing-great ↩
-
-
Always bet on text
2021-10-22 16:53
Text is the most powerful, useful, effective communication technology ever.[^hoare2014]
- Text is the oldest and most stable communication technology (assuming we call speech a natural phenomenon). You can read text from 5000 years ago and can engrave granite that will outlast the human species.
- Text is the most flexible communication tech. Text can convey ideas with a precisely controlled level of ambiguity and precision, implied context, and elaborated content, unmatched by anything else. It is not a coincidence that all of literature, poetry, history, philosophy, mathematics, logic, programming, engineering, and everything else rely on textual encoding for their ideas.
- Text is the most efficient communication technology. By orders of magnitude.
- Text is the most socially useful communication technology. It works well in 1:1, 1:N, and M:N modes. It can be indexed and searched efficiently, even by hand. It can be translated. It can be produced and consumed at variable speeds. It is asynchronous. It can be compared, diffed, clustered, corrected, summarized and filtered algorithmically. It permits multiparty editing. It permits branching conversations, lurking, annotation, quoting, reviewing, summarizing, structured responses, exegesis, even fan-fic. The breadth, scale and depth of ways people use text is unmatched by anything. There is no equivalent in any other communication technology for the social, communicative, cognitive, and reflective complexity of a library full of books or an internet full of postings. Nothing else comes close. Nothing.
-
Approximations compose poorly
2021-10-11 11:06
Approximations do not hold up to composition with other approximations. The error of approximation is magnified when we combine them so that the total error becomes egregiously large.
Here's a simple example with basic math
2.00 ~= 1.99 2.00 ^ 2 = 4.00 1.99 ^ 2 = 3.96 2.00 ^ 3 = 8.00 1.99 ^ 3 = 7.88
You can see how the error is growing much larger after combining multiple approximate values.
In programming, this can be devious. We're not always sure where approximations will come in to play (including things like floating point precision problems).
Haskell offers a unique way around this problem with its laziness characteristic. Since things are evaluated lazily, we can specify a representation of infinite precision for our approximations and the precision we need at the end and Haskell will evaluate all our approximations to the necessary precision to get a correct precision in the outcome.1
-
Jelvis, T. (2015, June 17). Thinking with Laziness. Begriffs. https://begriffs.com/posts/2015-06-17-thinking-with-laziness.html ↩
-
-
Stir Trek 2024
2024-04-30 10:34
Selected Sessions
time room rank speaker track session 08:45 could not attend -
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.
-
Simple stress measurement questions
2021-10-22 08:40
Here are a few questions we can ask ourselves and others to measure their level of stress and burnout.1
- How stressed are you right now?
- What is your ideal stress level? Ideal meaning the stress is useful and not debilitating.
- What is your max stress level?
- What behaviors do you see in yourself when you close or at max?
Another similar question can help us identify stressors and guide a path to a more healthy lifestyle.
- Food, exercise, sleep, and time are the most important things. What's keeping me from them?
-
Lopp, M. (2021, June 25). The Hotel Giraffe. Rands in Repose. https://randsinrepose.com/archives/the-hotel-giraffe/ ↩
-
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 ↩
-
Closing calls
2021-09-07 20:35
Offering a closing call will substantially improve your odds of hiring a candidate.1 Not many people will take you up on it, but those that do will be highly engaged in the process.
How to do closing calls
- Offer the call.
- Show up prepared with their background and ready to articulate why you're at the company and why they should join.
- Ask what the candidate wants to talk about before you start talking.
- Tell them why the role addresses their concerns. If it truly doesn't, then it's better to learn that now.
- Clarify next steps and offer more time.
Abbreviated Version
- Ask for their concerns.
- Answer by telling the best version of the truth.
-
Larson, W. (2021, August 26). Closing calls: Tell the best version of the truth. Irrational Exuberance. https://lethain.com/closing-calls/ ↩
-
Differentiate between self-doubt and idea-doubt
2021-10-21 22:31
All humans feel fear and doubt when creating. The process can look something like this
- This is awesome
- This is tricky
- This is crap
- I am crap
- This might be ok
- This is awesome
Original thinkers and those that are consistently creative can skip step 4. Instead of saying “I’m crap” we should be saying “the first few drafts are always crap”.1
There are two things at play here.
- We shouldn’t doubt ourselves, we should doubt our ideas. We should test, iterate, think, revise, and build the best thing without being attached to the original idea or taking setbacks personally.
- 202112180923 Don't fear failing, fear failing to try
-
Grant, A. & TED. (2016, April 26). The surprising habits of original thinkers. https://www.youtube.com/watch?v=fxbCHn6gE3U ↩
-
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
-
Data-last pipe design
2021-07-27 23:06
Contrasts with 202107272307 Data-first pipe design.
Background
To start, the basic idea here is that the “data” or “object” is passed as the last parameter to a function. Consider the standard library
List.map
function from OCaml.[^chavarri2019]let numbers = ; (* numbers is the "data" and the last parameter *) let listTwo = map;
Data-last pipe design is common in functional languages because of currying #thread and partial application #thread.
Let’s take the example from above and break it up taking advantage of currying and partial application.[^chavarri2019]
let addOneToList = map; let listA = ; let listB = addOneToList;
It’s obvious in this example why data-last makes sense. Partially applying the function gives us a new function that we can reuse on different data objects. This is a powerful (de)composition #thread mechanism and the style of programming building up composed functions without specifying their parameters is called point-free programming #thread. Point-free programming is only possibly because of currying and partial application.
Functional languages supported currying by default and therefore naturally gravitated towards data-last conventions.
-
Timeout Killer
2024-05-05 12:51
Timeouts and Cancellations for Humans
Nice article on the difficulties of actually doing timeouts correctly. And an idea for a malicious endpoint that returns 1 byte every second or so for the same request to keep poorly coded timeouts from triggering.
-
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 ↩
-
Rescuing a failing project
2023-10-30 11:05
Cure the lack of momentum and feedback.
- Add some (very few for now) tests even if they verifies a bug continues to be a bug.
- Set up CI/CD that tests and pushes always.
- Continue to add tests
- If it hurts, do it more and automate it more.
Crafting Code Podcast Ep. 2
-
1BRC in rust in depth
2024-08-25 09:20
Just found a really awesome, super in-depth write-up of a high performance computing approach to the 1 billion row challenge using Rust. I'll probably try and tackle this myself sometime soon. I've been itching to get some experience with really hyper-optimized computing.
-
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.
-
Broken window theory
2023-08-28 23:41
Researchers determined that if a single broken window is left unfixed in a neighborhood, the neighborhood will descend into disrepair.1 The idea is that people will continue to put in the effort and care about things until they feel that others don’t care either.
-
Kelling, G. L., & Wilson, J. Q. (1982, March 1). Broken Windows. The Atlantic. https://www.theatlantic.com/magazine/archive/1982/03/broken-windows/304465/ ↩
-
-
The Principles of Product Development Flow
2023-08-24 17:43
- 202309011312 The primary goal in product development is to make good economic decisions
- 202309011322 We need more information for complex decision making
- 202309011327 Define metric to value transfer functions using sensitivity analysis
- 202309011333 Quantify your cost of delay
- 202309011342 Measure output instead of activity
- 202309021620 Important trade-offs have u-curve optimizations
-
The Software Craftsman
2023-12-09 13:23
Chapter 2 - Agile
- 202312161343 You don’t do Agile
- (18 discussion) “Focusing purely on the process and treating software development like a production line leads to average 9-to-5 developers doing what they are told — they become factory workers.” This is what we do here with mobbing
- (19 discussion) bad faith argument in paragraph 2
Chapter 3 - Software Craftsmanship
-
Desolation tries to colonize you
2024-08-22 13:04
[W]hen you see beauty in desolation it changes something inside you. Desolation tries to colonize you.1
There’s a certain appeal to the abyss, but 202408232359 The abyss gazes back. We must be cautious of the allure of desolation and the ways that it can overtake our minds and souls like a slow creeping swamp fungus swallowing a landscape on the sea by the lighthouse.
-
VanderMeer, Jeff. Annihilation. First Edition. Southern Reach Trilogy 1. (pp. 6). New York: Farrar, Straus and Giroux, 2014. ↩
-
-
Code that changes together should live together
2022-04-27 23:07
A simple concept that drives good code organization and ensures we’re abiding by the principles that 202204272308 Modules should be highly cohesive and 202204272309 Modules should be loosely coupled.
If changing one piece of code requires another piece of code to change:
- They should be in the same module or else they would have low cohesion and high coupling.
- They would require less mental bandwidth to understand if they were physically near each other in the filesystem.
- We will be less likely to forget to update one piece when updating the other if they’re near each other and part of the same module.
-
When to write a new Zettel
2021-07-27 22:38
When should I write a new note vs adding or changing an existing note or set of notes? The answer is to break this down into three categories:
- When you don't have any existing notes that relate to the topic, write a new note.
- When your note is considerably different than existing notes on the general topic, write a new note and be sure to link correctly.
- When your note matches existing notes, modify them. Note that this use of "modify" includes re-structuring, creating, deleting, updating, linking, or anything else.
-
The SECI model of organizational knowledge
2021-10-23 14:45
Developed by Ikujiro Nonaka, the SECI model of organizational knowledge describes a repeating loop of four activities that individuals in an organization undertake in order to create (202109060835 Knowledge is constructed), commemorate, and expand upon knowledge.1
- 202110231448 Socialization of knowledge
- 202110231449 Externalization of knowledge
- 202110231450 Combination of knowledge
- 202110231451 Internalization of knowledge
When the loop completes, it starts over again as the input to the next iteration. In this way it can be considered a 202110231515 Feedback loop.
-
Diffey, S. (2020, October 26). The ‘Knowledge-creating’ Product Organisation. Medium. https://productcoalition.com/the-knowledge-creating-product-organisation-6ec80870647b ↩
-
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.
-
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.
-
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 😬
-
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.
-
Verify behaviors and assert properties
2021-09-25 11:00
Software systems should have verifiable behavior and assertable properties. These are vital to the maintainability but moreover the evolvability of a system. Moving behaviors and properties up through the chain of verifiability and assertability is required for 202109251102 Reclaiming software systems.[^larson2019reclaim]
Behaviors
Behaviors are aspects of software that can be validated empirically against a specific environment.
- Observed — behaviors you notice in your logs
- Tracked — behaviors you get informed about, but only after a change to the software is deployed to the environment. Tend to degrade over time without a dedicated org-led program ensuring their upkeep. Architectural change is preceded by a period of fixing regressions in tracked behaviors before the intended change can be made.
- Verified — behaviors you can rely on being consistently true because they can be checked pre-deployment. Three common ways to verify behaviors: E2E tests, fault injection tests, and load/performance tests. Can be annoying to maintain verification status (including needing an attempted deploy), but help us design around them because we can depend on them being true.
-
Computation, storage, and representation are the basis of computing
2022-04-28 11:33
Modern computation can be described as the creation and management of three fundamental aspects.
- Evaluation — our ability to operate on data
- Storage — our ability to transfer data across space or time
- Representation — our ability to communicate data (e.g. visually or audibly)
All software systems — no matter how complex — can categorize their constituent pieces as one of these three actions.
An example:
In a simple, traditional 202204281140 Model, view, controller architecture, the model is responsible for storage, the controller is responsible for evaluation, and view is responsible for representation. This is obviously a simplification, but we could just get more specific and granular about which code is doing what and we'd see that the idea holds in the general case.
-
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.
-
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]
-
Curriculum design for software engineering
2022-06-28 20:18
I want to teach computer science, what should I do?
vs
I want to make software, what should I do?
Need to ask questions about the desired solution to figure out things like goals, constraints, and methods before you can build that solution. In the education case, the “solution” is the curriculum.
Ask things like:
- What age are the students?
- What exposure have they had before?
- Is this required? An elective? An extracurricular?
- How long is the class? How often does it meet?
- Is it even a class or something else?
- How many students are in the room?
etc. but also think about things like
- Is there internet access?
- Is the teacher new to programming?
- Can the students type?
- Are there students with disabilities?
- Do the students have regular computer access at home?
- Do the students have regular computer access at school?
Think about
- Equity, Rigor, and Scale
Methods
- Required courses
- Don’t scale though, need certifications for teacher. The economy for experts means that they’ll go to Jane Street and learn a huge amount more than public HS
- Rigor has to take a hit because everyone has to pass the course to graduate
- Elective courses
- Not equitable. Hugely biased (currently) to white and asian males, failures and achievement gap #thread lead to further disparity.
-
Desire vs expected outcome in decision making
2021-09-25 11:55
Before doing something, ask yourself two questions:
- If I do this thing, what do I want to happen?
- If I do this thing, what do I expect to happen?
You may be surprised that you're doing something based on what you want but not what is likely.1 We should strive to be rational when we make decisions whose outcomes are important to us. We should be realistic and understand the differences and biases that we bring to the table when we have an investment in a desired outcome.
Obviously, there are things in life that are good to do based on what you want to happen even if it's risky. However, we should be aware of the risk and prepared for what may come if it doesn’t turn out how we want it to.
-
Thorpe, E. (2017, January 24). A Man for All Markets. ↩
-
Feedback is for changing behavior
2022-05-02 19:56
The sole purpose of feedback is to drive a specific change in behavior.
This statement needs no further explanation, but let's drive the point home with a specific corollary.
If you need to deliver feedback, but the individual has something distressing and distraction going on, don't give the feedback at all.
this is the ask stage of feedback delivery #thread
First of all, the feedback will be less effective or counterproductive since the person is distracted.
More importantly though, there's no need for the feedback to be delivered whatsoever given the purpose is to drive behavior change.
Take the two possible outcomes for not giving the feedback:
- You don't give the feedback and the behavior continues. By definition this gives us another opportunity to give the feedback in better circumstances.
- You don't give the feedback and the behavior stops. Our goal is achieved, there's no need for the feedback at all.
-
Knowledge is the backbone of a product organization
2021-10-23 14:40
One of the single most significant contributing factors to the success of a product organization is its collective knowledge.1 There are two kinds of knowledge in an organization:
- 202110231457 Tacit knowledge is what people understand in their own minds. It is not commemorated anywhere permanent.
- 202110231459 Explicit knowledge is commemorated and defined, allowing others to find and share in it.
It's a good idea for organizations to turn the tacit knowledge of their individuals into explicit knowledge so that it lives beyond the tenure of the individual (202202011405 Teams abstract individuals over time and 202204301406 Teams should own critical knowledge).
202110231449 Externalization of knowledge in the 202110231445 The SECI model of organizational knowledge also shows how making knowledge explicit enables it to grow organically.
-
Diffey, S. (2020, October 26). The ‘Knowledge-creating’ Product Organisation. Medium. https://productcoalition.com/the-knowledge-creating-product-organisation-6ec80870647b ↩
-
Ten thousand times the spider would rebuild
2024-08-22 12:54
Ten thousand times the web could be destroyed, and ten thousand times the spider would rebuild it. There was neither annoyance nor despair, nor any delight, just as it had been for a billion years.1
The spider knows nothing of humans; it knows nothing of why the things happen to it that do; it only has a need and drive to exist. Humans, in turn, may not be able to comprehend the ways of other advanced civilizations in the universe. We're different than bugs though because of our desire to understand, model, and perhaps change the universe around us.
This quote is interesting because it can be interpreted as a value judgement — even contradicting positive and negative judgements — of the spider. It can also be interpreted in a more Zen way where the presumption of judgement or need to understand should be negated.
-
Liu, C. (2016). The Dark Forest (1st ed., Vol. 1) (pp. 15). Tor Books. ↩
-
-
Strengths of platform teams
2021-10-25 11:47
Contrasts with 202110251148 Weaknesses of platform teams.
- Thinking of infrastructure as part of the product. Looking at cost and efficiency and downtime are all things that platform teams excel at.1
- Building out capabilities and general solutions for other teams. Think of a platform team as building a toolbox instead of showing developers which tools to use for all problems.1
- Instilling a culture of rigor around research. Platform teams have to be careful with assuming that data and research can be applied to the entire platform instead of just being valid for that section of users. Generating insight that applies across the entire platform can be hard or impossible. Platform teams can help their organization's culture by being good at working in these stringent conditions.1
-
Ballona, D. (2021, February 15). Composition for teams: Platform and application pattern. Dballona. https://dballona.com/en/composition-for-teams-platform-and-application-pattern/ ↩ ↩2 ↩3
-
The great stagnation
2021-10-22 09:05
The 202110220859 Utilization adjusted total factor productivity of the US from 1947 through 1972 was 2.1%. Since then it decreased until the dotcom boom in the late 1990s and early 2000s. In 2005 though, the rate plummeted and has been a paltry 0.17% despite a rapid rise in the rate of scientific and theoretical technological progress.1
One lesson to take from this is that science alone isn't enough to end the stagnation. We need science to be applied to goods and services that affect the general public before we'll see a new period of sustained growth.1
One way to understand the forces at play here is to study 202110220853 Second-order thinking and make predictions about what technologies are capable of making an impact on the general public in the next 10 years or so.
-
Dourado, E. (2020, December 31). Notes on technology in the 2020s. Eli Dourado. https://elidourado.com/blog/notes-on-technology-2020s/ ↩ ↩2
-
-
Selling ideas requires effort
2023-04-11 22:20
Specifically, there are 3 skills to master in order to be able to sell our ideas:1
- Giving Formal presentations
- Producing written reports
- Mastering the art of informal presentations as they happen to occur.
The best ideas don't naturally win out, they must be sold even if they're much better than the competition. After all,
Change does not require progress, but progress requires change.1
Some tips for getting better at these:1
- Privately critique presentations you attend
- Ask others for their opinion on yours and others' presentations
- Find parts that are effective and those that are detrimental
- Be yourself or develop a personal style that you are comfortable with. This includes subtle things like telling jokes and being personable.
-
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 ↩ ↩2 ↩3
-
System design
2022-08-13 13:27
Designing systems is one of the common, critical tasks of a 202206112233 Staff-plus engineer. It's something that sets a 202206112236 Senior engineer apart. It proves that you can understand tradeoffs in technology and organizational size and maturity. It shows that you understand how to build things that are optimal for now and have a clear path to the future you're working toward. Many engineers plateau at a place where they can understand and implement any type of tech but aren't capable of planning out new systems from scratch based on some need of the business.
Example systems to learn how to design
- Rate limiter
- Consistent hashing
- Key-value store
- Unique id generator in distributed systems
- Url shortener
- Web crawler
- Notifications
- News feed
- Chat
- Search autocomplete
- YouTube
- Google Drive
Example: Scale from 0 to 1M users
- start with a single server. DNS somewhere directs all traffic to the web server where everything from apps, to APIs, to DBs are housed.
- The first interesting scale point is when you need to separate your database from your web servers. At this point you probably have enough reason to discuss the exact details of the DB you're using. Should you be using a relational DB or a NoSQL document store?
-
Don't tacitly endorse bad behaviors
2021-10-18 12:31
Sometimes it's easier to let a bad behavior continue than have the difficult conversations about stopping it. This is especially the case when the behavior doesn't seem to be too problematic. However, it's equally important in these scenarios to have the conversation and change the behavior.
If we don't change the behavior, then as leaders who are ultimately accountable for our teams, their culture, and their performance, we're implicitly saying that we endorse that behavior. There is no middle ground for the leader.
It's easier to hold your principles 100 percent of the time than it is to hold them 98 percent of the time.1
Tacit endorsement (or rejection) of behaviors is also effective with peers. For instance, it's a viable approach to 202203241127 Overcoming poor performance of a peer.
-
Christensen, C. M. (2010, July 1). How Will You Measure Your Life?. Harvard Business Review. https://hbr.org/2010/07/how-will-you-measure-your-life ↩
-
-
Weaknesses of platform teams
2021-10-25 11:48
Contrasts with 202110251148 Weaknesses of platform teams.
- Platforms are less likely to solve subjective or nuanced problems well. The concrete use cases and implementations that are needed to solve real-world problems can't be addressed by a team whose objective is building a general purpose platform that can solve many problems.1
- Context-related optimization should live close to the context. Optimizing in difficult situations may require understanding the exact, concrete case. Again, platform teams are better at maintaining general levels of competency than highly specialized instances.1
- Having a platform team may negatively affect your users. A team created to solve all problems may de-prioritize a real-world use case for a subset of users. There may also be situations that need to be generalized for a platform that are simply contradictory. In these instances, someone will lose out.1
-
Ballona, D. (2021, February 15). Composition for teams: Platform and application pattern. Dballona. https://dballona.com/en/composition-for-teams-platform-and-application-pattern/ ↩ ↩2 ↩3
-
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 ↩
-
-
OODA loop of action
2022-05-03 12:47
Developed by USAF Colonel John Boyd, the OODA loop is a cyclic method for decision making. The steps are designed to be carried out repeatedly in overlapping, differently sized feedback and feed-forward loops.
The eponymous steps are
- Observe — Gather information from a range of sources
- Orient — Understand where we are and where we want to be
- Decide — Develop a plan of action
- Act — Carry out the plan
flowchart TD OBSERVE --->|feed-forward|ORIENT ORIENT --->|feed-forward|DECIDE DECIDE --->|feed-forward|ACT ORIENT -->|feedback|OBSERVE DECIDE -->|feedback|OBSERVE ACT -->|feedback|OBSERVE subgraph OBSERVE direction RL o((observations)) o1([unfolding\ncircumstances]) --> o o2([outside\ninformation]) --> o o3([unfolding interaction\nwith environment]) --> o o4([implicit guidance\nand control]) --> o end subgraph ORIENT end subgraph DECIDE end subgraph ACT end
The loop has been adapted for business uses under different names. One such popular name is the Plan-Do-Check-Act (PDCA) Cycle.
-
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
-
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)
-
Understanding How Your CPU Thinks
2024-05-03 11:00
- Two most important skills for a developer
- Break problems into smaller problems
- Communication (with people and with the computer)
- Talked about pipelining
- increases µops throughput
- think about doing multiple loads of laundry in washer and dryer
- f# nice
- this point was a little off from my understanding of schedulers and the term "pipelining" specifically.
- Caches and different memory locations: registers, L1, L2, L3, RAM, DISK etc.
- Don't use 0V–1.3V and 3.7V-6.3V anymore for memory and heat efficiency. They've shrunk those voltages and tolerances.
- Got into machine code and micro-ops for assembly
- Importantly, the op and params and everything are all encoded.
- This is why ARM ops have variable bit sized parameters. They're all encoded into 32 bit instructions, so the specifics of the encoded instructions/params might change the available bits for parameter store.
- Showed the circuit for a 4 bit adder, arbitrarily chainable for higher bits, 32/64.
- youtube videos:
- domino computing by standupmaths
- water computer steve mould
- how to do multiplication
- f# "Freestylecoding.Math" bit math lib
- interesting idea of returning division with remainder as tuple with
/%
operator
- youtube videos:
- Two most important skills for a developer
-
CMS editor and developer experience alignment
2021-10-22 16:38
Using a headless CMS with a component based front-end application is one of the core tenets of the Jamstack. Unfortunately though, it's easy for CMS editors and application developers to be at odds with each other on alignment. In order to maintain that alignment we should use one of three strategies for mapping CMS fields to components.[^davis2021]
- Create a transformer near the components. This is easier to maintain and more understandable, but may not scale well in massive apps. It also has the downside of making more calls to the CMS for data, worsening performance.
- Create a top level transformer in your app. This will perform better by making one call, but be more complicated to maintain and test.
- Create a microservice proxy to transform from the CMS(s) that you use. This microservice would be able to have a consistent interface for front-end apps while allowing flexibility on data-sources and formats. The downside is the much higher cost of maintenance, testing, and deployment that the service will have relative to a simple in-app transformer.
We can use these like stepping stones, only moving up a level when your company needs different complexity and performance characteristics.
-
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]
-
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".
-
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]
-
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.
-
Prefer duplication over the wrong abstraction
2022-04-26 20:54
Notes from Dan Abramov's talk The Wet Codebase[^abramov2019]
Start with two modules
flowchart BT a((a)) b((b))
Abstract
flowchart BT a((a)) b((b)) c((c)) a-->c b-->c
Awesome, we’re reusing it and everything. But then something comes along and there’s a slight difference.
flowchart BT a((a)) b((b)) c((c+)) d((d)) a-->c b-->c d-->c
but then there’s bug in
c+
that requires a special case forb
’s use-case.flowchart BT a((a)) b((b)) c((c+*)) d((d)) a-->c b-->c d-->c
And then another slightly different one from
a
flowchart BT a((a)) b((b)) c((c+**)) d((d)) a-->c b-->c d-->c
So we pull those cases out and parameterize the call sites in
a
,b
, andd
.flowchart BT a_((a_)) a*((a*)) b_((b_)) b*((b*)) c((c+__)) d_((d_)) d*((d*)) a_-->a* a*-->c b_-->b* b*-->c d_-->d* d*-->c
Later, after small fixes over time, logging, minor changes, you end up somewhere like this.
flowchart BT a_((a_)) [Continue reading](/notes/202204262054)
-
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
-
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
-
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++)
-
Reclaiming software systems
2021-09-25 11:02
Software systems are organic entities. They take on a life of their own over the passage of time under the pressure of external forces. They slowly transition from 202109251124 Golden age software to 202109251125 Post-apocalyptic software.[^larson2019reclaim]
How do we get from golden age software to post-apocalyptic then? At some point we find an elegant extension to the golden system. It's looked at as proof of the system's power and flexibility. But in reality, it's the beginning of the end. It causes the system to be harder to reason about, and eventually becomes impossible. It's better to build systems for the problems they solve and keep them running with simplicity.
Each company is allowed to rewrite exactly once, but afterwards you have to learn how to reclaim your software instead.[^larson2019reclaim]
One option is to rewrite the system. This is expensive, time consuming, and may actually cause problems by losing years worth of sweat and knowledge that's been put into the system.[^spolsky2000] The good news is that rewrites aren't inevitable here, and we can reclaim the system instead.
Reclaiming the system is the project of evolving beliefs into behaviors and properties (202109251100 Verify behaviors and assert properties). We start off by believing that something works like it does. This might be a specific property of "all the DB calls come from ActiveRecord" or something. We turn that belief into a behavior or property that can be tracked and verified or asserted.
-
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
-
Expertise is required to create useful simulations
2022-07-27 15:30
It is necessary to have a great deal of special, expert knowledge in a field in order to create an accurate, useful simulation or program.[^hamming2020]
The argument for the requirement of deep practical knowledge:
- We know that a simulation cannot be 100% accurate to the real world (202203210832 Models are necessarily incomplete)
- Ergo, we will have to accept inaccuracies somewhere in the simulation
- Ergo, we need to know which inaccuracies are acceptable and which are not
- Ergo, we need to understand the field, the purpose of the simulation, the way people will interpret it, and how to make a simulation feel accurate even if it's slightly unfaithful to reality (e.g. a flight simulator giving pilots the right feeling for flying)
- Ergo, we have to be an expert to make a good simulation
A correlated, responsible first question when faced with a simulation of anything is "why should anyone believe this simulation is accurate or useful?" This question will make you better at creating simulations as well as more capable of detecting when others have not done well at this.
We need to be suspicious about getting too many solutions and not doing enough careful thinking about what we've seen. Volume output is a poor substitute for acquiring an intimate feeling (through deep thought about the underlying situation) for a situation being simulated.
-
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.
-
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]
-
The Private Library
Being a More or Less Compendious Disquisition on The History of the Architecture and Furnishing of the Domestic Bookroom
2024-07-28 12:42
The Private Library is the domestic bookroom: that quiet, book-wrapt space that guarantees its owner that there is at least one place in the world where it is possible to be happy. The history of its architecture and furnishing extends back almost to the beginning of history and forward toward a future that is in equal parts amazing and alarming.
All libraries are magical rooms. All their windows look out onto Faërie, and all their carpets can fly. […] Entering our library should feel like easing into a hot tub, strolling into a magic store, emerging into the orchestra pit, or entering a chamber of curiosities, the club, the circus, our cabin on an outbound yacht, the house an old friend. It is a setting forth and a coming back to center. [^byers2021] (pp. 1, 3)
A visitor standing before this instantiation of language must have felt the true, right sense of the numinous.[^byers2021] (pp. 14)
A private library is a place for rest and relaxation, but also contemplation and thought. It is a place for the individual to find respite and transport oneself to new worlds. In its purest form, a library is only a library if that is its sole purpose. A study or an office can have many of the qualities of a private library but it may not truly be one if it can’t provide the enveloping nature of a pure library.
-
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. -
Naming conventions should use unambiguous delimiters
2022-03-22 16:10
When naming variables, files, etc. we need to delimit words, initialisms, and segments of meaning for people to interpret. Therefore, we should use unambiguous methods to delimit each word. In practice this means casing like
kebab-case
andsnake_case
are objectively simpler and superior to things likecamelCase
.Further explanation
Firstly, acronyms and words. Symbol delimited names are the only way to universally disambiguate words. There's a reason that
CSV
stands for Comma Delimited Values and not Capital-letter Delimited Value. It only takes one example to see this.What do we do when we want to name something like "URL Parser". Our options are
urlParser
,uRLParser
,URLParser
, andUrlParser
. The optionurlParser
isn't so bad, but we also need to solve for when the acronym isn't the first word in the sentence like "parse URL":parseUrl
orparseURL
. It certainly loses even more appeal if the acronym is in the middle:parseUrlParams
andparseURLParams
. And (though the example is getting contrived now I've seen similar and worse in real world code) the final nail in the coffin is "a URL parser":aURLParser
,AURLParser
,AUrlParser
, oraUrlParser
. -
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
-
The Entry Point
2021-04-29 15:22
#new #thread #source #structure #wip
This is the main entry point into my knowledge graph. At the risk of being prescriptive about categories and connections, a single top-level entry point is useful to maximize discoverability. If you're looking for other things I do, check out my home page.
The lofty goal of this project is to contain all of my knowledge. I hope this will be a lifelong project where I can learn, collect, and create a record of my thoughts in a simple, plain-text format that should never become obsolete.
Workflow
This will change drastically over time, but in an effort to keep myself organized, here's my process.
- Find a source of information
- Create a #source note with solid citations (managed in Zotero) for taking notes while consuming the source.
- Create, link, and manage the Zettel and my Zettelkasten.
For more information on the why and how of using a Zettelkasten, see 202107272242 The Art of using a Zettelkasten.
Tags
- The #structure tag is used for structure notes. These are hubs of Zettel that are connected under some sort of idea. They help with discoverability and maintenance of the Zettelkasten as a whole.
- The #source tag is a single Zettel to organize the notes I take while working through some source material. Each Zettel that's a #source is also a #structure Zettel. For example, I take notes while reading a book in a Zettel that's named for the book's title and tag it with the #source tag. These notes aren't technically needed if we do a good job citing sources, but it's helpful during the initial reading and note taking for long-form content that requires multiple sessions.
-
Stock and flow
2022-05-02 12:52
The fundamental observation of systems thinking is that the links between events are often more subtle than they appear.[^larson2018systems]
Big changes appear to happen in the moment but there is usually a slow accumulation of small changes that lead to that moment.
Static values or accumulations are called stocks. They are how changes are stored over time. Stocks are the elements of the system that you can see, feel, count, or measure at a given time.[^meadows2011]
Changes to the stocks are called flows.[^meadows2011] These are rates of change. They can be inflows or outflows.
System dynamics are the relationships between different stocks and flows. For example, the rate of water pouring into a tub can be less than, equal to, or greater than the rate of water draining from the tub. This system dynamic can result in different long term outcomes like overflowing, equilibrium, or emptying.[^meadows2011]
Keep in mind that stocks take time to change because flows (as units over time) require time to flow. As such stocks often act as delays or buffers in systems. They also produce lag in indication. Additionally, they allow the inflow and outflow rates to be different and temporarily out of balance. This creates feedback processes by which we monitor the inflows and outflows to keep a stock at some acceptable value.[^meadows2011]
-
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.
-
Essential XP Emergent Design
2024-06-27 12:56
An article we read as a group for a discussion in our engineering organization. The author explicitly offered all his conclusions as fact "without much justification" noting that "at some later time, perhaps I’ll try to justify this view."[^jeffries2001] I did not agree with what little it did contain.
There are many well-known modeling and design techniques that can be used to bring about a "good design". An incremental process may limit the applicability of these techniques, which are most powerful when applied and committed to "up front". Test everything; eliminate duplication; express all ideas; minimize entities: These few simple rules, applied locally, can help a high quality global design to emerge.[^jeffries2001]
Ron asserts that good design is highly modular, consisting of separate components (typically objects) which are highly cohesive, loosely coupled, and given expressive names that enable us to grasp quickly what the modules mean and why they are there.[^jeffries2001] This statement is the most reasonable of the article. I agree with it, but I find it to be vague to the point of being unhelpful. For example, I'd rather be the right temperature than very hot or cold, but that doesn't offer much as to the nature of "the right temperature". Being the right temperature is tautological. His design principles aren't as self-evident, but they can be interpreted in almost any way to fit or reject a design as "good".
-
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).
-
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.
-
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.
-
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?
-
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)
-
Second-order thoughts about the 2020s
2022-11-02 09:29
Much of these excellent thoughts are from Eli Dourado's great post on the subject.[^dourado2020]
- Bring science to market in order to end 202110220905 The great stagnation.
- mRNA vaccines are amazing. They can be developed quickly and cheaply. There is an HIV/AIDS vaccine in trials and it could be eradicated this decade. There are also "miraculous" treatments for cancer in this vein that aren't true vaccines, but could improve outcomes drastically.
- There are a number of anti-aging techniques coming out that are backed by more credible science than before (therapeutic plasma exchange, aging clocks, other senolytic drugs). Expect people to live longer and healthier by the end of the decade.
- Solar and wind costs were drastically cut in the 2010s and in the 2020s deployment will accelerate. We need a storage price of $20/kWh for a grid powered completely by today's tech. The closest we come is a $542/kWh battery based solution from Tesla.
- Instead of solar and wind we need scalable zero-carbon baseload energy — nuclear or geothermal. Current tech for nuclear targets around 6.5¢/kWh but is delayed until at least 2030. More likely is geothermal which looks to crack 3.5¢/kWh. Not only this but geothermal's drilling advancements mean that even Lockheed Martin's promising compact fusion reactor might not be able to compete if it comes to market this decade. This is because digging the wells this decade means we just have to replace the heat exchange pieces but not re-dig the wells, effectively halving the cost of new wells for the following 15 years, meaning 1¢/kWh energy by the 2050s. Fusion will kill in space though.
-
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.
-
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.
-
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.
-
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.
-
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,
-
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.
-
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.
-
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.