An attempt at a personal manifesto
Written circa 2018. My perspective on some things may have changed since then.
Frequent reflection and introspection helps me to develop a certain degree of process awareness, which then helps to identify constraints and bottlenecks, and to discover ways to improve and do things more effectively and efficiently. I’ve attempted to distill some of these learnings as a set of principles below.
The golden rules: apply these widely
Keep it simple. Complexity leads to fragility,1 and tends to hide risks and defects. But keep in mind the tradeoff between simplicity and oversimplification; a good guideline is “as simple as possible, but no simpler”. Simplicity here is more intended as a guard against the harmful consequences of incomplete knowledge.
Value time. From my experience, people generally don’t value their time enough, including myself. We can make more money but we can’t make more time—so it should be treasured. A simple heuristic: take the hourly wage you expect to be paid during work hours, and double that for your free hours. Tempus ager meus (time is a field to be cultivated).
Learn from mistakes. Failures are valuable learning opportunities that should never be surrendered to pride. It’s the basis of the time-tested technique of trial-and-error.
A distinction should be made between artificial and natural complexity, the latter having evolved organically over far longer timescales than our human lifetimes.
Processes and decision-making
Be adaptive to change. Make feedback cycles as short as possible without becoming restrictive. Work on big tasks iteratively; avoid “Big Design Up Front”.
Follow the 80/20 rule. A.k.a. the Pareto principle: 80% of effects come from 20% of causes. Look at the big picture; don’t sweat the small stuff. Focus on the most pressing needs and work down in priority. Don’t prematurely optimize or over-analyze.
Maintain a high standard. Follow best practices and patterns within reason and practicality, write clean and idiomatic code, and refactor often.
Minimize context-switching. Multi-tasking is generally inefficient, at least for me. Focus on the task at hand by funnelling new ideas into a backlog.
Look to subtract before adding. YAGNI applies in most cases. This has the desirable side effect of reducing complexity.
Automate as much as possible. This saves time and mitigates human error.
Don’t reinvent the wheel. Assume that someone more talented and/or more familiar with the subject domain has worked on and solved the same problem,2 unless it’s something really niche.
Be wary of cognitive traps. Including, but not limited to: confirmation, narrative, survivorship, complexity, and data-mining bias. A lot of this ties into the nature of randomness (see below).
Be wary of randomness. Especially regarding hidden fat tails and illusory cause-and-effect. Diversify risk. Do apply basic statistical reasoning. Don’t apply Platonic, artifically-constrained models of probability to the real world.
Repeat what works. Stop doing what doesn’t work. (A simple rule that can be surprisingly hard to follow.)
I rediscover this time and again in the free software community. A salient example: I had been pondering the benefits of being able to tag arbitrary files in order to impose a virtual, conceptual hierarchy independent of filesystem structure. After some digging, I came across the outstanding TMSU tool that does just that, and even takes it further by implementing a whole virtual filesystem that can be mounted anywhere.
Learning and self-improvement
Keep an open mind. Pursue different perspectives and points of view. Be receptive to criticism. Counterpoint: stand your ground if evidence is on your side–don’t encourage willful ignorance–and always maintain a healthy skepticism.3
Have the right motivations. Don’t learn for money, social validation, personal branding or some misguided sense of superiority, but to improve yourself, and because it is fun and fulfilling.
Apply the scientific method. Develop a falsifiable hypothesis, test it, refine the hypothesis, and repeat. Look for evidence hat invalidates the hypothesis, not the other way round.
If you can’t explain it, you don’t understand it. My favourite measure of knowledge is the ability to explain something accurately in clear and concise language.
There is no free lunch. If you want something, find the price and pay it. Usually, this implies taking on some sort of risk that can’t be easily diversified away.
Write it down. Synthesize and consolidate knowledge in some sort of repository. (Emphasis on synthesize instead of rote note-taking.)
Suspend judgment as long as possible. Don’t jump to conclusions before the evidence justifies them.
More in the philosophical or scientific sense, less the fraudulent version in our modern discourse of rejecting ideas you don’t like (or ideas held by people you don’t like).
Interacting with people
- Don’t be snarky.
- Avoid ad hominem.
- Assume good faith.
- Assume the other side is smarter than you.4
- Don’t take things personally.
- Be sincere.
- Listen instead of waiting to talk.
It doesn’t matter if they are or not (according to whatever subjective notion of smartness we choose to invoke); the point is just to not be an ass.