Results: 63
-
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
-
Masonry Layout CSS
2024-04-23 21:22
Help us invent masonry layouts for css grid level 3
I remember getting this working in ~2013 with flexbox columns, but I had to do a complicated interleaving operation to make the sequence correct from left to right then top to bottom. Cool to see this happening finally.
-
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 ↩
-
-
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)
-
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 ↩
-
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
-
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.
-
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
-
Repeat the message in order to be heard
2021-04-29 15:29
There's a saying that goes
For a message to be transmitted effectively it has to at least be communicated in 3 different ways and said 3 times each way.
There's another saying that says
You need to say something 7 times for someone to hear it once and they need to hear it 7 times for them to understand it.
A huge portion of responsibility as leaders is to collect information, 202104291526 Make the hard decisions, and then follow through on them. Since 202104291525 It's not a leader's job to be the best at everything, we're not the people who are carrying out the actions that come out of the decision. In order to keep everyone aligned and successful, it's critical that everyone knows the message behind the decision.
Everyone working on the project or direction should be able to answer the question "what is the vision and strategy for this project?" on the spot. It should be so ingrained in their heads that they can make the expert decisions that they're supposed to without needing to ask the leader about each one. The only way they can do that is if they know that message and that mission deeply. The only way to get people to know that message deeply is to keep repeating the message about where we're going and why (202203231647 Leading from vision). It's much easier for people to make the right decisions when you 202304051001 Use a simple heuristic to guide gradual adoption.
-
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 ↩
-
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.
-
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
-
Moral Philosophy
2022-06-05 15:28
One of the big questions of all human kind that has been prevalent in 202109071211 Philosophy since ancient times. What it means to be moral, and similarly but slightly differently, what it means to act ethically.
There are 3 main schools of thought in the western tradition of moral philosophy:1
202206052202 Moral desert is a related concept of "what people deserve".
-
Schur, M. (2022). How to be perfect: A foolproof guide to making the correct moral decision in every situation you ever encounter anywhere on earth, forever. ↩
-
-
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.
-
Immanuel Kant
2021-09-07 12:12
A German philosopher, central thinker of the 202109071219 Age of Enlightenment, and one of the most influential philosophers in all of western philosophy.1
Works
- Critique of Pure Reason
- Groundwork of the Metaphysics of Morals
- Metaphysics of Morals
- Critique of Practical Reason
- Critique of the Power of Judgement
Influence
- Kant popularized the phrase 202109060833 Sapere Aude as a motto for the 202109071219 Age of Enlightenment.
- Kant is most famous for his work in 202206051530 Deontology, the Critique of Pure Reason, and his 3 formulations of the x202206051544 Categorical imperative.
-
Immanuel Kant. (2023). In Wikipedia. https://en.wikipedia.org/w/index.php?title=Immanuel_Kant&oldid=1172510977 ↩
-
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 ↩
-
Joe the Axolotl, Clever Closet, & Demonic Robots
2024-05-03 15:30
- Anyone can start a girls who code club and if you have enough people sign up, you can get free resources like lessons, notebooks etc.
- Dept of Ed standards alignment
- 7x more likely to go into STEM than national avg
- She led the Otterbein one, it does something a little different than the provided web lessons
- Build things “clever closet” and others (had never seen clueless so they thought it was original which is cool)
- Pololu 3 Pi Robots pre-built 4 AAA batteries, hokey pokey robot, Rube Goldberg machines, etc
- LEGO Robots now, loved those
- Game dev
gwcotterbein@gmail.com afholcomb72@gmail.com @gwcotterbein insta
-
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/ ↩
-
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.
-
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.
-
Definition of system
2024-01-29 14:25
So what is a system? A system is a set of things — people, cells, molecules, or whatever — interconnected in such a way that they produce their own pattern of behavior over time. The system may be buffeted, constricted, triggered, or driven by outside forces. But the system’s response to these forces is characteristic of itself, and that response is seldom simple in the real world.1
Systems are combinations: sets of things that combine to create behavior. Systems exhibit 202104291540 Emergence.
We our complex systems — our own bodies are magnificent examples of integrated, interconnected, self-maintaining complexity.1
Systems must consist of elements, interconnections, and a function or purpose. Elements are easy to see, interconnections harder, and purpose hardest.
-
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/ ↩
-
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
-
Stir Trek 2024
2024-04-30 10:34
Selected Sessions
time room rank speaker track session 08:45 could not attend -
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
-
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?
-
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
-
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.
-
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.
-
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.
-
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
-
Levinthal's paradox
2021-10-22 10:09
Levinthal's paradox[^wikipedia2021levinthal] is a thought experiment, also constituting a self-reference in the theory of protein folding.
In 1969, Cyrus Levinthal noted that, because of the very large number of degrees of freedom in an unfolded polypeptide chain, the molecule has an astronomical number of possible conformations. For example, a polypeptide of 100 residues will have 99 peptide bonds, and therefore 198 different phi and psi bond angles. If each of these bond angles can be in one of three stable conformations, the protein may mis-fold into a maximum of $3^{198}$ different conformations (including any possible folding redundancy).
Therefore, if a protein were to attain its correctly folded configuration by sequentially sampling all the possible conformations, it would require a time longer than the age of the universe to arrive at its correct native conformation. This is true even if conformations are sampled at rapid (nanosecond or picosecond) rates.
The "paradox" is that most small proteins fold spontaneously on a millisecond or even microsecond time scale. This paradox is central to computational approaches to protein structure prediction. It may imply that there's a specific algorithmic process that's followed that we have not been able to discover as of now.
-
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]
-
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.
-
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.
-
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.
-
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++)
-
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.
-
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.
-
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.
-
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
. -
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 -
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]
-
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".
-
Types, and why you should care
2022-06-28 14:49
From a talk[^minsky2019] by Yaron Minsky of Jane Street.
Typed vs. Untyped
- Untyped — scripting, lightweight, friendly, and slow.
- Typed — Serious, professional, unfriendly, verbose, and fast.
Some definitions
- Values — data, things
- Variables — can be different values, part of the lexical portion of the language
- Expression — composed out of variables, values, and other things
- Types — categorization system for values; groups values into named groups; strings, integers etc.
- In untyped language, values have types
- In typed languages, values, variables, and expressions all have types. (For instance, variable is typed when it always contains a variable of that type)
Why types?
- Make programs faster, typically through compilation/interpretation loop having “hints” and more information.
- V8 for instance can be super fast, within a factor of 3 or so from a compiled language (but this is through herculean effort of thousands of people over tens of years and complicated things like tracing compilers and things)
- This is predictable performance vs V8
- Make programs more understandable
So why don’t people always use them?
- Often make programs more verbose — when the language doesn’t have a convenient way to express something, it’s difficult to express it at all or in a good way
-
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.
-
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
-
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)
-
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.
-
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.
-
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. -
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.