Organizations generally have high level tenets around which culture is shaped and decisions are guided. However, these tenets are generally too high level and provide little insight as to how a team should be run at a more granular level, and equally as important, how individuals operate.
“Operating Principles” attempts to fill this gap by organizing a list of guiding principles that have helped provide clarity on how to deal with various situations, and I am convinced that writing them down on paper will further reinforce the consistent application of such principles across a variety of situations.
It also serves the dual purpose of helping others with whom I collaborate understand the manner in which I tend to operate, in order to settle disagreements and resolve conflicts more easily. I don't claim to be perfect in my application of these principles, but strive to do better everyday. 😊
I hope these will help others as they have helped me in the past.
Here is the list.
- Meta
- Top Principles
- Thinking
- Work and Culture
- Software Systems
- Process and Organization
- People and Leadership
- Quotes
A. Meta (Back to top)
- Conflicts or logical inconsistencies between these principles are reconciled case-by-case.
- This list should be revised periodically through cycles of aim-plan-act-review.
B. Top Principles (Back to top)
- Everything we do at work should revolve around one focus - getting results.
- Don’t underestimate the importance of knowledge preservation, expansion and organization.
- Time is valuable and we should strive to not waste anyone’s time, including our own.
- Constant vigilance, memento mori.
- Above all else, prioritize people.
C. Thinking (Back to top)
- If in doubt, start from First Principles to fill in the missing gaps in our understanding.
- Strive to get to a level where we can operate at the highest levels of
- Models simplify at the cost of encapsulating details - it may be necessary to lift the hood.
- Prefer (at least) second-order thinking by default.
- Do a worst case scenario analysis to understand the bottom line of a decision.
- Taking risks is not the same thing as recklessness - it requires doing our homework.
- Working backwards can often help instate temporal clarity.
- In face of fear, if something isn’t an Act of God, it’s most likely not deadly.
- When confronted with complexity, see if any philosophical razors can be of assistance.
- Allay uncertainty through mitigation strategies and assigning a margin of safety.
- Argumentum ad antiquitatem is neither an explanation nor a valid justification.
- One should not engage in ad hominem arguments as the refutations are irrelevant.
- Ipse dixit is a barrier at work and should be avoided.
- Unless ceteris paribus is guaranteed, one should not assume it.
- Unless there is evidence of the contrary, correlation does not imply causation.
- Consequentialist thinking can save time in the long run.
- The most effective solution to any problem is prevention.
- Pragmatism over idealism.
- Outstanding execution over an outstanding idea.
- Unless complexity can be justified under intense scrutiny, prefer simplicity.
- Attaining simplicity is exceedingly complex, but it is generally worth it.
- Meritocracy over autocracy or democracy.
- Function over form unless function derives from, or is tied to form.
- However much time and effort we think we need to master something, we need to at least double the amount of actual practice.
- The keys to scaling up a project and its operations
- Configuration
- Organization
- Timing
D. Work and Culture (Individuals) (Back to top)
- Lack of knowledge and experience can be remedied by doing our due diligence.
- Everything we do at work is a work artifact (e.g. email, meetings, code reviews, diagrams, etc.)
- The bar should be equally high among all work artifacts, not just those that require precision.
- What we don’t say, write or do is often as important as what we do commit to action.
- Intent and tone are more important than the words used to convey them.
- Build respect by caring for others’ welfare through consistent, concrete actions over time.
- Trust is built by making promises and keeping them consistently over time.
- Be radically transparent and open about each others’ shortcomings and mistakes.
- Courtesy and decorum are not valid reasons to avoid radical honesty.
- Nothing matters more than seeking the truth.
- Autonomy and self-sufficiency are key to operational efficiency, but trust must be earned.
- Prefer explicit over implicit; specific over vague.
- We should benchmark our progress against ourselves; not against other people.
- Prefer communicating at higher level abstractions and trust teammates to figure details out.
- Trust, but verify. That’s why audits and spot checks are necessary.
- The ability to share knowledge is one of the greatest gifts from technology, let's do more of it.
- The “why” is as important as the “how” - both should be treated with an equal level of rigour.
- Strive to be non-ambiguous with the use of language.
- We are accountable not only to external customers, but also internal customers.
- Be proactive, not reactive.
- Prefer writing before speaking, and if there’s a choice, over.
- Teamwork above solo strength.
- Be obsessed with quality - test and double check rigorously.
- Cutting corners just delays the problem and is usually not worth it.
- Do not underestimate the impact and importance of presentation.
- Pointing out each others’ mistakes is nothing personal. The objectives of doing so include:
- Raising awareness of the problem (or dispel one’s misunderstanding);
- Getting alignment across stakeholders;
- Proposing a solution;
- Determining how to rectify and execute.
- Reserve facetime as a last resort for one of the following occasions
- We are working on a project where details need to be communicated;
- Sharing something important that’s difficult to do so through writing;
- There’s a dependency you own that’s blocking the progress of a project;
- When one is in desperate need of help after exhausting all means of research;
- One needs help under a time crunch.
- Things to avoid at work
- Ghosting others who have a hard dependency on our work or what we own;
- Writing that’s unclear, unambiguous, not proof read for accuracy;
- Repeated actions that reflect “that’s not my job”;
- Code review comments focused on style, syntax preferences;
- Lack of empathy.
- Emails, texting, speaking have different rules regarding etiquette.
- Adding an emoji after a message (1) lightens the mood; (2) doubles as a read receipt.
- Ensure the use of terminology and jargon is consistent among the group.
- Results loop: Goal > Reason > Viability > Plan > Execute > Clean up > Reflection
- Regular weekly reflections can help make sense of chaos and deal with overwhelm.
- When everything went perfectly but we still failed, to understand why, reflect upon
- Environment (uncontrollable factors)
- Timing (great execution, bad timing)
- People (lack of excitement, unified spirit to push through)
- Fundamentals (mismatch in ability and goals)
- Leverage (not possible without catalysts and help)
- Inception (whole project wasn't necessary)
- Aptitude (mismatch in talent with challenges)
- Unknowns (gaps in understanding of world tied to project)
- Uninformed (parts of whole landscape missing from our radar)
- Balance between doing our due diligence and analysis paralysis.
- Pushing through isn't the only solution. Circumvention can be useful too.
- Technical solutions aren't necessarily the best path forward.
- Defining work not done is often as important as work to do.
- The best way to multitask is to not - complete a workstream before switching to the next.
- When reaching out, prefer talking to teammates one-on-one instead of in a group.
- Be curious and keep learning. Learn what? Anything that allows you to create.
- If you could choose between learning and doing
- If there are time constraints, that choice is gone - choose doing.
- Otherwise, learn so we can execute better and take more things into consideration.
- Best yet is if we can learn by doing something new.
- Approach problems systematically.
- Always prefer a fix that minimizes or reduces manual effort and scales.
- If the timing isn’t right, at least create a complete solution and document it to action later.
- Root cause problems. Instead of top down, try bottom up. Don’t settle until we reach a real understanding of the problem.
- Three things to avoid talking about
- Religion
- Politics
- Talking about people behind their backs
- Before handing over something, three questions to ask
- If we ourselves consume this work artifact one year from now, can we understand it?
- Did we gather all the facts and exhaust all options? (Is it comprehensive?)
- Is it in a state that someone doesn't have to tidy up before consuming this work artifact?
E. Software Systems (Back to top)
- Avoid adopting tools we don’t understand. If we’d like to adopt them, understand them.
- Resist giving in to the Shiny Object Syndrome - novelty does not justify adoption.
- Spend the most time in the bottom three rungs of the code review pyramid
- Mental Alignment
- Correct Solution
- Design Discussion
- The definition of good code (the most important first)
- It’s correct
- It’s secure
- It’s readable
- It’s extensible
- Beware of red herrings when doing data analysis.
- DRY is not always the best policy - the pros and cons of duplication must be weighed case-by-case.
- Code Reviews are often more important than writing code.
- Review code as if we were doing the task ourselves.
- Inaccurate documentation is worse than no documentation.
- If we can’t describe the problem and solution(s) clearly in words, desist from writing code.
- Tidy up now, because it’s now or never with software.
- A dedicated operational squad may be necessary to alleviate systemic issues.
- Do not forget the value of teammates in these roles
- Technical Writers
- QA
- Scrum Masters
- Product Owners
- Servant Leaders
- Take our time choosing names.
- Don’t trust inputs arriving from beyond the bounds of a system - always validate.
- Technical decisions should be reviewed against these architectural characteristics
- Availability (how long the system will need to be available)
- Continuity (disaster recovery capability)
- Performance (e.g. stress testing, peak analysis, frequency of functions used, capacity, response times)
- Recoverability (e.g. in case of disaster - how quickly do systems need to recover, backup strategy, duplicated hardware, etc.)
- Reliability/safety (fail-safe / mission criticality, financial cost of systems failing, etc.)
- Robustness (handle error and boundary conditions if internet connection goes down, power outage, hardware failure, etc.)
- Scalability (how the system handles requests as users / requests increases)
- Configurability (how easily software's configuration is changeable)
- Extensibility (plug and play architecture)
- Installability (ease of installation on platforms)
- Leverage-ability/reuse (reuse common components across multiple products/platforms)
- Localization (support for multiple languages, locales, reports, currency, units of measure)
- Maintainability (ease of enhancing the system, adding changes, making edits, etc.)
- Portability (concerns vis-à-vis running on multiple platforms)
- Supportability (technical support, logging, traceability of stack, ease of debugging errors, etc.)
- Upgradeability (how easy it is to upgrade the application / tech we use)
- Accessibility (tailoring UX for customers with disabilities like SDH, colour blindness etc.)
- Archivability (what data needs to be archived or deleted after a period of time according to the data retention policy, data classification)
- Authentication (security requirements to check authenticity of user identity)
- Authorization (principle of least privilege in manage our resources, least access by external customers)
- Legal (legislative constraints, e.g. GDPR, data protection laws, regulations regarding deployment or how the application needs to be built)
- Privacy (encrypting transactions from even internal administrators and employees)
- Security (encryption at rest, in transit, remote user access, etc.)
- Usability (UX studies with focus groups, ease of use of our application)
- The Gang of Four's Design Patterns can be applied outside of object-oriented contexts.
- Configuration and infrastructure should be treated with the same rigour as code.
- Third party libraries come at the cost of bundle size and encapsulated complexity. Avoid unless necessary.
- “Merging code” is not “done”. Consider the remaining work that still remains
- Ensure tech debt is reasonably addressed to prevent tech debt accumulating
- QA check specific to feature / bug fix
- Regression checks if change sufficiently large
- Writing integration tests / Visual regression tests
- Deploying changes to Prod
- Feature gating and dial up / release process
- Updating relevant documentation
- Updating runbooks
- Updating ops metrics / business metrics dashboards
- Monitoring ops metrics / business metrics for anomalies after dial up
- Experiment analysis and dial up conclusion
- Resist the temptation to code until requirements are 100% clear.
- This doesn't block work on the parts are clear as long as they are sufficiently isolated from the unclear.
- Implement in a way that allows for flexibility to change. Abstractions, composition, SOLID, interfaces can help.
- Execute in a way that allows to defer important architectural decisions until we have more information.
- We share the responsibility for work artifacts, designs, code changes, contracts we approve.
- Minimize unnecessary dependencies - they are hard to manage and even harder to remove.
- Organization engineering has a huge impact on the architecture - always keep Conway's Law in mind.
- Enforcing the Principle of Least Privilege internally is a mechanism to reduce manual errors, not a sign of distrust.
F. Process and Organization (Group) (Back to top)
- Add at least 30% padding to time estimates.
- If estimates involve configuration, accept it's impossible to estimate.
- Backlogs need to be groomed daily to prioritize, add details, dedupe and close out tasks.
- A Scrum team requires a Product Owner and Scrum Master, no exceptions.
- Writing the AC, implementation and QA should be done separately to avoid bias.
- Start with relative points and work backwards to figure out time-points mapping.
- Velocity varies based on team members, nature of tasks, holidays, KTLO, etc.
- Task updates should be shared daily to uncover blockers quickly.
- Four documents form the core of the Scrum practice - omit at our own risk
- Definition of Ready
- Definition of Done
- Team Norms
- RAID log
- We should add tasks for 80% of a cadence; leave room to deal with “other stuff”.
- Resist the temptation to work on items outside of what’s planned (unless they’re done).
- Desk checks are essential to make the Dev-QA cycle go faster.
- Encourage cross pollination by allowing members to self-assign tasks.
- Avoid project based execution, because it festers the growth of silos.
- If a task can’t be finished within a cadence, break it down so that it can.
- Be inclusive in the meeting invite list, but encourage teammates to reject irrelevant ones.
- Recurring issues should be pointed out even at the expense of repeating ad nauseam.
- A good moderator plays a key role in helping to ward off ignoratio elenchi.
- Always assign a scribe in a meeting to take notes so absentees can review them.
- Apply triple the vigilance when a project starts - decisions made then are often hard to reverse.
- Prefer rules-based governance over deferring to individuals’ standards.
- Split our time 80:20 between short term and long term initiatives.
- Organization and management need design reviews, just like software systems.
- Flat hierarchies promote collaboration; nested hierarchies introduce barriers.
- Reject all meetings
- Without a prepared agenda;
- Without at least 2 business days to review said agenda in advance;
- That invitees cannot meaningfully add value to;
- That are too long or too short.
- Balance between the short, medium and long term. Examples include
- Short: Sprint planning, execution, scope management, technical work
- Medium: Architecture, team process, retros, fixing ops inefficiencies, process issues
- Long: Extra curricular learning, codification of principles, axioms, exploring disciplines
- There should be at least two Subject Matter Experts per knowledge domain.
- Processes and mechanisms over manual intervention.
- Never underestimate the importance of an organization scheme.
- Organization is a prerequisite to any process reforms.
- Establish checks and balances to govern how we work.
- Prefer a T-shaped over I-shaped operational style and avoid silos.
- Schedule regular reviews and after incidents to reflect and revise our SOPs.
- Reserve at least 10% of headcount perennially for OE/EE initiatives. (Oncall doesn't count.)
- Defining an "eye for quality" - Calibration to match the right configuration that appeals to most.
- Organization is the basis for KTLO and improved efficiency.
- All businesses are based on organization “let’s make it easier and faster for others to access these resources".
- Hire the right people. Define “the right people”? Hunger and empathy.
G. People and Leadership (Back to top)
- What leaders should strive to do
- Elucidate and embellish upon a vision that inspires.
- Instate clarity (remove uncertainty) when ambiguity is present.
- Commit to delivering value by solving real problems.
- Force multiply and empowering the team to grow.
- Define and revise operating philosophy and values regularly.
- Create an environment that allows the team to flourish.
- Encourage a culture of experimentation and risk taking.
- Apply core principles consistently to adjudicate problems.
- Build and maintain harmony with internal and external stakeholders.
- Promote diversity and inclusion (not just ethnically, but different personalities).
- Establish mechanisms to maintain a prioritized list of work.
- Invest in minimizing drudgery at work.
- Promote a culture of growth and continual learning, actively invest in individual growth.
- Be proactive, not reactive; stay ahead, not behind.
- Laissez-faire is not the same thing as extricating oneself from the day-to-day as a leader.
- “Years of experience” or “seniority” is not an accurate indicator of ability.
- Leaders should ensure a balance between individual aspirations and business goals.
- Ideas can come from anywhere, but require leadership support to manifest into reality.
- Use metrics to track key performance indicators with the team (e.g. SLAs, happiness).
- “Let me know if I can help” is generally not enough, proactive outreach is necessary.
- Personality tests are helpful to help match opportunities with aptitudes.
- Feedback should be meaningful, specific and lead to SMART goals to rectify.
- In case of ambiguity, provide a chance for interview candidates to produce proof of ability.
- Err on the side of rejection if data collected during an interview is inconclusive. (Or gather more data.)
- Lead with empathy and aspire to become servant leaders.
- We should pay extra attention to continually raise the hiring bar.
- An interviewing template / rubric can help with a consistent understanding of “The Bar”.
- Be nice to each other, it's usually worth it.
- Don’t wait for people to come to us with problems, approach our teams.
- The team should not depend on a leader to function, but they should be better off in the presence of that leader.
- Carry out regular retrospectives on different aspects of operations to review each pillar separately, then holistically as an entity.
- Leaders should have unique personality traits, skills or charm that can win over people’s hearts.
- Stay connected to the technical details, but don’t lose sight of the big picture
H. Quotes (Back to top)
- “Premature organization is the root of all evil.” - Donald Knuth
- “Il semble que la perfection soit atteinte non quand il n'y a plus rien à ajouter, mais quand il n'y a plus rien à retrancher.” - Antoine de Saint-Exupéry
- “I think it's far more important to write well than most people realize. Writing doesn't just communicate ideas; it generates them. If you're bad at writing and don't like to do it, you'll miss out on most of the ideas writing would have generated.” - Paul Graham
Acknowledgments (Back to top)
- Mental Models
- Fundamentals of Software Architecture: An Engineering Approach (Mark Richards, Neal Ford)
- Code review pyramid
- The definition of good code
- Fallacies
- Graham’s hierarchy
- Maslow’s hierarchy
- Bloom’s taxonomy
- Principles (Ray Dalio)
- The Zen of Python
- The Gang of Four's Design Patterns
- High Five Test
- 16 personalities