<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Project-Management on Osmar Petry</title><link>https://osmarpetry.dev/tags/project-management/</link><description>Recent content in Project-Management on Osmar Petry</description><generator>Hugo</generator><language>en-US</language><lastBuildDate>Mon, 01 Sep 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://osmarpetry.dev/tags/project-management/rss.xml" rel="self" type="application/rss+xml"/><item><title>Backend Architectures — history, case studies &amp; dogfooding</title><link>https://osmarpetry.dev/blog/introduction-to-be-archtitectures/</link><pubDate>Mon, 01 Sep 2025 00:00:00 +0000</pubDate><guid>https://osmarpetry.dev/blog/introduction-to-be-archtitectures/</guid><description>&lt;h2 id="summary"&gt;Summary&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Know the &lt;strong&gt;history&lt;/strong&gt; (monolith → services → serverless) to choose the &lt;strong&gt;right shape for now&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Use &lt;strong&gt;dogfooding&lt;/strong&gt; to turn internal capabilities into &lt;strong&gt;platforms&lt;/strong&gt; and eventually &lt;strong&gt;products&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;Pair &lt;strong&gt;tech + finance&lt;/strong&gt; on every decision so architecture choices have a clear &lt;strong&gt;P&amp;amp;L story&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="case-studies-what-they-did--why-it-mattered"&gt;Case studies (what they did → why it mattered)&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Amazon&lt;/strong&gt;: built infra &amp;amp; tooling for itself first (&lt;strong&gt;dogfood&lt;/strong&gt;) → later externalized as &lt;strong&gt;AWS&lt;/strong&gt; (new revenue, 2× monetization of the same effort).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Netflix&lt;/strong&gt;: &lt;strong&gt;hybrid&lt;/strong&gt; of microservices + serverless; serverless for bursty/edge workloads, services for core domains → &lt;strong&gt;speed + cost control&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Google&lt;/strong&gt;: evolved from large coordinated monoliths to &lt;strong&gt;microservices&lt;/strong&gt; as scale/teams grew → &lt;strong&gt;independent deploys&lt;/strong&gt; and &lt;strong&gt;targeted reliability&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Uber&lt;/strong&gt;: reused &lt;strong&gt;profile, payments, geo, notifications&lt;/strong&gt; to launch &lt;strong&gt;Eats&lt;/strong&gt; quickly → &lt;strong&gt;time-to-market&lt;/strong&gt; by reusing platform primitives.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="decision-heuristics-when-to-pick-what"&gt;Decision heuristics (when to pick what)&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Monolith first&lt;/strong&gt; when the team is small, domain still moving, and you need &lt;strong&gt;velocity&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Split by domain&lt;/strong&gt; (bounded contexts) when teams block each other and deploys become risky.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Serverless&lt;/strong&gt; for event-driven, spiky, or edge tasks where &lt;strong&gt;operational burden&lt;/strong&gt; must be minimal.&lt;/li&gt;&#10;&lt;li&gt;Always design for &lt;strong&gt;observability&lt;/strong&gt; (logs/metrics/traces) and &lt;strong&gt;clear failure domains&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="dogfooding--productization-loop"&gt;Dogfooding → productization loop&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;Build&lt;/strong&gt; the capability you need (internal API/service).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Harden&lt;/strong&gt; with SLOs, docs, dashboards.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Reuse&lt;/strong&gt; across 2–3 internal products (prove generality).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Abstract&lt;/strong&gt; contracts (versioning, quotas, cost model).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Externalize&lt;/strong&gt; (SDKs, billing, support) when economics are clear.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;&lt;strong&gt;Two-sided payoff:&lt;/strong&gt; internal reuse lowers &lt;strong&gt;cost/time&lt;/strong&gt;, externalization creates &lt;strong&gt;revenue&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Conway’s Law — origins, literature, and team design</title><link>https://osmarpetry.dev/blog/conways-law-birth-1968/</link><pubDate>Tue, 15 Apr 2025 00:00:00 +0000</pubDate><guid>https://osmarpetry.dev/blog/conways-law-birth-1968/</guid><description>&lt;h2 id="reference-stack"&gt;Reference stack&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Melvin Conway, “How Do Committees Invent?” (1968).&lt;/li&gt;&#10;&lt;li&gt;Thoughtworks, “Applying Conway’s Law to Improve Your Software Development.”&lt;/li&gt;&#10;&lt;li&gt;M. Soldani et al., “A Decade of Conway’s Law: A Literature Review 2003–2012” (IEEE).&lt;/li&gt;&#10;&lt;li&gt;Video summary: &lt;a href="https://youtu.be/SWrlFod8t5g" target="_blank" rel="noreferrer"&gt;https://youtu.be/SWrlFod8t5g&lt;/a&gt;.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="essence-of-the-law"&gt;Essence of the law&lt;/h2&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;“Any organization that designs a system will produce a design whose structure is a copy of the organization’s communication structure.”&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Architecture mirrors team communication pathways; siloed teams create siloed modules, joined at fragile seams.&lt;/li&gt;&#10;&lt;li&gt;“Monolithic teams do not build microservices”—system modularity depends on cross-team autonomy and shared vocabulary.&lt;/li&gt;&#10;&lt;li&gt;Neglecting communication design results in accidental system design, rather than deliberate architecture.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="historical-context--popularization"&gt;Historical context &amp;amp; popularization&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Conway observed the phenomenon across software, military, and governmental projects in the 1960s.&lt;/li&gt;&#10;&lt;li&gt;Frederick Brooks amplified the idea in &lt;em&gt;The Mythical Man-Month&lt;/em&gt;, cementing “Conway’s Law” in software folklore.&lt;/li&gt;&#10;&lt;li&gt;Later research confirms that org charts and interface diagrams often align, sometimes unintentionally.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="key-takeaways-from-the-literature-review"&gt;Key takeaways from the literature review&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Larger organizations introduce communication friction, leading to complex, tightly coupled systems.&lt;/li&gt;&#10;&lt;li&gt;Parkinson’s Law: management layers tend to expand, exacerbating coordination overhead.&lt;/li&gt;&#10;&lt;li&gt;Small, autonomous teams (“two-pizza teams”) correlate with cleaner, more modular architecture.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="review-questions"&gt;Review questions&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;How does organizational structure influence the resulting system design?&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Systems reflect the communication patterns of their creators; poor cross-team collaboration manifests as brittle interfaces.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;ol start="2"&gt;&#10;&lt;li&gt;How does company size impact system complexity?&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;As organizations grow, coordination paths lengthen, producing sprawling systems with integration pain; keeping teams small mitigates the effect.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="practical-implications"&gt;Practical implications&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Design teams around the architecture you want (the “inverse Conway maneuver”): align squads to bounded contexts before writing code.&lt;/li&gt;&#10;&lt;li&gt;Optimize for communication density: co-locate domains, create shared rituals, and collapse unnecessary hierarchy.&lt;/li&gt;&#10;&lt;li&gt;When introducing API gateways or platform teams, ensure their communication network matches the required integrations.&lt;/li&gt;&#10;&lt;li&gt;Regularly map org structures to architecture diagrams; adjust teams when misalignment appears.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="next-actions"&gt;Next actions&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Compare current team topology with service/module boundaries; plan reorg if misalignment exists.&lt;/li&gt;&#10;&lt;li&gt;Share the original essay and Thoughtworks article with engineering leadership to ground discussions in historical context.&lt;/li&gt;&#10;&lt;li&gt;Incorporate Conway’s Law checkpoints into architecture reviews (e.g., “Does a team own each interface?”).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="related-notes"&gt;Related Notes&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;[[DbC|Design by Contract]]&lt;/li&gt;&#10;&lt;li&gt;[[no-silver-bullet-1986|No Silver Bullet — Essence &amp;amp; Accidents]]&lt;/li&gt;&#10;&lt;li&gt;[[parnas-modularization-1972|Modularization Criteria — Parnas 1972]]&lt;/li&gt;&#10;&lt;li&gt;[[software-aging-1994|Software Aging]]&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>Decision-Making Traits of Great Software Engineers</title><link>https://osmarpetry.dev/blog/software-engineer-decisions-2015/</link><pubDate>Tue, 15 Apr 2025 00:00:00 +0000</pubDate><guid>https://osmarpetry.dev/blog/software-engineer-decisions-2015/</guid><description>&lt;h2 id="abstract"&gt;Abstract&lt;/h2&gt;&#10;&lt;p&gt;Based on 59 interviews with senior Microsoft engineers (Meyer, Zimmermann, Fritz, ICSE 2015). Identifies 53 characteristics grouped into personal qualities, decision-making, team impact, and product impact. Focus here is on decision-making skills that differentiate top engineers.&lt;/p&gt;&#10;&lt;h2 id="key-points"&gt;Key points&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Deep knowledge of organisational context (people, priorities, constraints).&lt;/li&gt;&#10;&lt;li&gt;Ability to switch between big-picture vision and low-level details.&lt;/li&gt;&#10;&lt;li&gt;Balancing short-term deliverables with long-term maintainability.&lt;/li&gt;&#10;&lt;li&gt;Evaluating risks and trade-offs before committing to technical choices.&lt;/li&gt;&#10;&lt;li&gt;Creating shared context: ensuring stakeholders understand constraints.&lt;/li&gt;&#10;&lt;li&gt;Fostering psychological safety so teammates surface concerns early.&lt;/li&gt;&#10;&lt;li&gt;Anticipating future needs; keeping options open for future change.&lt;/li&gt;&#10;&lt;li&gt;Honesty and transparency in communicating limitations or unknowns.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="connections"&gt;Connections&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Aligns with soft-skill emphasis: empathy, collaboration, cultural awareness.&lt;/li&gt;&#10;&lt;li&gt;Supports literature on leadership, team coordination, and human factors in project success.&lt;/li&gt;&#10;&lt;li&gt;Critiques traditional curricula (ACM/IEEE) for insufficient real-world detail.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="questions"&gt;Questions&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;How to cultivate these 53 traits under tight deadlines?&lt;/li&gt;&#10;&lt;li&gt;Which traits matter most in startups vs large enterprises?&lt;/li&gt;&#10;&lt;li&gt;How to measure and reward decision-making soft skills in performance reviews?&lt;/li&gt;&#10;&lt;li&gt;How much does organisational context enable or limit development of these traits?&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="personal-reflections"&gt;Personal reflections&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Excellence extends beyond technical mastery; requires self-development, empathy, systems thinking, and collaboration.&lt;/li&gt;&#10;&lt;li&gt;Leaders must build psychologically safe environments to encourage healthy decision-making.&lt;/li&gt;&#10;&lt;li&gt;Curriculum reform should focus on practical, context-aware training.&lt;/li&gt;&#10;&lt;li&gt;Use findings to guide career development and performance evaluation discussions.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="references"&gt;References&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Meyer, A. N., Zimmermann, T., &amp;amp; Fritz, T. (2015). &lt;em&gt;What Makes a Great Software Engineer?&lt;/em&gt; ICSE Proceedings. &lt;a href="https://www.researchgate.net/.../What-Makes-a-Great-Software-Engineer.pdf" target="_blank" rel="noreferrer"&gt;https://www.researchgate.net/&amp;hellip;/What-Makes-a-Great-Software-Engineer.pdf&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>Design by Contract (DbC)</title><link>https://osmarpetry.dev/blog/dbc/</link><pubDate>Tue, 15 Apr 2025 00:00:00 +0000</pubDate><guid>https://osmarpetry.dev/blog/dbc/</guid><description>&lt;h2 id="abstract"&gt;Abstract&lt;/h2&gt;&#10;&lt;p&gt;Bertrand Meyer introduced Design by Contract (DbC) to formalise expectations between software components. Contracts specify obligations and benefits for clients and suppliers via preconditions, postconditions, and invariants, enabling safer, more maintainable systems.&lt;/p&gt;&#10;&lt;h2 id="key-points"&gt;Key points&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Contracts&lt;/strong&gt;: Define preconditions (caller responsibilities), postconditions (supplier guarantees), invariants (state consistency).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Runtime checks&lt;/strong&gt;: Contracts can be enforced during development/testing to catch violations early.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Documentation&lt;/strong&gt;: Contracts serve as precise specs and executable documentation.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Encapsulation&lt;/strong&gt;: Components hide implementation details while exposing contractual behaviour.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Reuse &amp;amp; reliability&lt;/strong&gt;: DbC encourages reusable components with clear expectations.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="connections"&gt;Connections&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Basis for Eiffel language features; influences modern assertion frameworks.&lt;/li&gt;&#10;&lt;li&gt;Complements unit testing and TDD by clarifying expected behaviour.&lt;/li&gt;&#10;&lt;li&gt;Aligns with API design best practices and microservice contracts.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="questions"&gt;Questions&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;How to balance DbC runtime checks with performance constraints?&lt;/li&gt;&#10;&lt;li&gt;How to integrate DbC in languages without native support?&lt;/li&gt;&#10;&lt;li&gt;When should contracts be relaxed or extended as systems evolve?&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="personal-reflections"&gt;Personal reflections&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Contracts clarify team communication and reduce misunderstandings.&lt;/li&gt;&#10;&lt;li&gt;Useful for critical systems where correctness outweighs overhead.&lt;/li&gt;&#10;&lt;li&gt;Combining DbC with automated tests and CI improves confidence in deployments.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="references"&gt;References&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Meyer, B. (1992). &lt;em&gt;Applying &amp;ldquo;Design by Contract&amp;rdquo;&lt;/em&gt;. Computer, 25(10), 40-51.&lt;/li&gt;&#10;&lt;li&gt;Official Eiffel documentation on DbC.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="related-notes"&gt;Related Notes&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;[[conways-law-birth-1968|Conway’s Law — origins, literature, and team design]]&lt;/li&gt;&#10;&lt;li&gt;[[design-patterns|Design Pattern]]&lt;/li&gt;&#10;&lt;li&gt;[[ddd|Domain-Driven Design: Tackling Complexity in the Heart of Software]]&lt;/li&gt;&#10;&lt;li&gt;[[no-silver-bullet-1986|No Silver Bullet — Essence &amp;amp; Accidents]]&lt;/li&gt;&#10;&lt;li&gt;[[parnas-modularization-1972|Modularization Criteria — Parnas 1972]]&lt;/li&gt;&#10;&lt;li&gt;[[shape-up-2020|Shape Up: Stop Running in Circles and Ship Work that Matters]]&lt;/li&gt;&#10;&lt;li&gt;[[software-aging-1994|Software Aging]]&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>No Silver Bullet — Essence &amp; Accidents</title><link>https://osmarpetry.dev/blog/no-silver-bullet-1986/</link><pubDate>Tue, 15 Apr 2025 00:00:00 +0000</pubDate><guid>https://osmarpetry.dev/blog/no-silver-bullet-1986/</guid><description>&lt;h2 id="abstract"&gt;Abstract&lt;/h2&gt;&#10;&lt;p&gt;Frederick P. Brooks Jr. (1986) argues there’s no single “silver bullet” that will provide an order-of-magnitude productivity boost in software engineering. Distinguishes &lt;strong&gt;essential&lt;/strong&gt; difficulties (intrinsic to software) from &lt;strong&gt;accidental&lt;/strong&gt; difficulties (tooling, implementation). Technological advances continue to chip away at accidental issues, but inherent complexity remains.&lt;/p&gt;&#10;&lt;h2 id="key-points"&gt;Key points&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Essence vs accidents&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;Essential: inherent complexity, changing requirements, invisibility, costly change.&lt;/li&gt;&#10;&lt;li&gt;Accidental: tooling limitations (manual compilation, lack of IDEs) that technology can mitigate.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Central thesis&lt;/strong&gt;: innovations (OO, AI, higher-level languages) alone won’t deliver 10x productivity across the board.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Potential breakthroughs&lt;/strong&gt;: rapid prototyping, incremental development, empowering great designers.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Critique of techno-optimism&lt;/strong&gt;: automating accidental tasks doesn’t fix mis-specified requirements or poor communication.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="connections"&gt;Connections&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Relates to discussions on technical debt (unmanaged accidental complexity).&lt;/li&gt;&#10;&lt;li&gt;Anticipates agile principles (short iterations, prototyping).&lt;/li&gt;&#10;&lt;li&gt;Aligns with critiques of low-code/no-code as silver bullets.&lt;/li&gt;&#10;&lt;li&gt;Connects to cognitive complexity in distributed systems.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="questions"&gt;Questions&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Where do modern frameworks (React, Kubernetes) fall in essence vs accidents?&lt;/li&gt;&#10;&lt;li&gt;Does generative AI (Copilot) confirm or challenge Brooks’ predictions?&lt;/li&gt;&#10;&lt;li&gt;Has cloud computing reduced essential complexity or just moved it around?&lt;/li&gt;&#10;&lt;li&gt;Do DORA metrics (deployment frequency, etc.) mostly track accidental difficulties?&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="personal-reflections"&gt;Personal reflections&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Essential/accidental distinction explains why microservices fix operational issues but add systemic complexity.&lt;/li&gt;&#10;&lt;li&gt;Emphasising “great designers” foreshadows Site Reliability Engineering and other multiplier roles.&lt;/li&gt;&#10;&lt;li&gt;Invisibility still critical in distributed architectures; justifies heavy investment in observability.&lt;/li&gt;&#10;&lt;li&gt;Incremental evolution (“UNIX philosophy”) continues to beat grand revolutions.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="detailed-notes"&gt;Detailed notes&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Essential difficulties: complexity, conformity, invisibility, cost of change.&lt;/li&gt;&#10;&lt;li&gt;Accidental wins: high-level languages, IDEs, CI/CD automation.&lt;/li&gt;&#10;&lt;li&gt;Suggested strategies: buy vs build, rapid prototyping, nurture expert designers.&lt;/li&gt;&#10;&lt;li&gt;Predictions validated: OOP aided encapsulation but didn’t eliminate logic bugs; open source helped with accidental costs, not conflicting requirements.&lt;/li&gt;&#10;&lt;li&gt;Quote: “Complexity is the soul of software; there is no silver bullet.”&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="references"&gt;References&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Brooks, F. P. Jr. (1986). &lt;em&gt;No Silver Bullet: Essence and Accidents of Software Engineering&lt;/em&gt;. (Link: &lt;a href="http://www.cs.unc.edu/techreports/86-020.pdf" target="_blank" rel="noreferrer"&gt;http://www.cs.unc.edu/techreports/86-020.pdf&lt;/a&gt;)&lt;/li&gt;&#10;&lt;li&gt;Additional commentary and analyses (ACM DL, Wikipedia, etc.).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="related-notes"&gt;Related Notes&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;[[conways-law-birth-1968|Conway’s Law — origins, literature, and team design]]&lt;/li&gt;&#10;&lt;li&gt;[[DbC|Design by Contract]]&lt;/li&gt;&#10;&lt;li&gt;[[parnas-modularization-1972|Modularization Criteria — Parnas 1972]]&lt;/li&gt;&#10;&lt;li&gt;[[shape-up-2020|Shape Up: Stop Running in Circles and Ship Work that Matters]]&lt;/li&gt;&#10;&lt;li&gt;[[software-aging-1994|Software Aging]]&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>Software Aging</title><link>https://osmarpetry.dev/blog/software-aging-1994/</link><pubDate>Tue, 15 Apr 2025 00:00:00 +0000</pubDate><guid>https://osmarpetry.dev/blog/software-aging-1994/</guid><description>&lt;h2 id="abstract"&gt;Abstract&lt;/h2&gt;&#10;&lt;p&gt;David L. Parnas likens software aging to biological aging: over time, software becomes harder to maintain, less efficient, and more failure-prone. Maturity in software engineering requires prioritizing long-term health over first releases. Preventive practices can slow aging but cannot eliminate it.&lt;/p&gt;&#10;&lt;h2 id="key-points"&gt;Key points&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Software aging is inevitable but manageable through disciplined engineering.&lt;/li&gt;&#10;&lt;li&gt;Two main accelerants:&lt;/li&gt;&#10;&lt;li&gt;Inability to update software as business needs change.&lt;/li&gt;&#10;&lt;li&gt;Accumulation of ignorance due to team turnover and poor documentation.&lt;/li&gt;&#10;&lt;li&gt;Aging costs: lost competitiveness, increased defects, degraded performance, higher maintenance effort.&lt;/li&gt;&#10;&lt;li&gt;Preventive “medicine”: design for change, thorough documentation, frequent code reviews.&lt;/li&gt;&#10;&lt;li&gt;Critiques the focus on initial releases and lack of systematic engineering practices.&lt;/li&gt;&#10;&lt;li&gt;Documentation is essential despite agile tendencies to downplay it.&lt;/li&gt;&#10;&lt;li&gt;Suggests planning for software “retirement” as part of lifecycle management.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="connections"&gt;Connections&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Links to discussions of technical debt and legacy systems.&lt;/li&gt;&#10;&lt;li&gt;Resonates with sustainability narratives and maintaining long-lived open source projects.&lt;/li&gt;&#10;&lt;li&gt;Contrasts with agile manifesto statements about documentation.&lt;/li&gt;&#10;&lt;li&gt;Aligns with DevOps practices emphasizing observability and continuous improvement.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="questions"&gt;Questions&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;How to objectively measure software aging across domains?&lt;/li&gt;&#10;&lt;li&gt;Which documentation practices balance agility with sustainable knowledge?&lt;/li&gt;&#10;&lt;li&gt;How to adapt recommendations for small teams or short-lived projects?&lt;/li&gt;&#10;&lt;li&gt;Differences in aging patterns between proprietary and open source software?&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="personal-reflections"&gt;Personal reflections&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Aging metaphor helps analyze system trajectories, especially with high team turnover.&lt;/li&gt;&#10;&lt;li&gt;Highlights challenges seen in both public and private IT projects lacking systematic processes.&lt;/li&gt;&#10;&lt;li&gt;“Retirement plan” concept is valuable for interviewing IT managers.&lt;/li&gt;&#10;&lt;li&gt;Reinforces importance of documentation and review in case studies.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="detailed-notes"&gt;Detailed notes&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Aging compared to humans: inevitable but mitigable via prevention and care.&lt;/li&gt;&#10;&lt;li&gt;Focus should shift to system health over first release success.&lt;/li&gt;&#10;&lt;li&gt;Aging factors recorded from various talks (timestamps included in original note).&lt;/li&gt;&#10;&lt;li&gt;Emphasis on design for change, documentation, code reviews.&lt;/li&gt;&#10;&lt;li&gt;Recognize when software becomes unreliable; apply re-modularization and documentation retrofits.&lt;/li&gt;&#10;&lt;li&gt;Plan for end-of-support lifecycle as part of responsible engineering.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="references"&gt;References&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Parnas, D. L. (1994). &lt;em&gt;Software Aging&lt;/em&gt;. Proceedings of ICSE 16.&lt;/li&gt;&#10;&lt;li&gt;Article PDF: &lt;a href="http://www.inf.ed.ac.uk/teaching/courses/seoc/2004_2005/resources/bullet11.pdf" target="_blank" rel="noreferrer"&gt;http://www.inf.ed.ac.uk/teaching/courses/seoc/2004_2005/resources/bullet11.pdf&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;Talk: &lt;a href="https://youtu.be/fe8Mp1YOjQI" target="_blank" rel="noreferrer"&gt;https://youtu.be/fe8Mp1YOjQI&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="related-notes"&gt;Related Notes&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;[[conways-law-birth-1968|Conway’s Law — origins, literature, and team design]]&lt;/li&gt;&#10;&lt;li&gt;[[DbC|Design by Contract]]&lt;/li&gt;&#10;&lt;li&gt;[[no-silver-bullet-1986|No Silver Bullet — Essence &amp;amp; Accidents]]&lt;/li&gt;&#10;&lt;li&gt;[[parnas-modularization-1972|Modularization Criteria — Parnas 1972]]&lt;/li&gt;&#10;&lt;li&gt;[[shape-up-2020|Shape Up: Stop Running in Circles and Ship Work that Matters]]&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>ADR — Architecture Decision Records</title><link>https://osmarpetry.dev/blog/adr/</link><pubDate>Wed, 15 Jan 2025 00:00:00 +0000</pubDate><guid>https://osmarpetry.dev/blog/adr/</guid><description>&lt;p&gt;ADRs (Architecture Decision Records) are essential documents in software engineering that capture important architectural choices and the context behind them. In an Obsidian vault, ADRs integrate naturally into project documentation.&lt;/p&gt;&#10;&lt;h2 id="why-use-adrs"&gt;Why use ADRs?&lt;/h2&gt;&#10;&lt;p&gt;In long-running projects — such as framework migrations or service changes in Go or Java — decisions change constantly. Without recording &lt;em&gt;why&lt;/em&gt; a tool was chosen over another, the team (or even yourself) may forget the reasoning months later, losing the context that justified the choice.&lt;/p&gt;</description></item><item><title>Agile Software Development</title><link>https://osmarpetry.dev/blog/agile/</link><pubDate>Wed, 15 Jan 2025 00:00:00 +0000</pubDate><guid>https://osmarpetry.dev/blog/agile/</guid><description>&lt;p&gt;Agile is a set of values and principles for software development that emphasizes flexibility, collaboration, and iterative delivery. Rather than following a rigid plan, Agile teams adapt to changing requirements and deliver working software frequently.&lt;/p&gt;&#10;&lt;h2 id="what-is-agile"&gt;What is Agile?&lt;/h2&gt;&#10;&lt;p&gt;Agile is not a single methodology but rather a philosophy that encompasses various frameworks and practices. The core idea is to break down large projects into smaller, manageable pieces that can be delivered incrementally.&lt;/p&gt;</description></item><item><title>Shape Up: Stop Running in Circles and Ship Work that Matters</title><link>https://osmarpetry.dev/blog/shape-up-2020/</link><pubDate>Wed, 15 Jan 2025 00:00:00 +0000</pubDate><guid>https://osmarpetry.dev/blog/shape-up-2020/</guid><description>&lt;h2 id="summary"&gt;Summary&lt;/h2&gt;&#10;&lt;p&gt;In December 2020 I read several books and papers: &lt;strong&gt;The Mythical Man-Month&lt;/strong&gt;, &lt;strong&gt;Design by Contract&lt;/strong&gt;, &lt;strong&gt;Programming with Abstract Data Types&lt;/strong&gt;, &lt;strong&gt;Shape Up&lt;/strong&gt;, and &lt;strong&gt;Domain-Driven Design&lt;/strong&gt;. Their ideas map directly to problems and solutions I encountered building apps in recent years.&#10;The largest recurring gap in real projects is the &lt;strong&gt;beginning&lt;/strong&gt;—how we &lt;strong&gt;shape&lt;/strong&gt; and refine the work—more than the middle or the end. &lt;strong&gt;Shape Up&lt;/strong&gt; gives a concrete way to close that gap in modern teams.&lt;/p&gt;</description></item></channel></rss>