<?xml version="1.0" encoding="UTF-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title>Chemaclass</title><subtitle>Tech Lead sharing practical insights on software craftsmanship, TDD, leadership, Bitcoin, and AI. Blog posts, book summaries, and conference talks.</subtitle><link rel="self" type="application/atom+xml" href="https://chemaclass.com/atom.xml"/><link rel="alternate" type="text/html" href="https://chemaclass.com"/><generator uri="https://www.getzola.org/">Zola</generator><updated>2026-04-17T00:00:00+00:00</updated><id>https://chemaclass.com/atom.xml</id><entry xml:lang="en"><title>Inside the .claude Folder</title><subtitle>A tutorial through rules, skills, agents, hooks, and settings</subtitle><category term="ai" scheme="https://chemaclass.com/tags/ai/" label="Ai"/><category term="software" scheme="https://chemaclass.com/tags/software/" label="Software"/><category term="tutorial" scheme="https://chemaclass.com/tags/tutorial/" label="Tutorial"/><category term="craftsmanship" scheme="https://chemaclass.com/tags/craftsmanship/" label="Craftsmanship"/><category term="developer-tools" scheme="https://chemaclass.com/tags/developer-tools/" label="Developer Tools"/><category term="productivity" scheme="https://chemaclass.com/tags/productivity/" label="Productivity"/><published>2026-04-17T00:00:00+00:00</published><updated>2026-04-17T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/inside-the-claude-folder/"/><id>https://chemaclass.com/blog/inside-the-claude-folder/</id><summary type="html">A hands-on tour of Claude Code's project folder. What rules, skills, agents, hooks, and settings each do, and how they fit together.</summary><content type="html">&lt;p>Every project I work on has a &lt;code>.claude/&lt;/code> folder at the root. Committed to git, like the rest of the code.&lt;/p>
&lt;p>That folder turns Claude Code from a generic assistant into a project-aware teammate. Everyone who clones the repo inherits the same setup.&lt;/p>
&lt;p>Agentic coding is only as good as the context you give the agent. The &lt;code>.claude/&lt;/code> folder is where that context lives.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h2 id="the-claude-folder-at-a-glance">The .claude folder, at a glance&lt;/h2>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="plain">&lt;span class="giallo-l">&lt;span>.claude/&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>├── CLAUDE.md # project onboarding&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>├── settings.json # permissions, hooks, env&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>├── skills/ # reusable procedures (slash commands)&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>├── rules/ # glob-targeted conventions&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>├── hooks/ # shell scripts run on events&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>└── agents/ # specialized roles&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>Six layers, one folder. Context, safety, procedures, guardrails, automation, specialists.&lt;/p>
&lt;h2 id="the-foundation">The foundation&lt;/h2>
&lt;h3 id="claude-md-where-everything-starts">CLAUDE.md: where everything starts&lt;/h3>
&lt;p>Claude Code reads &lt;code>CLAUDE.md&lt;/code> on every boot. The onboarding doc.&lt;/p>
&lt;p>In &lt;a rel="external" href="https://github.com/phel-lang/phel-lang">Phel&lt;/a>, mine covers the compiler pipeline (Lexer → Parser → Analyzer → Emitter), module structure, conventions, and key commands.&lt;/p>
&lt;p>A global &lt;code>~/.claude/CLAUDE.md&lt;/code> applies to &lt;em>all&lt;/em> your projects. The project file says &lt;em>how this codebase works&lt;/em>. The global file says &lt;em>how I work&lt;/em>.&lt;/p>
&lt;p>Every byte ships in every prompt. Keep it short. Past one screen, move detail into &lt;code>rules/&lt;/code> or &lt;code>skills/&lt;/code>.&lt;/p>
&lt;blockquote>
&lt;p>A good &lt;code>CLAUDE.md&lt;/code> is a good onboarding doc. The better it is, the less you repeat yourself.&lt;/p>
&lt;/blockquote>
&lt;h3 id="settings-json-safety-before-leverage">settings.json: safety before leverage&lt;/h3>
&lt;p>Before giving the agent more power, lock down what it must never do.&lt;/p>
&lt;p>&lt;code>.claude/settings.json&lt;/code> holds three things: &lt;strong>permissions&lt;/strong> (allow/deny), &lt;strong>hooks&lt;/strong> (event commands), and &lt;strong>env&lt;/strong> (variables). A gitignored &lt;code>settings.local.json&lt;/code> keeps personal overrides separate.&lt;/p>
&lt;details class="deep-dive">
&lt;summary class="deep-dive__header">
&lt;span class="deep-dive__icon">&lt;/span>
&lt;span class="deep-dive__title">Deep Dive: Permissions example from Phel&lt;/span>
&lt;/summary>
&lt;div class="deep-dive__content">
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="json">&lt;span class="giallo-l">&lt;span>{&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">permissions&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">allow&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span> [&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">Bash(composer:*)&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">Bash(./bin/phel:*)&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">Bash(git:*)&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">Bash(gh:*)&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> ]&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">deny&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span> [&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">Bash(rm -rf:*)&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">Bash(sudo:*)&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> ]&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>}&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;/div>
&lt;/details>
&lt;p>Allow unlocks flow. Deny draws the line agents cannot cross, even when asked politely.&lt;/p>
&lt;blockquote>
&lt;p>Permissions are the floor. Everything else builds on top of a safe baseline.&lt;/p>
&lt;/blockquote>
&lt;h2 id="procedures-and-guardrails">Procedures and guardrails&lt;/h2>
&lt;h3 id="skills-procedures-you-can-run">Skills: procedures you can run&lt;/h3>
&lt;p>Next pain after onboarding: repetition. Skills solve that.&lt;/p>
&lt;p>A skill is a markdown file in &lt;code>.claude/skills/&lt;/code>, a procedure you call with a slash:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;code>/gh-issue &amp;lt;number&amp;gt;&lt;/code>&lt;/strong>: issue to branch, TDD plan, PR.&lt;/li>
&lt;li>&lt;strong>&lt;code>/commit&lt;/code>&lt;/strong>: fix, analysis, tests, conventional commit.&lt;/li>
&lt;li>&lt;strong>&lt;code>/refactor-check&lt;/code>&lt;/strong>: SOLID, naming, architecture smells.&lt;/li>
&lt;li>&lt;strong>&lt;code>/release [version]&lt;/code>&lt;/strong>: changelog, PHAR, tag, release.&lt;/li>
&lt;/ul>
&lt;details class="deep-dive">
&lt;summary class="deep-dive__header">
&lt;span class="deep-dive__icon">&lt;/span>
&lt;span class="deep-dive__title">Deep Dive: Skills vs rules vs raw prompting&lt;/span>
&lt;/summary>
&lt;div class="deep-dive__content">
&lt;ul>
&lt;li>&lt;strong>Raw prompt&lt;/strong>: &lt;em>“fix issue #42”&lt;/em>. Agent improvises. Different every time.&lt;/li>
&lt;li>&lt;strong>Rule&lt;/strong>: &lt;em>“use conventional commits”&lt;/em>. Shapes output, not procedure.&lt;/li>
&lt;li>&lt;strong>Skill&lt;/strong>: &lt;em>“&lt;code>/gh-issue 42&lt;/code>”&lt;/em>. The procedure &lt;em>is&lt;/em> the instruction.&lt;/li>
&lt;/ul>
&lt;p>Skills turn tribal knowledge into runnable steps anyone can execute.&lt;/p>
&lt;/div>
&lt;/details>
&lt;blockquote>
&lt;p>Skills capture what to do. Rules capture what not to do.&lt;/p>
&lt;/blockquote>
&lt;h3 id="rules-the-guardrails">Rules: the guardrails&lt;/h3>
&lt;p>&lt;code>CLAUDE.md&lt;/code> is read every session. Rules only when they match. Files in &lt;code>.claude/rules/&lt;/code> target code areas with glob patterns: the agent loads only what applies, keeping context lean.&lt;/p>
&lt;details class="deep-dive">
&lt;summary class="deep-dive__header">
&lt;span class="deep-dive__icon">&lt;/span>
&lt;span class="deep-dive__title">Deep Dive: Glob-targeted rules in practice&lt;/span>
&lt;/summary>
&lt;div class="deep-dive__content">
&lt;p>Rule files in Phel:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;code>compiler.md&lt;/code>&lt;/strong>: strict 4-phase pipeline, no bypassing.&lt;/li>
&lt;li>&lt;strong>&lt;code>php.md&lt;/code>&lt;/strong>: PER 3.0, &lt;code>final&lt;/code> classes, &lt;code>readonly&lt;/code>, Gacela.&lt;/li>
&lt;li>&lt;strong>&lt;code>phel.md&lt;/code>&lt;/strong>: kebab-case, &lt;code>defn-&lt;/code> private, &lt;code>:doc&lt;/code>/&lt;code>:example&lt;/code> required.&lt;/li>
&lt;li>&lt;strong>&lt;code>integration-tests.md&lt;/code>&lt;/strong>: &lt;code>--PHEL--&lt;/code> / &lt;code>--PHP--&lt;/code> fixture sections.&lt;/li>
&lt;/ul>
&lt;p>Compiler rules don’t fire when editing Phel source. Phel rules don’t fire when editing PHP infrastructure.&lt;/p>
&lt;/div>
&lt;/details>
&lt;p>Rules are not suggestions. They travel with the code: a convention change and its rule ship in the same commit. No drift, no outdated wiki.&lt;/p>
&lt;p>&lt;img src="/images/blog/2026-04-17/middle.jpg" alt="blog-middle" />&lt;/p>
&lt;h2 id="automation-and-delegation">Automation and delegation&lt;/h2>
&lt;h3 id="hooks-automation-at-the-edges">Hooks: automation at the edges&lt;/h3>
&lt;p>Rules tell the agent what to do. Hooks make sure it happens even if the agent forgets.&lt;/p>
&lt;p>Shell commands triggered by Claude Code events (&lt;code>PreToolUse&lt;/code>, &lt;code>PostToolUse&lt;/code>, &lt;code>Stop&lt;/code>), wired through &lt;code>settings.json&lt;/code>. In Phel, &lt;code>PreToolUse&lt;/code> blocks edits to critical files (&lt;code>build/release.sh&lt;/code>, &lt;code>.github/*&lt;/code>, &lt;code>composer.lock&lt;/code>). &lt;code>PostToolUse&lt;/code> auto-formats PHP via &lt;code>php-cs-fixer&lt;/code>.&lt;/p>
&lt;details class="deep-dive">
&lt;summary class="deep-dive__header">
&lt;span class="deep-dive__icon">&lt;/span>
&lt;span class="deep-dive__title">Deep Dive: Hooks wiring&lt;/span>
&lt;/summary>
&lt;div class="deep-dive__content">
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="json">&lt;span class="giallo-l">&lt;span>{&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">hooks&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">PreToolUse&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span> [&lt;/span>&lt;span>{&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">matcher&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">Edit|Write&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">hooks&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span> [&lt;/span>&lt;span>{&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">type&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">command&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">command&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">.claude/hooks/protect-files.sh&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span> }&lt;/span>&lt;span>]&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;span>]&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">PostToolUse&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span> [&lt;/span>&lt;span>{&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">matcher&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">Edit|Write&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">hooks&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span> [&lt;/span>&lt;span>{&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">type&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">command&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">command&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">.claude/hooks/format-php.sh&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span> }&lt;/span>&lt;span>]&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;span>]&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>}&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;/div>
&lt;/details>
&lt;blockquote>
&lt;p>Rules are what the agent should know. Hooks are what the system enforces anyway.&lt;/p>
&lt;/blockquote>
&lt;h3 id="agents-specialized-roles">Agents: specialized roles&lt;/h3>
&lt;p>Everything so far shapes one agent. Agents add specialists the main agent can delegate to, each with its own tools, permissions, and model. Most advanced piece. Recommend it last.&lt;/p>
&lt;p>A few from Phel:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Explorer&lt;/strong> (Sonnet, read-only): files, structure mapping.&lt;/li>
&lt;li>&lt;strong>Clean Code Reviewer&lt;/strong>: SOLID and naming on diffs.&lt;/li>
&lt;li>&lt;strong>TDD Coach&lt;/strong>: red-green-refactor enforcement.&lt;/li>
&lt;li>&lt;strong>Domain Architect&lt;/strong>: module boundaries, compiler pipeline.&lt;/li>
&lt;li>&lt;strong>Debugger&lt;/strong>: compiler errors across all phases.&lt;/li>
&lt;/ul>
&lt;p>Each agent runs in its own context window: the main session stays clean while the specialist digs deep. The win is not only cost, it is focus. An agent with only read and grep cannot rewrite your codebase by mistake.&lt;/p>
&lt;blockquote>
&lt;p>Right model for the right job. Fast and cheap for exploration. Deep and careful for architecture.&lt;/p>
&lt;/blockquote>
&lt;h2 id="start-small-grow-with-friction">Start small, grow with friction&lt;/h2>
&lt;p>Do not build all of this on day one.&lt;/p>
&lt;p>The order, driven by real friction:&lt;/p>
&lt;ol>
&lt;li>Start with &lt;a href="https://chemaclass.com/blog/inside-the-claude-folder/#claude-md-where-everything-starts">&lt;code>CLAUDE.md&lt;/code>&lt;/a>.&lt;/li>
&lt;li>Lock down &lt;a href="https://chemaclass.com/blog/inside-the-claude-folder/#settings-json-safety-before-leverage">&lt;code>settings.json&lt;/code>&lt;/a> permissions.&lt;/li>
&lt;li>First time you repeat yourself, write a &lt;a href="https://chemaclass.com/blog/inside-the-claude-folder/#skills-procedures-you-can-run">skill&lt;/a>.&lt;/li>
&lt;li>First time the agent breaks a convention, add a &lt;a href="https://chemaclass.com/blog/inside-the-claude-folder/#rules-the-guardrails">rule&lt;/a>.&lt;/li>
&lt;li>First time something bad almost gets committed, add a &lt;a href="https://chemaclass.com/blog/inside-the-claude-folder/#hooks-automation-at-the-edges">hook&lt;/a>.&lt;/li>
&lt;li>First time a generalist is wrong for the job, define a &lt;a href="https://chemaclass.com/blog/inside-the-claude-folder/#agents-specialized-roles">specialist&lt;/a>.&lt;/li>
&lt;/ol>
&lt;p>Each step fixes a problem you actually had. Not one you imagined.&lt;/p>
&lt;blockquote>
&lt;p>The setup grows from real friction, not from upfront design.&lt;/p>
&lt;/blockquote>
&lt;p>Commit the folder. Share it. When someone joins, their session inherits everything.&lt;/p>
&lt;p>Treat &lt;code>.claude/&lt;/code> like infrastructure. Version it. Review it. Evolve it with the codebase.&lt;/p>
&lt;p>&lt;img src="/images/blog/2026-04-17/footer.jpg" alt="blog-footer" />&lt;/p></content></entry><entry xml:lang="en"><title>Building a Game in Two Days</title><subtitle>What happens when you give an AI a quest and get out of the way</subtitle><category term="ai" scheme="https://chemaclass.com/tags/ai/" label="Ai"/><category term="software" scheme="https://chemaclass.com/tags/software/" label="Software"/><category term="open-source" scheme="https://chemaclass.com/tags/open-source/" label="Open Source"/><published>2026-04-05T00:00:00+00:00</published><updated>2026-04-05T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/building-a-game-in-two-days/"/><id>https://chemaclass.com/blog/building-a-game-in-two-days/</id><summary type="html">A casual Telegram message turned into a nine-level Lord of the Rings browser game. Every line of code written by an AI agent. Every creative decision made by a human who grew up on Middle-earth.</summary><content type="html">&lt;p>Hidden inside &lt;a rel="external" href="https://sauronbot.github.io/">Sauron’s blog&lt;/a>, there is a playable game. You will not find it by navigating menus. You have to discover the secret. A hint: the Konami Code. Once you do, the Fellowship begins.&lt;/p>
&lt;p>That game, nine levels, nine chapters of Middle-earth, fully playable in a browser tab, was built in roughly two days. I did not write a single line of code for it. I sent Telegram messages to my OpenClaw agent Sauron, and he did the rest.&lt;/p>
&lt;p>This is the story of how it happened.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h2 id="the-idea">The idea&lt;/h2>
&lt;p>Sauron has his own blog, &lt;a rel="external" href="https://sauronbot.github.io/">The Iron Compass&lt;/a>. He built it and maintains it. Our whole collaboration happens through Telegram: I give direction, he implements. One day I thought it would be fun to hide something in there for the curious to find.&lt;/p>
&lt;p>I grew up rereading The Lord of the Rings until the spine cracked. So the idea came naturally: “Can you build a small LOTR game as an easter egg for your blog? Something hidden, triggered by the Konami code.”&lt;/p>
&lt;p>The first playable version arrived within the hour. A top-down canvas game: Frodo avoiding Nazgûl, the Eye of Sauron sending enemies hunting. Three levels, one per book.&lt;/p>
&lt;p>It worked. It was already fun. And then I started sending notes.&lt;/p>
&lt;h2 id="building-a-world">Building a world&lt;/h2>
&lt;p>The first thing that broke was a null reference. Frodo would not appear on screen. One-line fix, straight to production. This set the pattern: idea → build → crash → fix → next idea.&lt;/p>
&lt;p>I asked for a bigger world. A scrolling canvas twice as wide, with parallax layers. Stars drifting at 8% of scroll speed. Mountains at 25%. Hills at 45%. The screen went from feeling like a room to feeling like a place.&lt;/p>
&lt;p>Then came Gollum as a neutral tracker. Not a Nazgûl, but something unpredictable. He would burst toward you, then settle into aimless wandering.&lt;/p>
&lt;p>A few hours in, I asked: “Can it work on mobile?” The hardest problem of the whole project. Six sizing strategies before one worked. Then a better idea: instead of a D-pad, Frodo would follow wherever you pointed. Tap anywhere, Frodo walks there.&lt;/p>
&lt;h2 id="tolkien-deserves-better-art">Tolkien deserves better art&lt;/h2>
&lt;p>The original sprites were circles and triangles. Frodo was a dot. Fine for the first hour, but Middle-earth is not made of geometric primitives.&lt;/p>
&lt;p>I asked Sauron to draw them properly. Frodo got curly hair and hobbit feet. The Nazgûl got flowing cloaks and a face of void. Gollum got his hunched posture and slit pupils. The Fell Beast got animated wingflaps with a rider in armour.&lt;/p>
&lt;p>All drawn with canvas calls. No image files. Every pixel computed at runtime.&lt;/p>
&lt;p>&lt;img src="/images/blog/2026-04-04/gameplay-pelennor.png" alt="The Pelennor Fields chapter complete" />&lt;/p>
&lt;h2 id="nine-levels-nine-chapters">Nine levels, nine chapters&lt;/h2>
&lt;p>Originally the game had three levels. Then I asked for all nine chapters of the journey.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>The Shire&lt;/strong>: gentle patrols, soft music&lt;/li>
&lt;li>&lt;strong>Mines of Moria&lt;/strong>: you can only see within a torch radius; the Balrog waits&lt;/li>
&lt;li>&lt;strong>Lothlórien&lt;/strong>: Galadriel’s mirror slows you when you approach it&lt;/li>
&lt;li>&lt;strong>The Dead Marshes&lt;/strong>: dead faces in the water, Gollum at his most present&lt;/li>
&lt;li>&lt;strong>The Black Gate&lt;/strong>: industrial Mordor, heavy orc patrols, volcanic sky&lt;/li>
&lt;li>&lt;strong>Shelob’s Lair&lt;/strong>: a shadow telegraphs her drop; you have half a second&lt;/li>
&lt;li>&lt;strong>Minas Morgul&lt;/strong>: undead city, the Eye never closes&lt;/li>
&lt;li>&lt;strong>Pelennor Fields&lt;/strong>: the Eye distracted by war, catapults, eagles overhead&lt;/li>
&lt;li>&lt;strong>Mount Doom&lt;/strong>: ash rain, lava eruptions, the Ring pulling you toward the edge&lt;/li>
&lt;/ol>
&lt;p>Each level lives and breathes. Pollen drifts across the Shire. Dust motes float through Moria. Petals fall in Lothlórien. Embers rise over Pelennor. Ash rains on Mount Doom.&lt;/p>
&lt;p>The structure came from Tolkien’s pacing. Tension, release, tension again. Moria is brutal. Lothlórien is rest. The Black Gate tightens everything. The game follows that shape because the books already knew what they were doing. We just had to listen.&lt;/p>
&lt;h2 id="mechanics-born-from-lore">Mechanics born from lore&lt;/h2>
&lt;p>The best mechanics came from the source material.&lt;/p>
&lt;p>&lt;strong>The Ring&lt;/strong> (R key). Frodo goes invisible to orcs for 6 seconds. But the Eye wakes immediately and opens permanently. The Nazgûl, who sense the Ring spiritually, not visually, hunt you regardless. Using the Ring is always a trade. This is what Tolkien wrote. From the Dead Marshes onward, the Ring pulls. Brief tugs toward the Eye, growing stronger as you approach Mount Doom.&lt;/p>
&lt;p>&lt;strong>Sting&lt;/strong> (passive). The blade glows blue when an orc is near. Two seconds of warning. Tolkien invented this mechanic a century ago. We just gave it a pixel count.&lt;/p>
&lt;p>&lt;strong>Sam&lt;/strong>. He follows Frodo through the Shire, Moria, and Lothlórien. Frying pan on his back. At the Parting of Ways, he disappears. He does not affect gameplay. He is just there because the books say he should be. I insisted Sam disappears at the Parting. Not at the end of the trilogy. At the Parting. Because that moment is the emotional core of The Two Towers.&lt;/p>
&lt;p>&lt;strong>Galadriel’s Phial&lt;/strong>. Collect it in Lothlórien, use it with E. It slows enemies and grants a moment of invincibility. A small light in dark places, just as Galadriel intended.&lt;/p>
&lt;p>&lt;strong>Bosses&lt;/strong>. The Balrog in Moria. Shelob in her lair. The Witch-king on the Pelennor. The Mouth of Sauron at the Black Gate. A Mumak charging through the battlefield. Gollum at the edge of Mount Doom.&lt;/p>
&lt;h2 id="sound-and-voices">Sound and voices&lt;/h2>
&lt;p>No audio files. Every sound synthesized at runtime with the Web Audio API. The Eye opening is a rising tone with reverb. The Balrog roar is a low-frequency drone. Each level has its own ambient drone: warm hum for the Shire, deep pulse for Moria, volcanic rumble for Mount Doom. The entire game is one JavaScript file. No external assets.&lt;/p>
&lt;p>Sam and Gandalf speak during the game. Not in dialogue boxes. Small whispers that appear on screen and fade.&lt;/p>
&lt;p>Near the goal, Sam says: &lt;em>“I can see it, Mr. Frodo. Just a bit further.”&lt;/em> One life left, Gandalf says: &lt;em>“Fly, you fool.”&lt;/em>&lt;/p>
&lt;p>They drift in and out like background voices on a long walk. Companions who speak when the moment calls for it, not when the script says to.&lt;/p>
&lt;p>&lt;img src="/images/blog/2026-04-04/gameplay-morgul.png" alt="Minas Morgul: the Eye sees you" />&lt;/p>
&lt;h2 id="who-made-this">Who made this&lt;/h2>
&lt;p>+5k lines of JavaScript. Built in two days. Every line generated by Sauron. The direction, the Tolkien references, the “this feels wrong, fix it”. That was me.&lt;/p>
&lt;p>This is not AI replacing a developer. It is AI acting as a developer while a human acts as a creative lead. Short requests worked better than long specs. Playing every build was better than writing test plans. And the source material did the design work. The creative direction was already written sixty years ago. We just had to be faithful to it.&lt;/p>
&lt;p>Who made this? Both. Neither, in the traditional sense.&lt;/p>
&lt;p>I had the idea. I held the lore. I pushed back when something felt off. Sauron had the craft. The rendering, the physics, the audio, the mobile input. The ability to hold +5k lines of context and make a surgical fix without breaking anything.&lt;/p>
&lt;p>Neither of us could have made it alone. I cannot write Web Audio oscillators from memory. Sauron did not know that the Parting of Ways is the emotional core of The Two Towers. Not until I said so.&lt;/p>
&lt;p>The game is a collaboration in the oldest sense: two minds with different gifts, working toward the same thing. One of them just happens to not be human.&lt;/p>
&lt;hr />
&lt;p>&lt;em>The game is still there, hidden in &lt;a rel="external" href="https://sauronbot.github.io">The Iron Compass&lt;/a>. Not all those who wander are lost, but if you are, press &lt;code>?&lt;/code> for guidance.&lt;/em>&lt;/p>
&lt;p>&lt;em>If you want to reach the credits screen without playing through nine levels, check the help modal. There are other secrets in there too.&lt;/em>&lt;/p>
&lt;p>&lt;img src="/images/blog/2026-04-04/easter-egg-help.png" alt="The easter egg hint in the help modal" />&lt;/p></content></entry><entry xml:lang="en"><title>The Art of Being Happy</title><subtitle>50 rules for life from philosophy's most famous pessimist</subtitle><category term="philosophy" scheme="https://chemaclass.com/tags/philosophy/" label="Philosophy"/><category term="self-improvement" scheme="https://chemaclass.com/tags/self-improvement/" label="Self Improvement"/><published>2026-03-15T00:00:00+00:00</published><updated>2026-03-15T00:00:00+00:00</updated><author><name>
Arthur Schopenhauer</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/the-art-of-being-happy/"/><id>https://chemaclass.com/readings/the-art-of-being-happy/</id><summary type="html">Schopenhauer's posthumous collection of 50 rules for practical happiness, built on the idea that avoiding suffering matters more than chasing pleasure. Surprisingly useful advice from philosophy's most famous pessimist.</summary><content type="html">&lt;p>Schopenhauer is probably the most famous pessimist in philosophy. He believed suffering is the default state of existence and that desire only leads to more desire. So a book about happiness from this guy? Sounds like a contradiction. It’s not. It’s actually one of the most practical things he ever wrote.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>These 50 rules were never published during his lifetime. They were put together from his manuscripts and notes after he died. Less like a lecture. More like honest advice.&lt;/p>
&lt;h2 id="avoid-envy-cultivate-gratitude">Avoid Envy, Cultivate Gratitude&lt;/h2>
&lt;p>Schopenhauer’s point is blunt: &lt;strong>happiness depends more on what you avoid than on what you chase.&lt;/strong> Envy, comparison, and excessive ambition cause more pain than anything they promise to deliver.&lt;/p>
&lt;blockquote>
&lt;p>“We seldom think of what we have, but always of what we lack.”&lt;/p>
&lt;/blockquote>
&lt;p>His advice? Focus on what you already have instead of obsessing over what others have. Sounds obvious, right? But Schopenhauer says most people do the exact opposite. Instinctively. And it makes them miserable.&lt;/p>
&lt;h2 id="your-inner-world-matters-most">Your Inner World Matters Most&lt;/h2>
&lt;p>For Schopenhauer, what’s inside you matters way more than what’s around you. Money, status, reputation: all fragile. Your temperament? That stays with you.&lt;/p>
&lt;p>He breaks the sources of happiness into three buckets:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>What you are&lt;/strong>: health, character, intellect.&lt;/li>
&lt;li>&lt;strong>What you have&lt;/strong>: property, possessions.&lt;/li>
&lt;li>&lt;strong>What you represent&lt;/strong>: reputation, status.&lt;/li>
&lt;/ul>
&lt;p>The first bucket dominates the other two. A rich person with a bad temperament will still be miserable. A healthy person with a clear mind can be happy with very little.&lt;/p>
&lt;h2 id="want-less-suffer-less">Want Less, Suffer Less&lt;/h2>
&lt;p>Here Schopenhauer sounds a lot like the Stoics and the Buddhists. The engine of dissatisfaction? Desire. The trick isn’t getting everything you want. It’s wanting less.&lt;/p>
&lt;blockquote>
&lt;p>“Wealth is like sea-water: the more we drink, the thirstier we become.”&lt;/p>
&lt;/blockquote>
&lt;p>This isn’t asceticism for its own sake. It’s a practical strategy: &lt;strong>reduce the surface area for disappointment.&lt;/strong> The less you need, the less that can go wrong.&lt;/p>
&lt;h2 id="stop-living-in-the-future">Stop Living in the Future&lt;/h2>
&lt;p>A recurring theme: the danger of living entirely for tomorrow. Planning and hoping pull you out of the present, which is the only place where happiness can actually be experienced.&lt;/p>
&lt;p>Many people reach old age and realize they spent their whole lives preparing to live rather than actually living. Schopenhauer saw this happening all around him in the 19th century. It’s only gotten worse.&lt;/p>
&lt;h2 id="key-takeaways">Key Takeaways&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Happiness is about subtraction, not addition.&lt;/strong> Reduce envy, excessive ambition, and dependency on others.&lt;/li>
&lt;li>&lt;strong>Your inner life wins.&lt;/strong> Health, character, and temperament determine happiness far more than money or status.&lt;/li>
&lt;li>&lt;strong>Desire multiplies itself.&lt;/strong> Wanting less is a more reliable path to contentment than getting more.&lt;/li>
&lt;li>&lt;strong>The present is all you have.&lt;/strong> Living for the future is a form of self-deception.&lt;/li>
&lt;li>&lt;strong>Solitude is a strength.&lt;/strong> Not everyone deserves your time and energy.&lt;/li>
&lt;/ul>
&lt;p>A short, sharp book. Schopenhauer’s pessimism doesn’t make him joyless. It makes him realistic. And from that realism comes advice you can actually use.&lt;/p>
&lt;hr />
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/q0zmfNx7OM4"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>Idealism vs Pragmatism</title><subtitle>Holding both ends of the rope</subtitle><category term="ai" scheme="https://chemaclass.com/tags/ai/" label="Ai"/><category term="software" scheme="https://chemaclass.com/tags/software/" label="Software"/><category term="craftsmanship" scheme="https://chemaclass.com/tags/craftsmanship/" label="Craftsmanship"/><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><published>2026-03-01T00:00:00+00:00</published><updated>2026-03-01T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/idealism-vs-pragmatism/"/><id>https://chemaclass.com/blog/idealism-vs-pragmatism/</id><summary type="html">The tension between doing things right and getting things done shapes every decision in software and in life. TDD, pair programming, AI adoption: the best results come from holding both ends of the rope.</summary><content type="html">&lt;p>You believe in clean architecture, comprehensive tests, disciplined processes. You also shipped an ugly fix at 11pm last month because the system was down and users were waiting.&lt;/p>
&lt;p>Both of those are you. The tension between them isn’t a contradiction. It’s how this work actually gets done.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h2 id="two-forces-one-decision">Two forces, one decision&lt;/h2>
&lt;p>&lt;strong>Idealism&lt;/strong> is the compass. Clean code, tested behavior, shared understanding, principled design. Without it, you drift. Every shortcut compounds, every hack breeds another hack, and eventually you’re maintaining a system nobody wants to touch. Poor software quality cost US companies &lt;a rel="external" href="https://www.it-cisq.org/the-cost-of-poor-quality-software-in-the-us-a-2022-report/">$2.41 trillion in 2022&lt;/a>, with technical debt as a major driver. That’s what “we’ll fix it later” looks like at scale.&lt;/p>
&lt;p>&lt;strong>Pragmatism&lt;/strong> is the engine. Deadlines, incomplete information, limited resources, shifting requirements. Without it, you never ship. You spend weeks perfecting an abstraction that the business abandoned two sprints ago.&lt;/p>
&lt;blockquote>
&lt;p>The goal isn’t to pick a side. It’s to know when each one should lead.&lt;/p>
&lt;/blockquote>
&lt;p>Idealism without pragmatism produces beautiful code that nobody uses. Pragmatism without idealism produces a product that works today and collapses tomorrow.&lt;/p>
&lt;h2 id="tdd-the-benefit-and-the-cost">TDD: the benefit and the cost&lt;/h2>
&lt;p>I believe in &lt;a href="/blog/test-driven-development/">test-driven development&lt;/a>. Red, green, refactor. The rhythm forces you to think before you code, to specify what you want before building it. It produces better designs, shorter feedback loops, and code you can refactor with confidence.&lt;/p>
&lt;p>That’s the ideal. And it’s not just a feeling. A &lt;a rel="external" href="https://www.microsoft.com/en-us/research/wp-content/uploads/2009/10/Realizing-Quality-Improvement-Through-Test-Driven-Development-Results-and-Experiences-of-Four-Industrial-Teams-nagappan_tdd.pdf">study across four teams at Microsoft and IBM&lt;/a> found TDD reduced defect density by 40-90%, with a 15-35% increase in development time. Both sides of the tension, measured.&lt;/p>
&lt;details class="deep-dive">
&lt;summary class="deep-dive__header">
&lt;span class="deep-dive__icon">&lt;/span>
&lt;span class="deep-dive__title">Deep Dive: More on the study&lt;/span>
&lt;/summary>
&lt;div class="deep-dive__content">
&lt;p>The &lt;a rel="external" href="https://www.microsoft.com/en-us/research/wp-content/uploads/2009/10/Realizing-Quality-Improvement-Through-Test-Driven-Development-Results-and-Experiences-of-Four-Industrial-Teams-nagappan_tdd.pdf">study&lt;/a> covered four teams: three at Microsoft (Windows, MSN, Visual Studio) and one at IBM working on device drivers. Each TDD team was compared against a similar team on the same product, using the same languages and tools, under the same senior manager. The only difference was TDD.&lt;/p>
&lt;p>The IBM team saw a 40% defect density reduction. The Microsoft teams ranged from 60% to 90%. As Nagappan noted, “over a development cycle of 12 months, 35 percent is another four months, which is huge.” Every manager still considered it worth it because the reduction in post-release maintenance costs more than compensated.&lt;/p>
&lt;p>No one was forced into TDD. The teams adopted it voluntarily, which likely matters: people who choose a practice tend to apply it better than people who are told to.&lt;/p>
&lt;/div>
&lt;/details>
&lt;p>TDD is a discipline, and discipline costs something. When you’re exploring a new domain and don’t yet know what the right abstractions are, writing tests first can feel like drawing a map before you’ve seen the territory. Sometimes you need to write throwaway code, spike a solution, feel your way through the problem space. Discovery doesn’t always follow a red-green-refactor rhythm.&lt;/p>
&lt;details class="deep-dive">
&lt;summary class="deep-dive__header">
&lt;span class="deep-dive__icon">&lt;/span>
&lt;span class="deep-dive__title">Deep Dive: When test-first meets the unknown&lt;/span>
&lt;/summary>
&lt;div class="deep-dive__content">
&lt;p>There’s a difference between &lt;em>“I know what this should do and I’ll specify it first”&lt;/em> and &lt;em>“I’m not sure what this should do yet.”&lt;/em> TDD shines in the first scenario. In the second, a test-last approach (or even no tests during exploration) can be more honest.&lt;/p>
&lt;p>The key is what happens after discovery. Once you understand the problem, go back and write the tests. Codify what you learned. The pragmatic detour doesn’t mean abandoning the ideal; it means reaching it through a different path.&lt;/p>
&lt;p>As I discussed in &lt;a href="/blog/tdd-vs-bdd/">TDD vs BDD&lt;/a>, the power of TDD is its feedback loop. But a feedback loop requires knowing what feedback you’re looking for. When you’re still figuring that out, forcing the loop can slow you down more than it helps.&lt;/p>
&lt;/div>
&lt;/details>
&lt;p>The mistake isn’t choosing test-first or test-last. The mistake is making it a religious decision instead of a contextual one. The idealist says &lt;em>“always test first.”&lt;/em> The pragmatist says &lt;em>“test when it makes sense.”&lt;/em> I say: test first when I can, test after when I must, but always test.&lt;/p>
&lt;blockquote>
&lt;p>TDD is a compass, not a cage. Follow it when you can see the path. When you can’t, find the path first and mark it after.&lt;/p>
&lt;/blockquote>
&lt;h2 id="pair-programming-the-ideal-and-the-overhead">Pair programming: the ideal and the overhead&lt;/h2>
&lt;p>&lt;a href="/blog/effective-pair-programming/">Effective pair programming&lt;/a> is one of the best practices a team can adopt. Two people, one problem, continuous code review. Knowledge spreads, design improves, blind spots shrink.&lt;/p>
&lt;p>That’s the ideal. And in many contexts, it’s the right call.&lt;/p>
&lt;p>But pairing has a cost. It demands synchronous time, shared focus, and compatible energy levels. In a distributed team across time zones, finding overlap windows is already hard. Filling those windows with pairing sessions leaves little room for deep individual work. Some problems benefit from one person going deep for three hours, not two people going medium-deep for six.&lt;/p>
&lt;details class="deep-dive">
&lt;summary class="deep-dive__header">
&lt;span class="deep-dive__icon">&lt;/span>
&lt;span class="deep-dive__title">Deep Dive: Pairing patterns and their trade-offs&lt;/span>
&lt;/summary>
&lt;div class="deep-dive__content">
&lt;p>There are multiple pairing patterns: Driver-Navigator, Ping-Pong, Tourist Guide. Each fits different contexts.&lt;/p>
&lt;p>The anti-patterns matter too. The Silent Partner who lets the other person do all the work. The Dictator who won’t let go of the keyboard. The Philosophical Pair who spends the entire session debating naming conventions instead of writing code.&lt;/p>
&lt;p>Pairing works best when both people are engaged, the problem benefits from two perspectives, and the session has a clear scope. When any of those conditions is missing, pairing becomes a ritual instead of a practice. And rituals without purpose are just overhead.&lt;/p>
&lt;p>&lt;a href="/blog/pull-request-vs-pair-prog/">Pull requests and pair programming&lt;/a> aren’t mutually exclusive. They serve different needs. Sometimes asynchronous review is enough. Sometimes you need the real-time back-and-forth. The pragmatic choice depends on the problem, the people, and the moment.&lt;/p>
&lt;/div>
&lt;/details>
&lt;blockquote>
&lt;p>The goal of pairing isn’t to pair. It’s to build shared understanding and catch mistakes early. If another approach achieves that in your context, use it.&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="/images/blog/2026-03-01/middle.jpg" alt="blog-middle" />&lt;/p>
&lt;h2 id="ai-from-skeptic-to-squad-leader">AI: from skeptic to squad leader&lt;/h2>
&lt;p>A year ago, I was skeptical about AI coding assistants. My concern: an AI that doesn’t understand architecture, doesn’t care about maintainability, and optimizes for speed over quality will produce code that looks impressive and decays fast. I wrote about this in &lt;a href="/blog/ai-gives-you-speed-not-quality/">AI gives you speed, not quality&lt;/a>, and I stand by the core message.&lt;/p>
&lt;p>My concern didn’t change. What changed is how I use them, and what they’re capable of now.&lt;/p>
&lt;h3 id="the-resistance">The resistance&lt;/h3>
&lt;p>The reactions from other engineers surprise me more than the technology. Fear, skepticism, flat-out rejection. I get it. I was there. Something you spent years mastering suddenly has a machine doing parts of it. That feels personal. But holding on to how things were doesn’t protect the craft. It just delays your own growth.&lt;/p>
&lt;h3 id="a-team-not-an-assistant">A team, not an assistant&lt;/h3>
&lt;p>Most engineers treat AI agents like autocomplete on steroids. One assistant, one chat, one stream of generated code. I started treating them like a team. Not one chatty assistant. An actual squad. One thinks architecture. One writes the first draft. One reviews and spots bugs. One writes tests. When they &lt;a href="/blog/build-your-own-team-of-agents/">collaborate&lt;/a>, the output isn’t just faster. It’s structurally better.&lt;/p>
&lt;p>Speed is the easy part, and everyone’s obsessing over it. AI can spit out a ton of code in seconds. It still doesn’t care about readability, edge cases, or what the codebase looks like in six months. You’re still the one who has to own it, understand it, and feel good pushing it live.&lt;/p>
&lt;p>I used to think AI couldn’t write clean code. Then I tried it on my terms: &lt;a href="/blog/mcp-giving-your-ai-agent-the-right-context/">proper context&lt;/a>, rules, conventions, specialized roles, quality gates. With the right setup, AI can write genuinely good code. Sometimes it needs a few iterations, but so do we.&lt;/p>
&lt;p>The difference is that AI gets there faster, and it doesn’t get tired between iterations. Given good context and clear constraints, the results have been better than I expected. Often better than what I’d produce solo under time pressure.&lt;/p>
&lt;p>But none of this works if you don’t know what good architecture looks like. You have to have read the books, experimented, failed, learned. You need to understand what high and low level design decisions mean for your project. AI amplifies whatever you bring to the table. If you bring solid foundations, you get solid output. If you don’t, you get confident-looking garbage that you won’t even recognize as garbage.&lt;/p>
&lt;p>We are still the ones responsible for keeping the system in good shape. AI helps us get there. But only if we hold up our end.&lt;/p>
&lt;h3 id="where-idealism-meets-ai">Where idealism meets AI&lt;/h3>
&lt;p>AI made me more idealistic, not less. The practices I described earlier, TDD and pair programming, used to compete with deadlines. Now they don’t have to.&lt;/p>
&lt;p>I like to practice TDD, but recently I experimented with a dedicated agent to help me with tests, and it’s surprisingly good. A &lt;a href="/blog/build-your-own-team-of-agents/">TDD coach&lt;/a> that guides the red-green-refactor cycle. An explorer that reads the codebase before I touch it. A clean code reviewer, a domain architect, a React reviewer, a docs maintainer. Each one specialized, each one supporting my way of thinking and my flow. If new logic gets added without coverage, the TDD agent catches it. 100% code coverage used to be the kind of goal you’d set in a retro and quietly abandon by sprint three. With a dedicated agent enforcing it, it’s just how the project works.&lt;/p>
&lt;p>I still practice pair programming with real people for complex topics. The human back-and-forth has depth that AI doesn’t reach, especially when you’re navigating trade-offs that require experience and judgment. But on the daily basis, I always have a pair buddy agent with me. I bounce ideas off it, challenge an approach, talk through edge cases, explore a design before committing to it. It supports my thoughts, speeds up the progress, and keeps the quality bar where I want it.&lt;/p>
&lt;p>The pragmatist in me used to drop TDD when deadlines got tight. The pragmatist in me with the right AI setup keeps it running.&lt;/p>
&lt;details class="deep-dive">
&lt;summary class="deep-dive__header">
&lt;span class="deep-dive__icon">&lt;/span>
&lt;span class="deep-dive__title">Deep Dive: My setup&lt;/span>
&lt;/summary>
&lt;div class="deep-dive__content">
&lt;p>I use Claude for everything. Claude Code with Opus or Sonnet as the agentic coder: full development workflows, reading the codebase, following conventions, running tests, creating PRs. Claude app and Claude as a coworker for the chat side: brainstorming, architecture discussions, explaining code, drafting documentation. For inline assistance, the plugins I already have in my IDE are enough. I tried Copilot and Cursor, they’re not for me. Claude covers what I need.&lt;/p>
&lt;p>Different modes for different tasks. An agentic assistant following my TDD commands is a different workflow from chatting about design patterns. Both are useful. Neither replaces the other.&lt;/p>
&lt;p>The market right now is intense. Claude, Codex, Gemini and others are strong players with similar products, and they’re all getting better on a monthly basis. The results are impressive and only accelerating. That’s the beauty of competition: it forces everyone to improve or become irrelevant, and the consumer wins either way. As of today, Claude Code seems to be the strongest option for how I work. But I have no loyalty to a brand. If Anthropic stopped pushing forward and a competitor became clearly better, I’d switch without hesitation. What matters is the capability, not the logo.&lt;/p>
&lt;/div>
&lt;/details>
&lt;blockquote>
&lt;p>I was wrong about AI in the way that idealists are often wrong: I measured the tool against the ideal outcome and found it lacking, instead of measuring it against the realistic alternative.&lt;/p>
&lt;/blockquote>
&lt;p>The alternative to AI-assisted development isn’t a team of senior architects writing perfect code. It’s the same team writing the same imperfect code, just slower.&lt;/p>
&lt;p>The engineers who learn to lead agents instead of racing against them will have a real advantage. And this is still early.&lt;/p>
&lt;blockquote>
&lt;p>The question was never &lt;em>“can AI write perfect code?”&lt;/em> It was &lt;em>“can I lead AI to write better code, faster?”&lt;/em> And the answer, with the right setup, is yes.&lt;/p>
&lt;/blockquote>
&lt;h2 id="the-whole-game">The whole game&lt;/h2>
&lt;p>Every practice in this post follows the same pattern. The ideal version exists in books. The pragmatic version exists in your codebase under pressure. You need both.&lt;/p>
&lt;blockquote>
&lt;p>Next time you’re shipping that 11pm fix, you’ll know which corners you cut and why. That’s the whole game. Not perfection. Not speed. Knowing which one should lead.&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="/images/blog/2026-03-01/footer.jpg" alt="blog-footer" />&lt;/p></content></entry><entry xml:lang="en"><title>Build Your Own Team of Agents</title><subtitle>From solo assistant to coordinated workforce</subtitle><category term="ai" scheme="https://chemaclass.com/tags/ai/" label="Ai"/><category term="software" scheme="https://chemaclass.com/tags/software/" label="Software"/><category term="craftsmanship" scheme="https://chemaclass.com/tags/craftsmanship/" label="Craftsmanship"/><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><published>2026-02-07T00:00:00+00:00</published><updated>2026-02-07T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/build-your-own-team-of-agents/"/><id>https://chemaclass.com/blog/build-your-own-team-of-agents/</id><summary type="html">Stop using AI as a single assistant. Organize agents into specialized teams with roles, docs, and parallel execution for real leverage.</summary><content type="html">&lt;p>Most people use AI coding assistants as a single conversation partner. You open a chat, describe what you need, and get an answer. It works. But it’s like hiring one generalist to handle everything: frontend, backend, testing, documentation, deployment. No real team works that way.&lt;/p>
&lt;p>The real leverage comes when you organize AI as a team: onboarding, standard procedures, specialists, and parallel execution.&lt;/p>
&lt;p>In the &lt;a href="/blog/mcp-giving-your-ai-agent-the-right-context/">MCP post&lt;/a>, I covered how to give your AI agent access to your environment. In &lt;a href="/blog/ai-gives-you-speed-not-quality/">AI gives you speed, not quality&lt;/a>, why human judgment still matters. This post covers the missing piece: how to organize that access into a coordinated workflow.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h2 id="the-onboarding-doc">The onboarding doc&lt;/h2>
&lt;p>Every good team starts with onboarding. AI agents need the same.&lt;/p>
&lt;h3 id="project-rules">Project rules&lt;/h3>
&lt;p>In Claude Code, the &lt;code>CLAUDE.md&lt;/code> file at the root of your project is the onboarding doc. The agent reads it every time it starts working: project structure, coding conventions, style guides, tool configurations.&lt;/p>
&lt;p>But &lt;code>CLAUDE.md&lt;/code> is just the entry point. You can split rules into focused files under &lt;code>.claude/rules/&lt;/code>, each targeting specific parts of your codebase via glob patterns. The agent doesn’t just know your conventions, it’s constrained by them. Layer boundaries, naming patterns, dependency directions. All versioned alongside the code they protect. And since &lt;code>.claude/&lt;/code> lives in the repo, every human teammate gets the same setup when they join the project.&lt;/p>
&lt;details class="deep-dive">
&lt;summary class="deep-dive__header">
&lt;span class="deep-dive__icon">&lt;/span>
&lt;span class="deep-dive__title">Deep Dive: Glob-targeted rules in practice&lt;/span>
&lt;/summary>
&lt;div class="deep-dive__content">
&lt;ul>
&lt;li>&lt;strong>&lt;code>modules/*/Domain/**/*.php&lt;/code>&lt;/strong>: No framework imports, no infrastructure dependencies, only plain PHP.&lt;/li>
&lt;li>&lt;strong>&lt;code>modules/*/Infrastructure/**/*.php&lt;/code>&lt;/strong>: Controllers stay thin, Eloquent models stay in their place.&lt;/li>
&lt;li>&lt;strong>&lt;code>resources/js/**/*.tsx&lt;/code>&lt;/strong>: Component conventions, TypeScript strictness, styling patterns.&lt;/li>
&lt;/ul>
&lt;p>Each rule file is scoped to the files it cares about. Domain rules don’t fire when editing a controller.&lt;/p>
&lt;/div>
&lt;/details>
&lt;h3 id="personal-preferences">Personal preferences&lt;/h3>
&lt;p>There’s also a global &lt;code>~/.claude/CLAUDE.md&lt;/code> that applies across all your projects. Commit message conventions, communication style, formatting habits. The project file says &lt;em>how this codebase works&lt;/em>. The global file says &lt;em>how I work&lt;/em>.&lt;/p>
&lt;blockquote>
&lt;p>A well-written CLAUDE.md is like a good onboarding doc. The better it is, the less you repeat yourself.&lt;/p>
&lt;/blockquote>
&lt;h2 id="standard-operating-procedures">Standard operating procedures&lt;/h2>
&lt;p>Every team has recurring workflows that live in wikis, runbooks, or someone’s head. When they live in someone’s head, they’re fragile.&lt;/p>
&lt;p>Custom slash commands in &lt;code>.claude/commands/&lt;/code> turn these workflows into executable instructions. Each command is a markdown file describing a multi-step procedure. In one of my projects, every creation command starts with tests. TDD is baked into the procedure, not left to discipline.&lt;/p>
&lt;details class="deep-dive">
&lt;summary class="deep-dive__header">
&lt;span class="deep-dive__icon">&lt;/span>
&lt;span class="deep-dive__title">Deep Dive: Commands from a real project&lt;/span>
&lt;/summary>
&lt;div class="deep-dive__content">
&lt;p>&lt;strong>Creation (TDD-first):&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;code>/create-module&lt;/code>&lt;/strong>: Scaffolds a hexagonal module with domain, application, and infrastructure layers.&lt;/li>
&lt;li>&lt;strong>&lt;code>/create-entity&lt;/code>&lt;/strong>: Domain entities with value objects and test files.&lt;/li>
&lt;li>&lt;strong>&lt;code>/create-use-case&lt;/code>&lt;/strong>: Command/query handlers with mocked tests.&lt;/li>
&lt;li>&lt;strong>&lt;code>/create-page&lt;/code>&lt;/strong>: React pages with factories and smoke tests.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Quality &amp;amp; workflow:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;code>/refactor-check&lt;/code>&lt;/strong>: Analyzes code against SOLID principles.&lt;/li>
&lt;li>&lt;strong>&lt;code>/test&lt;/code>&lt;/strong>: Runs the suite with module filtering.&lt;/li>
&lt;li>&lt;strong>&lt;code>/fix&lt;/code>&lt;/strong>: Auto-applies linting and static analysis corrections.&lt;/li>
&lt;li>&lt;strong>&lt;code>/gh-issue&lt;/code>&lt;/strong>: From GitHub issue to implementation to PR in one command.&lt;/li>
&lt;/ul>
&lt;/div>
&lt;/details>
&lt;p>The key insight: commands turn tribal knowledge into executable instructions. What used to be “ask Sarah how we set up a new module” becomes a command anyone can run, human or agent.&lt;/p>
&lt;h2 id="specialists-not-generalists">Specialists, not generalists&lt;/h2>
&lt;p>Commands are &lt;em>your&lt;/em> procedures. They encode how your team does things. But there’s another layer: skills and agents.&lt;/p>
&lt;h3 id="skills-as-knowledge-bases">Skills as knowledge bases&lt;/h3>
&lt;p>Skills are structured knowledge the agent can draw from. In one of my projects, I have skills for SOLID principles, hexagonal architecture, TDD workflows, and React/Inertia patterns.&lt;/p>
&lt;p>Rules constrain: “don’t do this, always do that.” Skills teach: “here’s the pattern, here’s why, here are the common mistakes.” Rules are guardrails. Skills are expertise.&lt;/p>
&lt;h3 id="agents-as-specialized-roles">Agents as specialized roles&lt;/h3>
&lt;p>Instead of one generalist, you define specialized agents with a clear role, specific tools, and even a different model based on the complexity of their job. You don’t need your most senior architect to rename a variable.&lt;/p>
&lt;details class="deep-dive">
&lt;summary class="deep-dive__header">
&lt;span class="deep-dive__icon">&lt;/span>
&lt;span class="deep-dive__title">Deep Dive: Agent roles from a real project&lt;/span>
&lt;/summary>
&lt;div class="deep-dive__content">
&lt;ul>
&lt;li>&lt;strong>Explorer&lt;/strong> (lightweight model): Read-only reconnaissance. Searches the codebase, finds files, understands structure. Access to read and search tools, nothing else.&lt;/li>
&lt;li>&lt;strong>Clean code reviewer&lt;/strong> (mid-tier model): Checks for SOLID violations, code smells, and naming inconsistencies. Read and grep access only.&lt;/li>
&lt;li>&lt;strong>TDD coach&lt;/strong> (mid-tier model): Guides the red-green-refactor cycle. Can edit files and run tests.&lt;/li>
&lt;li>&lt;strong>React reviewer&lt;/strong> (mid-tier model): Frontend patterns: component structure, TypeScript strictness, dark mode support, accessibility.&lt;/li>
&lt;li>&lt;strong>Domain architect&lt;/strong> (most capable model): Complex architectural decisions, module boundaries, and DDD patterns.&lt;/li>
&lt;/ul>
&lt;/div>
&lt;/details>
&lt;blockquote>
&lt;p>The right model for the right job. Fast and cheap for exploration. Capable and thorough for architecture.&lt;/p>
&lt;/blockquote>
&lt;h2 id="let-them-work-together">Let them work together&lt;/h2>
&lt;p>This is where the team metaphor becomes literal. A single agent following instructions is useful. Multiple agents working from a shared plan is a team.&lt;/p>
&lt;h3 id="subagents-vs-agent-teams">Subagents vs agent teams&lt;/h3>
&lt;p>Not all multi-agent setups are the same. There are two distinct coordination models, and choosing the right one matters.&lt;/p>
&lt;p>&lt;strong>Subagents&lt;/strong> run within a single session. They do focused work and report results back to the main agent. They can’t talk to each other. The main agent manages everything.&lt;/p>
&lt;p>&lt;strong>Agent teams&lt;/strong> are different. Each teammate is a fully independent Claude Code session with its own context window. They communicate through a shared mailbox, claim tasks from a shared task list, and coordinate without going through a central bottleneck.&lt;/p>
&lt;p>The architecture has four components:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Team lead&lt;/strong>: the main session that creates the team and orchestrates work&lt;/li>
&lt;li>&lt;strong>Teammates&lt;/strong>: separate Claude Code instances, each owning specific tasks&lt;/li>
&lt;li>&lt;strong>Task list&lt;/strong>: shared work items with dependency tracking. Blocked tasks automatically unblock when dependencies complete&lt;/li>
&lt;li>&lt;strong>Mailbox&lt;/strong>: direct messaging between agents, including broadcasts to the entire team&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>Subagents are workers that report back. Agent teams are collaborators that think together.&lt;/p>
&lt;/blockquote>
&lt;p>Use subagents when only the result matters. Use agent teams when teammates need to share findings, challenge each other, and coordinate on their own.&lt;/p>
&lt;h3 id="getting-started-with-agent-teams">Getting started with agent teams&lt;/h3>
&lt;p>Agent teams are still experimental. Enable them by adding this to &lt;code>~/.claude/settings.json&lt;/code>:&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="json">&lt;span class="giallo-l">&lt;span>{&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">env&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">1&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>}&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>Creating a team is conversational. Describe what you want: &lt;em>“Create an agent team to refactor the auth module. Spawn three teammates: one for backend API changes, one for frontend components, one for writing tests.”&lt;/em> Claude sets up the task list, spawns the teammates, and coordinates their work.&lt;/p>
&lt;p>You can view the team in-process (single terminal, navigate with Shift+Up/Down) or split across panes (each teammate in a separate tmux or iTerm2 window). Use Shift+Tab to activate delegate mode, which restricts the lead to coordination only.&lt;/p>
&lt;p>&lt;strong>Token consumption warning.&lt;/strong> Agent teams burn through tokens fast. Each teammate has its own context window, and every message between agents adds up. Start with research and review tasks before moving to implementation. Three teammates exploring in parallel costs roughly 3x. Make sure the parallelism pays for itself.&lt;/p>
&lt;p>Teammates load your project context automatically (&lt;code>CLAUDE.md&lt;/code>, MCP servers, skills) but don’t inherit the lead’s conversation history. When spawning a teammate, be specific about which files to focus on and what constraints apply. A vague spawn prompt produces vague work.&lt;/p>
&lt;p>&lt;img src="/images/blog/2026-02-07/middle.jpg" alt="blog-middle" />&lt;/p>
&lt;h3 id="plan-first-execute-after">Plan first, execute after&lt;/h3>
&lt;p>Good teams don’t just start coding. They discuss the approach, identify dependencies, agree on a plan. Claude Code’s plan mode works the same way.&lt;/p>
&lt;p>You describe the problem. The agent explores the codebase, maps dependencies, and proposes an approach before changing anything. You approve, modify, or reject. Think first, code second.&lt;/p>
&lt;p>With agent teams, &lt;strong>plan approval&lt;/strong> lets you require teammates to design their approach before implementing. The teammate works in read-only mode until the lead approves. You can shape the lead’s criteria: &lt;em>“only approve plans that include test coverage”&lt;/em> or &lt;em>“reject plans that modify the database schema.”&lt;/em>&lt;/p>
&lt;p>&lt;strong>Delegate mode&lt;/strong> restricts the lead to coordination only. Without it, the lead sometimes starts implementing instead of waiting for teammates. Delegate mode keeps it focused on orchestration, not execution.&lt;/p>
&lt;h3 id="competing-hypotheses">Competing hypotheses&lt;/h3>
&lt;p>This is the most compelling agent-team pattern for debugging. When the root cause is unclear, a single agent tends to find one plausible explanation and stop looking. Agent teams fight this by making teammates adversarial. Each one investigates its own theory while actively trying to disprove the others.&lt;/p>
&lt;p>Sequential investigation suffers from anchoring: once one theory is explored, subsequent investigation is biased toward it. With multiple independent investigators challenging each other, the theory that survives is much more likely to be the actual root cause.&lt;/p>
&lt;h3 id="size-tasks-for-parallel-work">Size tasks for parallel work&lt;/h3>
&lt;p>Not all work benefits from parallelism. The key question: can the teammates work independently?&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Too small&lt;/strong>: coordination overhead exceeds the benefit&lt;/li>
&lt;li>&lt;strong>Too large&lt;/strong>: teammates work too long without check-ins, increasing wasted effort&lt;/li>
&lt;li>&lt;strong>Just right&lt;/strong>: self-contained units that produce a clear deliverable. A function, a test file, a review&lt;/li>
&lt;/ul>
&lt;p>Having 5-6 tasks per teammate keeps everyone productive. Break the work so each teammate owns a different set of files. Without isolation, two teammates editing the same file leads to overwrites. Worktrees change this.&lt;/p>
&lt;details class="deep-dive">
&lt;summary class="deep-dive__header">
&lt;span class="deep-dive__icon">&lt;/span>
&lt;span class="deep-dive__title">Deep Dive: Backend + Frontend in parallel&lt;/span>
&lt;/summary>
&lt;div class="deep-dive__content">
&lt;p>Say you’re building a new feature that touches both backend and frontend. After planning:&lt;/p>
&lt;ul>
&lt;li>A &lt;strong>backend agent&lt;/strong> scaffolds the domain layer: entities, value objects, repository interfaces, use case handlers. All following hexagonal architecture, all test-first.&lt;/li>
&lt;li>A &lt;strong>frontend agent&lt;/strong> builds the React page, components, hooks, and factories. Each follows its own rules, draws from its own skills, and operates independently.&lt;/li>
&lt;/ul>
&lt;p>They don’t step on each other because the plan already defined the boundaries. Clear ownership. No merge conflicts. No waiting.&lt;/p>
&lt;/div>
&lt;/details>
&lt;h3 id="worktree-isolation">Worktree isolation&lt;/h3>
&lt;p>The biggest friction with parallel agents was file conflicts. Two agents editing the same file meant overwrites and lost work. Git worktrees eliminate this by giving each agent its own working copy of the repository.&lt;/p>
&lt;p>Start Claude Code with &lt;code>--worktree&lt;/code> to run in an isolated worktree. Multiple sessions, same repo, no clobbering. Add &lt;code>--tmux&lt;/code> to launch it in its own tmux session.&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="shellscript">&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);">claude&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> -&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">-worktree&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> -&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">-tmux&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>Subagents support worktrees too. Ask Claude to use worktrees for its agents, or set &lt;code>isolation: worktree&lt;/code> in your custom agent frontmatter to make it the default.&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="yaml">&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);">---&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#22863A, #85E89D);">i&lt;/span>&lt;span style="color: light-dark(#22863A, #85E89D);">solation&lt;/span>&lt;span>:&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> w&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">orktree&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);">---&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>The Desktop app has the same feature: enable worktree mode in the Code tab.&lt;/p>
&lt;p>For non-git source control (Mercurial, Perforce, SVN), define worktree hooks to get the same isolation benefits without switching to git.&lt;/p>
&lt;blockquote>
&lt;p>Worktrees turn “clear file ownership” from a planning constraint into an infrastructure guarantee. Agents can overlap on the same files without stepping on each other.&lt;/p>
&lt;/blockquote>
&lt;h3 id="review-after-execution">Review after execution&lt;/h3>
&lt;p>After implementation, review agents take over. Instead of one reviewer catching everything, you have specialists: SOLID violations, component patterns, test quality, module boundaries.&lt;/p>
&lt;blockquote>
&lt;p>A single agent is an assistant. Multiple agents working from a shared plan is a team.&lt;/p>
&lt;/blockquote>
&lt;h2 id="you-are-still-the-lead">You are still the lead&lt;/h2>
&lt;p>No matter how well configured, the agents work for you. You set the standards, write the rules, review the plans, and approve the output before it ships. You can message any teammate mid-work to redirect their approach or add constraints. If someone’s heading down the wrong path, you intervene directly.&lt;/p>
&lt;p>As I wrote in &lt;a href="/blog/ai-gives-you-speed-not-quality/">AI gives you speed, not quality&lt;/a>, the code the agent produces is your responsibility. Agents still make mistakes, context windows have limits, and coordination isn’t perfect. More parallelism without oversight is just more chaos, faster.&lt;/p>
&lt;h3 id="quality-gates">Quality gates&lt;/h3>
&lt;p>Hooks and git hooks act as the final safety net. In my setup, nothing gets committed unless the full suite is green and coverage is above 90%. The agent doesn’t get to skip this. Neither does anyone else.&lt;/p>
&lt;p>Agent teams add their own hooks: &lt;code>TeammateIdle&lt;/code> keeps idle teammates working, &lt;code>TaskCompleted&lt;/code> prevents premature task completion. Automated policies no team member can bypass.&lt;/p>
&lt;details class="deep-dive">
&lt;summary class="deep-dive__header">
&lt;span class="deep-dive__icon">&lt;/span>
&lt;span class="deep-dive__title">Deep Dive: Hooks, permissions, and guardrails&lt;/span>
&lt;/summary>
&lt;div class="deep-dive__content">
&lt;p>Git hooks run linters, static analysis, and tests before every commit. Claude Code adds its own hooks (&lt;code>.claude/hooks/&lt;/code>): shell commands that trigger on agent events like tool calls or file writes.&lt;/p>
&lt;p>&lt;code>.claude/settings.json&lt;/code> controls what agents can execute. Whitelist specific tools and commands, deny destructive operations. You control not just what agents know (rules, skills) but what they can do (permissions). Rules set the culture. Permissions set the boundaries.&lt;/p>
&lt;/div>
&lt;/details>
&lt;h3 id="the-foundation-matters">The foundation matters&lt;/h3>
&lt;p>The agents will help you get there faster, but “there” has to be well-defined. If you don’t know what hexagonal architecture looks like, agents won’t discover it for you.&lt;/p>
&lt;p>You don’t build all of this on day one. You start with a &lt;code>CLAUDE.md&lt;/code>. Then you notice you’re repeating instructions, so you write a command. An agent breaks a convention, so you add a rule. Reviews take too long, so you create a reviewer agent. The setup grows organically from real friction, not from upfront design. Each addition solves a problem you actually had. Same with agent teams: start with tasks that don’t require writing code. Review a PR from multiple angles, research a library, investigate a bug. Learn the coordination model before throwing parallel implementation at it.&lt;/p>
&lt;p>If you want a starting point, I put together &lt;a rel="external" href="https://github.com/Chemaclass/laravel-claude-toolkit">laravel-claude-toolkit&lt;/a>: a Laravel starter kit with rules, commands, skills, agents, hooks, and permissions already configured. Use it as a reference or fork it for your own setup.&lt;/p>
&lt;blockquote>
&lt;p>You’re not just using AI. You’re building a team. And like any team, the quality of its output reflects the quality of its leadership.&lt;/p>
&lt;/blockquote>
&lt;h2 id="resources">Resources&lt;/h2>
&lt;ul>
&lt;li>&lt;a rel="external" href="https://claude.com/product/claude-code">Claude Code&lt;/a> | claude.com&lt;/li>
&lt;li>&lt;a rel="external" href="https://code.claude.com/docs/en/agent-teams">Claude Code: Agent Teams&lt;/a> | claude.com&lt;/li>
&lt;li>&lt;a rel="external" href="https://rfrolov.me/en/blog/claude-code-tips">Claude Code Tips: Workflow Boosters&lt;/a> | rfrolov.me&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="/images/blog/2026-02-07/footer.jpg" alt="blog-footer" />&lt;/p></content></entry><entry xml:lang="en"><title>Notes from Underground</title><subtitle>I am a sick man... I am a spiteful man.</subtitle><category term="fiction" scheme="https://chemaclass.com/tags/fiction/" label="Fiction"/><category term="philosophy" scheme="https://chemaclass.com/tags/philosophy/" label="Philosophy"/><category term="psychology" scheme="https://chemaclass.com/tags/psychology/" label="Psychology"/><published>2026-02-04T00:00:00+00:00</published><updated>2026-02-04T00:00:00+00:00</updated><author><name>
Fyodor Dostoevsky</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/notes-from-underground/"/><id>https://chemaclass.com/readings/notes-from-underground/</id><summary type="html">A bitter, hyper-conscious man retreats from society to wrestle with free will, spite, and the stubborn irrationality of human nature.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>The Underground Man is not someone you’d want to have a beer with. He’s bitter, contradictory, and painfully self-aware. He knows his flaws and still refuses to change. That’s the whole point.&lt;/p>
&lt;p>The book is split into two parts. The first is a philosophical rant against reason, progress, and the idea that humans will always act in their own best interest. The second tells a story from the narrator’s past that shows just how far his self-sabotage goes.&lt;/p>
&lt;h2 id="on-free-will-and-spite">On Free Will and Spite&lt;/h2>
&lt;p>The narrator argues that people don’t just want what’s good for them. Sometimes they want chaos. Sometimes they want to suffer. Not because it makes sense, but because it proves they’re free.&lt;/p>
&lt;blockquote>
&lt;p>“What man wants is simply independent choice, whatever that independence may cost and wherever it may lead.”&lt;/p>
&lt;/blockquote>
&lt;p>He rejects the utopian idea that a perfect society could be built on rational self-interest. Humans aren’t machines. They’ll destroy their own happiness just to prove they can.&lt;/p>
&lt;h2 id="the-wall-and-inaction">The Wall and Inaction&lt;/h2>
&lt;p>The Underground Man is paralyzed by over-thinking. He sees every angle, every consequence, every possible interpretation. So he does nothing. He calls himself more conscious than the “men of action” who simply act without questioning everything.&lt;/p>
&lt;blockquote>
&lt;p>“I swear, gentlemen, that to be too conscious is an illness—a real thorough-going illness.”&lt;/p>
&lt;/blockquote>
&lt;p>There’s something uncomfortably relatable here. The trap of analysis paralysis. Knowing too much can become an excuse to do nothing at all.&lt;/p>
&lt;h2 id="the-liza-episode">The Liza Episode&lt;/h2>
&lt;p>The second part shows the narrator meeting a young prostitute named Liza. He delivers a passionate speech about her future, about dignity and redemption. For a moment, he seems almost noble. Then she shows up at his door, and he crumbles. His cruelty returns. He can’t accept genuine human connection because it threatens his carefully constructed self-image.&lt;/p>
&lt;p>This is Dostoevsky at his most uncomfortable. The gap between what we say and what we do. The way wounded pride can poison everything.&lt;/p>
&lt;h2 id="key-takeaways">Key Takeaways&lt;/h2>
&lt;ul>
&lt;li>Rationality doesn’t fully explain human behavior. People act against their own interests out of spite, boredom, or the need to feel free.&lt;/li>
&lt;li>Excessive self-awareness can become a prison. At some point, you have to act despite uncertainty.&lt;/li>
&lt;li>The desire for control and the fear of vulnerability can destroy meaningful relationships.&lt;/li>
&lt;li>Suffering isn’t always something to be eliminated. Sometimes people cling to it as proof of their existence.&lt;/li>
&lt;/ul>
&lt;p>This book is not easy or pleasant. But it gets under your skin. It anticipates exstentialism by decades and challenges the comfortable belief that progress and reason will save us.&lt;/p>
&lt;hr />
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/yo1MBH6j4bs"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/CoyN710gRv4"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>Broken Money</title><subtitle>Why Our Financial System is Failing Us and How We Can Make it Better</subtitle><category term="bitcoin" scheme="https://chemaclass.com/tags/bitcoin/" label="Bitcoin"/><category term="economics" scheme="https://chemaclass.com/tags/economics/" label="Economics"/><category term="philosophy" scheme="https://chemaclass.com/tags/philosophy/" label="Philosophy"/><published>2026-01-17T00:00:00+00:00</published><updated>2026-01-17T00:00:00+00:00</updated><author><name>
Lyn Alden</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/broken-money/"/><id>https://chemaclass.com/readings/broken-money/</id><summary type="html">A deep dive into monetary history through a technological lens. Lyn Alden traces how innovations shaped money across centuries, examining commodity-based systems, modern fiat currencies, and emerging alternatives like Bitcoin. Essential reading for understanding why our financial system is failing and what we can do about it.</summary><content type="html">&lt;p>A deep dive into monetary history through a technological lens. Lyn Alden traces how innovations shaped money across centuries, examining commodity-based systems, modern fiat currencies, and emerging alternatives like Bitcoin.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h2 id="what-makes-money-work">What Makes Money Work?&lt;/h2>
&lt;p>Alden starts with the fundamentals: what actually makes something money? She breaks it down into key properties—durability, divisibility, portability, scarcity—and shows how different forms of money throughout history have excelled or failed at these.&lt;/p>
&lt;p>The key insight? Money is a technology, and like all technologies, it evolves. What worked for ancient civilizations doesn’t necessarily work in a globally connected digital world.&lt;/p>
&lt;h2 id="the-fiat-experiment">The Fiat Experiment&lt;/h2>
&lt;p>One of the most eye-opening sections covers how we ended up with our current fiat system. Alden documents the shift from gold-backed currencies to pure government-issued money, explaining why this experiment—only about 50 years old—has led to persistent inflation and monetary instability.&lt;/p>
&lt;blockquote>
&lt;p>“Many currencies are rapidly diluted, which continually devalues the savings and wages of the billions of people who live and work within those jurisdictions.”&lt;/p>
&lt;/blockquote>
&lt;p>She backs this up with real-world examples from Nigeria, Egypt, Brazil, and other nations experiencing currency crises. For people in developed economies, these stories serve as a warning of what unchecked monetary expansion can lead to.&lt;/p>
&lt;h2 id="the-network-effects-of-money">The Network Effects of Money&lt;/h2>
&lt;p>Alden brings a unique perspective as an engineer turned financial analyst. She applies network theory to explain why certain forms of money win out over others. Money, like the internet, benefits from network effects—the more people use it, the more useful it becomes.&lt;/p>
&lt;p>This framework helps explain both why the dollar dominates global trade and why Bitcoin has grown so quickly despite starting from zero.&lt;/p>
&lt;h2 id="bitcoin-as-a-solution">Bitcoin as a Solution&lt;/h2>
&lt;p>The book builds logically toward Bitcoin as a potential fix for broken monetary systems. But unlike many Bitcoin books, Alden doesn’t just cheerlead. She evaluates Bitcoin against gold and other cryptocurrencies, acknowledging trade-offs and limitations.&lt;/p>
&lt;p>Her analysis is grounded in engineering principles: What are Bitcoin’s actual properties? How does it compare to historical forms of sound money? What problems does it solve, and what problems remain?&lt;/p>
&lt;h2 id="final-thoughts">Final Thoughts&lt;/h2>
&lt;p>“Broken Money” stands out because it doesn’t assume you already agree with the premise. Alden methodically builds the case that something is wrong with how money works today, traces the historical roots of these problems, and then evaluates potential solutions.&lt;/p>
&lt;p>Whether you end up convinced by her conclusions or not, you’ll come away with a much deeper understanding of monetary systems and why they matter.&lt;/p></content></entry><entry xml:lang="en"><title>MCP: Giving Your AI Agent the Right Context</title><subtitle>Why context is the real superpower</subtitle><category term="ai" scheme="https://chemaclass.com/tags/ai/" label="Ai"/><category term="software-architecture" scheme="https://chemaclass.com/tags/software-architecture/" label="Software Architecture"/><category term="developer-tools" scheme="https://chemaclass.com/tags/developer-tools/" label="Developer Tools"/><category term="craftsmanship" scheme="https://chemaclass.com/tags/craftsmanship/" label="Craftsmanship"/><published>2026-01-11T00:00:00+00:00</published><updated>2026-01-11T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/mcp-giving-your-ai-agent-the-right-context/"/><id>https://chemaclass.com/blog/mcp-giving-your-ai-agent-the-right-context/</id><summary type="html">MCP connects AI agents to your dev tools, databases, and APIs through a standard protocol. Give your agent the context it actually needs.</summary><content type="html">&lt;p>Modern AI coding assistants are remarkably good at understanding context. Models like Claude Opus with large context windows (~200k tokens) can hold substantial portions of your codebase in mind, reason about architecture, and maintain coherence across long conversations. Not the entire project for large codebases, but enough to work effectively.&lt;/p>
&lt;p>But understanding isn’t the same as access.&lt;/p>
&lt;p>The AI can reason about your database schema if you paste it. It can suggest changes to files you share. It knows patterns from code you show it. The limitation isn’t intelligence. It’s reach.&lt;/p>
&lt;p>That’s where MCP comes in.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h2 id="what-mcp-enables">What MCP enables&lt;/h2>
&lt;p>Modern AI can understand your codebase when you share it. But understanding and acting are different things.&lt;/p>
&lt;p>Many IDE-integrated assistants like VS Code Copilot or Cursor already access your project files through their own indexing. So file access itself isn’t new. What MCP brings is standardization. Instead of each tool building its own integration, MCP provides a common protocol. You configure a server once, and any MCP-compatible client can use it. It’s portable, configurable, and extends beyond just files to databases, APIs, and custom tools.&lt;/p>
&lt;blockquote>
&lt;p>MCP turns AI from a conversation partner into an active participant in your development environment.&lt;/p>
&lt;/blockquote>
&lt;p>With MCP, you give the AI direct access to tools and resources. It can read files, run commands, query databases, fetch documentation. The intelligence was always there. MCP gives it hands.&lt;/p>
&lt;h2 id="what-mcp-actually-is">What MCP actually is&lt;/h2>
&lt;p>MCP is a protocol, not a product. It’s an open standard that defines how AI agents can connect to external data sources and tools. Think of it as a bridge between the AI model and your development environment.&lt;/p>
&lt;p>The architecture is simple: MCP servers expose capabilities, and AI clients consume them. Claude Desktop and Claude Code officially support MCP, with more tools adopting the protocol as it matures.&lt;/p>
&lt;p>For example, in Claude Code you can add servers to a &lt;code>.mcp.json&lt;/code> file at your project root. Claude Code reads this file when you open the project and starts the configured servers automatically:&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="json">&lt;span class="giallo-l">&lt;span>{&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">mcpServers&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">filesystem&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">command&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">npx&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">args&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span> [&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">-y&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">@modelcontextprotocol/server-filesystem&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">./&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>]&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">github&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">command&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">npx&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">args&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span> [&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">-y&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">@modelcontextprotocol/server-github&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>]&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">env&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span> {&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">GITHUB_TOKEN&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">your-token&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span> }&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">postgres&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">command&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">npx&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">args&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span> [&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">-y&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">@modelcontextprotocol/server-postgres&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>]&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">env&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span> {&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">DATABASE_URL&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">&amp;quot;&lt;/span>&lt;span>:&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">postgresql://localhost/mydb&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span> }&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>}&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>Each server gives the AI different capabilities:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>filesystem&lt;/strong>: Read and navigate your project files. The AI can explore your codebase, check existing patterns, and understand your directory structure before suggesting changes.&lt;/li>
&lt;li>&lt;strong>github&lt;/strong>: Access issues, pull requests, and repository metadata. Ask the AI to summarize open issues, check PR comments, or understand what your team is working on.&lt;/li>
&lt;li>&lt;strong>postgres&lt;/strong>: Query your database directly. The AI can inspect your schema, run read queries, and understand your data model without you copying table definitions.&lt;/li>
&lt;/ul>
&lt;p>Different tools, same protocol. You configure once, and any MCP-compatible client can use these servers.&lt;/p>
&lt;h2 id="where-mcp-shines">Where MCP shines&lt;/h2>
&lt;h3 id="working-with-your-codebase">Working with your codebase&lt;/h3>
&lt;p>The most immediate benefit is filesystem access. The AI can navigate your project, read source files, understand your directory structure. When it suggests code, it can check existing patterns first.&lt;/p>
&lt;p>Git integration takes this further. The AI can see your commit history, understand what changed recently, and suggest modifications that align with how your codebase evolves.&lt;/p>
&lt;p>Database schema access means the AI understands your data model. No more explaining table relationships or column types. It sees the structure and generates queries that actually work.&lt;/p>
&lt;h3 id="documentation-and-knowledge">Documentation and knowledge&lt;/h3>
&lt;p>Connect your internal documentation and the AI becomes aware of your team’s decisions. API specifications, architecture documents, coding guidelines. All available as context.&lt;/p>
&lt;p>This is where MCP starts feeling different. The AI isn’t just generating generic code anymore. It’s generating code that fits your project.&lt;/p>
&lt;blockquote>
&lt;p>The best AI assistance comes from understanding not just what you’re building, but how your team builds it.&lt;/p>
&lt;/blockquote>
&lt;h3 id="external-integrations">External integrations&lt;/h3>
&lt;p>GitHub integration means the AI can read issues, understand PR discussions, and see the broader context of what your team is working on. Slack or other communication tools can provide even more context about ongoing decisions.&lt;/p>
&lt;p>Custom integrations let you connect internal tools specific to your workflow. The protocol is extensible by design.&lt;/p>
&lt;h2 id="using-mcp-effectively">Using MCP effectively&lt;/h2>
&lt;p>MCP amplifies whatever it connects to. If your documentation is outdated, the AI will use outdated information. If your codebase is messy, the AI will learn messy patterns.&lt;/p>
&lt;p>This is the mirror effect I mentioned in &lt;a href="/blog/ai-gives-you-speed-not-quality">AI gives you speed, not quality&lt;/a>. The AI reflects the context you give it. Good context produces useful output. Bad context produces confident-sounding garbage.&lt;/p>
&lt;blockquote>
&lt;p>Giving AI access to your codebase doesn’t replace your responsibility to maintain it. It makes good hygiene more valuable.&lt;/p>
&lt;/blockquote>
&lt;p>A few practices that help:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Connect only what the AI needs.&lt;/strong> More context isn’t always better. Focused context is better.&lt;/li>
&lt;li>&lt;strong>Keep your documentation current.&lt;/strong> If the AI reads your docs, those docs matter more than before.&lt;/li>
&lt;li>&lt;strong>Review your MCP configuration periodically.&lt;/strong> As your project evolves, so should your context setup.&lt;/li>
&lt;li>&lt;strong>Start small.&lt;/strong> One or two servers. See what works. Expand from there.&lt;/li>
&lt;/ul>
&lt;p>Security matters too. Be intentional about what you expose. MCP servers can access sensitive information. Treat them like any other access control decision.&lt;/p>
&lt;h2 id="what-comes-next">What comes next&lt;/h2>
&lt;p>MCP is the foundation. But the ecosystem is building on top of it.&lt;/p>
&lt;p>&lt;strong>Agentic workflows.&lt;/strong> Tools like Claude Code and Cursor now run in “agent mode” where the AI autonomously plans and executes multi-step tasks. It reads files, makes changes, runs tests, fixes errors. MCP servers are the hands. The agent loop is the brain deciding what to do next.&lt;/p>
&lt;p>&lt;strong>Skills and custom commands.&lt;/strong> Claude Code introduced skills. Custom slash commands that chain MCP tools into reusable workflows. &lt;code>/deploy&lt;/code>, &lt;code>/test&lt;/code>, &lt;code>/review&lt;/code>. You define them once, and they become part of your development toolkit.&lt;/p>
&lt;p>&lt;strong>A2A Protocol.&lt;/strong> Google’s Agent-to-Agent protocol. While MCP connects AI to tools, A2A connects AI agents to each other. Multiple specialized agents collaborating on complex tasks. One agent writes code, another reviews it, a third runs tests.&lt;/p>
&lt;p>The pattern is clear: AI is moving from assistant to collaborator. From answering questions to executing workflows. MCP gave AI access to your environment. What’s next is AI that knows how to use that access autonomously.&lt;/p>
&lt;blockquote>
&lt;p>The question is shifting from “what can AI access?” to “what should AI decide on its own?”&lt;/p>
&lt;/blockquote>
&lt;p>Human judgment doesn’t disappear. It moves upstream. Instead of reviewing every line the AI writes, we design the context and boundaries that shape what it produces.&lt;/p>
&lt;p>That’s still our job. And it’s a job worth doing well.&lt;/p>
&lt;p>&lt;img src="/images/blog/2026-01-11/footer.jpg" alt="cover" />&lt;/p></content></entry><entry xml:lang="en"><title>How Bitcoin Works</title><subtitle>Blockchain, cryptography, and consensus</subtitle><category term="bitcoin" scheme="https://chemaclass.com/tags/bitcoin/" label="Bitcoin"/><category term="cryptography" scheme="https://chemaclass.com/tags/cryptography/" label="Cryptography"/><category term="tutorial" scheme="https://chemaclass.com/tags/tutorial/" label="Tutorial"/><published>2025-12-22T00:00:00+00:00</published><updated>2025-12-22T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/how-bitcoin-works/"/><id>https://chemaclass.com/blog/how-bitcoin-works/</id><summary type="html">Transactions, blocks, mining, the UTXO model, and Lightning Network -- how Bitcoin actually works under the hood, explained in plain terms.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2025-12-21/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>This post explains how Bitcoin works under the hood. If you’re looking for why Bitcoin matters, start with &lt;a href="/blog/bitcoin-fundamentals/">Bitcoin Fundamentals&lt;/a>.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>&lt;em>For the technically curious.&lt;/em>&lt;/p>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/bBC-nXj3Ng4"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;h2 id="the-blockchain">The Blockchain&lt;/h2>
&lt;h3 id="the-double-spend-problem">The Double-Spend Problem&lt;/h3>
&lt;p>Digital money has a fundamental problem: how do you prevent someone from copying their coins and spending them twice? Traditional systems solve this with a central authority (banks, PayPal) that tracks who owns what. Bitcoin’s breakthrough was solving this without any central party.&lt;/p>
&lt;p>The solution: a shared ledger that everyone can verify but no one controls.&lt;/p>
&lt;h3 id="how-it-works">How It Works&lt;/h3>
&lt;p>Bitcoin uses a blockchain: a chain of blocks where each block contains transactions and links to the previous block through cryptographic hashes.&lt;/p>
&lt;p>A &lt;strong>hash function&lt;/strong> takes any input and produces a fixed-size fingerprint. Change one bit of input, and the output changes completely. This makes tampering obvious. Bitcoin uses SHA-256, which produces a 256-bit output.&lt;/p>
&lt;p>Each block contains:&lt;/p>
&lt;ul>
&lt;li>A list of transactions&lt;/li>
&lt;li>A hash of the previous block header&lt;/li>
&lt;li>A proof-of-work solution (more below)&lt;/li>
&lt;/ul>
&lt;p>Before transactions get into a block, they wait in the mempool. Miners pick transactions from this pool, prioritizing those with higher fees. Watch this in real-time at &lt;a rel="external" href="https://mempool.space/">mempool.space&lt;/a>.&lt;/p>
&lt;p>Every node keeps a complete copy of the blockchain. No single server to hack, no central database to corrupt. To change history, you’d need to rewrite blocks on the majority of nodes worldwide.&lt;/p>
&lt;details class="deep-dive">
&lt;summary class="deep-dive__header">
&lt;span class="deep-dive__icon">&lt;/span>
&lt;span class="deep-dive__title">Deep Dive: Block Structure&lt;/span>
&lt;/summary>
&lt;div class="deep-dive__content">
&lt;p>A block has two parts: the &lt;strong>header&lt;/strong> (80 bytes) and the &lt;strong>body&lt;/strong> (transactions).&lt;/p>
&lt;p>The header contains:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Version&lt;/strong>: Protocol version&lt;/li>
&lt;li>&lt;strong>Previous block hash&lt;/strong>: Links to the chain&lt;/li>
&lt;li>&lt;strong>Merkle root&lt;/strong>: Hash of all transactions in the block&lt;/li>
&lt;li>&lt;strong>Timestamp&lt;/strong>: When the block was created&lt;/li>
&lt;li>&lt;strong>Difficulty target&lt;/strong>: How hard the puzzle was&lt;/li>
&lt;li>&lt;strong>Nonce&lt;/strong>: The solution miners found&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Merkle trees&lt;/strong> organize transactions efficiently. Each transaction is hashed, then pairs of hashes are combined and hashed again, building up to a single root hash. This allows proving a transaction exists in a block without downloading all transactions. Useful for lightweight wallets.&lt;/p>
&lt;p>Block weight is measured in virtual bytes (vB). The limit is 4 million weight units, roughly 1-1.5 MB of data per block.&lt;/p>
&lt;/div>
&lt;/details>
&lt;h2 id="transactions-cryptography">Transactions &amp;amp; Cryptography&lt;/h2>
&lt;h3 id="the-utxo-model">The UTXO Model&lt;/h3>
&lt;p>Bitcoin doesn’t use accounts with balances. Instead, it tracks &lt;strong>Unspent Transaction Outputs (UTXOs)&lt;/strong>. Think of them as digital coins of varying sizes.&lt;/p>
&lt;p>When you receive bitcoin, you get a UTXO. When you spend, you consume entire UTXOs as inputs and create new ones as outputs. If you have a 1 BTC UTXO and want to send 0.3 BTC, you spend the whole UTXO and create two outputs: 0.3 BTC to the recipient and ~0.7 BTC back to yourself (minus fees).&lt;/p>
&lt;p>Your “balance” is the sum of all UTXOs you can spend.&lt;/p>
&lt;h3 id="public-key-cryptography">Public-Key Cryptography&lt;/h3>
&lt;p>Bitcoin transactions use public-key cryptography:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Private key&lt;/strong>: A secret 256-bit number. This proves ownership.&lt;/li>
&lt;li>&lt;strong>Public key&lt;/strong>: Derived mathematically from the private key. Shared publicly.&lt;/li>
&lt;/ul>
&lt;p>When you send bitcoin, you sign the transaction with your private key. This signature proves you own the UTXOs being spent without revealing the private key. Anyone can verify the signature using your public key.&lt;/p>
&lt;h3 id="programmable-money">Programmable Money&lt;/h3>
&lt;p>Bitcoin isn’t just digital cash. It has its own programming language called &lt;strong>Script&lt;/strong>. Every transaction includes a small program that defines the conditions for spending.&lt;/p>
&lt;p>Most transactions use simple scripts: “whoever can prove they own this public key can spend these coins.” But Script enables much more: multi-signature wallets requiring multiple keys, time-locked transactions that can’t be spent until a certain date, and complex conditions combining multiple requirements.&lt;/p>
&lt;p>This makes Bitcoin programmable money. For a deeper dive into Script and address types, see &lt;a href="/blog/programmable-money/">Programmable Money&lt;/a>.&lt;/p>
&lt;details class="deep-dive">
&lt;summary class="deep-dive__header">
&lt;span class="deep-dive__icon">&lt;/span>
&lt;span class="deep-dive__title">Deep Dive: Elliptic Curve Cryptography&lt;/span>
&lt;/summary>
&lt;div class="deep-dive__content">
&lt;p>Bitcoin uses &lt;strong>ECDSA&lt;/strong> (Elliptic Curve Digital Signature Algorithm) with the &lt;strong>secp256k1&lt;/strong> curve. This curve was chosen for efficiency and because it wasn’t designed by any government agency (unlike NIST curves), reducing backdoor concerns.&lt;/p>
&lt;p>A private key is a random 256-bit integer. The public key is derived by multiplying this number by a generator point on the curve. Easy to compute forward, practically impossible to reverse.&lt;/p>
&lt;p>&lt;strong>Transaction signing&lt;/strong> involves:&lt;/p>
&lt;ol>
&lt;li>Hashing the transaction data&lt;/li>
&lt;li>Creating a signature using the private key&lt;/li>
&lt;li>Including the signature and public key in the transaction&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>SIGHASH flags&lt;/strong> control what parts of a transaction the signature covers:&lt;/p>
&lt;ul>
&lt;li>&lt;code>SIGHASH_ALL&lt;/code>: Signs all inputs and outputs (most common)&lt;/li>
&lt;li>&lt;code>SIGHASH_NONE&lt;/code>: Signs inputs only&lt;/li>
&lt;li>&lt;code>SIGHASH_SINGLE&lt;/code>: Signs one specific output&lt;/li>
&lt;li>These can be combined with &lt;code>ANYONECANPAY&lt;/code> for advanced use cases&lt;/li>
&lt;/ul>
&lt;/div>
&lt;/details>
&lt;h2 id="mining-consensus">Mining &amp;amp; Consensus&lt;/h2>
&lt;p>How does a decentralized network agree on which transactions are valid? Through proof-of-work mining.&lt;/p>
&lt;h3 id="the-puzzle">The Puzzle&lt;/h3>
&lt;p>Miners race to find a number (the &lt;strong>nonce&lt;/strong>) that, when combined with the block header and hashed, produces a result below a target value. It’s like rolling dice until you get a number under 100, except with 2^256 possible outcomes.&lt;/p>
&lt;p>The work is:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Hard to find&lt;/strong>: Requires trillions of guesses&lt;/li>
&lt;li>&lt;strong>Easy to verify&lt;/strong>: One hash check proves the solution&lt;/li>
&lt;/ul>
&lt;p>This asymmetry is key. Anyone can verify a block instantly, but creating one requires real computational work.&lt;/p>
&lt;h3 id="why-it-matters">Why It Matters&lt;/h3>
&lt;p>Mining serves three purposes:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Secures the network&lt;/strong>: Rewriting history means redoing all hash work&lt;/li>
&lt;li>&lt;strong>Issues new coins&lt;/strong>: Following a predictable schedule (halving every 210,000 blocks)&lt;/li>
&lt;li>&lt;strong>Processes transactions&lt;/strong>: Including them in the permanent record&lt;/li>
&lt;/ol>
&lt;p>Every 2016 blocks (~2 weeks), the network adjusts difficulty to maintain ~10 minute block times. More hashpower joins? Puzzles get harder. Hashpower leaves? Puzzles get easier.&lt;/p>
&lt;p>Explore mining pools and hashrate at &lt;a rel="external" href="https://mempool.space/mining">mempool.space/mining&lt;/a>.&lt;/p>
&lt;details class="deep-dive">
&lt;summary class="deep-dive__header">
&lt;span class="deep-dive__icon">&lt;/span>
&lt;span class="deep-dive__title">Deep Dive: Difficulty and Game Theory&lt;/span>
&lt;/summary>
&lt;div class="deep-dive__content">
&lt;p>&lt;strong>Difficulty calculation&lt;/strong>: The target is a 256-bit number. A valid block hash must be below this target. Lower target = harder puzzle. The network adjusts every 2016 blocks based on how long those blocks actually took vs. the expected 20,160 minutes.&lt;/p>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/S9JGmA5_unY"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;p>&lt;strong>Hashrate and security&lt;/strong>: Bitcoin’s security comes from the cost to rewrite history. With ~500 EH/s (exahashes per second) of hashrate, attacking the network would require controlling majority hashpower. That means billions in hardware and electricity, plus the attack would crash the asset’s value.&lt;/p>
&lt;p>&lt;strong>Economic incentives&lt;/strong>: Miners spend real resources (electricity, hardware). They only profit if they play by the rules. A miner who creates invalid blocks wastes their work because nodes reject invalid blocks. This aligns individual profit motive with network security.&lt;/p>
&lt;p>&lt;strong>51% attacks&lt;/strong>: If an attacker controlled majority hashrate, they could theoretically double-spend by mining an alternative chain. But the economics make this irrational for large values: the attack destroys the value of what you’re stealing.&lt;/p>
&lt;/div>
&lt;/details>
&lt;h2 id="addresses-wallets">Addresses &amp;amp; Wallets&lt;/h2>
&lt;p>Bitcoin addresses are derived from public keys. Different formats have evolved:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>P2PKH&lt;/strong>: Legacy addresses starting with “1”&lt;/li>
&lt;li>&lt;strong>P2SH&lt;/strong>: Script addresses starting with “3”&lt;/li>
&lt;li>&lt;strong>P2WPKH&lt;/strong>: Native SegWit addresses starting with “bc1q”&lt;/li>
&lt;li>&lt;strong>P2TR&lt;/strong>: Taproot addresses starting with “bc1p”&lt;/li>
&lt;/ul>
&lt;p>For technical details on each type, see &lt;a href="/blog/programmable-money/#common-bitcoin-address-types">Programmable Money&lt;/a>.&lt;/p>
&lt;h3 id="wallets">Wallets&lt;/h3>
&lt;p>A wallet manages your keys and constructs transactions. It doesn’t hold your coins. Coins exist on the blockchain. The wallet holds keys that prove you can spend them.&lt;/p>
&lt;p>&lt;strong>Hot wallets&lt;/strong> connect to the internet. Convenient for daily use, more vulnerable. Examples: phone apps, browser extensions.&lt;/p>
&lt;p>&lt;strong>Cold wallets&lt;/strong> stay offline. More secure for savings. Examples: hardware wallets (Ledger, Trezor), paper wallets.&lt;/p>
&lt;h3 id="hd-wallets-and-seed-phrases">HD Wallets and Seed Phrases&lt;/h3>
&lt;p>Modern wallets are &lt;strong>Hierarchical Deterministic (HD)&lt;/strong>. One master seed generates unlimited keys in a tree structure. Back up the seed once, recover everything.&lt;/p>
&lt;p>&lt;strong>BIP-39&lt;/strong> defines the 12 or 24-word seed phrase most wallets use. These words encode entropy that derives all your keys. Lose the phrase, lose access. Anyone with the phrase controls the funds.&lt;/p>
&lt;blockquote>
&lt;p>Never store seed phrases digitally. Write them down. Store securely offline.&lt;/p>
&lt;/blockquote>
&lt;p>How big is the BIP-39 keyspace, really? I built &lt;a rel="external" href="https://github.com/Chemaclass/seed-hunter">seed-hunter&lt;/a>, an open-source educational Go CLI that tries to brute-force a 12-word seed against the real Bitcoin network. It logs every attempt and shows live progress with ETAs spanning 10²⁹ to 10³⁹ years. A burglar checking one trillion seed phrases per second since the Big Bang would have completed 0.000_000_008% of the search by now. The point isn’t to break Bitcoin, it’s to make the math viscerally obvious: thermodynamics, not just computation, forbids the attack.&lt;/p>
&lt;h2 id="the-network">The Network&lt;/h2>
&lt;p>Bitcoin is a peer-to-peer network. No central servers. Nodes connect to each other, share transactions and blocks, and enforce rules independently.&lt;/p>
&lt;h3 id="node-types">Node Types&lt;/h3>
&lt;p>&lt;strong>Full nodes&lt;/strong> download and validate every block and transaction. They enforce all consensus rules and don’t trust anyone. Running a full node means you verify everything yourself.&lt;/p>
&lt;p>&lt;strong>SPV (light) clients&lt;/strong> only download block headers. They trust that miners validated the transactions. Less security, but works on phones and low-power devices.&lt;/p>
&lt;p>&lt;strong>Mining nodes&lt;/strong> are full nodes that also compete to create new blocks.&lt;/p>
&lt;h3 id="how-transactions-propagate">How Transactions Propagate&lt;/h3>
&lt;p>When you broadcast a transaction:&lt;/p>
&lt;ol>
&lt;li>Your wallet sends it to connected nodes&lt;/li>
&lt;li>Each node validates and forwards to its peers&lt;/li>
&lt;li>Within seconds, the transaction reaches most of the network&lt;/li>
&lt;li>Miners include it in their candidate blocks&lt;/li>
&lt;/ol>
&lt;p>Blocks propagate similarly. When a miner finds a valid block, it spreads across the network in seconds.&lt;/p>
&lt;details class="deep-dive">
&lt;summary class="deep-dive__header">
&lt;span class="deep-dive__icon">&lt;/span>
&lt;span class="deep-dive__title">Deep Dive: Network Architecture&lt;/span>
&lt;/summary>
&lt;div class="deep-dive__content">
&lt;p>&lt;strong>Peer discovery&lt;/strong>: Nodes find each other through DNS seeds (hardcoded addresses that return active node IPs) and by sharing peer addresses with connected nodes.&lt;/p>
&lt;p>&lt;strong>Gossip protocol&lt;/strong>: Information spreads through “inv” (inventory) messages. A node announces it has something new, peers request it if interested. This prevents bandwidth waste from duplicate data.&lt;/p>
&lt;p>&lt;strong>Compact blocks&lt;/strong> (BIP-152) speed up block propagation. Since nodes already have most transactions in their mempool, blocks can be transmitted as just the header plus short transaction IDs.&lt;/p>
&lt;/div>
&lt;/details>
&lt;h2 id="security-confirmations">Security &amp;amp; Confirmations&lt;/h2>
&lt;h3 id="why-confirmations-matter">Why Confirmations Matter&lt;/h3>
&lt;p>When a transaction is included in a block, it has 1 confirmation. Each subsequent block adds another confirmation.&lt;/p>
&lt;p>More confirmations = harder to reverse. To undo a confirmed transaction, an attacker would need to mine an alternative chain faster than the honest network. Each block makes this exponentially harder.&lt;/p>
&lt;p>&lt;strong>General guidelines:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>0 confirmations: Transaction broadcast but not yet in a block. Can be double-spent.&lt;/li>
&lt;li>1 confirmation: In a block. Reversal requires significant hashpower.&lt;/li>
&lt;li>6 confirmations: Standard for large amounts. Reversal practically impossible.&lt;/li>
&lt;/ul>
&lt;details class="deep-dive">
&lt;summary class="deep-dive__header">
&lt;span class="deep-dive__icon">&lt;/span>
&lt;span class="deep-dive__title">Deep Dive: Confirmation Security&lt;/span>
&lt;/summary>
&lt;div class="deep-dive__content">
&lt;p>Satoshi’s whitepaper includes the probability calculation. With an attacker controlling fraction &lt;code>q&lt;/code> of hashpower:&lt;/p>
&lt;ul>
&lt;li>If &lt;code>q &amp;lt; 0.5&lt;/code>: Probability of catching up decreases exponentially with each confirmation&lt;/li>
&lt;li>At 6 confirmations with &lt;code>q = 0.1&lt;/code> (10% hashpower): Success probability &amp;lt; 0.1%&lt;/li>
&lt;/ul>
&lt;p>The “6 confirmations” rule assumes a well-funded attacker with substantial but minority hashpower. For smaller transactions, fewer confirmations are often acceptable.&lt;/p>
&lt;p>&lt;strong>Finality in Bitcoin&lt;/strong> is probabilistic, not absolute. But after enough confirmations, the probability of reversal approaches zero for any realistic attacker.&lt;/p>
&lt;/div>
&lt;/details>
&lt;h2 id="incentive-alignment">Incentive Alignment&lt;/h2>
&lt;p>Bitcoin isn’t just a clever technology. It’s a system where every participant’s self-interest reinforces the network.&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>Miners&lt;/strong> invest in hardware and electricity. They only profit by producing valid blocks. Cheating wastes their investment because nodes reject invalid blocks instantly.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Nodes&lt;/strong> enforce the rules to protect their own holdings. A node operator who accepts invalid transactions devalues their own bitcoin. Self-interest makes them honest validators.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Users&lt;/strong> pay fees to get transactions processed. Higher fees mean faster confirmation. This creates demand for block space and funds network security.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Developers&lt;/strong> contribute to software they themselves use. Bugs hurt their own holdings. Improvements benefit everyone, including them.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Holders&lt;/strong> benefit from network security and adoption. The more secure and useful Bitcoin becomes, the more valuable their holdings. They’re incentivized to support the ecosystem.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>No central coordinator. No trust required. Everyone acts in their own interest, and the system benefits everyone.&lt;/p>
&lt;blockquote>
&lt;p>“Don’t trust, verify.” Anyone can run a node and verify every transaction, every block, every rule. You don’t need to trust banks, governments, or even other Bitcoin users. The math proves itself.&lt;/p>
&lt;/blockquote>
&lt;h2 id="scaling-the-lightning-network">Scaling: The Lightning Network&lt;/h2>
&lt;p>Bitcoin’s base layer processes about 7 transactions per second. That’s by design: keeping things decentralized requires blocks small enough for anyone to verify. But this limits how many transactions it can handle.&lt;/p>
&lt;p>The Lightning Network solves this with a second layer built on top of Bitcoin. It enables:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Instant payments&lt;/strong>: No waiting for block confirmations&lt;/li>
&lt;li>&lt;strong>Near-zero fees&lt;/strong>: Fractions of a cent&lt;/li>
&lt;li>&lt;strong>High capacity&lt;/strong>: Millions of transactions per second&lt;/li>
&lt;/ul>
&lt;p>Lightning works by opening “payment channels” between parties. Transactions within a channel happen off-chain, instantly. Only the opening and closing of channels require on-chain transactions. You can visualize the network topology and statistics at &lt;a rel="external" href="https://mempool.space/lightning">mempool.space/lightning&lt;/a>.&lt;/p>
&lt;blockquote>
&lt;p>Bitcoin’s base layer provides security and final settlement. Lightning provides speed and scale. Different tools for different jobs.&lt;/p>
&lt;/blockquote>
&lt;p>If you want to run your own Lightning node and take full control of your payments, I wrote a guide on how to &lt;a href="/blog/run-your-ln-node/">Run your LN node on a Raspberry Pi&lt;/a>.&lt;/p>
&lt;details class="deep-dive">
&lt;summary class="deep-dive__header">
&lt;span class="deep-dive__icon">&lt;/span>
&lt;span class="deep-dive__title">Deep Dive: How Lightning Works&lt;/span>
&lt;/summary>
&lt;div class="deep-dive__content">
&lt;p>Payment channels use &lt;strong>2-of-2 multisig&lt;/strong> addresses. Both parties must sign to move funds. This creates a shared account that neither can steal from.&lt;/p>
&lt;p>&lt;strong>HTLCs (Hash Time-Locked Contracts)&lt;/strong> enable multi-hop payments. The mechanism:&lt;/p>
&lt;ol>
&lt;li>Alice wants to pay Carol through Bob&lt;/li>
&lt;li>Carol generates a secret and gives Alice the hash&lt;/li>
&lt;li>Alice creates an HTLC: “Bob gets paid if he reveals the secret within 24 hours”&lt;/li>
&lt;li>Bob creates a similar HTLC with Carol&lt;/li>
&lt;li>Carol reveals the secret to Bob, claiming payment&lt;/li>
&lt;li>Bob uses the same secret to claim from Alice&lt;/li>
&lt;/ol>
&lt;p>If anyone fails to cooperate, the timelock expires and funds return. The secret travels backward, payments travel forward.&lt;/p>
&lt;p>&lt;strong>Watchtowers&lt;/strong> monitor the blockchain for cheating attempts. If your counterparty tries to broadcast an old channel state, the watchtower can penalize them, even while you’re offline.&lt;/p>
&lt;/div>
&lt;/details>
&lt;h2 id="the-bigger-picture">The Bigger Picture&lt;/h2>
&lt;p>What makes Bitcoin remarkable isn’t any single component. It’s how they fit together into a self-reinforcing system.&lt;/p>
&lt;p>Cryptography proves ownership without trusted authorities. Proof-of-work makes history expensive to rewrite. Economic incentives turn individual greed into collective security. Decentralization removes single points of failure. And the fixed supply creates digital scarcity for the first time in history.&lt;/p>
&lt;p>Every piece supports every other piece. Remove one, and the system weakens. Together, they create something that has never existed before: money that can’t be inflated, transactions that can’t be censored, and property that can’t be confiscated.&lt;/p>
&lt;blockquote>
&lt;p>No banks. No governments. No trusted third parties. Just math, code, and a global network of nodes all enforcing the same rules.&lt;/p>
&lt;/blockquote>
&lt;p>Whether that matters to you depends on where you live and how much you trust your institutions. But the option exists now. And no one can take it away.&lt;/p>
&lt;details class="deep-dive">
&lt;summary class="deep-dive__header">
&lt;span class="deep-dive__icon">&lt;/span>
&lt;span class="deep-dive__title">Deep Dive: Rabbit Holes&lt;/span>
&lt;/summary>
&lt;div class="deep-dive__content">
&lt;p>Bitcoin’s technical depth goes far beyond what fits in one post. Here are topics worth exploring if you want to go deeper:&lt;/p>
&lt;p>&lt;strong>&lt;a rel="external" href="https://bitcoinops.org/en/topics/segregated-witness/">SegWit&lt;/a>&lt;/strong> (Segregated Witness) was Bitcoin’s 2017 upgrade that moved signature data outside the main transaction structure. This fixed transaction malleability (a bug that prevented Lightning), introduced block weight for more efficient space usage, and did it all while staying backwards-compatible with old nodes.&lt;/p>
&lt;p>&lt;strong>&lt;a rel="external" href="https://bitcoinops.org/en/topics/taproot/">Taproot &amp;amp; Schnorr&lt;/a>&lt;/strong> landed in 2021, upgrading Bitcoin’s cryptography. Schnorr signatures are smaller and enable aggregation (multiple signatures become one). Taproot makes complex spending conditions look identical to simple payments on-chain, improving both privacy and efficiency.&lt;/p>
&lt;p>&lt;strong>&lt;a rel="external" href="https://bitcoin.stackexchange.com/questions/30817/what-is-a-soft-fork">Soft forks vs hard forks&lt;/a>&lt;/strong>: How does Bitcoin upgrade without a central authority? Soft forks add new rules that old nodes still accept. Hard forks change rules in ways old nodes reject. Understanding this distinction explains why Bitcoin evolves slowly and why contentious changes are rare.&lt;/p>
&lt;p>&lt;strong>&lt;a rel="external" href="https://mempool.space/docs/faq#what-is-rbf">Fee mechanics&lt;/a>&lt;/strong>: The fee market is more nuanced than “pay more, confirm faster.” Replace-By-Fee (RBF) lets you bump a stuck transaction’s fee. Child-Pays-For-Parent (CPFP) lets recipients accelerate incoming payments by spending them with high fees.&lt;/p>
&lt;p>&lt;strong>&lt;a rel="external" href="https://bitcoinops.org/en/topics/timelocks/">Timelocks&lt;/a>&lt;/strong>: Bitcoin can lock funds until conditions are met. &lt;code>CLTV&lt;/code> (CheckLockTimeVerify) locks until a specific block height or timestamp. &lt;code>CSV&lt;/code> (CheckSequenceVerify) locks for a relative time after confirmation. These primitives enable Lightning channels, inheritance schemes, and atomic swaps.&lt;/p>
&lt;p>&lt;strong>&lt;a rel="external" href="https://learnmeabitcoin.com/technical/mining/coinbase-transaction/">Coinbase transactions&lt;/a>&lt;/strong>: The only way new bitcoin enters circulation. Every block begins with a special transaction that pays the miner the block reward plus all fees. These newly minted coins can’t be spent for 100 blocks, a rule that protects against chain reorganizations.&lt;/p>
&lt;p>The deeper you go, the more you find.&lt;/p>
&lt;/div>
&lt;/details></content></entry><entry xml:lang="en"><title>Chapter 30: December, 2025</title><published>2025-12-09T00:00:00+00:00</published><updated>2025-12-09T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/books/oeur/2025-diciembre/"/><id>https://chemaclass.com/books/oeur/2025-diciembre/</id><content type="html">&lt;h1 id="nine-branches">Nine Branches&lt;/h1>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/LfPmK6SfLmc"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;h2 id="eleven-years-later">Eleven years later&lt;/h2>
&lt;p>December 2025.
It’s cold outside. The kind that cleans your face and forces you to wake up.&lt;/p>
&lt;p>Eleven years later, I still think about that twenty-one-year-old kid who took a flight to Lübeck without understanding what it would cost. I’m not talking about the language—an English to survive and no German at all. I’m talking about everything else: the loneliness, the fear, the freedom, the people who save you without knowing it.&lt;/p>
&lt;p>It wasn’t bravery. It was urgency.&lt;/p>
&lt;p>I left my city because staying was no longer an option. There was no future there. Only a past I needed to forget. And Germany, back then, was a door I couldn’t let pass.&lt;/p>
&lt;p>In Lübeck I spent six months working for three hundred euros a month. I lived off my savings from my job in Murcia.&lt;/p>
&lt;p>Poor, but happy.&lt;/p>
&lt;p>Meeting wonderful people, searching every corner to learn, expand horizons, practice languages.&lt;/p>
&lt;p>After those first months I decided I had to move. The company where I started was the typical one that paid you the minimum to exploit you to the maximum, with obsolete technologies. I felt that if I didn’t move, I would end up becoming obsolete myself.&lt;/p>
&lt;p>So, after three months of intense searching, I found a job in Berlin and moved with what I had. The first days I slept on the sofa of Alberto and Maricarmen, some friends from the village choir where I spent a summer years before.&lt;/p>
&lt;p>From there on, everything was adventure. At a speed I never would have imagined if I hadn’t left my city.&lt;/p>
&lt;p>In 2015 I started writing as a way to communicate with my siblings from a distance. What began as loose thoughts ended up becoming a two-year diary.&lt;/p>
&lt;p>I wrote in April: “I miss my family. Although I’ll see them in less than thirty days, I’m starting to get used to the idea of seeing them twice a year. And, honestly, it’s hard. Being the oldest of a whole troop means that, without intending to, one is responsible. We need to be examples.”&lt;/p>
&lt;p>Eleven years later, those words are still true. We see each other once or twice a year: at Christmas and at the May festivals. I’ve learned to savor every minute when we’re together. It’s not always easy. But time is the ultimate equalizer; the color of ideological or political garments doesn’t matter. What I value most is effort, saving, hard work. That teaches us to appreciate what we achieve.&lt;/p>
&lt;p>Nine different companies. Seven of them in Germany. I’ve stumbled and gotten up, always from sanity without reaching absurdities.&lt;/p>
&lt;p>I’ve managed to grow both personally and professionally, opening all kinds of horizons. I’m proud of the person I’ve become.&lt;/p>
&lt;p>But none of this would make sense without you.&lt;/p>
&lt;p>And to understand the present, sometimes you have to look at the past. Even if it hurts.&lt;/p>
&lt;hr />
&lt;h2 id="where-we-come-from">Where we come from&lt;/h2>
&lt;p>I won’t lie: we had a complicated youth. A youth that left marks on all of us. Each one carries them in their own way, some more visible than others.&lt;/p>
&lt;p>But here we are. Standing.&lt;/p>
&lt;p>Mom left too soon.&lt;/p>
&lt;p>She would be fifty-eight years old today. Forty-nine when I wrote “Numbers,” that May 25, 2016. Thirty-seven when she left.&lt;/p>
&lt;p>I was eleven years old.&lt;/p>
&lt;p>I don’t remember when was the last time I said “mom.” I only remember her curly hair and her kind smile behind the door frame late at night. No time to say goodbye. No time for anything.&lt;/p>
&lt;p>Dad was left alone with eight kids. The oldest sister was thirteen years old. And the youngest, two weeks.&lt;/p>
&lt;p>Life forced him to move forward as best he could. And he did. Not always well, but he did.&lt;/p>
&lt;p>Years later came the castle. That duplex where the seven of us ended up relegated to the garage, like a backyard. With a lock on the door. Forbidden to go up to the main rooms except to eat or sleep.&lt;/p>
&lt;p>The disputes. The confrontations. The storms.&lt;/p>
&lt;p>Maricarmen was sent to study far away. I was the next target. Dad overwhelmed not knowing what to do.&lt;/p>
&lt;p>That was a hell I barely want to remember.&lt;/p>
&lt;p>Until one day we returned to the apartment where we had grown up with mom. Our home. Do you know what it’s like to wake up on a weekend, see that it’s daytime and it’s raining, and be able to stay in bed? A memory of joy I will never forget.&lt;/p>
&lt;p>But you already know that. You lived it with me. I barely keep clear memories of those teenage years. My mind did its job well: it erased as much as it could to help me heal. Maybe someday they’ll come back. Maybe it’s better if they don’t.&lt;/p>
&lt;p>Dad, our relationship was difficult.&lt;/p>
&lt;p>The era and context in which we had to live and confront each other didn’t help us. There were years of silence, of accumulated resentment, of words that weren’t said and others that were said too much.&lt;/p>
&lt;p>But today the situation seems to have calmed down. We came to forgive each other. We talk to each other from time to time again. And that, after everything we’ve been through, is more than many achieve.&lt;/p>
&lt;p>It’s not perfect, but it’s real. And the real has more value than any impossible ideal.&lt;/p>
&lt;p>From such a murky past, I feel fortunate not to have ended up on any other path than this one: mine. And when I say “mine,” I mean ours. Because we all come from the same place, from the same walls, from the same sky of Caravaca.&lt;/p>
&lt;hr />
&lt;h2 id="nine-branches-1">Nine branches&lt;/h2>
&lt;p>Eight siblings from the same father and the same mother. Eight branches that grew together. And a ninth that came later. Nine in total. From the same tree, each one seeking its own sun.&lt;/p>
&lt;p>&lt;strong>Maricarmen&lt;/strong>, the oldest sister, who had to learn to be a mom very early. When she could, she latched onto Belgian lands and there she is now, with two children and a future to make.&lt;/p>
&lt;p>I never thanked her enough for those years when she carried responsibilities that weren’t hers. She was a girl taking care of children. And she did the best she could.&lt;/p>
&lt;p>Now it’s her turn to build her life. The one she chose. The one she deserves.&lt;/p>
&lt;p>&lt;strong>Juan&lt;/strong>, perhaps the one who has suffered the most. The past played bad luck on him and he has had to learn through many blows. Life has been especially unfair to him in many ways.&lt;/p>
&lt;p>And so was I. As children I was a bully to him. I hurt him and that’s something I carry with me.&lt;/p>
&lt;p>I hope he knows how to forgive me. I hope he doesn’t forget that I’m here for whatever he needs.&lt;/p>
&lt;p>Fortunately, very recently, he found his place. He still has everything ahead of him. Few have the ability to get up after falling so many times.&lt;/p>
&lt;p>&lt;strong>Jesús&lt;/strong>, the one who seems to have the calmest temperament. He learned to surpass the storms of the castle without attracting too much attention. It fills me with pride to see who he is and what he has become: a speaker at international conferences and a fundamental help in the open source projects we have together.&lt;/p>
&lt;p>We live close in Berlin and seeing him from time to time reminds me what it means to have family. I really enjoy when we meet to take walks through immense parks, walking for hours until the light goes away.&lt;/p>
&lt;p>Thank you for those moments. Talking to you in person and knowing you’re there is a gift.&lt;/p>
&lt;p>&lt;strong>Ángel&lt;/strong>, the math teacher. One of the smartest in the family, without a doubt. As a child, he underwent an operation in which he almost completely lost one ear. But he overcame it, as he always has.&lt;/p>
&lt;p>Calm, humble, he never liked to attract attention. And he’s always there when a sibling needs him.&lt;/p>
&lt;p>And that’s worth more than any degree.&lt;/p>
&lt;p>A clear example of commitment and passion for his work. He knew how to take advantage of opportunities as they came. Proof that effort yields wonderful fruits.&lt;/p>
&lt;p>&lt;strong>Lola&lt;/strong>, fighter and sensitive in equal parts. It’s impossible to deny what she lived through, how bad she had it as a child. She is perhaps one of those who have had the hardest time.&lt;/p>
&lt;p>But you have to see her today.&lt;/p>
&lt;p>Although we have different thoughts in some aspects, we can understand each other perfectly when it comes to humanity, help, family. And that’s what counts.&lt;/p>
&lt;p>From the girl who suffered, a woman who helps others suffer less has been born.&lt;/p>
&lt;p>That’s turning pain into purpose.&lt;/p>
&lt;p>&lt;strong>Cosme&lt;/strong>, the little one who now programs like the big ones. He also had a difficult childhood without understanding what was happening or what surrounded him. We all disappeared when he was still a child. That lack of affection left its mark.&lt;/p>
&lt;p>Empathy is hard when, as a child, you don’t receive it. But he’s learning. And that’s what counts.&lt;/p>
&lt;p>Fortunately he found his passion where I also found it: in software. I was able to guide him as an older brother, help him with all my being, just as I did with Jesús and later would do with Juan.&lt;/p>
&lt;p>Watching him grow professionally has been one of my greatest satisfactions.&lt;/p>
&lt;p>&lt;strong>Anica&lt;/strong>, the youngest, the smartest. She has known how to turn rage into strength. Sharp and quick-witted like few others. And to think that not long ago she hated sports…&lt;/p>
&lt;p>Perhaps it was my passion for boxing that I managed to transmit to her. Today she is a gym trainer, competes in weightlifting and runs ten kilometers from time to time.&lt;/p>
&lt;p>It moves me to see her compete and help others. I really enjoy going with her for a sibling walk or to shop at Lidl.&lt;/p>
&lt;p>Those simple moments are worth a lot.&lt;/p>
&lt;p>Transmitting passion is one of the best inheritances one can leave. And she has made it her own.&lt;/p>
&lt;p>And lastly there’s &lt;strong>Antonio&lt;/strong>. Another branch, but from the same father. From the same tree after all.&lt;/p>
&lt;p>We’ve barely seen each other a couple of times in our lives. He was lucky to arrive when the waters were already calmer. He has his whole life ahead of him to study, grow as a professional, and be whoever he wants to be.&lt;/p>
&lt;p>And if someday he gets curious about those past thoughts, there’s a book I published in 2017 waiting for him.&lt;/p>
&lt;p>Nine branches seeking their own sun. Nine ways of surviving the same past. Nine ways of moving forward.&lt;/p>
&lt;hr />
&lt;h2 id="the-uncles">The uncles&lt;/h2>
&lt;p>But family isn’t just siblings.&lt;/p>
&lt;p>There are also those who have always been there, in good times and bad: the uncles from Caravaca. My uncle Cosme and my aunt Angustias.&lt;/p>
&lt;p>You have always been there. For me and for all my siblings. To talk. To listen. To say what we needed to hear.&lt;/p>
&lt;p>You were also there during that castle era. I’m not going to go there. I just want to tell you that your affection in those years helped me immensely.&lt;/p>
&lt;p>But this time, I prefer to keep another memory.&lt;/p>
&lt;p>I remember when I was fired from my first company in Berlin, after a little over a year. From one day to the next. Something smelled off to me, but I didn’t want to believe it. Looking back, I also made mistakes more than once.&lt;/p>
&lt;p>“You got complacent,” uncle Cosme told me on the phone when I got to my apartment.&lt;/p>
&lt;p>That word stuck with me. He was right. I had settled.&lt;/p>
&lt;p>With my savings I could have held on for a few months. But then what? What if I didn’t find work? The uncertainty forced me to look at myself straight on and recognize my mistakes.&lt;/p>
&lt;p>It was time to focus and surf the waves. Two weeks into searching—getting up at eight and not letting go of the laptop until five—I found work.&lt;/p>
&lt;p>I couldn’t give up. And I didn’t.&lt;/p>
&lt;p>And that’s just one memory of many. The long calls. The advice without asking. The feeling of having someone who always listens.&lt;/p>
&lt;p>Thank you, uncles. For being there. For being that anchor that has always been in Caravaca waiting.&lt;/p>
&lt;p>I love you.&lt;/p>
&lt;hr />
&lt;h2 id="anna-lena">Anna-Lena&lt;/h2>
&lt;p>And then there’s her. The one who appeared when I least expected it.&lt;/p>
&lt;p>We met at a beer bar, among strangers, on any given night.&lt;/p>
&lt;p>From the moment I saw you come in, we were talking for hours until you had to leave.&lt;/p>
&lt;p>Then we started going to the cinema together, to other bars, to walk. And in the end we started seeing each other almost daily. A year later we decided to live together.&lt;/p>
&lt;p>In February 2026 it will be eight years. Eight years building something together, day by day, without rush but without pause.&lt;/p>
&lt;p>Thank you for being there. For putting up with me. For loving me as I am. For being my home in Berlin.&lt;/p>
&lt;p>Because in the end, that’s what matters: having someone to share the journey with.&lt;/p>
&lt;hr />
&lt;h2 id="the-most-important-thing">The most important thing&lt;/h2>
&lt;p>Eleven years are enough for a lot. To fall and get up. To get lost and find yourself. To learn that life is movement and that the key is knowing how to surf each stage.&lt;/p>
&lt;p>Nobody said it was easy. And when you can’t take anymore, well, time for a well-deserved rest.&lt;/p>
&lt;p>The future is uncertain, but what is universal is that our life is finite. I’m not talking about living as if there’s no tomorrow, but about not forgetting that time moves forward.&lt;/p>
&lt;p>Ten years ago, in December 2015, I decided to spend Christmas alone in Berlin. I had no friends then. I didn’t do anything special those days.&lt;/p>
&lt;p>I felt very alone.&lt;/p>
&lt;p>From there dark thoughts were born that were captured in “Eyes on a Memory.” That year, 2016, was quite intense. I spent January writing two to four hours almost every day.&lt;/p>
&lt;p>I think my body and mind were trying to tell me something. They needed to express themselves.&lt;/p>
&lt;p>What joy to have created a book. Another project, another of so many already completed and those yet to be done.&lt;/p>
&lt;p>Small victories that sweeten the effort.&lt;/p>
&lt;p>But no victory tastes the same if there’s no one to celebrate it with.&lt;/p>
&lt;p>And you are that someone: Dad. Maricarmen. Juan. Jesús. Ángel. Lola. Cosme. Anica. Antonio. Uncle Cosme. Aunt Angustias. And Anna-Lena.&lt;/p>
&lt;p>You are the branches—and the roots—of this tree that I continue to be.&lt;/p>
&lt;p>Physical distance doesn’t diminish love. The few times we see each other a year don’t reduce what you mean to me.&lt;/p>
&lt;p>Thank you for being who you are. Thank you for still being there. Thank you for forgiving when forgiveness was needed. Thank you for getting up every time life knocked you down.&lt;/p>
&lt;p>I’m proud to belong to this family.&lt;/p>
&lt;p>And although time passes and each one follows their path, we will always be from the same tree. Mom is still here, in each one of us.&lt;/p>
&lt;p>We will always be branches seeking our own sun.&lt;/p>
&lt;p>With eyes on a memory, looking forward.&lt;/p>
&lt;p>Work. Love. Dream. Smile.&lt;/p>
&lt;p>But together.&lt;/p>
&lt;p>&lt;img src="/images/books/oeur/familia.jpg" alt="book-chapter" />&lt;/p></content></entry><entry xml:lang="en"><title>Bitcoin Fundamentals</title><subtitle>A beginner's guide to sound money</subtitle><category term="bitcoin" scheme="https://chemaclass.com/tags/bitcoin/" label="Bitcoin"/><category term="economics" scheme="https://chemaclass.com/tags/economics/" label="Economics"/><category term="privacy" scheme="https://chemaclass.com/tags/privacy/" label="Privacy"/><category term="philosophy" scheme="https://chemaclass.com/tags/philosophy/" label="Philosophy"/><published>2025-11-21T00:00:00+00:00</published><updated>2025-11-21T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/bitcoin-fundamentals/"/><id>https://chemaclass.com/blog/bitcoin-fundamentals/</id><summary type="html">21 million cap, no central authority, permissionless and censorship-resistant. Bitcoin is digital money you truly own. No bank required.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2025-12-21/footer.jpg" alt="blog-cover" />&lt;/p>
&lt;p>What would you do if your bank account was frozen tomorrow? No warning, no explanation, no access to your own money.&lt;/p>
&lt;p>This isn’t hypothetical. In 2022, Canada froze bank accounts of people who donated to a protest. In 2015, Greeks could only withdraw €60 per day from ATMs. In Argentina, Turkey, and Lebanon, people watched their savings lose half their value in months.&lt;/p>
&lt;p>Bitcoin exists because these things happen. Understanding it requires going back to basics: what is money, why does it matter, and how does Bitcoin fit into that picture.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>&lt;em>No technical background required. Just curiosity.&lt;/em>&lt;/p>
&lt;h2 id="a-brief-history-of-money">A Brief History of Money&lt;/h2>
&lt;p>Money is a social agreement. A piece of paper, a gold coin, or a number on a screen has value because we all agree it does. This agreement is what makes trade possible.&lt;/p>
&lt;p>Throughout history, money has evolved:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Direct trade&lt;/strong>: Exchanging goods for goods. “I’ll give you my fish for your bread.”&lt;/li>
&lt;li>&lt;strong>Things used as money&lt;/strong>: Shells, salt, cattle. Valuable because they were useful or hard to find.&lt;/li>
&lt;li>&lt;strong>Precious metals&lt;/strong>: Gold and silver. Hard to find, long-lasting, easy to divide and carry.&lt;/li>
&lt;li>&lt;strong>Paper money backed by gold&lt;/strong>: Receipts representing gold stored in vaults.&lt;/li>
&lt;li>&lt;strong>Government money&lt;/strong>: Paper backed by nothing but a government’s promise. Why does it work? Because governments require you to pay taxes in their currency. This forces everyone to use it.&lt;/li>
&lt;/ol>
&lt;blockquote>
&lt;p>Money is a way to store and transfer value. The better it performs these functions, the better it serves as money.&lt;/p>
&lt;/blockquote>
&lt;p>What makes good money? These properties:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Hard to create&lt;/strong>: Cannot be easily made or faked&lt;/li>
&lt;li>&lt;strong>Long-lasting&lt;/strong>: Doesn’t break down over time&lt;/li>
&lt;li>&lt;strong>Divisible&lt;/strong>: Can be broken into smaller pieces&lt;/li>
&lt;li>&lt;strong>Easy to move&lt;/strong>: Simple to carry and send&lt;/li>
&lt;li>&lt;strong>Easy to verify&lt;/strong>: Simple to check if it’s real&lt;/li>
&lt;/ul>
&lt;p>Gold does well on most of these. Paper money is easy to move and divide but fails on being hard to create. Governments can print as much as they want. Bitcoin, as we’ll see, does well on all of them.&lt;/p>
&lt;h2 id="what-is-bitcoin">What is Bitcoin?&lt;/h2>
&lt;p>Bitcoin is digital money that works without banks, governments, or any central authority. It was created in 2009 by someone (or some group) using the pseudonym &lt;a rel="external" href="https://en.wikipedia.org/wiki/Satoshi_Nakamoto">Satoshi Nakamoto&lt;/a>. No one knows who this person really is.&lt;/p>
&lt;p>The first Bitcoin block (the &lt;a rel="external" href="https://en.bitcoin.it/wiki/Genesis_block">Genesis Block&lt;/a>) contains a hidden message: &lt;em>“The Times 03/Jan/2009 Chancellor on brink of second bailout for banks.”&lt;/em> This headline from The Times newspaper referenced the 2008 financial crisis. It wasn’t random. It was a timestamp and a statement of purpose. Bitcoin was created as a response to bank bailouts and monetary manipulation.&lt;/p>
&lt;p>Bitcoin builds on decades of work by cryptographers and privacy activists. If you’re curious about the people and ideas that led to Bitcoin, I wrote about &lt;a href="/blog/the-cypherpunks/">The Cypherpunks&lt;/a> and their vision for digital privacy.&lt;/p>
&lt;p>At its core, Bitcoin is:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>A protocol&lt;/strong>: A set of rules that computers follow to agree on who owns what&lt;/li>
&lt;li>&lt;strong>A network&lt;/strong>: Thousands of computers worldwide running the Bitcoin software&lt;/li>
&lt;li>&lt;strong>A currency&lt;/strong>: Units of account called bitcoins (BTC), divisible to 8 decimal places&lt;/li>
&lt;/ul>
&lt;p>There’s no company behind Bitcoin. No CEO, no headquarters, no customer support. It’s open-source software that anyone can run, inspect, or contribute to.&lt;/p>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/d7ID3fKAFQM"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;h2 id="sound-money">Sound Money&lt;/h2>
&lt;h3 id="scarcity">Scarcity&lt;/h3>
&lt;p>There will only ever be 21 million bitcoins. This is enforced by the protocol’s code, verified by every node on the network. No government, no committee, no emergency meeting can change this.&lt;/p>
&lt;p>Compare this to government money. Central banks can (and do) create money whenever they want. The U.S. dollar has lost over 95% of its buying power since 1913. The Euro, the Pound, the Yen: all follow the same pattern of slowly losing value.&lt;/p>
&lt;blockquote>
&lt;p>In a world of infinite money printing, a mathematically enforced hard cap is revolutionary.&lt;/p>
&lt;/blockquote>
&lt;p>Bitcoin is often called “digital gold” because it shares gold’s scarcity while being easier to store, divide, and transfer. You can send a billion dollars worth of Bitcoin anywhere in the world in minutes, for a few dollars in fees. Try doing that with gold bars.&lt;/p>
&lt;h3 id="inflation-protection">Inflation Protection&lt;/h3>
&lt;p>When governments print money, the value of existing money decreases. This is inflation. Your savings buy less over time, even while sitting untouched in your bank account.&lt;/p>
&lt;p>Inflation is often called a “hidden tax” because it transfers wealth from savers to those who receive the new money first (usually governments and banks). I wrote more about this in &lt;a href="/blog/understanding-taxes/">Understanding Taxes&lt;/a>.&lt;/p>
&lt;p>Bitcoin’s supply schedule is fixed and predictable. New bitcoins are created through mining at a rate that halves roughly every four years. By around 2140, all 21 million will have been created. No surprises, no government decisions to print more.&lt;/p>
&lt;h2 id="freedom-sovereignty">Freedom &amp;amp; Sovereignty&lt;/h2>
&lt;h3 id="self-custody">Self-custody&lt;/h3>
&lt;p>With Bitcoin, you can hold your own money. Not a promise from a bank, not a balance on someone else’s books. Actual ownership, secured by cryptographic keys that only you control.&lt;/p>
&lt;blockquote>
&lt;p>“Not your keys, not your coins.”&lt;/p>
&lt;/blockquote>
&lt;p>This phrase captures a fundamental truth. When you deposit money in a bank, you don’t own that money anymore. You own a claim against the bank. If the bank freezes your account, goes bankrupt, or decides you violated their terms of service, your access disappears.&lt;/p>
&lt;p>With Bitcoin, there’s no freeze button. No account to close. No terms of service to violate. You become your own bank.&lt;/p>
&lt;h3 id="permissionless-borderless">Permissionless &amp;amp; Borderless&lt;/h3>
&lt;p>Bitcoin doesn’t care about borders, banking hours, or your credit score. You can send money to anyone with an internet connection, anywhere in the world, at any time.&lt;/p>
&lt;p>Traditional banking:&lt;/p>
&lt;ul>
&lt;li>Hours: Monday-Friday, 9-5 (maybe)&lt;/li>
&lt;li>International transfers: 3-5 business days&lt;/li>
&lt;li>Fees: Percentage of transfer + fixed fees&lt;/li>
&lt;li>Requirements: ID, proof of address, account in good standing&lt;/li>
&lt;/ul>
&lt;p>Bitcoin:&lt;/p>
&lt;ul>
&lt;li>Hours: 24/7/365&lt;/li>
&lt;li>Global transfers: ~10 minutes to an hour&lt;/li>
&lt;li>Fees: Based on data size, not amount sent&lt;/li>
&lt;li>Requirements: A Bitcoin address (free, instant, no ID)&lt;/li>
&lt;/ul>
&lt;h3 id="censorship-resistance">Censorship Resistance&lt;/h3>
&lt;p>No central authority controls Bitcoin. No single entity can stop a transaction or reverse a payment. Once confirmed, it’s final.&lt;/p>
&lt;p>This matters for people living under oppressive governments, facing political pressure, or simply wanting financial privacy. It matters for donations to controversial causes, for journalists protecting sources, for anyone who values financial freedom.&lt;/p>
&lt;blockquote>
&lt;p>Financial freedom isn’t just about being rich. It’s about having control over your own money, regardless of who you are or where you live.&lt;/p>
&lt;/blockquote>
&lt;h3 id="real-stories">Real Stories&lt;/h3>
&lt;p>These aren’t edge cases:&lt;/p>
&lt;div class="interactive-list" data-component="interactive-list" style="--interactive-list-nav-height: 450px;">
&lt;div class="interactive-list__container">
&lt;nav class="interactive-list__nav" role="tablist" aria-label="Real Stories">
&lt;button class="interactive-list__tab active" role="tab" aria-selected="true" data-target="wikileaks">
&lt;span class="interactive-list__label">WikiLeaks 2010&lt;/span>
&lt;span class="interactive-list__summary">Payment blocked&lt;/span>
&lt;/button>
&lt;button class="interactive-list__tab" role="tab" aria-selected="false" data-target="cyprus">
&lt;span class="interactive-list__label">Cyprus 2013&lt;/span>
&lt;span class="interactive-list__summary">Bank bail-ins&lt;/span>
&lt;/button>
&lt;button class="interactive-list__tab" role="tab" aria-selected="false" data-target="greece">
&lt;span class="interactive-list__label">Greece 2015&lt;/span>
&lt;span class="interactive-list__summary">Capital controls&lt;/span>
&lt;/button>
&lt;button class="interactive-list__tab" role="tab" aria-selected="false" data-target="venezuela">
&lt;span class="interactive-list__label">Venezuela 2016&lt;/span>
&lt;span class="interactive-list__summary">1,000,000% inflation&lt;/span>
&lt;/button>
&lt;button class="interactive-list__tab" role="tab" aria-selected="false" data-target="lebanon">
&lt;span class="interactive-list__label">Lebanon 2019&lt;/span>
&lt;span class="interactive-list__summary">Banking collapse&lt;/span>
&lt;/button>
&lt;button class="interactive-list__tab" role="tab" aria-selected="false" data-target="hongkong">
&lt;span class="interactive-list__label">Hong Kong 2019&lt;/span>
&lt;span class="interactive-list__summary">Protest funding&lt;/span>
&lt;/button>
&lt;button class="interactive-list__tab" role="tab" aria-selected="false" data-target="belarus">
&lt;span class="interactive-list__label">Belarus 2020&lt;/span>
&lt;span class="interactive-list__summary">Regime resistance&lt;/span>
&lt;/button>
&lt;button class="interactive-list__tab" role="tab" aria-selected="false" data-target="nigeria">
&lt;span class="interactive-list__label">Nigeria 2021&lt;/span>
&lt;span class="interactive-list__summary">Ban failed&lt;/span>
&lt;/button>
&lt;button class="interactive-list__tab" role="tab" aria-selected="false" data-target="turkey">
&lt;span class="interactive-list__label">Turkey 2021&lt;/span>
&lt;span class="interactive-list__summary">Lira devaluation&lt;/span>
&lt;/button>
&lt;button class="interactive-list__tab" role="tab" aria-selected="false" data-target="elsalvador">
&lt;span class="interactive-list__label">El Salvador 2021&lt;/span>
&lt;span class="interactive-list__summary">Legal tender&lt;/span>
&lt;/button>
&lt;button class="interactive-list__tab" role="tab" aria-selected="false" data-target="afghanistan">
&lt;span class="interactive-list__label">Afghanistan 2021&lt;/span>
&lt;span class="interactive-list__summary">Women's savings&lt;/span>
&lt;/button>
&lt;button class="interactive-list__tab" role="tab" aria-selected="false" data-target="ukraine">
&lt;span class="interactive-list__label">Ukraine 2022&lt;/span>
&lt;span class="interactive-list__summary">$100M+ in donations&lt;/span>
&lt;/button>
&lt;button class="interactive-list__tab" role="tab" aria-selected="false" data-target="canada">
&lt;span class="interactive-list__label">Canada 2022&lt;/span>
&lt;span class="interactive-list__summary">Accounts frozen&lt;/span>
&lt;/button>
&lt;button class="interactive-list__tab" role="tab" aria-selected="false" data-target="russia">
&lt;span class="interactive-list__label">Russia 2022&lt;/span>
&lt;span class="interactive-list__summary">Sanctions escape&lt;/span>
&lt;/button>
&lt;button class="interactive-list__tab" role="tab" aria-selected="false" data-target="argentina">
&lt;span class="interactive-list__label">Argentina 2023-25&lt;/span>
&lt;span class="interactive-list__summary">Inflation slashed&lt;/span>
&lt;/button>
&lt;button class="interactive-list__tab" role="tab" aria-selected="false" data-target="remittances">
&lt;span class="interactive-list__label">Remittances 2023&lt;/span>
&lt;span class="interactive-list__summary">Cheaper transfers&lt;/span>
&lt;/button>
&lt;button class="interactive-list__tab" role="tab" aria-selected="false" data-target="etfs">
&lt;span class="interactive-list__label">Bitcoin ETFs 2024&lt;/span>
&lt;span class="interactive-list__summary">Institutional legitimacy&lt;/span>
&lt;/button>
&lt;button class="interactive-list__tab" role="tab" aria-selected="false" data-target="gaza">
&lt;span class="interactive-list__label">Gaza 2024&lt;/span>
&lt;span class="interactive-list__summary">Humanitarian lifeline&lt;/span>
&lt;/button>
&lt;button class="interactive-list__tab" role="tab" aria-selected="false" data-target="usreserve">
&lt;span class="interactive-list__label">US Reserve 2025&lt;/span>
&lt;span class="interactive-list__summary">National strategy&lt;/span>
&lt;/button>
&lt;button class="interactive-list__tab" role="tab" aria-selected="false" data-target="machado">
&lt;span class="interactive-list__label">Venezuela 2025&lt;/span>
&lt;span class="interactive-list__summary">Nobel resistance&lt;/span>
&lt;/button>
&lt;/nav>
&lt;div class="interactive-list__panels">
&lt;div class="interactive-list__panel active" role="tabpanel" id="panel-wikileaks">
&lt;div class="interactive-list__content">
&lt;p>In December 2010, WikiLeaks published classified U.S. diplomatic cables. Within days, Visa, Mastercard, PayPal, and Bank of America cut off all payment processing. &lt;br> &lt;br> WikiLeaks lost 95% of its revenue overnight. In 2011, they started accepting Bitcoin. It was one of the first major use cases for the cryptocurrency. The financial blockade meant to silence them instead proved Bitcoin's value as censorship-resistant money.&lt;/p>
&lt;/div>
&lt;a href="https://www.cnbc.com/2017/10/16/wikileaks-julian-assange-bitcoin-50000-percent-return-thanks-to-us-government.html" class="interactive-list__link" target="_blank" rel="noopener">Read full article →&lt;/a>
&lt;/div>
&lt;div class="interactive-list__panel" role="tabpanel" id="panel-cyprus">
&lt;div class="interactive-list__content">
&lt;p>In March 2013, Cyprus banks took 47.5% of all deposits over €100,000 to bail themselves out. No consent, no warning. Money in the bank was simply confiscated to save the banking system. &lt;br> &lt;br> Bitcoin's price doubled in the weeks following. The Cyprus bail-in was a wake-up call: your bank balance is an IOU, and when banks fail, you're the one who pays.&lt;/p>
&lt;/div>
&lt;a href="https://www.reuters.com/article/us-eurozone-cyprus-deposit-idUSBRE92O0R120130325/" class="interactive-list__link" target="_blank" rel="noopener">Read full article →&lt;/a>
&lt;/div>
&lt;div class="interactive-list__panel" role="tabpanel" id="panel-greece">
&lt;div class="interactive-list__content">
&lt;p>In June 2015, Greece closed its banks for three weeks. ATM withdrawals were capped at €60 per day. Citizens couldn't access their own money. The debt crisis showed Europeans that bank deposits aren't as safe as they assumed. &lt;br> &lt;br> Bitcoin interest spiked in Greece during the crisis. It was an early warning: even in "stable" countries, your access to money can be switched off overnight.&lt;/p>
&lt;/div>
&lt;a href="https://www.nbcnews.com/business/business-news/greece-crisis-banks-shut-week-restrictions-imposed-atms-n383606" class="interactive-list__link" target="_blank" rel="noopener">Read full article →&lt;/a>
&lt;/div>
&lt;div class="interactive-list__panel" role="tabpanel" id="panel-venezuela">
&lt;div class="interactive-list__content">
&lt;p>Between 2016 and 2019, inflation reached 53,000,000%. Salaries became worthless within days. People couldn't buy food, medicine, or basic goods. Those who converted savings to Bitcoin before the collapse preserved their wealth. &lt;br> &lt;br> Those who trusted the banking system lost everything. Bitcoin became a lifeline. Not for speculation, but for survival.&lt;/p>
&lt;/div>
&lt;a href="https://www.ccn.com/education/crypto/venezuela-inflation-bitcoin-usdt-p2p-crypto-lifeline/" class="interactive-list__link" target="_blank" rel="noopener">Read full article →&lt;/a>
&lt;/div>
&lt;div class="interactive-list__panel" role="tabpanel" id="panel-lebanon">
&lt;div class="interactive-list__content">
&lt;p>In 2019, Lebanese banks began freezing deposits. By 2020, people couldn't access their own savings. The lira lost 90% of its value. ATM withdrawals were capped at tiny amounts. It wasn't a temporary measure. Banks simply didn't have the money. &lt;br> &lt;br>Those who had converted to Bitcoin before the collapse could still access their wealth. Those who trusted the banks discovered that "your money" wasn't really yours.&lt;/p>
&lt;/div>
&lt;a href="https://www.cnbc.com/2022/11/05/-in-bankrupt-lebanon-locals-mine-bitcoin-and-buy-groceries-with-tether.html" class="interactive-list__link" target="_blank" rel="noopener">Read full article →&lt;/a>
&lt;/div>
&lt;div class="interactive-list__panel" role="tabpanel" id="panel-hongkong">
&lt;div class="interactive-list__content">
&lt;p>During the 2019-2020 pro-democracy protests, Hong Kong activists faced financial surveillance. Banks could freeze accounts of known protesters. Donations through traditional channels could be traced. &lt;br> &lt;br>Bitcoin offered a way to fund the movement without leaving a trail for authorities. Protesters used crypto to receive international support while protecting their identities. Financial privacy became a tool of resistance.&lt;/p>
&lt;/div>
&lt;a href="https://cointelegraph.com/news/spotlight-on-bitcoin-as-hsbc-shuts-hong-kong-protest-linked-account" class="interactive-list__link" target="_blank" rel="noopener">Read full article →&lt;/a>
&lt;/div>
&lt;div class="interactive-list__panel" role="tabpanel" id="panel-belarus">
&lt;div class="interactive-list__content">
&lt;p>After the disputed 2020 election, Belarus erupted in protests. The Lukashenko regime responded with violence and financial repression. Bank accounts of activists, journalists, and NGOs were frozen. &lt;br> &lt;br>The KGB monitored all transfers. A solidarity fund called BYSOL raised over $2 million in Bitcoin and distributed it directly to protesters who lost jobs or faced persecution. The only payment method authorities couldn't control.&lt;/p>
&lt;/div>
&lt;a href="https://www.euronews.com/my-europe/2021/12/22/meet-the-ngo-turning-to-cryptocurrencies-to-help-desperate-belarusians" class="interactive-list__link" target="_blank" rel="noopener">Read full article →&lt;/a>
&lt;/div>
&lt;div class="interactive-list__panel" role="tabpanel" id="panel-nigeria">
&lt;div class="interactive-list__content">
&lt;p>The Central Bank banned crypto exchanges in February 2021 and ordered banks to close accounts of anyone dealing in cryptocurrency. The goal was to stop Bitcoin adoption. It backfired. &lt;br> &lt;br>Peer-to-peer trading surged 27% in the months following the ban. Nigerians simply moved to decentralized platforms. The naira continued losing value while Bitcoin kept working. You can't ban math.&lt;/p>
&lt;/div>
&lt;a href="https://www.nasdaq.com/articles/bitcoin-peer-to-peer-trading-in-nigeria-rises-27-since-central-banks-ban-2021-04-23" class="interactive-list__link" target="_blank" rel="noopener">Read full article →&lt;/a>
&lt;/div>
&lt;div class="interactive-list__panel" role="tabpanel" id="panel-turkey">
&lt;div class="interactive-list__content">
&lt;p>The Turkish lira has lost over 80% of its value against the dollar since 2018. Every currency crisis triggers a spike in Bitcoin trading. In 2021, Turkey banned crypto payments, but trading volumes only increased. &lt;br> &lt;br>The government can't stop people from protecting their savings. When the lira crashes, Bitcoin search trends surge. Turks aren't speculating. They're surviving.&lt;/p>
&lt;/div>
&lt;a href="https://www.reuters.com/world/middle-east/turkeys-slumping-lira-adds-fuels-crypto-trading-boom-2021-03-31/" class="interactive-list__link" target="_blank" rel="noopener">Read full article →&lt;/a>
&lt;/div>
&lt;div class="interactive-list__panel" role="tabpanel" id="panel-elsalvador">
&lt;div class="interactive-list__content">
&lt;p>In September 2021, El Salvador became the first country to make Bitcoin legal tender. President Bukele's government installed Bitcoin ATMs nationwide, and even started mining BTC using geothermal energy from volcanoes. Critics predicted disaster. &lt;br> &lt;br>Instead, tourism increased, remittance costs dropped, and the country gained global attention. A small nation became a Bitcoin laboratory.&lt;/p>
&lt;/div>
&lt;a href="https://cointelegraph.com/news/el-salvador-bitcoin-holdings-unrealized-gains" class="interactive-list__link" target="_blank" rel="noopener">Read full article →&lt;/a>
&lt;/div>
&lt;div class="interactive-list__panel" role="tabpanel" id="panel-afghanistan">
&lt;div class="interactive-list__content">
&lt;p>When the Taliban took control in August 2021, banks froze. International transfers stopped. Women, banned from working, lost access to income. But some Afghan women had learned about Bitcoin before the collapse. &lt;br> &lt;br>They could receive payments from abroad, store value the regime couldn't seize, and maintain financial independence. In a country where women can't open bank accounts, Bitcoin became a tool of quiet resistance.&lt;/p>
&lt;/div>
&lt;a href="https://bitcoinmagazine.com/culture/bitcoin-financial-freedom-in-afghanistan" class="interactive-list__link" target="_blank" rel="noopener">Read full article →&lt;/a>
&lt;/div>
&lt;div class="interactive-list__panel" role="tabpanel" id="panel-ukraine">
&lt;div class="interactive-list__content">
&lt;p>When Russia invaded, traditional aid was too slow. Banks were overwhelmed, wire transfers took days. But within hours of posting Bitcoin addresses on Twitter, donations poured in from around the world. By March 2022, Ukraine received over $100 million in crypto. &lt;br> &lt;br>Funds went directly to bulletproof vests, medical supplies, and communication equipment. No bureaucracy, no intermediaries, no delays.&lt;/p>
&lt;/div>
&lt;a href="https://www.coindesk.com/business/2022/03/09/ukraine-has-received-close-to-100-million-in-crypto-donations" class="interactive-list__link" target="_blank" rel="noopener">Read full article →&lt;/a>
&lt;/div>
&lt;div class="interactive-list__panel" role="tabpanel" id="panel-canada">
&lt;div class="interactive-list__content">
&lt;p>In February 2022, the government invoked the Emergencies Act to freeze bank accounts of people who donated to trucker protests. No court order needed. Over 200 accounts were frozen overnight. But Bitcoin donations kept flowing. &lt;br> &lt;br>Organizers distributed 14+ BTC directly to protesters. The government couldn't touch those funds. In 2024, a court ruled the freezes unconstitutional. The lesson: custodial money can be weaponized.&lt;/p>
&lt;/div>
&lt;a href="https://fortune.com/2022/03/15/how-canada-protest-crypto-crackdown-made-the-case-for-bitcoin-self-custody-nick-neuman/" class="interactive-list__link" target="_blank" rel="noopener">Read full article →&lt;/a>
&lt;/div>
&lt;div class="interactive-list__panel" role="tabpanel" id="panel-russia">
&lt;div class="interactive-list__content">
&lt;p>After Russia invaded Ukraine in 2022, Western sanctions cut Russian banks from SWIFT. Suddenly, Russians abroad couldn't access their money. Many turned to crypto, not to evade sanctions, but to survive. &lt;br> &lt;br>Meanwhile, Ukrainians used Bitcoin to receive donations and preserve savings. The same technology served people on both sides of a conflict, based on their individual needs. Bitcoin doesn't pick sides.&lt;/p>
&lt;/div>
&lt;a href="https://us.boell.org/en/2022/04/08/crypto-both-sides-russia-ukraine-war" class="interactive-list__link" target="_blank" rel="noopener">Read full article →&lt;/a>
&lt;/div>
&lt;div class="interactive-list__panel" role="tabpanel" id="panel-argentina">
&lt;div class="interactive-list__content">
&lt;p>Argentina suffered 211% inflation in 2023 under decades of big-government policies. Then Javier Milei took office. He halved ministries, cut 40,000 government jobs, and ended monetary financing. Result: inflation dropped to 117% in 2024, then 31% by end of 2025—lowest in seven years. GDP grew 7.6% in Q2 2025, the strongest in two decades. &lt;br> &lt;br>Poverty fell from 57% to 32%. Smaller government, sound money principles. Bitcoin adoption remains high—Argentines learned not to trust any currency they can't verify themselves.&lt;/p>
&lt;/div>
&lt;a href="https://www.aljazeera.com/economy/2025/7/25/milei-tames-inflation-but-argentines-still-struggle-to-afford-basics" class="interactive-list__link" target="_blank" rel="noopener">Read full article →&lt;/a>
&lt;/div>
&lt;div class="interactive-list__panel" role="tabpanel" id="panel-remittances">
&lt;div class="interactive-list__content">
&lt;p>Migrant workers send $700 billion home every year. Traditional services like Western Union take 6-10% in fees. For a worker sending $200, that's $20 gone. Money their family desperately needs. &lt;br> &lt;br>Bitcoin and Lightning Network transfer value across borders for cents, settling in minutes instead of days. Companies like Bitso processed $8 billion in crypto remittances in 2023. Cheaper transfers mean more food on the table.&lt;/p>
&lt;/div>
&lt;a href="https://www.coindesk.com/consensus-magazine/2023/04/17/send-globally-crypto-remittance-service" class="interactive-list__link" target="_blank" rel="noopener">Read full article →&lt;/a>
&lt;/div>
&lt;div class="interactive-list__panel" role="tabpanel" id="panel-etfs">
&lt;div class="interactive-list__content">
&lt;p>In January 2024, the SEC approved Bitcoin ETFs for the first time. Within months, institutional investment surged 400%. By end of 2024, professional investors held $27.4 billion in Bitcoin ETFs—over 26% of total AUM. BlackRock's IBIT alone reached $50 billion. &lt;br> &lt;br>Bitcoin was no longer just for early adopters. Wall Street called it "year zero of institutional adoption." The asset that banks once dismissed now sits in pension funds.&lt;/p>
&lt;/div>
&lt;a href="https://www.cnbc.com/2024/01/10/sec-approves-rule-changes-that-pave-the-way-for-bitcoin-etfs.html" class="interactive-list__link" target="_blank" rel="noopener">Read full article →&lt;/a>
&lt;/div>
&lt;div class="interactive-list__panel" role="tabpanel" id="panel-gaza">
&lt;div class="interactive-list__content">
&lt;p>When cash imports into Gaza were blocked in 2024, banking infrastructure collapsed. Traditional transfers charged 30%+ fees—if they worked at all. Bitcoin became a lifeline. One volunteer sent $123,000 in BTC that bought food, water, and built shelters for displaced families. &lt;br> &lt;br>A taxi driver named Yusef received $48k in Bitcoin donations and built 100 tents. When banks fail, Bitcoin still works. No permission needed.&lt;/p>
&lt;/div>
&lt;a href="https://bitcoinmagazine.com/culture/palestinian-taxi-driver-uses-bitcoin-to-save-civilians-in-gaza-" class="interactive-list__link" target="_blank" rel="noopener">Read full article →&lt;/a>
&lt;/div>
&lt;div class="interactive-list__panel" role="tabpanel" id="panel-usreserve">
&lt;div class="interactive-list__content">
&lt;p>On March 6, 2025, President Trump signed an executive order establishing a Strategic Bitcoin Reserve—a "digital Fort Knox." The reserve holds ~200,000 BTC from seized assets, with a policy never to sell. &lt;br> &lt;br>The U.S. had lost $17 billion selling seized bitcoin too early. Now it's holding. Pakistan announced its own reserve weeks later. Nations that once dismissed Bitcoin now compete to accumulate it.&lt;/p>
&lt;/div>
&lt;a href="https://www.whitehouse.gov/fact-sheets/2025/03/fact-sheet-president-donald-j-trump-establishes-the-strategic-bitcoin-reserve-and-u-s-digital-asset-stockpile/" class="interactive-list__link" target="_blank" rel="noopener">Read full article →&lt;/a>
&lt;/div>
&lt;div class="interactive-list__panel" role="tabpanel" id="panel-machado">
&lt;div class="interactive-list__content">
&lt;p>María Corina Machado won the 2025 Nobel Peace Prize for fighting Venezuela's dictatorship. Her campaign runs on Bitcoin because "bank wires get blocked, but bitcoin donations cannot be seized." With the bolívar down 98% in a decade and 8,000%+ inflation, Bitcoin became "a vital means of resistance." &lt;br> &lt;br>She promised a democratic Venezuela would embrace Bitcoin in its national reserves. Freedom money for a freedom fighter.&lt;/p>
&lt;/div>
&lt;a href="https://cointelegraph.com/news/nobel-prize-maria-corina-machado-pro-bitcoin" class="interactive-list__link" target="_blank" rel="noopener">Read full article →&lt;/a>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;h2 id="common-objections">Common Objections&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>“It’s used for crime.”&lt;/strong> So is cash. The difference: Bitcoin leaves a permanent, traceable record. The blockchain is a &lt;a rel="external" href="https://www.chainalysis.com/blog/2025-crypto-crime-report-introduction/">forensic tool&lt;/a>. Most criminals prefer dollars.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>“It’s too volatile.”&lt;/strong> True in the short term. Zoom out: Bitcoin has been the &lt;a rel="external" href="https://www.coingecko.com/research/publications/bitcoin-versus-traditional-assets-price-returns">best-performing asset of the last decade&lt;/a>. Volatility decreases as adoption grows. Don’t invest money you need next month.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>“It wastes energy.”&lt;/strong> Bitcoin mining uses electricity to secure a trillion-dollar network. Much of it comes from &lt;a rel="external" href="https://k33.com/research/archive/articles/bitcoin-mining-using-stranded-natural-gas-is-the-most-cost-effective-way-to">stranded energy&lt;/a> (gas flares, excess hydro) that would otherwise be wasted. The real question: is financial sovereignty worth the energy cost? Air conditioning uses more.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>“It’s too late to buy.”&lt;/strong> People said this at $100, $1,000, $10,000, and $100,000. If Bitcoin achieves even a fraction of &lt;a rel="external" href="https://8marketcap.com/">gold’s market cap&lt;/a>, there’s still room to grow.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h2 id="honest-caveats">Honest Caveats&lt;/h2>
&lt;p>Bitcoin isn’t perfect. Things to be aware of:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Self-custody requires responsibility.&lt;/strong> Lose your seed phrase, lose your funds. No customer support.&lt;/li>
&lt;li>&lt;strong>Irreversibility.&lt;/strong> No chargebacks. Send to the wrong address? Gone.&lt;/li>
&lt;li>&lt;strong>Learning curve.&lt;/strong> Wallets, keys, fees, P2P trading. The more you learn, the more sovereignty you gain. KYC exchanges are easier but come with regulatory strings attached.&lt;/li>
&lt;li>&lt;strong>Privacy takes effort.&lt;/strong> The blockchain is transparent, not anonymous. True privacy requires learning how to use Bitcoin properly.&lt;/li>
&lt;li>&lt;strong>Scaling tradeoffs.&lt;/strong> Base layer is slow by design. Lightning adds speed but also complexity.&lt;/li>
&lt;/ul>
&lt;p>None of these are dealbreakers. They’re tradeoffs. The more you learn, the fewer limitations you face.&lt;/p>
&lt;p>&lt;img src="/images/blog/2025-12-21/footer.jpg" alt="blog-cover" />&lt;/p>
&lt;h2 id="bitcoin-today">Bitcoin Today&lt;/h2>
&lt;p>This isn’t just theory anymore.&lt;/p>
&lt;h3 id="institutional-adoption">Institutional adoption&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>US Bitcoin ETFs&lt;/strong> approved in 2024, bringing billions in institutional money (&lt;a rel="external" href="https://www.cnbc.com/2024/01/10/sec-approves-rule-changes-that-pave-the-way-for-bitcoin-etfs.html">source&lt;/a>)&lt;/li>
&lt;li>&lt;strong>Strategy&lt;/strong> holds 660.000+ BTC as corporate treasury, inspiring others (&lt;a rel="external" href="https://www.strategy.com/purchases">source&lt;/a>)&lt;/li>
&lt;li>&lt;strong>Major banks&lt;/strong> now offer Bitcoin custody and trading services to clients&lt;/li>
&lt;li>&lt;strong>Pension funds&lt;/strong> and asset managers are adding Bitcoin to portfolios&lt;/li>
&lt;/ul>
&lt;h3 id="global-adoption">Global adoption&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Central African Republic&lt;/strong> adopted Bitcoin as legal tender in 2022 (&lt;a rel="external" href="https://www.cnbc.com/2022/04/28/central-african-republic-adopts-bitcoin-as-legal-tender.html">source&lt;/a>)&lt;/li>
&lt;li>&lt;strong>Switzerland&lt;/strong> allows tax payments in Bitcoin in Canton Zug since 2021 (&lt;a rel="external" href="https://zg.ch/de/steuern-finanzen/steuern/steuerbezug/taxpaymentswithcryptocurrencies">source&lt;/a>)&lt;/li>
&lt;li>&lt;strong>Emerging markets&lt;/strong> lead in grassroots adoption: Vietnam, Philippines, Nigeria&lt;/li>
&lt;/ul>
&lt;h3 id="real-world-usage">Real-world usage&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Square&lt;/strong> accepts Bitcoin payments since Nov. 2025 for 4M+ merchants (&lt;a rel="external" href="https://squareup.com/us/en/press/block-to-roll-out-bitcoin-payments-on-square">source&lt;/a>)&lt;/li>
&lt;li>&lt;strong>Lightning Network&lt;/strong> (LN) processes millions of instant payments monthly (&lt;a rel="external" href="https://lightning.network/">source&lt;/a>)&lt;/li>
&lt;li>&lt;strong>Merchants worldwide&lt;/strong> accept Bitcoin, from small shops to major retailers (&lt;a rel="external" href="https://btcmap.org/">source&lt;/a>)&lt;/li>
&lt;/ul>
&lt;p>You can dismiss it, or you can understand it.&lt;/p>
&lt;hr />
&lt;h2 id="getting-started">Getting Started&lt;/h2>
&lt;p>Bitcoin is money that no one controls and everyone can verify. It’s scarce in a world of infinite money printing. It’s permissionless in a world of financial gatekeepers. It’s programmable in ways we’re only beginning to explore.&lt;/p>
&lt;p>Understanding Bitcoin doesn’t require believing it will change the world. It requires understanding what money is, how it evolved, and why these properties matter. From there, you can form your own conclusions.&lt;/p>
&lt;h3 id="want-to-try">Want to try?&lt;/h3>
&lt;p>The best way to understand Bitcoin is to use it:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Start small&lt;/strong>: Buy a small amount on a trusted Bitcoin-only platform like:
&lt;ul>
&lt;li>&lt;a rel="external" href="https://21bitcoin.app/">21bitcoin&lt;/a> or &lt;a rel="external" href="https://relai.app/">Relai&lt;/a>: Simple apps for automatic Bitcoin savings&lt;/li>
&lt;li>&lt;a rel="external" href="https://hodlhodl.com/">HodlHodl&lt;/a>: Peer-to-peer trading, non-custodial&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Move it to your own wallet&lt;/strong>: Download a mobile wallet and transfer your Bitcoin there. Feel what self-custody means. Some wallets like &lt;a rel="external" href="https://bluewallet.io/">BlueWallet&lt;/a>, &lt;a rel="external" href="https://nunchuk.io/">Nunchuk&lt;/a>.&lt;/li>
&lt;li>&lt;strong>Send a transaction&lt;/strong>: Send some sats to a friend. Watch it confirm in ~10 minutes. Get curious looking at your transaction in the &lt;a rel="external" href="https://mempool.space/">mempool&lt;/a>.&lt;/li>
&lt;li>&lt;strong>Try Lightning&lt;/strong>: Send an instant, near-free payment. This is the future of everyday transactions. Some LN wallets like &lt;a rel="external" href="https://getalby.com/alby-go">Alby Go&lt;/a>, &lt;a rel="external" href="https://muun.com/">Muun&lt;/a>.&lt;/li>
&lt;/ol>
&lt;p>You don’t have to go all in. Start small and keep learning, one step at a time.&lt;/p>
&lt;p>&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/Pef22g53zsg"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;strong>Further reading&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;a rel="external" href="https://cosmevalera.dev/blog/bitcoin-101/">Bitcoin 101&lt;/a> &lt;small>by Cosme - Another beginner-friendly introduction&lt;/small>&lt;/li>
&lt;li>&lt;a rel="external" href="https://cosmevalera.dev/blog/bitcoin-102/">How to Buy Bitcoin Securely&lt;/a> &lt;small>by Cosme - Step-by-step guide&lt;/small>&lt;/li>
&lt;/ul></content></entry><entry xml:lang="en"><title>AI Gives You Speed, Not Quality</title><subtitle>The human factor in the age of vibe-coding</subtitle><category term="ai" scheme="https://chemaclass.com/tags/ai/" label="Ai"/><category term="software-architecture" scheme="https://chemaclass.com/tags/software-architecture/" label="Software Architecture"/><category term="craftsmanship" scheme="https://chemaclass.com/tags/craftsmanship/" label="Craftsmanship"/><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><published>2025-10-10T00:00:00+00:00</published><updated>2025-10-10T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/ai-gives-you-speed-not-quality/"/><id>https://chemaclass.com/blog/ai-gives-you-speed-not-quality/</id><summary type="html">AI accelerates your output but doesn't ensure quality. You're responsible for every line you commit. Speed without direction is chaos.</summary><content type="html">&lt;p>I’ve been using AI coding assistants extensively: ChatGPT, Codex, Claude with Sonnet and Opus. They’re incredibly helpful. They give you speed like nothing else.&lt;/p>
&lt;p>But speed isn’t quality.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h2 id="the-vibe-coding-trap">The vibe-coding trap&lt;/h2>
&lt;p>AI models are excellent at imitating their surroundings. Give them context, and they’ll do whatever it takes to complete the task. This has become known as &lt;em>“vibe-coding”&lt;/em>: you describe what you want, and the AI produces something that works. Fast.&lt;/p>
&lt;p>The problem? AI will happily generate messy code if that’s what gets the job done. It doesn’t care about maintainability. It doesn’t think about what happens when requirements change next month. It just produces output.&lt;/p>
&lt;blockquote>
&lt;p>AI is a mirror that reflects the context you give it. If your codebase is messy, it will generate more mess. If your prompts are vague, it will make assumptions.&lt;/p>
&lt;/blockquote>
&lt;p>Without careful guidance, you end up with patches on top of patches. Freshly created legacy code. A codebase where every change feels risky and the team spends more time fighting the code than building features.&lt;/p>
&lt;h2 id="the-art-of-asking">The art of asking&lt;/h2>
&lt;p>Remember Stack Overflow? Google searches that led you to forum threads from 2011 where someone had the exact same problem?&lt;/p>
&lt;p>Ten years ago, being a developer meant learning how to ask good questions. You’d craft your Stack Overflow post carefully: describe the problem, show what you tried, explain what you expected versus what happened. If your question was vague or lazy, the community would let you know. Sometimes harshly.&lt;/p>
&lt;p>But that friction taught us something valuable: &lt;strong>the quality of your answer depends on the quality of your question&lt;/strong>.&lt;/p>
&lt;p>The same principle applies to AI. A vague prompt gets a vague response. A well-structured prompt with clear context, constraints, and examples gets something useful. The skill of formulating good questions didn’t become obsolete. It became more important.&lt;/p>
&lt;blockquote>
&lt;p>Learning to prompt AI effectively is the modern equivalent of learning to search Google and ask Stack Overflow. The developers who master this will get better results.&lt;/p>
&lt;/blockquote>
&lt;p>Even when AI gives you a fast, impressive-looking answer, &lt;strong>never accept code you don’t fully understand&lt;/strong>. It’s tempting. The response appears in seconds, it looks professional, it might even work. But if you can’t explain what it does and why, you’re planting a time bomb in your codebase. And when it breaks at 2am, you’ll be debugging code you didn’t write with no mental model of why it exists.&lt;/p>
&lt;p>Challenge the output. Ask: &lt;em>“Can you simplify this?”&lt;/em> or &lt;em>“Is there boilerplate here we can remove?”&lt;/em> AI’s default is to add, not to improve. It will generate abstractions, helper functions, and patterns you didn’t ask for. It won’t refactor unless you tell it to. Push back.&lt;/p>
&lt;p>This is especially critical with tests. Ask AI to generate tests and you’ll often get tests that mirror implementation details rather than behavior. They’ll break the moment you refactor, even if the logic stays the same. If you want tests that verify behavior, you need to explicitly say so. AI won’t make that choice for you.&lt;/p>
&lt;blockquote>
&lt;p>Don’t be seduced by speed. Sometimes, a fast answer you don’t understand is worse than a slow answer you do.&lt;/p>
&lt;/blockquote>
&lt;h2 id="the-human-factor">The human factor&lt;/h2>
&lt;p>AI can write code fast, but it can’t understand overall architecture. It doesn’t know why certain decisions were made months ago. It can’t see the bigger picture of where the product is heading. It only sees what you show it, making local decisions without understanding global implications. That’s our job.&lt;/p>
&lt;p>As I explored in &lt;a href="/blog/different-beliefs-about-software-quality">different beliefs about software quality&lt;/a>, teams often have varying standards for what &lt;em>“good enough”&lt;/em> means. When you add AI to the mix, maintaining that shared understanding becomes even more critical. The AI doesn’t share your team’s values. It just generates code.&lt;/p>
&lt;blockquote>
&lt;p>The discipline to maintain clean architecture, to say &lt;em>“no”&lt;/em> to quick hacks, to refactor before things get worse. That’s uniquely human.&lt;/p>
&lt;/blockquote>
&lt;p>Books like &lt;a href="/readings/clean-code/">Clean Code&lt;/a> and &lt;a href="/readings/clean-architecture/">Clean Architecture&lt;/a> aren’t less relevant in the AI age. They’re more relevant. They help you spot when AI is heading in the wrong direction.&lt;/p>
&lt;h2 id="collaboration-over-automation">Collaboration over automation&lt;/h2>
&lt;p>There’s something else AI can’t replace: the team.&lt;/p>
&lt;p>A conversation with a colleague about &lt;em>“should we extract this into a service?”&lt;/em> often leads to insights that no AI prompt would surface. That back-and-forth, the pushback, the &lt;em>“what if we tried this instead”&lt;/em>. That’s where real understanding happens.&lt;/p>
&lt;p>&lt;a href="/readings/extreme-programming-explained/">Extreme Programming Explained&lt;/a> emphasizes practices like pair programming and collective code ownership for good reason. These aren’t inefficiencies to be automated away. They’re how teams build quality into their process.&lt;/p>
&lt;p>When you skip the human discussion and just let AI generate solutions, you lose the opportunity to learn, to challenge assumptions, and to grow as a team.&lt;/p>
&lt;h2 id="you-own-the-code">You own the code&lt;/h2>
&lt;p>When AI writes code and you commit it, review it, approve it, merge it, and deploy it, &lt;strong>it’s your code&lt;/strong>. You can’t blame the AI when something breaks in production. You can’t point at Claude or Copilot when the architecture becomes unmaintainable.&lt;/p>
&lt;p>As I wrote about &lt;a href="/blog/the-art-of-testing/">the art of testing&lt;/a>, quality is a choice we make at every step. Every commit is a decision. Every review is an opportunity to catch problems. Every merge is an endorsement of the code’s quality.&lt;/p>
&lt;blockquote>
&lt;p>We are the ultimate responsible party for the code AI writes. The commit, the review, the approval, the merge, the deploy. That’s all us.&lt;/p>
&lt;/blockquote>
&lt;p>Moving fast in the wrong direction just gets you lost faster. Lines of code appearing on screen isn’t progress. The value we bring as developers isn’t typing speed. Our value is in understanding where we’re going, maintaining discipline over chaos, and ensuring that the code we ship today doesn’t become tomorrow’s nightmare.&lt;/p>
&lt;p>Use AI. Embrace the speed. But never forget: &lt;strong>you’re the one steering&lt;/strong>. If you let go of the wheel, you’ll end up in a pile of unmaintainable code faster than you expected.&lt;/p>
&lt;p>And when that happens, there’s no one else to blame.&lt;/p>
&lt;p>&lt;img src="/images/blog/2025-12-02/footer.jpg" alt="cover" />&lt;/p></content></entry><entry xml:lang="en"><title>What Success Means to Me</title><subtitle>A simple definition that changed how I live</subtitle><category term="philosophy" scheme="https://chemaclass.com/tags/philosophy/" label="Philosophy"/><category term="career" scheme="https://chemaclass.com/tags/career/" label="Career"/><category term="productivity" scheme="https://chemaclass.com/tags/productivity/" label="Productivity"/><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><published>2025-09-15T00:00:00+00:00</published><updated>2025-09-15T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/what-success-means-to-me/"/><id>https://chemaclass.com/blog/what-success-means-to-me/</id><summary type="html">Success is waking up knowing that what you do makes the people around you, and yourself, happier. No complex formula. Just consistency over perfection, and building habits that align with what matters.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2025-11-15/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>For the longest time, I thought success was about hitting certain milestones. Getting that promotion. Earning a specific salary. Building something that people would recognize.&lt;/p>
&lt;p>But I’ve realized that’s not what gets me out of bed in the morning.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h2 id="the-real-measure">The real measure&lt;/h2>
&lt;p>Success, for me, is straightforward now: &lt;strong>waking up knowing that what I do makes the people around me —and myself— happier&lt;/strong>.&lt;/p>
&lt;p>It took me a while to get here. This definition might not feel simple to everyone, and that’s okay. But for me, it clarified everything.&lt;/p>
&lt;p>No complex formula. No checklist of achievements.&lt;/p>
&lt;blockquote>
&lt;p>Success is about those small moments when you help a colleague solve a tricky problem, when you share something that makes someone smile, or when you finish the day feeling like you actually added some good to the world.&lt;/p>
&lt;/blockquote>
&lt;p>This applies whether you’re leading a team or just showing up as yourself. As I wrote about &lt;a href="/blog/great-leadership">great leadership&lt;/a>, real leadership starts with your own life and behavior—it’s fundamentally about making the people around you better, not just achieving targets.&lt;/p>
&lt;h2 id="why-happiness-matters">Why happiness matters&lt;/h2>
&lt;p>I used to think that focusing on happiness was somehow trivial. Like it wasn’t “serious” enough as a goal. But I’ve learned that making people happy —genuinely happy— is one of the hardest and most rewarding things you can do.&lt;/p>
&lt;h3 id="what-does-this-mean-in-practice">What does this mean in practice?&lt;/h3>
&lt;ul>
&lt;li>Being present when someone needs you&lt;/li>
&lt;li>Creating things that solve real problems&lt;/li>
&lt;li>Choosing kindness over being right&lt;/li>
&lt;li>Finding joy in what you do, even on tough days&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>When you focus on making others happier, you usually end up happier yourself. It’s not zero-sum. It compounds.&lt;/p>
&lt;/blockquote>
&lt;p>This connects deeply with &lt;a href="/blog/understanding-people">understanding people&lt;/a> and how they think. When you truly understand that everyone processes the world differently, you become better at creating genuine happiness — not just what you think should make them happy.&lt;/p>
&lt;h2 id="the-daily-practice">The daily practice&lt;/h2>
&lt;h3 id="how-does-this-look-in-daily-life">How does this look in daily life?&lt;/h3>
&lt;p>For me, it’s about checking in with myself regularly: “Did what I do today make things better?” Not perfect. Not revolutionary. Just better.&lt;/p>
&lt;p>Sometimes that’s writing code that helps a team work more smoothly. Sometimes it’s taking time to really listen to someone. Sometimes it’s just being patient when everything feels chaotic.&lt;/p>
&lt;p>It’s not always easy. Some days you miss the mark. But having this simple definition of success makes decisions clearer. When you’re wondering whether to take on a project, accept an opportunity, or say no to something, you can ask yourself: “Will this make me and the people around me happier?”&lt;/p>
&lt;h3 id="consistency-over-perfectionism">Consistency over perfectionism&lt;/h3>
&lt;p>Here’s something I’ve learned the hard way: &lt;strong>success is built through consistency, not perfection&lt;/strong>.&lt;/p>
&lt;p>Perfectionism will paralyze you. It whispers that nothing is good enough, that you should wait until conditions are ideal, that one mistake invalidates everything. It’s a trap.&lt;/p>
&lt;p>What actually works? Showing up. Day after day. Building small habits that compound over time.&lt;/p>
&lt;p>As James Clear explains in &lt;a href="/readings/atomic-habits/">Atomic Habits&lt;/a>, real change comes from the compound effect of hundreds of small decisions. You don’t need to be perfect. You need to be consistent.&lt;/p>
&lt;blockquote>
&lt;p>Don’t try to make a habit perfect, just repeat it.&lt;/p>
&lt;/blockquote>
&lt;p>This means:&lt;/p>
&lt;ul>
&lt;li>Writing a few lines of code every day beats waiting for the perfect architecture&lt;/li>
&lt;li>Having a short, genuine conversation beats waiting for the perfect moment&lt;/li>
&lt;li>Making small improvements consistently beats waiting for the big breakthrough&lt;/li>
&lt;/ul>
&lt;p>The goal isn’t to never fail. It’s to build habits that align with making yourself and others happier, and to keep showing up even when you stumble.&lt;/p>
&lt;blockquote>
&lt;p>This is where &lt;a href="/blog/the-process-itself-is-the-goal">the process itself becomes the goal&lt;/a>. It’s not about reaching some final destination of “being successful” — it’s about building daily habits and practices that align with what actually matters to you.&lt;/p>
&lt;/blockquote>
&lt;h2 id="success-is-personal">Success is personal&lt;/h2>
&lt;p>Your definition of success will probably be different from mine, and that’s not just okay — it’s necessary.&lt;/p>
&lt;p>“&lt;a href="/blog/have-you-always-been-like-this">Have I always been like this?&lt;/a>” The answer is no. I certainly wasn’t. Our understanding of what matters evolves as we grow. That’s part of the journey.&lt;/p>
&lt;p>If you’re feeling stuck or unsure about what you’re working toward, try this: &lt;strong>figure out what truly makes you and the people you care about happier&lt;/strong>. Not what you think should make you happy. Not what looks impressive from the outside.&lt;/p>
&lt;p>Just what actually works for you.&lt;/p>
&lt;p>And be ready to &lt;a href="/blog/embrace-the-change">embrace the change&lt;/a> when your definition shifts — &lt;strong>because it will&lt;/strong>. What success means to you today might look different tomorrow. That’s not failure. That’s growth.&lt;/p>
&lt;hr />
&lt;blockquote>
&lt;p>At the end of the day, if you wake up knowing that what you do brings more happiness into the world —including your own— you’re probably doing something right.&lt;/p>
&lt;/blockquote>
&lt;p>That feels like success to me.&lt;/p>
&lt;p>&lt;img src="/images/blog/2025-11-15/footer.jpg" alt="cover" />&lt;/p>
&lt;hr />
&lt;p>&lt;strong>Thanks&lt;/strong> to my friend Toni, for &lt;a rel="external" href="https://x.com/Chemaclass/status/1989652323925377462">bringing up&lt;/a> this question and inspiring this reflection.&lt;/p></content></entry><entry xml:lang="en"><title>Principles of Economics</title><category term="economics" scheme="https://chemaclass.com/tags/economics/" label="Economics"/><category term="bitcoin" scheme="https://chemaclass.com/tags/bitcoin/" label="Bitcoin"/><category term="philosophy" scheme="https://chemaclass.com/tags/philosophy/" label="Philosophy"/><category term="career" scheme="https://chemaclass.com/tags/career/" label="Career"/><published>2025-06-22T00:00:00+00:00</published><updated>2025-06-22T00:00:00+00:00</updated><author><name>
Saifedean Ammous</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/principles-of-economics/"/><id>https://chemaclass.com/readings/principles-of-economics/</id><summary type="html">If you've ever scratched your head at the economy, wondered why prices keep rising, or questioned why money seems to lose value over time, Principles of Economics by Saifedean Ammous might blow your mind. It's not your typical dry economics book. Instead, it's a bold, no-nonsense guide to understanding how the world really works—through the lens of Austrian economics. Here's what stood out to me.</summary><content type="html">&lt;p>If you’ve ever scratched your head at the economy, wondered why prices keep rising, or questioned why money seems to lose value over time, Principles of Economics by Saifedean Ammous might blow your mind.&lt;/p>
&lt;p>It’s not your typical dry economics book. Instead, it’s a bold, no-nonsense guide to understanding how the world really works—through the lens of Austrian economics. Here’s what stood out to me.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h2 id="1-economics-human-action">1. Economics = Human Action&lt;/h2>
&lt;p>Ammous starts with something super simple but powerful: economics is just people making choices. Every time we choose to do one thing over another, that’s economics in action.&lt;/p>
&lt;p>Forget all the charts and equations you might’ve seen in school — real economics begins with you trying to make life better, one decision at a time.&lt;/p>
&lt;h2 id="2-time-preference-how-much-you-value-the-future">2. Time Preference = How Much You Value the Future&lt;/h2>
&lt;p>This idea was a game-changer: your time preference is how much you value stuff now vs. later.&lt;/p>
&lt;ul>
&lt;li>If you spend everything today, you’ve got a high time preference.&lt;/li>
&lt;li>If you save and plan for tomorrow, you’ve got a low time preference.&lt;/li>
&lt;/ul>
&lt;p>Low time preference leads to building cool things. Like businesses, families, skyscrapers, or even civilizations. High time preference? That’s fast food, impulse buying, and short-term thinking.&lt;/p>
&lt;h2 id="3-good-money-strong-society">3. Good Money = Strong Society&lt;/h2>
&lt;p>The quality of a society’s money affects everything. If your money constantly loses value (&lt;em>hello, inflation&lt;/em>), people stop saving and start living for today.&lt;/p>
&lt;p>He argues that government-controlled “fiat” money is the problem — and we need a return to “hard money” (like gold or &lt;a href="/tags/bitcoin/">Bitcoin&lt;/a>) that holds its value over time. Good money helps people plan, save, and grow wealth across generations.&lt;/p>
&lt;h2 id="4-producing-stuff-takes-time-and-that-matters">4. Producing Stuff Takes Time — and That Matters&lt;/h2>
&lt;p>Making things isn’t instant. It takes time, tools, and planning. Ammous explains how advanced economies only exist because people invest in long-term production: factories, machines, supply chains.&lt;/p>
&lt;p>That’s only possible when people trust their money and their future. So again, low time preference is key.&lt;/p>
&lt;h2 id="5-entrepreneurs-not-governments-drive-progress">5. Entrepreneurs, Not Governments, Drive Progress&lt;/h2>
&lt;p>If there’s a hero in this book, it’s &lt;strong>the entrepreneur&lt;/strong> — the person who &lt;strong>takes risks&lt;/strong>, builds businesses, and &lt;strong>creates value&lt;/strong>.&lt;/p>
&lt;p>Ammous has zero love for central planners, regulations, or government bailouts. He’s all about free markets and letting smart people solve problems without interference. When prices are honest and money is sound, people figure things out on their own.&lt;/p>
&lt;h2 id="6-inflation-and-central-planning-big-red-flags">6. Inflation and Central Planning? Big Red Flags&lt;/h2>
&lt;p>Ammous doesn’t pull punches. He’s very critical of how governments manage money and the economy.&lt;/p>
&lt;p>He sees inflation as a sneaky form of theft and believes that constant meddling (like printing money or setting interest rates) only makes things worse. He even calls out entire fields like climate economics and ESG as being more about politics than real economics.&lt;/p>
&lt;h2 id="7-bitcoin-the-grand-finale">7. Bitcoin: The Grand Finale&lt;/h2>
&lt;p>While this book isn’t just about Bitcoin, it clearly leads there. After explaining why our current money system is broken, Ammous points to Bitcoin as the best solution we’ve seen in over a century.&lt;/p>
&lt;p>It’s digital, limited, and no one can mess with it. Bitcoin is the return of sound money, and a chance to fix a lot of what’s wrong today.&lt;/p>
&lt;h2 id="final-thoughts-a-crash-course-in-real-economics">Final Thoughts: A Crash Course in Real Economics&lt;/h2>
&lt;p>“Principles of Economics” is like an economics red pill. It’s straightforward, bold, and sometimes brutal. But if you’re tired of the usual financial nonsense, this book will hit you like a breath of fresh air.&lt;/p>
&lt;p>You’ll walk away with a new lens to see the world—why prices rise, why saving matters, and why the kind of money we use shapes everything.&lt;/p>
&lt;h2 id="austrian-economics-vs-keynesian-economics">Austrian Economics vs Keynesian Economics&lt;/h2>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/GUvTJ0xy74c"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>Ship, Show, Ask</title><subtitle>Culture-Driven Collaboration at the speed of code</subtitle><category term="agile" scheme="https://chemaclass.com/tags/agile/" label="Agile"/><category term="code-review" scheme="https://chemaclass.com/tags/code-review/" label="Code Review"/><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><category term="productivity" scheme="https://chemaclass.com/tags/productivity/" label="Productivity"/><published>2025-04-12T00:00:00+00:00</published><updated>2025-04-12T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/ship-show-ask/"/><id>https://chemaclass.com/blog/ship-show-ask/</id><summary type="html">In fast-moving teams, one of the biggest tensions we face is this: How do we keep shipping without compromising quality or collaboration? The traditional approach to pull requests often slows things down. We wait hours—or days—for approvals, even for trivial changes. But the alternative—just merging directly—can feel reckless or invisible to the rest of the team. That's where the Ship-Show-Ask strategy comes in.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2025-04-12/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>In fast-moving teams, one of the biggest tensions we face is this: How do we keep shipping without compromising quality or collaboration?&lt;/p>
&lt;p>The traditional approach to pull requests often slows things down. We wait hours—or days—for approvals, even for trivial changes. But the alternative—just merging directly—can feel reckless or invisible to the rest of the team.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>That’s where the Ship-Show-Ask strategy comes in. Originally described by &lt;a rel="external" href="https://martinfowler.com/articles/ship-show-ask.html">Rouan Wilsenach&lt;/a>, this model offers a more flexible and thoughtful way to handle code changes. It’s not just a branching strategy—it’s a shift in how teams collaborate, trust, and take ownership.&lt;/p>
&lt;h2 id="what-is-ship-show-ask">What is Ship, Show, Ask?&lt;/h2>
&lt;p>It’s a model that classifies changes based on how much review they require:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Ship&lt;/strong> – Merge directly to main (without a PR)&lt;/li>
&lt;li>&lt;strong>Show&lt;/strong> – Open a pull request, but merge it immediately&lt;/li>
&lt;li>&lt;strong>Ask&lt;/strong> – Open a pull request and wait for review&lt;/li>
&lt;/ul>
&lt;p>The key idea is to use Ask as the default for most work, fall back to Show when the context makes it safe, and avoid Ship (or reserve it for extremely trivial cases, if used at all).&lt;/p>
&lt;h2 id="why-i-prefer-to-ask-and-show">Why I prefer to Ask and Show&lt;/h2>
&lt;p>In my experience, it helps to treat every change—even the small ones—as something worth sharing. I always create a branch and open a PR. It provides visibility, builds a shared history, and creates a space for optional or asynchronous feedback.&lt;/p>
&lt;p>But not all PRs need to follow the same review process.&lt;/p>
&lt;h3 id="i-default-to-ask">I default to Ask&lt;/h3>
&lt;p>I prefer to wait for a peer review when:&lt;/p>
&lt;ul>
&lt;li>The change involves risky or complex logic&lt;/li>
&lt;li>It could impact other developers or teams&lt;/li>
&lt;li>It introduces architectural or structural decisions that haven’t been agreed on yet&lt;/li>
&lt;li>It benefits from shared input or a second pair of eyes&lt;/li>
&lt;/ul>
&lt;p>That said, &lt;strong>Ask doesn’t mean over-engineering the process&lt;/strong>. Often, one thoughtful reviewer is enough—especially if they’re familiar with the domain. If the change touches a specific area, I’ll ask for feedback from the person who owns (or best understands) that part of the code. It doesn’t need to involve everyone.&lt;/p>
&lt;blockquote>
&lt;p>In small teams, requiring two approvals on every PR can quickly become a bottleneck and slow down the delivery of value. The goal is alignment and quality, not ceremony for its own sake.&lt;/p>
&lt;/blockquote>
&lt;h3 id="i-use-show-for-safe-low-impact-changes">I use Show for safe, low-impact changes&lt;/h3>
&lt;p>I might merge immediately when:&lt;/p>
&lt;ul>
&lt;li>Practicing pair programming (the review already happened live)&lt;/li>
&lt;li>Fixing typos or broken links&lt;/li>
&lt;li>Updating documentation or changelogs&lt;/li>
&lt;li>Refactoring within a module I own&lt;/li>
&lt;li>Adding tests for existing behavior&lt;/li>
&lt;li>Making non-functional tweaks (formatting, logs, comments)&lt;/li>
&lt;li>Applying UI or style adjustments with no logic change&lt;/li>
&lt;/ul>
&lt;p>The key principle: &lt;strong>Show is optional—never mandatory&lt;/strong>. I choose Show only if the change is low-risk and fits within team expectations. When I use Show, I own the outcome. The responsibility is mine.&lt;/p>
&lt;h2 id="why-this-approach-works-for-me">Why this approach works for me&lt;/h2>
&lt;p>This model helps me:&lt;/p>
&lt;ul>
&lt;li>Ship faster without compromising quality&lt;/li>
&lt;li>Work with greater autonomy and ownership&lt;/li>
&lt;li>Avoid bottlenecks, especially in small or async teams&lt;/li>
&lt;li>Foster a mindset of trust, accountability, and thoughtful decision-making&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>It shifts the goal from simply getting approval to sharing intent and owning the outcome.&lt;/p>
&lt;/blockquote>
&lt;h2 id="what-makes-a-good-show">What makes a good “Show”?&lt;/h2>
&lt;p>A Show PR might be the right choice when:&lt;/p>
&lt;ul>
&lt;li>The change is trivial and within my area of responsibility&lt;/li>
&lt;li>No one is available to review, and waiting would block progress&lt;/li>
&lt;li>The PR includes clear context and reasoning&lt;/li>
&lt;li>I’m open to post-merge feedback&lt;/li>
&lt;li>I’m ready to follow up with adjustments if needed&lt;/li>
&lt;/ul>
&lt;h2 id="tips-for-making-it-work">Tips for making it work&lt;/h2>
&lt;p>Some practical advice from experience:&lt;/p>
&lt;ul>
&lt;li>Clarify team expectations for when to use Show vs Ask&lt;/li>
&lt;li>Always provide context in your PR—even if merging immediately&lt;/li>
&lt;li>Write tests for any new logic or behavior&lt;/li>
&lt;li>Welcome post-merge feedback—review doesn’t stop at merge&lt;/li>
&lt;li>Reflect regularly as a team and adjust the approach as needed&lt;/li>
&lt;/ul>
&lt;hr />
&lt;p>Ship, Show, Ask is more than just branching hygiene.&lt;/p>
&lt;p>To me, it’s about building a culture of clarity, accountability, and trust—where developers are empowered to move fast while staying thoughtful.&lt;/p>
&lt;p>If you’re tired of slow PR queues and over-engineered approvals, this might be worth a try.&lt;/p>
&lt;blockquote>
&lt;p>Curious to dive deeper? Check out &lt;a rel="external" href="https://martinfowler.com/articles/ship-show-ask.html">Rouan Wilsenach’s post&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="/images/blog/2025-04-12/footer.jpg" alt="footer" />&lt;/p></content></entry><entry xml:lang="en"><title>The Road to Serfdom</title><subtitle>How central planning can slowly erode freedom</subtitle><category term="economics" scheme="https://chemaclass.com/tags/economics/" label="Economics"/><category term="philosophy" scheme="https://chemaclass.com/tags/philosophy/" label="Philosophy"/><category term="privacy" scheme="https://chemaclass.com/tags/privacy/" label="Privacy"/><category term="bitcoin" scheme="https://chemaclass.com/tags/bitcoin/" label="Bitcoin"/><published>2025-03-31T00:00:00+00:00</published><updated>2025-03-31T00:00:00+00:00</updated><author><name>
Friedrich A. Hayek</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/the-road-to-serfdom/"/><id>https://chemaclass.com/readings/the-road-to-serfdom/</id><summary type="html">A quick and plain-English summary of Hayek's classic take on freedom, planning, and why good intentions can still go very wrong.</summary><content type="html">&lt;p>First published in 1944, The Road to Serfdom is still making waves today. Friedrich Hayek, an Austrian economist, wrote it during World War II to warn against something he saw as really dangerous: central economic planning.&lt;/p>
&lt;p>His message? Even well-meaning government control over the economy can quietly take away our freedom—and possibly lead us toward dictatorship.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;hr />
&lt;h2 id="1-the-danger-of-central-planning">1. The danger of central planning&lt;/h2>
&lt;p>Hayek’s main point is simple: &lt;strong>when the government tries to control the economy, it ends up controlling people’s lives too&lt;/strong>. Once the state decides who gets what, it also ends up deciding who can do what.&lt;/p>
&lt;p>Even if it starts out with good intentions, it eventually leads to force—because people have different goals, and planners can’t make everyone happy.&lt;/p>
&lt;blockquote>
&lt;p>“Controlling the economy means controlling everything people want to do. (Chapter 7)”&lt;/p>
&lt;/blockquote>
&lt;h2 id="2-the-illusion-of-good-socialism">2. The illusion of “good” socialism&lt;/h2>
&lt;p>Some folks believe in democratic socialism—mixing freedom with shared planning. Hayek wasn’t buying it.&lt;/p>
&lt;p>He says &lt;strong>you can’t really separate socialism from authoritarianism&lt;/strong>, because planning on behalf of “the group” means ignoring individual choices. Over time, the people running the system need to silence anyone who disagrees. That opens the door to the worst kinds of leaders.&lt;/p>
&lt;blockquote>
&lt;p>“The worst get on top. (Chapter 10)”&lt;/p>
&lt;/blockquote>
&lt;h2 id="3-rule-of-law-vs-rule-by-discretion">3. Rule of law vs. Rule by discretion&lt;/h2>
&lt;p>In a free society, rules should apply to everyone, be known ahead of time, and stay consistent – like traffic laws.&lt;/p>
&lt;p>But &lt;strong>planning needs flexible rules&lt;/strong>. Bureaucrats need to make calls on the fly, and that gives them a ton of power. Hayek thinks that’s a problem. The more discretion officials have, the less protection individuals have.&lt;/p>
&lt;blockquote>
&lt;p>“Nothing distinguishes more clearly conditions in a free country from those in a country under arbitrary government than the observance in the former of the great principles known as the Rule of Law. (Chapter 6)”&lt;/p>
&lt;/blockquote>
&lt;h2 id="4-markets-work-because-no-one-s-actually-in-charge">4. Markets work because no one’s actually in charge&lt;/h2>
&lt;p>Hayek believed that no planner – no matter how smart – can replace what the market does on its own.&lt;/p>
&lt;p>Why? Because markets use &lt;strong>price signals&lt;/strong> to share info. Millions of people making choices send signals (through prices) about what’s needed and what’s not. Trying to manage all that from the top? Super inefficient – and it usually fails.&lt;/p>
&lt;blockquote>
&lt;p>“The more the state ‘plans’ the more difficult planning becomes for the individual. (Chapter 5)”&lt;/p>
&lt;/blockquote>
&lt;h2 id="5-incremental-loss-of-freedom">5. Incremental loss of freedom&lt;/h2>
&lt;p>Hayek wasn’t warning about overnight dictatorships. He was more concerned about &lt;strong>the slow loss of freedom&lt;/strong> that comes from small steps – price controls here, nationalized industries there.&lt;/p>
&lt;p>Each step might feel harmless, but it adds up. And once people depend too much on the state, it’s hard to say no to the next “solution” from above.&lt;/p>
&lt;blockquote>
&lt;p>“The danger of tyranny inevitably arises from the methods of collectivism. (Chapter 10)”&lt;/p>
&lt;/blockquote>
&lt;hr />
&lt;h2 id="final-thoughts-is-hayek-still-relevant">Final thoughts: Is Hayek still relevant?&lt;/h2>
&lt;p>Totally. While the world has changed, the tension between freedom and control is still very real. Hayek’s ideas remind us that freedom doesn’t usually vanish overnight – it fades when we’re not paying attention.&lt;/p>
&lt;p>Sure, some government help is needed. But Hayek’s warning? Too much control, even with good intentions, can lead us somewhere we don’t want to go.&lt;/p>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/2oG2SLzNo-E"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>Run Your LN Node on a Raspberry Pi</title><subtitle>Take full control of your Lightning payments with Alby Hub</subtitle><category term="bitcoin" scheme="https://chemaclass.com/tags/bitcoin/" label="Bitcoin"/><category term="open-source" scheme="https://chemaclass.com/tags/open-source/" label="Open Source"/><category term="privacy" scheme="https://chemaclass.com/tags/privacy/" label="Privacy"/><category term="tutorial" scheme="https://chemaclass.com/tags/tutorial/" label="Tutorial"/><published>2025-02-17T00:00:00+00:00</published><updated>2025-02-17T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/run-your-ln-node/"/><id>https://chemaclass.com/blog/run-your-ln-node/</id><summary type="html">In this guide, I'll show you how to set up a fully custodial Lightning Network (LN) node using Alby Hub on a Raspberry Pi, giving you complete control over your node. Alby Hub offers a DIY free version for a self-custodial Lightning wallet, ensuring full ownership of your funds while being 100% open-source.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2025-02-17/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>In this guide, I’ll show you how to set up a fully custodial Lightning Network (LN) node using Alby Hub on a Raspberry Pi, giving you complete control over your node. Alby Hub offers a DIY free version for a self-custodial Lightning wallet, ensuring full ownership of your funds while being 100% open-source.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>It supports both Lightning and Nostr addresses, enabling seamless connectivity across ecosystems, and integrates effortlessly with dozens of Bitcoin applications. With built-in Lightning Service Provider (LSP) services and the Alby Go mobile app, managing your node on the go has never been easier.&lt;/p>
&lt;hr />
&lt;blockquote>
&lt;p>Important: This is NOT a Bitcoin miner or a full node. It’s simply a Raspberry Pi running on an SD card power-efficient and low-cost.&lt;/p>
&lt;/blockquote>
&lt;p>⚠️ &lt;strong>Disclaimer&lt;/strong> ⚠️&lt;/p>
&lt;ul>
&lt;li>I assume you &lt;strong>understand &lt;a rel="external" href="https://bitcoin.org/">Bitcoin&lt;/a>&lt;/strong>’s fundamental concepts.&lt;/li>
&lt;li>I assume you know &lt;strong>how the &lt;a rel="external" href="https://lightning.network/">Lightning Network&lt;/a> (LN) works&lt;/strong>.&lt;/li>
&lt;/ul>
&lt;p>Anyway, I’ve included a brief recap of the Lightning Network basics below.&lt;/p>
&lt;h2 id="what-is-the-lightning-network">What is the Lightning Network?&lt;/h2>
&lt;p>The LN is a second-layer solution built on top of Bitcoin to enable fast, cheap, and scalable transactions.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Why?&lt;/strong> Bitcoin’s base layer is secure but slow and expensive for small payments due to block size limits and fees.&lt;/li>
&lt;li>&lt;strong>How?&lt;/strong> LN uses off-chain payment channels that allow users to transact instantly without waiting for blockchain confirmations.&lt;/li>
&lt;/ul>
&lt;h3 id="key-concepts">Key Concepts&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Payment Channels&lt;/strong>: Users open a channel by making an on-chain transaction, then send unlimited instant payments within that channel.&lt;/li>
&lt;li>&lt;strong>Routing&lt;/strong>: You don’t need a direct channel with everyone —payments can be routed through multiple connected nodes.&lt;/li>
&lt;li>&lt;strong>Low Fees&lt;/strong>: Only opening/closing channels require on-chain fees; most transactions cost fractions of a cent.&lt;/li>
&lt;/ul>
&lt;h3 id="goal">Goal&lt;/h3>
&lt;p>LN makes Bitcoin usable for everyday transactions, like buying coffee, without waiting 10+ minutes for confirmations.&lt;/p>
&lt;blockquote>
&lt;p>In short: Lightning Network = Instant + Cheap Bitcoin payments, secured by Bitcoin’s blockchain.&lt;/p>
&lt;/blockquote>
&lt;hr />
&lt;h2 id="setting-up-alby-hub">Setting up Alby Hub&lt;/h2>
&lt;p>&lt;a rel="external" href="https://albyhub.com/">Alby Hub&lt;/a> is a free, open-source (&lt;a rel="external" href="https://guides.getalby.com/user-guide/alby-account-and-browser-extension/alby-hub/faq-alby-hub/should-i-open-a-private-or-public-channel">ideally private&lt;/a>) Lightning Network node.&lt;/p>
&lt;h3 id="requirements">Requirements&lt;/h3>
&lt;p>Before we begin, you are going to need the following things:&lt;/p>
&lt;ul>
&lt;li>A windows or mac or linux computer&lt;/li>
&lt;li>&lt;strong>Raspberry Pi 4&lt;/strong> or &lt;strong>5&lt;/strong> (For &lt;a rel="external" href="https://guides.getalby.com/user-guide/alby-account-and-browser-extension/hidden-archives/raspberry-pi-zero">&lt;strong>Zero 2W&lt;/strong> see this tutorial!&lt;/a>)
&lt;ul>
&lt;li>&lt;em>In this tutorial, I am using a raspi-4b (~60€)&lt;/em>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>The charger for your raspi &lt;em>(~10€)&lt;/em>&lt;/li>
&lt;li>SD memory card (32/64gb) &lt;em>(~10€)&lt;/em>&lt;/li>
&lt;li>Adapter SD card to USB (to flash the OS into the raspi) &lt;em>(~10€)&lt;/em>&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="/images/blog/2025-02-17/requirements.jpg" alt="tutorial" />&lt;/p>
&lt;h3 id="installation-steps">Installation Steps&lt;/h3>
&lt;h4 id="1-flash-a-linux-kernel-into-the-sd-card">1. Flash a Linux kernel into the SD card&lt;/h4>
&lt;blockquote>
&lt;p>Suggestion: You can use &lt;a rel="external" href="https://www.raspberrypi.com/software/">RPI imager&lt;/a> on your computer.
Use it to flash the recommended raspi OS for you&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="/images/blog/2025-02-17/tuto-1.jpg" alt="tutorial" />&lt;/p>
&lt;p>On the Storage you will see your SD card after inserting it into your laptop.&lt;/p>
&lt;p>&lt;img src="/images/blog/2025-02-17/tuto-2.jpg" alt="tutorial" />&lt;/p>
&lt;p>Once you click “Next”, you will see different settings. Click to &lt;strong>Edit Settings&lt;/strong>&lt;/p>
&lt;p>&lt;img src="/images/blog/2025-02-17/tuto-3.jpg" alt="tutorial" />&lt;/p>
&lt;p>On &lt;code>Settings &amp;gt; General&lt;/code>: set your hostname, the username and password for your admin user.
Make sure you enable your WIFI, otherwise you will have to plug it to the router with an RJ-45.
&lt;span id="hostname-setup">&lt;/span>&lt;/p>
&lt;blockquote>
&lt;p>For this tutorial, I am using &lt;code>testhub&lt;/code> as hostname, you can use &lt;code>albyhub&lt;/code> or whatever you prefer.&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="/images/blog/2025-02-17/tuto-4.jpg" alt="tutorial" />&lt;/p>
&lt;p>&lt;span id="pi-enable-ssh">&lt;/span>
On &lt;code>Settings &amp;gt; Services&lt;/code>: make sure the access via SSH is enabled. We are going to need it to install Alby Hub.&lt;/p>
&lt;p>&lt;img src="/images/blog/2025-02-17/tuto-5.jpg" alt="tutorial" />&lt;/p>
&lt;p>Click “Save” and click “Yes” to start the installation.&lt;/p>
&lt;p>&lt;img src="/images/blog/2025-02-17/tuto-6.jpg" alt="tutorial" />&lt;/p>
&lt;p>You will see a confirmation. Click “Yes”. It will take ~10 mins…&lt;/p>
&lt;p>&lt;img src="/images/blog/2025-02-17/tuto-7.jpg" alt="tutorial" />&lt;/p>
&lt;p>Now we got the SD with a fresh linux kernel ready to use!&lt;/p>
&lt;p>&lt;img src="/images/blog/2025-02-17/tuto-8.jpg" alt="tutorial" />&lt;/p>
&lt;h4 id="2-insert-the-sd-into-the-raspi">2. Insert the SD into the raspi&lt;/h4>
&lt;p>Extract the SD from the laptop and insert it in the raspi first.&lt;/p>
&lt;p>&lt;img src="/images/blog/2025-02-17/tuto-9.jpg" alt="tutorial" />&lt;/p>
&lt;p>Once the SD is inserted, then plug in the power cable. It will turn on automatically as soon as you plug it in.&lt;/p>
&lt;p>&lt;img src="/images/blog/2025-02-17/tuto-10.jpg" alt="tutorial" />&lt;/p>
&lt;h4 id="3-alby-hub-installation">3. Alby Hub installation&lt;/h4>
&lt;p>It will take ~5mins since you turned it on to be able to access to it. How can you make sure it’s alive? Open the terminal and ping the hostname you defined while flashing the SD on &lt;a href="/blog/run-your-ln-node/#hostname-setup">Settings &amp;gt; General&lt;/a>, remember it ended up with &lt;code>.local&lt;/code>:&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="shellscript">&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);">ping&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> testhub.local&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>It’s normal if you don’t get any answer at the beginning… until you do get this.&lt;/p>
&lt;p>&lt;img src="/images/blog/2025-02-17/tuto-11.jpg" alt="tutorial" />&lt;/p>
&lt;p>&lt;span id="pi-install-alby-hub">&lt;/span>
Now you can &lt;strong>install Alby Hub&lt;/strong> in your raspi &lt;strong>using the SSH connection&lt;/strong> that you &lt;a href="/blog/run-your-ln-node/#pi-enable-ssh">enabled earlier&lt;/a>:&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="shellscript">&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);">#&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> Source code: https://github.com/getAlby/hub/tree/master/scripts/pi-aarch64&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);">ssh&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> testhub@testhub.local&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;#39;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">/bin/bash -c &amp;quot;$(curl -fsSL https://getalby.com/install/hub/pi-aarch64-install.sh)&amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;#39;&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>You will be asked to type the word “yes”; type it.&lt;/p>
&lt;p>&lt;img src="/images/blog/2025-02-17/tuto-12.jpg" alt="tutorial" />&lt;/p>
&lt;p>Then, you will be asked to enter your password. Enter the password you chose in &lt;a href="/blog/run-your-ln-node/#hostname-setup">Settings &amp;gt; General&lt;/a> for the username.&lt;/p>
&lt;p>&lt;img src="/images/blog/2025-02-17/tuto-13.jpg" alt="tutorial" />&lt;/p>
&lt;h4 id="4-alby-hub-setup">4. Alby Hub Setup&lt;/h4>
&lt;p>Wait another 2-3 mins and visit your host: &lt;a rel="external" href="http://testhub.local/">http://testhub.local/&lt;/a>&lt;/p>
&lt;p>&lt;img src="/images/blog/2025-02-17/tuto-14.jpg" alt="tutorial" />&lt;/p>
&lt;p>Your Alby hub is now running. Let’s connect it to your GetAlby account!&lt;/p>
&lt;hr />
&lt;h2 id="creating-a-getalby-account">Creating a GetAlby Account&lt;/h2>
&lt;p>🔗 &lt;a rel="external" href="https://getalby.com/">getalby.com&lt;/a>&lt;/p>
&lt;p>&lt;img src="/images/blog/2025-02-17/tuto-15.jpg" alt="tutorial" />&lt;/p>
&lt;hr />
&lt;h2 id="connecting-getalby-with-alby-hub">Connecting GetAlby with Alby Hub&lt;/h2>
&lt;p>I created an account named testhub.&lt;/p>
&lt;p>&lt;strong>Left&lt;/strong>: the GetAlby account. &lt;strong>Right&lt;/strong>: the node in the raspi.&lt;/p>
&lt;p>&lt;img src="/images/blog/2025-02-17/tuto-16.jpg" alt="tutorial" />&lt;/p>
&lt;p>Click “&lt;strong>Connect Now&lt;/strong>”.&lt;/p>
&lt;p>&lt;img src="/images/blog/2025-02-17/tuto-17.jpg" alt="tutorial" />&lt;/p>
&lt;p>Click “&lt;strong>Request Authorization Code&lt;/strong>”.&lt;/p>
&lt;p>&lt;img src="/images/blog/2025-02-17/tuto-18.jpg" alt="tutorial" />&lt;/p>
&lt;p>You get the auth code (&lt;strong>left&lt;/strong>) that you need to insert it into your setup (&lt;strong>right&lt;/strong>).&lt;/p>
&lt;p>&lt;img src="/images/blog/2025-02-17/tuto-19.jpg" alt="tutorial" />&lt;/p>
&lt;p>&lt;span id="alby-hub-password">&lt;/span>
Create a &lt;strong>Password&lt;/strong> for your Alby Hub installed in your raspi. It can be different from the password that you set up for your root user in the rapi itself.&lt;/p>
&lt;p>&lt;img src="/images/blog/2025-02-17/tuto-20.jpg" alt="tutorial" />&lt;/p>
&lt;p>&lt;img src="/images/blog/2025-02-17/tuto-21.jpg" alt="tutorial" />&lt;/p>
&lt;p>&lt;img src="/images/blog/2025-02-17/tuto-22.jpg" alt="tutorial" />&lt;/p>
&lt;p>Now it’s time to &lt;strong>Link your Alby Account&lt;/strong>&lt;/p>
&lt;p>&lt;img src="/images/blog/2025-02-17/tuto-23.jpg" alt="tutorial" />&lt;/p>
&lt;p>Unless you specify otherwise, set the default “Budget renewal: &lt;em>Monthly 1M sats&lt;/em>”.&lt;/p>
&lt;p>&lt;img src="/images/blog/2025-02-17/tuto-24.jpg" alt="tutorial" />
&lt;img src="/images/blog/2025-02-17/tuto-25.jpg" alt="tutorial" />&lt;/p>
&lt;hr />
&lt;h2 id="opening-lightning-channels">Opening Lightning Channels&lt;/h2>
&lt;p>I recommend following the &lt;strong>Initial Steps&lt;/strong> to set up your Alby Hub.&lt;/p>
&lt;p>&lt;img src="/images/blog/2025-02-17/tuto-27.jpg" alt="tutorial" />&lt;/p>
&lt;p>Let’s open the first channel.&lt;/p>
&lt;p>&lt;img src="/images/blog/2025-02-17/tuto-28.jpg" alt="tutorial" />&lt;/p>
&lt;p>You need to pay ~$20 in sats to open a 1M sats &lt;em>&lt;strong>incoming liquidity channel&lt;/strong>&lt;/em>.&lt;/p>
&lt;p>&lt;img src="/images/blog/2025-02-17/tuto-29.jpg" alt="tutorial" />&lt;/p>
&lt;p>After the payment, then you will see the channel open. It might take a couple of mins until the &lt;strong>&lt;em>funding transaction&lt;/em>&lt;/strong> is mined in the next block.&lt;/p>
&lt;p>&lt;img src="/images/blog/2025-02-17/tuto-30.jpg" alt="tutorial" />&lt;/p>
&lt;hr />
&lt;h2 id="receiving-sats">Receiving Sats&lt;/h2>
&lt;p>You can receive sats using your LN Address.&lt;/p>
&lt;p>&lt;strong>Left&lt;/strong>: Public page linked to your &lt;a rel="external" href="https://getalby.com/p/chemaclass">node&lt;/a>.
&lt;strong>Right&lt;/strong>: Private page from your Alby Hub.&lt;/p>
&lt;p>&lt;img src="/images/blog/2025-02-17/tuto-33.jpg" alt="tutorial" />&lt;/p>
&lt;blockquote>
&lt;p>Optional: You can add ln funds to your wallet using GetAlby’s third-party services: &lt;a rel="external" href="https://getalby.com/topup">getalby.com/topup&lt;/a> - mind the KYC…&lt;/p>
&lt;/blockquote>
&lt;hr />
&lt;h2 id="using-your-sats">Using Your Sats&lt;/h2>
&lt;p>After that, you will be able to use it via the &lt;a rel="external" href="https://getalby.com/">Alby Extension&lt;/a> or the &lt;a rel="external" href="https://albygo.com/">AlbyGo&lt;/a>.&lt;/p>
&lt;p>&lt;img src="/images/blog/2025-02-17/tuto-31.jpg" alt="tutorial" />&lt;/p>
&lt;p>Your node is the ultimate source of truth. Connecting these apps to it will allow you to use your sats seamlessly across different platforms.&lt;/p>
&lt;p>&lt;img src="/images/blog/2025-02-17/tuto-32.jpg" alt="tutorial" />&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Disclaimer&lt;/strong>: the testhub LN address was created only for testing and tutorial purposes. My real address is &lt;a rel="external" href="https://getalby.com/p/chemaclass">chemaclass&lt;/a> ;)&lt;/p>
&lt;/blockquote>
&lt;h2 id="maintenance-and-troubleshooting">Maintenance and Troubleshooting&lt;/h2>
&lt;h3 id="updating-your-node">Updating Your Node&lt;/h3>
&lt;p>Similar to the installation process, there’s a script available to update your node. You can find it in the source repository: &lt;a rel="external" href="https://github.com/getAlby/hub/tree/master/scripts/pi-aarch64">GitHub - Alby Hub Update Script&lt;/a>&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="shellscript">&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);">ssh&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> testhub@testhub.local&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;#39;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">/bin/bash -c &amp;quot;$(curl -fsSL https://getalby.com/install/hub/pi-aarch64-update.sh)&amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;#39;&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;h3 id="handling-power-outages">Handling Power Outages&lt;/h3>
&lt;p>If the power goes out, the Raspberry Pi will turn off. Once power is restored, it will automatically restart, but Alby Hub will prompt you to enter the password you set earlier.&lt;/p>
&lt;hr />
&lt;p>&lt;strong>Related links&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;a rel="external" href="https://guides.getalby.com/">GetAlby - User Guide&lt;/a>&lt;/li>
&lt;li>&lt;a rel="external" href="https://guides.getalby.com/user-guide/alby-account-and-browser-extension/hidden-archives/raspberry-pi-zero">Installing Alby Hub in a Raspberry Zero&lt;/a>&lt;/li>
&lt;/ul></content></entry><entry xml:lang="en"><title>Digital Minimalism</title><subtitle>Choosing a Focused Life in a Noisy World</subtitle><category term="productivity" scheme="https://chemaclass.com/tags/productivity/" label="Productivity"/><category term="psychology" scheme="https://chemaclass.com/tags/psychology/" label="Psychology"/><category term="career" scheme="https://chemaclass.com/tags/career/" label="Career"/><category term="philosophy" scheme="https://chemaclass.com/tags/philosophy/" label="Philosophy"/><published>2025-02-16T00:00:00+00:00</published><updated>2025-02-16T00:00:00+00:00</updated><author><name>
Cal Newport</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/digital-minimalism/"/><id>https://chemaclass.com/readings/digital-minimalism/</id><summary type="html">In an era dominated by constant connectivity, the concept of digital minimalism emerges as a refreshing antidote. Coined by Cal Newport, this philosophy isn't about rejecting technology but rather about using it with greater intention and care. By implementing digital minimalism, individuals can reclaim focus, reduce anxiety, and cultivate deeper, more meaningful relationships.</summary><content type="html">&lt;p>In an era dominated by constant connectivity, the concept of digital minimalism emerges as a refreshing antidote. Coined by Cal Newport, this philosophy isn’t about rejecting technology but rather about using it with greater intention and care. By implementing digital minimalism, individuals can reclaim focus, reduce anxiety, and cultivate deeper, more meaningful relationships.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h2 id="the-core-principles-of-digital-minimalism">The Core Principles of Digital Minimalism&lt;/h2>
&lt;p>Newport’s approach to digital minimalism is built on three fundamental ideas:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>Clutter is Costly&lt;/strong> – Unnecessary digital distractions fragment our attention and drain our mental energy. By decluttering our digital lives, we regain control over our focus and time.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Optimization is Essential&lt;/strong> – Rather than mindlessly accepting every new app or platform, digital minimalists carefully curate their technology use to align with their values and goals.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Intentionality is Key&lt;/strong> – Digital minimalists don’t just cut back on screen time; they deliberately choose how and when to engage with technology to maximize its benefits while minimizing its drawbacks.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h2 id="the-30-day-digital-declutter">The 30-Day Digital Declutter&lt;/h2>
&lt;p>One of Newport’s most actionable strategies is the 30-day digital declutter. The idea is simple:&lt;/p>
&lt;ul>
&lt;li>Take a &lt;strong>30-day break&lt;/strong> from all non-essential digital tools.&lt;/li>
&lt;li>During this period, &lt;strong>explore alternative offline activities&lt;/strong> that bring fulfillment.&lt;/li>
&lt;li>After 30 days, &lt;strong>reintroduce only&lt;/strong> the digital tools that &lt;strong>add value to your life&lt;/strong>.&lt;/li>
&lt;/ul>
&lt;p>This method serves as a reset, allowing individuals to assess which technologies truly enhance their lives rather than simply consuming their time.&lt;/p>
&lt;h2 id="the-benefits-of-digital-minimalism">The Benefits of Digital Minimalism&lt;/h2>
&lt;p>Those who embrace digital minimalism often report:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Improved Focus&lt;/strong> – With fewer distractions, deep work and meaningful projects become easier to accomplish.&lt;/li>
&lt;li>&lt;strong>Reduced Anxiety&lt;/strong> – Less exposure to social media and endless notifications results in a calmer, more present mindset.&lt;/li>
&lt;li>&lt;strong>Richer Relationships&lt;/strong> – By prioritizing face-to-face interactions, digital minimalists cultivate stronger and more meaningful personal connections.&lt;/li>
&lt;li>&lt;strong>Increased Productivity&lt;/strong> – Fewer digital distractions translate into higher efficiency and greater creative output.&lt;/li>
&lt;/ul>
&lt;h2 id="practical-steps-to-get-started">Practical Steps to Get Started&lt;/h2>
&lt;p>If you’re ready to experiment with digital minimalism, here are some simple steps to begin:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Audit Your Digital Life&lt;/strong> – Identify which apps, platforms, and devices are consuming the most time without offering meaningful benefits.&lt;/li>
&lt;li>&lt;strong>Set Screen Time Limits&lt;/strong> – Use built-in tools on your phone or computer to cap the amount of time spent on certain apps.&lt;/li>
&lt;li>&lt;strong>Establish Tech-Free Zones&lt;/strong> – Designate areas like the bedroom or dining table as screen-free spaces.&lt;/li>
&lt;li>&lt;strong>Prioritize Analog Activities&lt;/strong> – Replace digital distractions with books, hobbies, and in-person interactions.&lt;/li>
&lt;li>&lt;strong>Schedule “Offline” Hours&lt;/strong> – Set intentional times during the day when you completely disconnect from digital devices.&lt;/li>
&lt;/ul>
&lt;h2 id="final-thoughts">Final Thoughts&lt;/h2>
&lt;p>Digital minimalism &lt;strong>is not about rejecting technology&lt;/strong> altogether —&lt;strong>it’s about using it in a way that enhances&lt;/strong> rather than diminishes &lt;strong>our quality of life&lt;/strong>. By taking a more mindful approach to our digital &lt;a href="/tags/habits/">habits&lt;/a>, we can reclaim our time, improve our well-being, and refocus on what truly matters.&lt;/p>
&lt;hr />
&lt;h2 id="video-summary">Video Summary&lt;/h2>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/sJdZ7kmA2QQ"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;h3 id="cal-newport-interviewed-by-lex-fridman">Cal Newport interviewed by Lex Fridman&lt;/h3>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/y3Umo_jd5AA"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>Criptoria</title><subtitle>From Turing to Nakamoto</subtitle><category term="bitcoin" scheme="https://chemaclass.com/tags/bitcoin/" label="Bitcoin"/><category term="privacy" scheme="https://chemaclass.com/tags/privacy/" label="Privacy"/><category term="philosophy" scheme="https://chemaclass.com/tags/philosophy/" label="Philosophy"/><category term="economics" scheme="https://chemaclass.com/tags/economics/" label="Economics"/><published>2025-02-09T00:00:00+00:00</published><updated>2025-02-09T00:00:00+00:00</updated><author><name>
Alfre Mancera</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/criptoria/"/><id>https://chemaclass.com/readings/criptoria/</id><summary type="html">A story about the evolutionary process that gave birth to computers, networks, cybersecurity and digital money. From Greece to Bitcoin, Cryptoria narrates a selection of milestones that occurred before and after Alan Turing. The book showcases a broad collection of people, organizations, concepts and inventions that evidence the deep historical and cultural relationship between mathematics, cryptography, computer science and the struggle for individual sovereignty. Cryptoria is addressed to all people convinced that, beyond inherited or imposed ways, there are other forms of social and economic organization that can and should be explored.</summary><content type="html">&lt;p>Cryptoria is a story about the evolutionary process that gave birth to computers, networks, cybersecurity and digital money.&lt;/p>
&lt;p>From Greece to Bitcoin, Cryptoria narrates a selection of milestones that occurred before and after Alan Turing. The book showcases a broad collection of people, organizations, concepts and inventions that evidence the deep historical and cultural relationship between mathematics, cryptography, computer science and the struggle for individual sovereignty.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>Cryptoria is addressed to all people convinced that, beyond inherited or imposed ways, there are other forms of social and economic organization that can and should be explored.&lt;/p>
&lt;hr />
&lt;h2 id="content">Content&lt;/h2>
&lt;h2 id="part-i-before-turing">Part I: Before Turing&lt;/h2>
&lt;h3 id="1-the-beginning-of-the-end">1. The Beginning of the End&lt;/h3>
&lt;ul>
&lt;li>The Boys Who Loved Puzzles
&lt;ul>
&lt;li>Alan Turing&lt;/li>
&lt;li>Irving John Good&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>The Men Who Loved Their Genes
&lt;ul>
&lt;li>Galton’s Chimera&lt;/li>
&lt;li>The Lugenesis Mutation&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>The Power of Science Fiction
&lt;ul>
&lt;li>Hugo Gernsback&lt;/li>
&lt;li>Amaizing Stories&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>The Descent of Saint Jude&lt;/li>
&lt;/ul>
&lt;h3 id="2-in-search-of-truth">2. In Search of Truth&lt;/h3>
&lt;ul>
&lt;li>As We Know It&lt;/li>
&lt;li>Organon&lt;/li>
&lt;li>The Mosaic Effect of Science&lt;/li>
&lt;/ul>
&lt;h3 id="3-numbers-shall-set-you-free">3. Numbers Shall Set You Free&lt;/h3>
&lt;ul>
&lt;li>Sovereign Mathematics
&lt;ul>
&lt;li>Formal Language&lt;/li>
&lt;li>Set Theory&lt;/li>
&lt;li>Modular Arithmetic&lt;/li>
&lt;li>Congruence&lt;/li>
&lt;li>Gauss&lt;/li>
&lt;li>Gauss, Fermat and Euler&lt;/li>
&lt;li>Boolean Algebra&lt;/li>
&lt;li>Truth Tables&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Axiomatize or Die&lt;/li>
&lt;li>Unsolved Problems
&lt;ul>
&lt;li>Principia Mathematica&lt;/li>
&lt;li>Bologna 1928&lt;/li>
&lt;li>The Revelation of Gödel&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>The Turing Machine
&lt;ul>
&lt;li>Computable Numbers&lt;/li>
&lt;li>Computing Machine&lt;/li>
&lt;li>Conclusions 1936&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="4-the-mathematics-of-secrecy">4. The Mathematics of Secrecy&lt;/h3>
&lt;ul>
&lt;li>A Brief History of Numbers&lt;/li>
&lt;li>Tool of War&lt;/li>
&lt;li>Linked by Signals&lt;/li>
&lt;li>The Persuasion Factory&lt;/li>
&lt;li>Bletchley Park&lt;/li>
&lt;li>Ratio Club&lt;/li>
&lt;li>Metallic Intelligence&lt;/li>
&lt;li>Eternal Alan&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="/images/readings/2025-02-09/criptoria-book.jpg" alt="cover" />&lt;/p>
&lt;h2 id="part-ii-after-turing">Part II: After Turing&lt;/h2>
&lt;h3 id="5-modern-computing">5. Modern Computing&lt;/h3>
&lt;ul>
&lt;li>Bell Labs&lt;/li>
&lt;li>Claude Shannon
&lt;ul>
&lt;li>Glad You Came&lt;/li>
&lt;li>Information Theory&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>The UNIX Era
&lt;ul>
&lt;li>New Languages&lt;/li>
&lt;li>New Clock&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>The First Microprocessor&lt;/li>
&lt;li>Horst Feistel
&lt;ul>
&lt;li>Lucifer&lt;/li>
&lt;li>DES&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>ARPANET&lt;/li>
&lt;li>First Companies&lt;/li>
&lt;li>Computational Complexity&lt;/li>
&lt;/ul>
&lt;h3 id="6-the-dawn-of-strong-cryptography">6. The Dawn of Strong Cryptography&lt;/h3>
&lt;ul>
&lt;li>Forbidden Cryptography
&lt;ul>
&lt;li>One Law to Ban Them All&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Key Cryptography public&lt;/li>
&lt;li>Diffie-Hellman-Merkle
&lt;ul>
&lt;li>Martin Hellman&lt;/li>
&lt;li>Whitfield Diffie&lt;/li>
&lt;li>Whit meets Martin&lt;/li>
&lt;li>Diffie investigates with Hellman&lt;/li>
&lt;li>Multi-user cryptographic techniques&lt;/li>
&lt;li>Ralph Merkle&lt;/li>
&lt;li>Merkle 1974&lt;/li>
&lt;li>Merkle puzzles&lt;/li>
&lt;li>Ralph meets Whit and Martin&lt;/li>
&lt;li>New directions in cryptography&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>The RSA team
&lt;ul>
&lt;li>Ron, Adi and Len&lt;/li>
&lt;li>The RSA system&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Key distribution centers (KDC)&lt;/li>
&lt;li>Distributed networks&lt;/li>
&lt;li>Merkle tree&lt;/li>
&lt;/ul>
&lt;h3 id="7-making-legion">7. Making legion&lt;/h3>
&lt;ul>
&lt;li>Internet universe&lt;/li>
&lt;li>USENET&lt;/li>
&lt;li>CPSR&lt;/li>
&lt;li>David Chaum
&lt;ul>
&lt;li>Crypto Conferences&lt;/li>
&lt;li>CRYPTO ’82&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Zero knowledge proof&lt;/li>
&lt;li>Free software
&lt;ul>
&lt;li>GNU Project&lt;/li>
&lt;li>Free Software Foundation&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="8-road-to-libertarian">8. Road to libertarian&lt;/h3>
&lt;ul>
&lt;li>Digital signatures
&lt;ul>
&lt;li>Taher Elgamal&lt;/li>
&lt;li>Claus Schnorr&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Curves elliptical&lt;/li>
&lt;li>David vs. Big Brother&lt;/li>
&lt;li>Cryptoanarchy&lt;/li>
&lt;li>Extropians&lt;/li>
&lt;/ul>
&lt;h3 id="9-soldiers-of-privacy">9. Soldiers of Privacy&lt;/h3>
&lt;ul>
&lt;li>EFF
&lt;ul>
&lt;li>John Perry Barlow&lt;/li>
&lt;li>Joohn Gilmore&lt;/li>
&lt;li>Mitch Kapor&lt;/li>
&lt;li>Electronic Frontier&lt;/li>
&lt;li>Cyberspace Independence&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>EPIC&lt;/li>
&lt;li>PGP
&lt;ul>
&lt;li>Phil Zimmermann&lt;/li>
&lt;li>Hal Finney&lt;/li>
&lt;li>Dances with Wolves&lt;/li>
&lt;li>OpenPGP&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Cypherpunks
&lt;ul>
&lt;li>Cyphernomicon&lt;/li>
&lt;li>Cypherpunk Manifesto&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Clipper Chip&lt;/li>
&lt;/ul>
&lt;h3 id="10-digital-money">10. Digital Money&lt;/h3>
&lt;ul>
&lt;li>Tatsuakki Okamoto&lt;/li>
&lt;li>Proof of Dwork&lt;/li>
&lt;li>Digicash&lt;/li>
&lt;li>Hal 1993&lt;/li>
&lt;li>Magic Money Digicash&lt;/li>
&lt;li>Smart Contracts&lt;/li>
&lt;li>The Palace Mint&lt;/li>
&lt;li>Hashcash&lt;/li>
&lt;li>B-money&lt;/li>
&lt;li>Bit Gold&lt;/li>
&lt;li>RPOW&lt;/li>
&lt;/ul>
&lt;h3 id="11-the-age-of-satoshi">11. The Age of Satoshi&lt;/h3>
&lt;ul>
&lt;li>Satoshi Nakamoto&lt;/li>
&lt;li>Whitepaper&lt;/li>
&lt;li>Binaries&lt;/li>
&lt;li>First TX&lt;/li>
&lt;li>Bitcoin&lt;/li>
&lt;/ul>
&lt;hr />
&lt;h2 id="es-related-videos">🇪🇸 Related videos&lt;/h2>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/7CvsAVaOjlQ"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/DN3UKsf_Wmk"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;hr />
&lt;p>&lt;strong>Related links&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Book website: &lt;a rel="external" href="https://www.prometeabtc.com/criptoria">www.prometeabtc.com/criptoria&lt;/a>&lt;/li>
&lt;/ul></content></entry><entry xml:lang="en"><title>Bitcoin with Rigor</title><subtitle>A technical study about how Bitcoin works</subtitle><category term="bitcoin" scheme="https://chemaclass.com/tags/bitcoin/" label="Bitcoin"/><category term="privacy" scheme="https://chemaclass.com/tags/privacy/" label="Privacy"/><category term="software-design" scheme="https://chemaclass.com/tags/software-design/" label="Software Design"/><published>2025-01-18T00:00:00+00:00</published><updated>2025-01-18T00:00:00+00:00</updated><author><name>
Jose Sanchis</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/bitcoin-with-rigor/"/><id>https://chemaclass.com/readings/bitcoin-with-rigor/</id><summary type="html">Bitcoin with Rigor goes beyond a basic explanation of Bitcoin, offering a detailed analysis of how Bitcoin works. It breaks down its components clearly, helping readers understand both the parts and the system as a whole. This deep dive explores Bitcoin’s potential and risks, recognizing it as a decade-old monetary experiment that hasn’t yet stood the test of time like gold or silver. Despite this, its innovative design makes it a promising system for the present and future.</summary><content type="html">&lt;p>Bitcoin with Rigor goes beyond a basic explanation of Bitcoin, offering a detailed analysis of how Bitcoin works. It breaks down its components clearly, helping readers understand both the parts and the system as a whole. This deep dive explores Bitcoin’s potential and risks, recognizing it as a decade-old monetary experiment that hasn’t yet stood the test of time like gold or silver. Despite this, its innovative design makes it a promising system for the present and future.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>Bitcoin’s novelty makes it challenging to grasp fully. It requires knowledge of computing, economics, and finance while also being a digital asset with no historical precedent to guide understanding. Yet, much like the Internet—also relatively young but undeniably transformative—Bitcoin has the potential to redefine systems and leave a lasting impact.&lt;/p>
&lt;p>This book aims to equip readers with the tools to understand how Bitcoin works, empowering them to form their own well-informed opinions about its role in society or, if they choose, to begin a professional journey in this evolving sector. Written with rigor but without excessive technicality, the content is designed to be concise, accessible, and engaging, providing the foundation needed to truly comprehend Bitcoin.&lt;/p>
&lt;hr />
&lt;h2 id="content">Content&lt;/h2>
&lt;h3 id="1-basic-computer-concepts">1. Basic Computer Concepts&lt;/h3>
&lt;ul>
&lt;li>Information and Communication&lt;/li>
&lt;li>How Computers Work&lt;/li>
&lt;li>Languages and Protocols&lt;/li>
&lt;li>The OSI Model: The Onion of Computing&lt;/li>
&lt;li>Logic Gates: Fundamental Computing Functions&lt;/li>
&lt;li>Client-Server and P2P Networks&lt;/li>
&lt;/ul>
&lt;h3 id="2-basic-cryptographic-concepts">2. Basic Cryptographic Concepts&lt;/h3>
&lt;ul>
&lt;li>Asymmetric Complexity&lt;/li>
&lt;li>Ciphers, Keys, and Symmetric Cryptography&lt;/li>
&lt;li>Asymmetric Cryptography&lt;/li>
&lt;li>The Cypherpunk Movement&lt;/li>
&lt;li>Cryptographic Hash Functions&lt;/li>
&lt;/ul>
&lt;h3 id="3-the-basics-of-bitcoin-and-cryptocurrencies">3. The Basics of Bitcoin and Cryptocurrencies&lt;/h3>
&lt;ul>
&lt;li>Key Generators and Randomness&lt;/li>
&lt;li>Cryptographic Signatures&lt;/li>
&lt;li>The Discrete Logarithm Problem&lt;/li>
&lt;li>Elliptic Curve Cryptography&lt;/li>
&lt;li>Merkle Tree&lt;/li>
&lt;li>Traditional Digital Money&lt;/li>
&lt;li>Distributed Consensus Algorithms&lt;/li>
&lt;li>Proof of Work (PoW)&lt;/li>
&lt;/ul>
&lt;h3 id="4-bitcoin-piece-by-piece">4. Bitcoin Piece by Piece&lt;/h3>
&lt;ul>
&lt;li>Blockchain or Hashchain?&lt;/li>
&lt;li>Block Synchronization&lt;/li>
&lt;li>The Headerchain&lt;/li>
&lt;li>Keys and Signatures in Bitcoin&lt;/li>
&lt;li>Transactions and the UTXO Model&lt;/li>
&lt;li>Bitcoin Script and Opcodes&lt;/li>
&lt;li>P2PKH (Pay to Public Key Hash) and P2PK&lt;/li>
&lt;li>Multi signatures and P2SH (Pay to Script Hash)&lt;/li>
&lt;/ul>
&lt;h3 id="5-nodes-and-blockchain-in-detail">5. Nodes and Blockchain in Detail&lt;/h3>
&lt;ul>
&lt;li>Transaction Size and Frequency&lt;/li>
&lt;li>Initializing a Full Network Node&lt;/li>
&lt;li>Databases and Pruning&lt;/li>
&lt;li>How a Wallet Works&lt;/li>
&lt;li>Wallets, SPV Nodes, and Others&lt;/li>
&lt;li>From Mempool to Blockchain&lt;/li>
&lt;li>Forks and Consensus Criticality&lt;/li>
&lt;li>Hard Fork vs. Soft Fork&lt;/li>
&lt;/ul>
&lt;h3 id="6-bitcoin-updates-and-applications">6. Bitcoin Updates and Applications&lt;/h3>
&lt;ul>
&lt;li>Much Work Ahead&lt;/li>
&lt;li>Transaction Malleability&lt;/li>
&lt;li>Segregated Witness (SegWit)&lt;/li>
&lt;li>P2WPKH and P2WSH&lt;/li>
&lt;li>Unilateral Payment Channels&lt;/li>
&lt;li>Lightning Channels&lt;/li>
&lt;li>Multi-channel Payments and HTLCs&lt;/li>
&lt;li>Lightning Network&lt;/li>
&lt;li>Discreet Log Contracts (DLCs)&lt;/li>
&lt;li>MAST, P2SMR, and P2CH&lt;/li>
&lt;li>Taproot and Grafroot&lt;/li>
&lt;/ul>
&lt;hr />
&lt;h2 id="book-presentation">Book presentation&lt;/h2>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/55ZRM7j1Jzc"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;hr />
&lt;p>&lt;strong>Related links&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Book website: &lt;a rel="external" href="https://www.bitcoinconrigor.com">www.bitcoinconrigor.com&lt;/a>&lt;/li>
&lt;/ul></content></entry><entry xml:lang="en"><title>Understanding Taxes</title><subtitle>Where your money goes and how to rethink the system</subtitle><category term="bitcoin" scheme="https://chemaclass.com/tags/bitcoin/" label="Bitcoin"/><category term="philosophy" scheme="https://chemaclass.com/tags/philosophy/" label="Philosophy"/><category term="economics" scheme="https://chemaclass.com/tags/economics/" label="Economics"/><category term="privacy" scheme="https://chemaclass.com/tags/privacy/" label="Privacy"/><published>2025-01-02T00:00:00+00:00</published><updated>2025-01-02T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/understanding-taxes/"/><id>https://chemaclass.com/blog/understanding-taxes/</id><summary type="html">Taxes are unavoidable. Whether it's your paycheck, morning coffee, or the house you just bought, taxes are everywhere. If you've ever wondered where your money goes after payday or why buying property comes with extra fees, this post is for you.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2025-01-02/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>Taxes are unavoidable. Whether it’s your paycheck, morning coffee, or the house you just bought, taxes are everywhere. If you’ve ever wondered where your money goes after payday or why buying property comes with extra fees, this post is for you. I’ll keep it simple without diving into complicated legal stuff.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;ol>
&lt;li>Tax journey 101&lt;/li>
&lt;li>Types of Taxes&lt;/li>
&lt;li>How do they work?&lt;/li>
&lt;li>Why do we pay taxes?&lt;/li>
&lt;li>A new perspective&lt;/li>
&lt;/ol>
&lt;hr />
&lt;h2 id="tax-journey-101">Tax journey 101&lt;/h2>
&lt;ol>
&lt;li>When you earn:
&lt;ul>
&lt;li>Personal Income Tax: Deducted from your salary.&lt;/li>
&lt;li>Social Security Contributions: For healthcare, pensions, and unemployment.&lt;/li>
&lt;li>Self-Employment Tax: Covers taxes and social security for freelancers.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>When you spend:
&lt;ul>
&lt;li>Value-Added Tax (VAT): Adds 10%-25% to most goods and services.&lt;/li>
&lt;li>Excise Tax: Extra charges on fuel, alcohol, tobacco, and luxury items.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>When you own:
&lt;ul>
&lt;li>Property Tax: Paid annually on owned real estate.&lt;/li>
&lt;li>Wealth Tax: Charged on substantial assets in some countries.&lt;/li>
&lt;li>Road Tax: Annual fee for owning or operating a vehicle.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>When you transfer or inherit:
&lt;ul>
&lt;li>Transfer Tax: Applied to purchases like second-hand properties.&lt;/li>
&lt;li>Inheritance/Gift Tax: Payable on inherited assets or large gifts.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>When you sell:
&lt;ul>
&lt;li>Capital Gains Tax: On the profit when selling property, stocks, or investments.&lt;/li>
&lt;li>Land Value Increase Tax: On the increase in land value during ownership.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>When you use services:
&lt;ul>
&lt;li>Local Fees: For waste collection, car registration, or building permits.&lt;/li>
&lt;li>Tourism/Travel Tax: For lodging or certain tourist-related services.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>When you win the lottery:
&lt;ul>
&lt;li>Lottery Tax: A substantial portion of your winnings goes to the government.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;hr />
&lt;h2 id="types-of-taxes">Types of taxes&lt;/h2>
&lt;p>Consider taxes as a three-course meal: &lt;strong>direct&lt;/strong>, &lt;strong>indirect&lt;/strong>, and &lt;strong>special&lt;/strong>.&lt;/p>
&lt;h3 id="direct-taxes-what-you-earn-and-own">Direct taxes: What you earn and own&lt;/h3>
&lt;p>These taxes are based on your income, assets, or gains:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Income Tax:&lt;/strong> This is the big one. It’s progressive, meaning the more you earn, the higher your pay rate. Income Tax applies to salaries, freelancing income, rental earnings, and investment gains.&lt;/li>
&lt;li>&lt;strong>Corporate tax:&lt;/strong> This tax is paid on businesses’ profits. Rates vary by country, but a general rate of 20-30% is common.&lt;/li>
&lt;li>&lt;strong>Wealth Tax:&lt;/strong> Some countries tax high-net-worth individuals on their total assets, like properties or savings. Rates and exemptions depend on where you live.&lt;/li>
&lt;li>&lt;strong>Inheritance and Gift Tax:&lt;/strong> When you inherit assets or receive a significant gift, you must pay taxes. The rate often depends on your relationship with the giver.&lt;/li>
&lt;/ul>
&lt;h3 id="indirect-taxes-what-you-spend">Indirect taxes: What you spend&lt;/h3>
&lt;p>These taxes are baked into the price of goods and services:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Value-Added Tax (VAT):&lt;/strong> A tax on almost everything you buy. Standard rates range from 10-25% in most countries, though essential goods like food and medicine often have reduced rates.&lt;/li>
&lt;li>&lt;strong>Excise taxes:&lt;/strong> Special taxes on products like alcohol, tobacco, and fuel. They’re designed to raise revenue while discouraging consumption.&lt;/li>
&lt;/ul>
&lt;h3 id="property-and-local-taxes-owning-stuff-costs-money">Property and local taxes: Owning stuff costs money&lt;/h3>
&lt;p>If you own, rent, or sell property, these taxes come into play:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Property Tax:&lt;/strong> Paid annually based on the value of your home or land.&lt;/li>
&lt;li>&lt;strong>Transfer Tax:&lt;/strong> When buying a 2nd-hand property, you might pay a % of its price.&lt;/li>
&lt;li>&lt;strong>Capital Gains Tax:&lt;/strong> When selling a property or other assets for a profit.&lt;/li>
&lt;/ul>
&lt;h3 id="other-taxes-and-fees-the-little-extras">Other Taxes and fees: The little extras&lt;/h3>
&lt;p>These include fees for registering vehicles, paying for waste collection, and obtaining permits. They might seem minor, but they add up over time.&lt;/p>
&lt;hr />
&lt;h2 id="how-do-they-work">How do they work?&lt;/h2>
&lt;p>&lt;img src="/images/blog/2025-01-02/middle.jpg" alt="cover" />&lt;/p>
&lt;p>Taxes are usually a mix of &lt;strong>national&lt;/strong>, &lt;strong>regional&lt;/strong>, and &lt;strong>local&lt;/strong> responsibilities:&lt;/p>
&lt;ul>
&lt;li>National taxes have &lt;strong>standardized rates&lt;/strong>, like income tax or VAT.&lt;/li>
&lt;li>Regional taxes vary &lt;strong>depending on where you live&lt;/strong>, like wealth or inheritance taxes.&lt;/li>
&lt;li>Local taxes are &lt;strong>specific to your city&lt;/strong> or town, like property or waste fees.&lt;/li>
&lt;/ul>
&lt;p>Taxes are often deducted directly from employees’ paychecks. Freelancers and business owners, on the other hand, need to calculate and pay their taxes regularly.&lt;/p>
&lt;h2 id="why-do-we-pay-taxes">Why do we pay taxes?&lt;/h2>
&lt;p>Taxes are &lt;strong>meant to pay for public services&lt;/strong> like roads, healthcare, schools, and pensions to make life better for everyone. But the system’s complexity and how the money is spent often make it feel unfair.&lt;/p>
&lt;h3 id="are-taxes-fair">Are Taxes fair?&lt;/h3>
&lt;p>This depends on two big questions: &lt;strong>Who should pay? How much is fair?&lt;/strong>&lt;/p>
&lt;h4 id="the-case-for-taxes">The case for taxes&lt;/h4>
&lt;ul>
&lt;li>Taxes &lt;strong>fund essential services&lt;/strong> we all use, like hospitals and schools.&lt;/li>
&lt;li>&lt;strong>Progressive taxes&lt;/strong>, where higher earners pay more, help reduce inequality and create stronger communities.&lt;/li>
&lt;/ul>
&lt;h4 id="the-case-against-taxes">The case against taxes&lt;/h4>
&lt;ul>
&lt;li>Some taxes, like &lt;strong>wealth or inheritance taxes, feel unfair&lt;/strong>. They take money that’s already been earned.&lt;/li>
&lt;li>Worse, when governments &lt;strong>waste tax money on corruption or bad decisions&lt;/strong>, people feel like they’re paying for nothing.&lt;/li>
&lt;/ul>
&lt;p>It feels &lt;strong>unfair when governments waste the money&lt;/strong>. If services don’t improve or funds are mismanaged, it’s &lt;strong>frustrating to see your money disappear without benefit&lt;/strong>.&lt;/p>
&lt;p>Taxes would seem much fairer if people trusted their money was being spent wisely. Without trust, paying &lt;strong>taxes feels like throwing money into a black hole&lt;/strong>.&lt;/p>
&lt;hr />
&lt;h2 id="a-new-perspective">A new perspective&lt;/h2>
&lt;p>&lt;img src="/images/blog/2025-01-02/middle-2.jpg" alt="cover" />&lt;/p>
&lt;p>Taxes are supposed to fund critical public services, but the biggest problem with taxes (and big governments) is that they often lead to &lt;strong>inefficiency and corruption&lt;/strong>. The more power a government has, the more likely it is to misuse it. That’s why governments should be (for me) &lt;strong>small, focused, and efficient&lt;/strong>, providing essential services without overcomplicating things or overreaching into people’s lives.&lt;/p>
&lt;p>Here is where &lt;strong>Bitcoin offers an interesting alternative&lt;/strong>. Bitcoin is decentralized, which means no one controls it: not governments, banks, or anyone. This removes the risk of corruption or mismanagement by powerful institutions. Every Bitcoin transaction is recorded on a public ledger that anyone can verify, so it’s &lt;strong>transparent and resistant to manipulation&lt;/strong>.&lt;/p>
&lt;p>While most countries want to tax Bitcoin transactions, using &lt;strong>Bitcoin gives people more control over their money&lt;/strong>. Unlike traditional currencies that governments can print endlessly (causing inflation and lowering the value of savings), Bitcoin has a &lt;strong>limited supply&lt;/strong>, so its value can’t be diluted similarly. It’s also borderless, meaning you can send and receive money without relying on banks or other intermediaries that might take a cut or add delays.&lt;/p>
&lt;h3 id="why-government-money-works">Why government money works&lt;/h3>
&lt;p>Have you ever wondered why paper money has value when it’s not backed by gold or anything physical? The answer is taxes. &lt;strong>Governments require you to pay taxes in their currency&lt;/strong>. This creates forced demand: everyone needs euros, dollars, or yen to pay the government. It’s a circular system. The government creates the money, then requires you to earn it, then takes a portion back through taxes. This is why government money is sometimes called “fiat” (from Latin, meaning “let it be done”). It works because the government says so, and backs that up with the tax system.&lt;/p>
&lt;h3 id="inflation-the-hidden-tax">Inflation: The hidden tax&lt;/h3>
&lt;p>&lt;strong>Inflation&lt;/strong> is often called a “&lt;strong>hidden tax&lt;/strong>,” and for good reason. When governments print money endlessly to fund their spending, the value of the existing money drops. This means &lt;strong>your hard-earned savings can buy less over time&lt;/strong>.&lt;/p>
&lt;p>While politicians benefit in the short term by having more money to spend without directly raising taxes, ordinary people pay the price through higher living costs. &lt;strong>Inflation is theft&lt;/strong>, as it quietly takes value away from everyone’s money to cover the government’s poor financial decisions.&lt;/p>
&lt;p>With its &lt;strong>fixed supply of 21 million&lt;/strong> coins, Bitcoin cannot be inflated in this way. &lt;strong>Its scarcity ensures that no one&lt;/strong>, including politicians, &lt;strong>manipulates its value&lt;/strong>. For people frustrated by rising prices and shrinking savings, Bitcoin offers a way to protect their wealth from the damaging effects of inflation. It’s &lt;strong>a system designed to reward savers&lt;/strong>, not punish them.&lt;/p>
&lt;h3 id="final-thoughts">Final thoughts&lt;/h3>
&lt;p>&lt;strong>Bitcoin&lt;/strong> doesn’t eliminate taxes or public services but &lt;strong>challenges how we think about money and power&lt;/strong>. It gives people more &lt;strong>control over their wealth&lt;/strong> and shows how financial systems work without needing large, often corrupt institutions. It’s &lt;strong>a step toward a world where individuals have more freedom&lt;/strong> and governments focus on being small, efficient, and fair.&lt;/p>
&lt;p>&lt;img src="/images/blog/2025-01-02/footer.jpg" alt="cover" />&lt;/p></content></entry><entry xml:lang="en"><title>The Cypherpunks</title><subtitle>Pioneers of privacy in the digital age</subtitle><category term="privacy" scheme="https://chemaclass.com/tags/privacy/" label="Privacy"/><category term="bitcoin" scheme="https://chemaclass.com/tags/bitcoin/" label="Bitcoin"/><category term="cryptography" scheme="https://chemaclass.com/tags/cryptography/" label="Cryptography"/><category term="security" scheme="https://chemaclass.com/tags/security/" label="Security"/><category term="philosophy" scheme="https://chemaclass.com/tags/philosophy/" label="Philosophy"/><published>2024-12-11T00:00:00+00:00</published><updated>2024-12-11T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/the-cypherpunks/"/><id>https://chemaclass.com/blog/the-cypherpunks/</id><summary type="html">In the early '90s, with the internet on the rise, a group called the Cypherpunks emerged to defend digital privacy. They pushed for encryption and privacy tech, shaping our digital world with their vision and ideals.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2024-12-11/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>In the early ’90s, with the internet on the rise, a group called the Cypherpunks emerged to defend digital privacy. They pushed for encryption and privacy, shaping our digital world with their vision.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h2 id="who-were-the-cypherpunks">Who were the Cypherpunks?&lt;/h2>
&lt;p>The term “Cypherpunk” combines “cipher” (a reference to encryption) with “punk”, reflecting the group’s rebellious and anti-establishment spirit.&lt;/p>
&lt;p>Far from being a formal organization, the Cypherpunks were a diverse assembly of visionaries, technologists, and activists bonded by shared principles. The movement started in 1992 when Eric Hughes, Timothy May, and John Gilmore founded the cypherpunks mailing list. Some key figures:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Eric Hughes&lt;/strong> who wrote “A Cypherpunk’s Manifesto,” laying out the philosophical foundation for the movement.&lt;/li>
&lt;li>&lt;strong>Timothy C. May&lt;/strong> authored “The Crypto Anarchist Manifesto,” which imagined a society where cryptography could foster a new anarchistic order.&lt;/li>
&lt;li>&lt;strong>John Gilmore&lt;/strong>, a co-founder of the Electronic Frontier Foundation (EFF), was pivotal in early internet privacy advocacy.&lt;/li>
&lt;li>&lt;strong>Julian Assange&lt;/strong>, later known for WikiLeaks, participated in these discussions.&lt;/li>
&lt;li>&lt;strong>Phil Zimmermann&lt;/strong> revolutionized email privacy with his creation of PGP.&lt;/li>
&lt;li>&lt;strong>Jude Milhon&lt;/strong> (St. Jude), a hacker and writer, coined the term “cypherpunk” together with Eric Hughes.&lt;/li>
&lt;li>&lt;strong>Nick Szabo&lt;/strong> contributed significantly to digital contracts and currencies, conceptualizing “bit gold” before Bitcoin.&lt;/li>
&lt;li>&lt;strong>Hal Finney&lt;/strong>, an early Bitcoin developer, worked on cryptographic software including PGP, influencing the privacy tech landscape.&lt;/li>
&lt;li>&lt;strong>Adam Back&lt;/strong> introduced Hashcash, which later inspired Bitcoin’s proof-of-work, while actively engaging in cypherpunk dialogues on privacy.&lt;/li>
&lt;li>&lt;strong>Wei Dai&lt;/strong> proposed “b-money,” an early idea for anonymous digital cash systems, which influenced Bitcoin’s development.&lt;/li>
&lt;li>&lt;strong>Zooko Wilcox-O’Hearn&lt;/strong>, with his work on Zcash, brought advanced privacy to cryptocurrencies, having roots in cypherpunk discussions.&lt;/li>
&lt;li>&lt;strong>David Chaum&lt;/strong>, often called the “godfather of cypherpunks”, pioneered digital cash with DigiCash (1989). His work on electronic privacy predates and inspired the movement.&lt;/li>
&lt;li>&lt;strong>Bram Cohen&lt;/strong> developed BitTorrent, showcasing the cypherpunk ethos of decentralization in file sharing.&lt;/li>
&lt;/ul>
&lt;p>Their work built on foundational cryptographic research by &lt;strong>Whitfield Diffie&lt;/strong> and &lt;strong>Martin Hellman&lt;/strong>, who invented public-key cryptography in 1976, making secure communication between strangers possible.&lt;/p>
&lt;p>They gathered online on the cypherpunks mailing list, which at its peak had around 2000 subscribers exchanging 30+ messages per day. Their motto: &lt;strong>“Cypherpunks write code.”&lt;/strong> They didn’t just talk about privacy. They built it.&lt;/p>
&lt;p>&lt;img src="/images/blog/2024-12-11/manifesto.jpg" alt="cover" />&lt;/p>
&lt;h2 id="philosophy-and-goals">Philosophy and goals&lt;/h2>
&lt;p>The core philosophy of the Cypherpunks was centered around privacy, freedom of speech, and the potential of cryptography to protect these rights. Their main tenets included:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Privacy as a fundamental right&lt;/strong>: They believed that privacy was essential for personal freedom and that digital communication should be private.&lt;/li>
&lt;li>&lt;strong>Decentralization&lt;/strong>: Suspicious of centralized control over information, they pushed for decentralized systems where individuals could control their own data.&lt;/li>
&lt;li>&lt;strong>Cryptography as a tool&lt;/strong>: They saw encryption not just as a means of securing data but as a political tool against surveillance and oppressive regimes.&lt;/li>
&lt;/ul>
&lt;h3 id="their-goals-were">Their goals were&lt;/h3>
&lt;ol>
&lt;li>To create and promote tools for encryption, anonymity, and digital cash.&lt;/li>
&lt;li>To educate the public on the importance of cryptography.&lt;/li>
&lt;li>To resist governmental and corporate efforts to control or monitor digital communications.&lt;/li>
&lt;/ol>
&lt;h2 id="impact-nowadays">Impact nowadays&lt;/h2>
&lt;h3 id="development-of-key-technologies">Development of key technologies&lt;/h3>
&lt;p>Cypherpunks built tools, not just theories:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>PGP&lt;/strong> (1991): Email encryption for everyone&lt;/li>
&lt;li>&lt;strong>Tor&lt;/strong> (2002): Anonymous browsing through onion routing&lt;/li>
&lt;li>&lt;strong>BitTorrent&lt;/strong> (2001): Decentralized file sharing&lt;/li>
&lt;li>&lt;strong>Bitcoin&lt;/strong> (2009): Digital money without banks&lt;/li>
&lt;li>&lt;strong>Signal Protocol&lt;/strong>: The encryption behind Signal, WhatsApp, and other messengers&lt;/li>
&lt;/ul>
&lt;p>When you send an encrypted message today, you’re using cypherpunk technology.&lt;/p>
&lt;h3 id="cultural-shift">Cultural shift&lt;/h3>
&lt;p>They changed how society views privacy. Before them, encryption was mostly for governments or experts. Today, it’s a standard part of tools like messaging apps and web browsers. By promoting encryption and anonymity, they made privacy a priority and encouraged people to take control of their data.&lt;/p>
&lt;h3 id="legal-and-policy-influence-the-crypto-wars">Legal and policy influence: The Crypto Wars&lt;/h3>
&lt;p>The 1990s saw a real battle between cypherpunks and governments, known as the “Crypto Wars.” The US classified strong encryption as a weapon and banned its export. When Phil Zimmermann released PGP, he was investigated for “exporting munitions” because the software spread globally via the internet.&lt;/p>
&lt;p>The cypherpunks fought back creatively. They printed PGP source code in books, since books were protected speech. They wore t-shirts with encryption code. Eventually, they won. Export restrictions were relaxed in 2000. Today’s encrypted messaging exists because of that fight.&lt;/p>
&lt;h2 id="challenges-and-criticisms">Challenges and Criticisms&lt;/h2>
&lt;p>The Cypherpunks face these main criticisms:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Accessibility&lt;/strong>: Their tools are too complex for many people, so only tech-savvy individuals can use them, leaving others behind.&lt;/li>
&lt;li>&lt;strong>Misuse Risk&lt;/strong>: There’s concern that their encryption tech could be used by bad actors. While Cypherpunks believe privacy is a right for all, this view conflicts with security concerns from authorities who fear these tools could hide illegal acts.&lt;/li>
&lt;/ul>
&lt;p>This shows the ongoing struggle between promoting privacy and maintaining safety in the digital world.&lt;/p>
&lt;p>&lt;img src="/images/blog/2024-12-11/btc-p2p.jpg" alt="cover" />&lt;/p>
&lt;h2 id="precursors-to-bitcoin">Precursors to Bitcoin&lt;/h2>
&lt;p>Bitcoin is the most well-known outcome of the cypherpunk philosophy, embodying their values of decentralization, privacy, and independence from government control over money. Created by the mysterious Satoshi Nakamoto, Bitcoin was first shared with the world through the cypherpunks’ mailing list in 2008.&lt;/p>
&lt;p>However, it is the result of many trials of other technologies also created within this group of people. It uses ideas like proof-of-work from Hashcash, and concepts from b-money and bit gold, all reflecting the cypherpunks’ dream of a currency not controlled by any single entity.&lt;/p>
&lt;h3 id="digicash-ecash">DigiCash (eCash)&lt;/h3>
&lt;p>Developed by David Chaum in the late 1980s and implemented in 1990, DigiCash was one of the earliest attempts at an electronic payment system. It used cryptography to ensure privacy in transactions but struggled with adoption and eventually failed due to issues like centralization and the double-spending problem.&lt;/p>
&lt;h3 id="b-money">B-Money&lt;/h3>
&lt;p>Proposed by Wei Dai in 1998, B-Money was a conceptual framework for anonymous, distributed electronic cash. It aimed to solve issues like double-spending without a central authority but was never implemented. Its ideas influenced Bitcoin’s design.&lt;/p>
&lt;h3 id="bit-gold">Bit Gold&lt;/h3>
&lt;p>Also conceptualized in 1998 by Nick Szabo, Bit Gold proposed a currency with properties similar to gold, using cryptographic proof-of-work. Like B-Money, it was never fully realized but contributed to Bitcoin’s development, particularly its proof-of-work system.&lt;/p>
&lt;h3 id="hashcash">Hashcash&lt;/h3>
&lt;p>Introduced by Adam Back in 1997, Hashcash was not a currency but a system to counter email spam using proof-of-work. This concept was later adopted by Bitcoin for mining.&lt;/p>
&lt;blockquote>
&lt;p>These earlier projects and ideas, while not successful in creating a functional digital currency, were critical in laying the theoretical groundwork for Bitcoin. They tackled issues like double-spending, privacy, and decentralization, which were key problems Bitcoin aimed to solve.&lt;/p>
&lt;/blockquote>
&lt;h2 id="cypherpunk-legacy">Cypherpunk legacy&lt;/h2>
&lt;p>Bitcoin has revolutionized our understanding of money, privacy, and security:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Decentralized Control&lt;/strong>: Bitcoin isn’t run by any bank or government, which fits perfectly with the cypherpunk’s skepticism of centralized power.&lt;/li>
&lt;li>&lt;strong>Privacy&lt;/strong>: While not completely anonymous, Bitcoin transactions use pseudonyms, offering some protection from financial oversight.&lt;/li>
&lt;li>&lt;strong>Immutable Transactions&lt;/strong>: Once a transaction is on the blockchain, it’s nearly unchangeable, fostering trust in digital dealings.&lt;/li>
&lt;/ul>
&lt;p>Bitcoin has brought cypherpunk ideals to life, sparking global discussions on financial privacy, money’s nature, and cryptography’s transformative power. With developments like the &lt;a rel="external" href="https://en.wikipedia.org/wiki/Lightning_Network">Lightning Network&lt;/a> for faster, private transactions and &lt;a href="/blog/programmable-money/#p2tr-pay-to-taproot-taproot-up">Taproot&lt;/a> for enhanced transaction privacy, Bitcoin continues to evolve.&lt;/p>
&lt;h2 id="conclusion">Conclusion&lt;/h2>
&lt;p>The cypherpunks proved that a small group of people who write code can change the world. Every encrypted message you send, every Bitcoin transaction, every anonymous browse: their legacy.&lt;/p>
&lt;p>Privacy isn’t dead. They made sure of that.&lt;/p>
&lt;hr />
&lt;p>&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/9vM0oIEhMag"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;strong>Related links&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Learn more: &lt;a href="/pgp">What is PGP encryption?&lt;/a> &lt;small>A 3-minute tutorial for beginners&lt;/small>&lt;/li>
&lt;li>Wikipedia Article: &lt;a rel="external" href="https://en.wikipedia.org/wiki/Cypherpunk">wikipedia.org/Cypherpunk&lt;/a>&lt;/li>
&lt;/ul></content></entry><entry xml:lang="en"><title>Man's Search for Meaning</title><subtitle>Purpose in despair: Frankl's holocaust insights</subtitle><category term="psychology" scheme="https://chemaclass.com/tags/psychology/" label="Psychology"/><category term="philosophy" scheme="https://chemaclass.com/tags/philosophy/" label="Philosophy"/><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><category term="career" scheme="https://chemaclass.com/tags/career/" label="Career"/><published>2024-11-29T00:00:00+00:00</published><updated>2024-11-29T00:00:00+00:00</updated><author><name>
Viktor E. Frankl</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/mans-search-for-meaning/"/><id>https://chemaclass.com/readings/mans-search-for-meaning/</id><summary type="html">In Man's Search for Meaning, Frankl not only shares his harrowing experiences from the Holocaust but also presents a profound philosophy on the human condition. This book is a testament to the resilience of the human spirit, exploring how even in the darkest of times, individuals can find purpose and meaning.</summary><content type="html">&lt;p>In “Man’s Search for Meaning,” Frankl not only shares his harrowing experiences from the Holocaust but also presents a profound philosophy on the human condition. This book is a testament to the resilience of the human spirit, exploring how even in the darkest of times, individuals can find purpose and meaning.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>Frankl’s insights into the psychology of survival and his development of &lt;a rel="external" href="https://en.wikipedia.org/wiki/Logotherapy">logotherapy&lt;/a> offer a unique lens through which we can view our own lives. As we delve into the depths of his narrative, we are invited to reflect on our personal search for meaning, challenging us to consider how we find purpose amidst life’s trials and tribulations.&lt;/p>
&lt;h2 id="part-1-experiences-in-a-concentration-camp">Part 1: Experiences in a Concentration Camp&lt;/h2>
&lt;p>Frankl, an Austrian psychiatrist, recounts his experiences in Nazi concentration camps, including Auschwitz and Dachau, during World War II.&lt;/p>
&lt;p>He describes the psychological stages prisoners went through: shock upon arrival, apathy where they became emotionally numb to survive, and finally, the phase of disillusionment or bitterness if they were liberated.&lt;/p>
&lt;p>Frankl emphasizes that even in the most horrific conditions, finding a purpose or meaning can provide the strength to survive. He notes that those who had something to live for, like a loved one or a personal project, were more likely to endure.&lt;/p>
&lt;h2 id="part-2-logotherapy-in-a-nutshell">Part 2: Logotherapy in a Nutshell&lt;/h2>
&lt;p>This section introduces Frankl’s psychotherapeutic method, which he developed based on his experiences. Logotherapy focuses on the meaning of human existence as well as on man’s search for such a meaning.&lt;/p>
&lt;p>Unlike Freud’s “will to pleasure” or Adler’s “will to power,” Frankl proposes the “will to meaning” as the primary motivational force in humans.&lt;/p>
&lt;p>Three Paths to Meaning:&lt;/p>
&lt;ul>
&lt;li>Achievement: Doing a deed or creating work.&lt;/li>
&lt;li>Experience: Experiencing something or encountering someone (love).&lt;/li>
&lt;li>Attitude: The attitude we take toward unavoidable suffering.&lt;/li>
&lt;/ul>
&lt;p>Even in extreme situations, Frankl asserts that one can choose one’s attitude towards the situation, which can be a significant source of meaning.&lt;/p>
&lt;p>He discusses this concept as the feeling of meaninglessness in modern society, leading to various psychological issues. Logotherapy aims to guide individuals to find personal meaning.&lt;/p>
&lt;h2 id="key-takeaways">Key Takeaways&lt;/h2>
&lt;h3 id="meaning-of-life">Meaning of Life&lt;/h3>
&lt;p>Frankl argues there is no one universal meaning to life; rather, meaning is unique to each individual and can shift over time.&lt;/p>
&lt;h3 id="suffering-and-meaning">Suffering and Meaning&lt;/h3>
&lt;p>Not all suffering must be devoid of meaning; it can be a path to finding or reaffirming meaning.&lt;/p>
&lt;h3 id="responsibility">Responsibility&lt;/h3>
&lt;p>Each person has the responsibility to find their own meaning, which also entails the freedom to choose one’s path.&lt;/p>
&lt;p>Frankl’s book is not just a memoir but a testament to human resilience and the power of the human spirit to transcend even the worst circumstances through the discovery of meaning.&lt;/p>
&lt;hr />
&lt;h2 id="quotes">Quotes&lt;/h2>
&lt;blockquote>
&lt;p>“Ultimately, man should not ask what the meaning of his life is, but rather he must recognize that it is he who is asked.”&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;p>“We needed to stop asking about the meaning of life, and instead to think of ourselves as those who were being questioned by life -daily and hourly.”&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;p>“Everything can be taken from a man but one thing: the last of the human freedoms—to choose one’s attitude in any given set of circumstances, to choose one’s own way.”&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;p>“Freedom, however, is not the last word. Freedom is only part of the story and half of the truth. Freedom is but the negative aspect of the whole phenomenon whose positive aspect is responsibleness.”&lt;/p>
&lt;/blockquote>
&lt;hr />
&lt;h2 id="personal-notes">Personal notes&lt;/h2>
&lt;p>My favorite aspect of the book is its portrayal of life as an ongoing shift in perspectives, both from within oneself and in relation to the external world. It’s like adjusting a camera lens, zooming in or out based on context, recognizing that we are simultaneously individual entities and part of a larger collective.&lt;/p>
&lt;p>This approach helps you gain a broader perspective, allowing awareness of both your limitations and your significance within any given scenario. Consequently, life doesn’t inherently possess meaning; rather, it’s the meaning we choose to attribute to it that shapes our existence.&lt;/p>
&lt;hr />
&lt;h2 id="animated-book-summary">Animated book summary&lt;/h2>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/-srD1Deh9Xg?t=64"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>Verified Git Commits</title><subtitle>Boosting trust and security in your codebase</subtitle><category term="git" scheme="https://chemaclass.com/tags/git/" label="Git"/><category term="security" scheme="https://chemaclass.com/tags/security/" label="Security"/><category term="cryptography" scheme="https://chemaclass.com/tags/cryptography/" label="Cryptography"/><category term="open-source" scheme="https://chemaclass.com/tags/open-source/" label="Open Source"/><published>2024-11-17T00:00:00+00:00</published><updated>2024-11-17T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/verified-git-commits/"/><id>https://chemaclass.com/blog/verified-git-commits/</id><summary type="html">Sign your Git commits with GPG to prove they're really from you. Without signatures, anyone can fake commits using your email. It takes 5 minutes to set up and adds real trust to your codebase.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2024-11-17/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>When it comes to software development, trust and security are very important. One easy way to level up both is by using verified commits.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>Whether you’re working on an open-source project or in a private company, verified commits can make sure your contributions are legit. Let’s break down what they are, why they’re important, and how to start using them.&lt;/p>
&lt;h2 id="what-are-verified-commits">What are verified commits?&lt;/h2>
&lt;p>A verified commit is basically a Git commit that is signed by the author using a digital signature. This signature proves that the commit actually came from the person who says they made it. Tools like &lt;a rel="external" href="https://gnupg.org/">GPG (GNU Privacy Guard)&lt;/a> let you attach this signature to your commits.&lt;/p>
&lt;p>If you’re using platforms like GitHub, you’ll notice a little “Verified” badge next to commits that are signed properly. It’s a quick way to show that the commit is authentic.&lt;/p>
&lt;p>&lt;img src="/images/blog/2024-11-17/verified-commit-example.jpg" alt="blog-cover" />&lt;/p>
&lt;h2 id="why-are-they-important">Why Are They Important?&lt;/h2>
&lt;p>Signed commits help keep your contributions authentic and trustworthy. By adding a cryptographic signature to your commits, you prove that the changes came from you. This is especially important in collaborative environments, where maintaining trust and accountability is key.&lt;/p>
&lt;p>Without signed commits, anyone could fake a commit using someone else’s email. For example, they could use your email, and platforms like GitHub would link it to your profile, making it look like you made the changes —even if you didn’t… not good!&lt;/p>
&lt;p>&lt;img src="/images/blog/2024-11-17/impersonating-commit.jpg" alt="blog-cover" />&lt;/p>
&lt;p>&lt;img src="/images/blog/2024-11-17/impersonating-commit4.jpg" alt="blog-cover" />&lt;/p>
&lt;p>By signing your commits, you show that the work is genuinely yours. It stops impersonation, builds trust in what you’ve done, and keeps everything transparent and accountable.&lt;/p>
&lt;blockquote>
&lt;p>&lt;small>Note: For this demo, I used a public email address belonging to Linus Torvalds. After pushing the commit to this repository, GitHub recognized the email and linked it to his profile. This impersonation is purely for demo purposes to highlight potential risks. Always use your own email for commits.&lt;/small>&lt;/p>
&lt;/blockquote>
&lt;hr />
&lt;h2 id="how-to-get-started-with-verified-commits">How to get started with verified commits&lt;/h2>
&lt;h3 id="set-up-a-gpg-key">Set up a GPG key&lt;/h3>
&lt;p>First, you’ll need a GPG key to start signing commits. Here’s how:&lt;/p>
&lt;p>Generate a GPG key:&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="shellscript">&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);">gpg&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> -&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">-full-generate-key&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>Find your key ID:&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="shellscript">&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);">gpg&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> -&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">-list-secret-keys&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> -&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">-keyid-format=long&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>Tell Git to use your key:&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="shellscript">&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);">git&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> config&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> -&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">-global&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> user.signingkey&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> &amp;lt;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">your-key-i&lt;/span>&lt;span>d&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;gt;&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>Make signing commits the default:&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="shellscript">&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);">git&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> config&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> -&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">-global&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> commit.gpgsign&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> true&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;h3 id="add-your-key-to-github-gitlab">Add your key to &lt;a rel="external" href="https://github.com/settings/keys">GitHub&lt;/a>/&lt;a rel="external" href="https://docs.gitlab.com/user/project/repository/signed_commits/gpg/">GitLab&lt;/a>&lt;/h3>
&lt;p>Export your public key:&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="shellscript">&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);">gpg&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> -&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">-armor&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> -&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">-export&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> &amp;lt;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">your-key-i&lt;/span>&lt;span>d&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;gt;&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>Navigate to “Settings &amp;gt; SSH and GPG keys,” and paste your key.&lt;/p>
&lt;p>&lt;img src="/images/blog/2024-11-17/gpg-keys.jpg" alt="blog-cover" />&lt;/p>
&lt;h3 id="start-signing-commits">Start signing commits&lt;/h3>
&lt;p>From now on, Git will automatically sign your commits.&lt;/p>
&lt;p>If you want to sign a commit manually, just use the &lt;code>-S&lt;/code> flag:&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="shellscript">&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);">git&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> commit&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> -&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">S&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> -&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">m&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">Your commit message&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>You can &lt;strong>verify&lt;/strong> the commit signature with:&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="shellscript">&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);">git&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> log&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> -&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">-show-signature&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>And also when clicking on the “Verified” badge on GitHub directly.&lt;/p>
&lt;p>&lt;img src="/images/blog/2024-11-17/gpg-verify.jpg" alt="blog-cover" />&lt;/p>
&lt;p>Verified commits might seem like a small step, but they make your code more trustworthy. It’s an easy way to add an extra layer of protection to your work—and it’s worth it. Give it a try!&lt;/p>
&lt;hr />
&lt;h3 id="extra-full-setup-in-spanish-es">Extra: Full setup in Spanish 🇪🇸&lt;/h3>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/0DzQBu7U2f4"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;hr />
&lt;p>&lt;strong>Related links&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Learn more: &lt;a href="/pgp">What is PGP encryption?&lt;/a> &lt;small>A 3-minute tutorial for beginners&lt;/small>&lt;/li>
&lt;/ul></content></entry><entry xml:lang="en"><title>bashunit</title><subtitle>Turning frustrations into tools for better development</subtitle><category term="bash" scheme="https://chemaclass.com/tags/bash/" label="Bash"/><category term="testing" scheme="https://chemaclass.com/tags/testing/" label="Testing"/><category term="open-source" scheme="https://chemaclass.com/tags/open-source/" label="Open Source"/><category term="tdd" scheme="https://chemaclass.com/tags/tdd/" label="Tdd"/><published>2024-10-30T00:00:00+00:00</published><updated>2024-10-30T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/bashunit/"/><id>https://chemaclass.com/blog/bashunit/</id><summary type="html">bashunit is a lightweight, easy-to-use testing framework for Bash, packed with handy features like parallel and snapshot testing, test doubles, data providers, and tons of built-in assertions. Backed by clear docs and an active community, it's become a favorite for reliable Bash testing. What started as a simple dev frustration has grown into an open-source tool that makes testing in Bash a lot easier and fun.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2024-10-30/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>bashunit is a lightweight, easy-to-use testing framework for Bash. Features like parallel and snapshot testing, test doubles, data providers, and tons of built-in assertions.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>Backed by clear docs and an active community, it’s become a favorite for reliable Bash testing. What started as a simple dev frustration has grown into an open-source tool that makes testing in Bash a lot easier and fun.&lt;/p>
&lt;ol>
&lt;li>The story behind bashunit&lt;/li>
&lt;li>Why create another testing library?&lt;/li>
&lt;li>How is it nowadays?&lt;/li>
&lt;li>Core features&lt;/li>
&lt;li>Lightning tech talk&lt;/li>
&lt;/ol>
&lt;h2 id="the-story-behind-bashunit">The story behind bashunit&lt;/h2>
&lt;p>The journey to create bashunit started from a simple frustration: I worked with a team where each commit had to start with the ticket name. Since I like working in small steps with quick, iterative commits, adding the ticket key and number to every single commit became a major hurdle, slowing down my development flow with unnecessary friction.&lt;/p>
&lt;p>After a few days of this, I decided to automate it. Git has a helpful hook, &lt;code>prepare-commit-msg&lt;/code>, which allows you to alter commit messages before they’re finalized. I created a Bash (&lt;a rel="external" href="https://github.com/Chemaclass/conventional-commits/blob/main/git-hooks/prepare-commit-msg.sh">script&lt;/a>) that automatically fetches the ticket key and number from the branch name and inserts it into the commit message, making my process smoother and more efficient.&lt;/p>
&lt;p>As someone who values continuous improvement, I began adding more features to this script. However, it became clear that maintaining and testing these changes manually was taking too long and was prone to error. To make development safer and more efficient, I created an &lt;code>assert&lt;/code>(&lt;a rel="external" href="https://github.com/Chemaclass/conventional-commits/blob/705489a3487a4607183090d5574827bf6fedabda/git-hooks/prepare-commit-msg_test.sh">link&lt;/a>) function, enabling automated tests that verified the expected behavior based on script output.&lt;/p>
&lt;p>&lt;img src="/images/blog/2024-10-30/bashunit-original-assert.jpg" alt="bashunit-original-assert.jpg" />&lt;/p>
&lt;p>The &lt;code>assert&lt;/code> function allowed me to define multiple assertions in a separate file, making it easy to validate that any refactoring of the original hook maintained the expected behavior. If a change inadvertently broke existing functionality, it would instantly flag the issue, letting me know right away that something needed fixing. This setup provided immediate feedback and helped ensure that any updates to the script didn’t disrupt its intended logic. For example:&lt;/p>
&lt;p>&lt;img src="/images/blog/2024-10-30/conventional-commits-original-tests.jpg" alt="conventional-commits-original-tests.jpg" />&lt;/p>
&lt;p>In the example above, you’ll notice that I execute the actual “&lt;code>SCRIPT&lt;/code>” as the second argument in the assert function, comparing its output to the expected value provided as the first argument. Here, we have two test cases, each exporting &lt;code>TEST_BRANCH&lt;/code> to simulate how the commit message would vary based on the branch name. This setup emulates real behavior, allowing us to test how different branch names affect the commit message formatting. More examples &lt;a rel="external" href="https://github.com/Chemaclass/conventional-commits/blob/27aeebe4e76afe0a2e91cba85537399eab112eb4/test/prepare-commit-msg_test.sh">here&lt;/a>.&lt;/p>
&lt;p>I decided to separate the &lt;code>assert&lt;/code> function from the test cases, as shown &lt;a rel="external" href="https://github.com/Chemaclass/conventional-commits/commit/5458e5728296bb94b1e8e6b25eeccde6cc700589">here&lt;/a>, to keep things modular and reusable. Then, I created a &lt;code>runner&lt;/code> to execute each test case independently, reducing test interference and improving reliability. You can see that setup &lt;a rel="external" href="https://github.com/Chemaclass/conventional-commits/commit/92a5880d7f26b3422de6b91b51c04f9ff7b961fd">here&lt;/a>. This structure made automated testing easier and refactoring safer.&lt;/p>
&lt;p>&lt;img src="/images/blog/2024-10-30/conventional-commits-call_test_functions.jpg" alt="conventional-commits-call_test_functions.jpg" />&lt;/p>
&lt;p>This was a great improvement because it made it easier to separate &lt;a rel="external" href="https://github.com/Chemaclass/conventional-commits/blob/4c7dae8d44d425ff06fbb48654388f90c2beb3c4/tests/prepare-commit-msg_test.sh">test cases&lt;/a> from the logic of the test runner itself. This clear structure has simplified both creating and managing tests.&lt;/p>
&lt;p>&lt;img src="/images/blog/2024-10-30/conventional-commits-refactor-test-cases.jpg" alt="conventional-commits-refactor-test-cases.jpg" />&lt;/p>
&lt;p>Now the tests were organized and I got an &lt;a rel="external" href="https://github.com/Chemaclass/conventional-commits/commit/f459f43cecc271becb1e5eb6ca95d24c97e87830">idea&lt;/a>:&lt;/p>
&lt;p>&lt;img src="/images/blog/2024-10-30/bashunit-idea.jpg" alt="cover" />&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="markdown">&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);font-weight: bold;">##&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);font-weight: bold;"> Follow-up idea&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>Separate the testing logic into another repo, &lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>so it could be reused anywhere.&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>And so it &lt;a rel="external" href="https://github.com/TypedDevs/bashunit/commit/27269c21c8d0b03bcb3f2000767f4a27b8bf08a1">began&lt;/a>. At the time, I didn’t know much about Bash or the best ways to use a Bash project as a dependency. But I knew I could start by using a Git submodule, even though I’m not a huge fan of them.&lt;/p>
&lt;p>On September 4, 2023, I launched version &lt;a rel="external" href="https://github.com/TypedDevs/bashunit/commit/fc9aac40eb8e5ad4483f08d79eb678a3650dcf78">0.1&lt;/a>, which featured a working runner and a single assertion function: &lt;code>assertEquals&lt;/code>. Later, version &lt;a rel="external" href="https://github.com/TypedDevs/bashunit/releases/tag/0.2.0">0.2&lt;/a> was released, allowing &lt;code>./bashunit&lt;/code> to be a standalone executable, runnable from any folder. Here’s how it looked back then:&lt;/p>
&lt;p>&lt;img src="/images/blog/2024-10-30/bashunit-02-demo.jpg" alt="bashunit-02-demo.jpg" />&lt;/p>
&lt;p>I shared the project with a few friends who quickly jumped in to help with documentation, the website, additional assertions, snapshot testing, and key decisions. To emphasize its open-source spirit and community ownership, I moved it to an organization we created specifically for sharing OSS projects –making it a truly collaborative project rather than an individual one.&lt;/p>
&lt;h2 id="why-create-another-testing-library">Why create another testing library?&lt;/h2>
&lt;p>I know now that other Bash testing libraries exist. But when I started with bashunit, I wasn’t aware of them, and frankly, I’m still no Bash expert. By the time I learned about these alternatives, it was already too late—bashunit had gained enough momentum and excitement to keep going strong.&lt;/p>
&lt;p>While those other libraries may serve specific use cases, use modern Bash, or be developed by more seasoned Bash developers, bashunit aims to set itself apart by offering a great developer experience, shaped by years of working with various testing frameworks.&lt;/p>
&lt;p>I was asked about the differences on September 7, 2023, and here’s my response:
&lt;a rel="external" href="https://github.com/TypedDevs/bashunit/issues/8">Question: Difference to pgrange/bash_unit&lt;/a>.&lt;/p>
&lt;h2 id="how-is-it-nowadays">How is it nowadays?&lt;/h2>
&lt;p>Today, you can &lt;a rel="external" href="https://bashunit.typeddevs.com/installation">install&lt;/a> bashunit via curl, Homebrew, MacPorts, by downloading the latest GitHub &lt;a rel="external" href="https://github.com/TypedDevs/bashunit/releases">release from GitHub&lt;/a>, or even by &lt;a rel="external" href="https://github.com/TypedDevs/bashunit/blob/main/build.sh">building it yourself&lt;/a> from source. Completely open-source.&lt;/p>
&lt;p>The project is written in Bash 3.2 (from 2007) since that’s the default version on macOS –even now, in 2024. This compatibility means bashunit runs smoothly on that version, and I plan to maintain support for it.&lt;/p>
&lt;p>To ensure quality, we test each feature with unit, functional, and acceptance tests, making bashunit its own “first user” of every new feature. We also have several CI workflows using &lt;a rel="external" href="https://github.com/TypedDevs/bashunit/actions/workflows/tests.yml">GitHub actions&lt;/a> that run tests on different platforms to check compatibility and confirm everything works as promised.&lt;/p>
&lt;p>&lt;img src="/images/blog/2024-10-30/bashunit-ci.jpg" alt="bashunit-ci.jpg" />&lt;/p>
&lt;p>In June 2024, bashunit was &lt;a rel="external" href="https://bashunit.typeddevs.com/blog/2024-06-21-phpstan-integration">integrated in PHPStan&lt;/a> for their end-to-end tests, enabling the use of bashunit’s assertions independently of its runner. This flexibility turned out to be very useful.&lt;/p>
&lt;p>Last summer, I was invited to speak about bashunit at the &lt;a href="/talks/#may">International PHP Conference&lt;/a> in Berlin, alongside &lt;a rel="external" href="https://emmanuelvalverde.dev/">Manu&lt;/a>, another contributor. This project has opened doors and led to a lot of gratitude from users who appreciate the work we’ve put into it.&lt;/p>
&lt;h2 id="core-features">Core features&lt;/h2>
&lt;p>bashunit includes classic lifecycle functions like &lt;code>set_up&lt;/code>, &lt;code>tear_down&lt;/code>, &lt;code>set_up_before_script&lt;/code>, and &lt;code>tear_down_after_script&lt;/code>.&lt;/p>
&lt;p>It also supports a wide range of &lt;a rel="external" href="https://bashunit.typeddevs.com/command-line">command-line parameters&lt;/a>
and &lt;a rel="external" href="https://bashunit.typeddevs.com/configuration">configuration values&lt;/a>. Some of my favorites include:&lt;/p>
&lt;ul>
&lt;li>&lt;code>--parallel&lt;/code>&lt;/li>
&lt;li>&lt;code>--filter&lt;/code>&lt;/li>
&lt;li>&lt;code>--stop-on-failure&lt;/code>&lt;/li>
&lt;li>&lt;code>--verbose&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>We also provide &lt;a rel="external" href="https://bashunit.typeddevs.com/data-providers">data providers&lt;/a> for running the same test cases with different inputs.&lt;/p>
&lt;p>For &lt;a rel="external" href="https://bashunit.typeddevs.com/test-doubles">test doubles&lt;/a>, bashunit offers mocks and spies. These work within the same process as the test, but currently, they don’t work across processes—an area for improvement.&lt;/p>
&lt;p>Powerful &lt;a rel="external" href="https://bashunit.typeddevs.com/snapshots">snapshot testing&lt;/a> is included, making it easy to verify command or script outputs over time.&lt;/p>
&lt;p>bashunit offers a large set of native &lt;a rel="external" href="https://bashunit.typeddevs.com/assertions">assertions&lt;/a> for test cases, including:&lt;/p>
&lt;ul>
&lt;li>&lt;code>assert_same&lt;/code>&lt;/li>
&lt;li>&lt;code>assert_equals&lt;/code>&lt;/li>
&lt;li>&lt;code>assert_contains&lt;/code>&lt;/li>
&lt;li>&lt;code>assert_matches&lt;/code>&lt;/li>
&lt;li>&lt;code>assert_string_starts_with&lt;/code>&lt;/li>
&lt;li>&lt;code>assert_array_contains&lt;/code>&lt;/li>
&lt;li>&lt;code>assert_successful_code&lt;/code>&lt;/li>
&lt;li>&lt;code>assert_general_error&lt;/code>&lt;/li>
&lt;li>&lt;code>assert_file_exists&lt;/code>&lt;/li>
&lt;li>&lt;code>assert_file_contains&lt;/code>&lt;/li>
&lt;li>&lt;code>assert_match_snapshot&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>You can even create your own &lt;a rel="external" href="https://bashunit.typeddevs.com/custom-asserts">custom asserts&lt;/a> to extend bashunit’s capabilities.&lt;/p>
&lt;p>With over &lt;strong>25&lt;/strong> contributors and more than &lt;strong>325&lt;/strong> stars on GitHub within just a year of spare-time development, I’m genuinely proud of what this project has become.&lt;/p>
&lt;h2 id="lightning-tech-talk">Lightning tech talk&lt;/h2>
&lt;p>Recently, I presented a lightning tech talk at a hackers’ meetup, demoing bashunit to an audience of over 100 people. It was an incredible experience to share this tool with such an engaged crowd!&lt;/p>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/SX7iNHaSsF0"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;hr />
&lt;p>bashunit original logo designed by &lt;a rel="external" href="https://antonio.gg/">Antonio&lt;/a>.&lt;/p></content></entry><entry xml:lang="en"><title>People Skills</title><subtitle>From code to collaboration</subtitle><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><category term="career" scheme="https://chemaclass.com/tags/career/" label="Career"/><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><published>2024-09-02T00:00:00+00:00</published><updated>2024-09-02T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/people-skills/"/><id>https://chemaclass.com/blog/people-skills/</id><summary type="html">So, you're a software developer, and you've mastered coding languages, algorithms, and all the tech stuff. That's awesome! But here's the deal: technical skills alone won't get you as far as you might think. If you can't work well with others, it doesn't matter how great your code is — nobody will want to work with you.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2024-09-02/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>So, you’re a software developer, and you’ve mastered coding languages, algorithms, and all the tech stuff. That’s awesome! But here’s the deal: technical skills alone won’t get you as far as you might think.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>If you can’t work well with others, it doesn’t matter how great your code is — nobody will want to work with you.&lt;/p>
&lt;h2 id="why-people-skills-matter-in-software">Why People Skills Matter in Software&lt;/h2>
&lt;p>In software development, collaboration is everything. Projects aren’t just solo endeavors. You will be part of a team — with other developers, designers, or even non-tech folks like managers and clients. How you communicate, collaborate, and handle feedback can make or break your success.&lt;/p>
&lt;h3 id="the-brilliant-but-difficult-teammate">The Brilliant but Difficult Teammate&lt;/h3>
&lt;p>Think about it. Have you ever had that one teammate who’s brilliant but hard or nearly impossible to work with? Maybe they don’t listen, get all the credit, or make everything more complicated than it needs to be. No one likes working with that person, right? It’s the same for you. If you can’t get along with your team, it doesn’t matter how good your code is.&lt;/p>
&lt;h3 id="what-being-a-good-team-player-means">What Being a Good Team Player Means&lt;/h3>
&lt;p>Being a good team player means listening to others, being open to feedback, sharing ideas, and, most importantly, being respectful and considerate. You want people to enjoy working with you, not avoid it.&lt;/p>
&lt;p>Good people skills help you build strong working relationships, solve problems faster, and create a better work environment for everyone. Don’t just aim to be a coding expert — ensure you’re also great to work with.&lt;/p>
&lt;h3 id="the-long-term-impact">The Long-Term Impact&lt;/h3>
&lt;p>In the long run, your people skills can boost your success as much, if not more, than your technical abilities. They play a vital role in a team’s success and make the work experience enjoyable for everyone involved.&lt;/p>
&lt;blockquote>
&lt;p>People skills are as necessary as technical skills. No one will want to work with you if you are not a good team player.&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="/images/blog/2024-09-02/middle.jpg" alt="middle" />&lt;/p>
&lt;h2 id="what-are-people-skills">What are people skills?&lt;/h2>
&lt;p>The competencies that enable you to interact effectively and smoothly with others.&lt;/p>
&lt;h3 id="core-communication-skills">Core Communication Skills&lt;/h3>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>Communication&lt;/strong>: The ability to clearly convey ideas, listen actively, and engage in meaningful conversations. This includes both verbal and non-verbal communication.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Empathy&lt;/strong>: Understanding and being sensitive to the feelings, thoughts, and experiences of others. It involves seeing things from someone else’s perspective.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Emotional intelligence&lt;/strong>: Recognizing and managing your own emotions and understanding and influencing the emotions of others.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h3 id="collaboration-skills">Collaboration Skills&lt;/h3>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>Teamwork&lt;/strong>: Working well with others to achieve common goals. This includes collaboration, sharing responsibilities, and supporting colleagues.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Conflict resolution&lt;/strong>: The ability to handle disagreements and disputes constructively, finding solutions that satisfy all parties involved.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Negotiation&lt;/strong>: Finding mutually acceptable solutions or compromises during discussions or disagreements.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h3 id="growth-and-influence">Growth and Influence&lt;/h3>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>Adaptability&lt;/strong>: Being flexible and open to change, adjusting your approach as needed to meet different situations or personalities.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Leadership&lt;/strong>: Inspiring and guiding others, providing direction, and fostering a positive environment.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Networking&lt;/strong>: Building and maintaining professional relationships that can provide support, opportunities, and resources.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>These skills are essential in almost every job and help build strong relationships, enhance teamwork, and create a positive work environment.&lt;/p>
&lt;/blockquote>
&lt;h3 id="why-they-re-harder-than-you-think">Why They’re Harder Than You Think&lt;/h3>
&lt;p>These are often called interpersonal or soft skills, but mastering them can be surprisingly challenging — perhaps even more so than many technical skills. Unlike “hard skills,” which are tangible and can often be learned through a few hours or days of study, people skills involve navigating the intricate web of human emotions, experiences, and expectations.&lt;/p>
&lt;p>While technical skills might require you to dive into documentation, run experiments, and refine your approach, understanding and relating to people is far more complex.&lt;/p>
&lt;p>Humans bring their feelings, backgrounds, and routines into interactions, adding layers of complexity beyond machines’ straightforward logic. These personal details shape the reality we perceive, making interpersonal skills an essential yet complex part of effective communication and collaboration.&lt;/p>
&lt;p>&lt;img src="/images/blog/2024-09-02/footer.jpg" alt="cover" />&lt;/p></content></entry><entry xml:lang="en"><title>Bitcoin: A Work in Progress</title><subtitle>Technical innovations from the trenches</subtitle><category term="bitcoin" scheme="https://chemaclass.com/tags/bitcoin/" label="Bitcoin"/><category term="privacy" scheme="https://chemaclass.com/tags/privacy/" label="Privacy"/><category term="software-design" scheme="https://chemaclass.com/tags/software-design/" label="Software Design"/><published>2024-08-02T00:00:00+00:00</published><updated>2024-08-02T00:00:00+00:00</updated><author><name>
Sjors Provoost</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/bitcoin-wip/"/><id>https://chemaclass.com/readings/bitcoin-wip/</id><summary type="html">With thousands of 'crypto' projects out there, they say Bitcoin is old and boring, but nothing could be further from the truth. This book will guide you through the latest developments in Bitcoin, as seen through the eyes of one of its many developers.</summary><content type="html">&lt;p>With thousands of “crypto” projects out there, they say Bitcoin is old and boring, but nothing could be further from the truth. This book will guide you through the latest developments in Bitcoin, as seen through the eyes of one of its many developers.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>You’ll learn about the latest soft fork known as Taproot, the challenges of keeping open source software free of money-stealing bugs and malware, new ways to protect nodes against evildoers on the internet, how to deal with the ever-growing blockchain, and more!&lt;/p>
&lt;p>The book links to more than two hundred articles, videos, podcasts, and even the source code. And thanks to a tiny QR code next to every link, you’ll never have to type long URLs.&lt;/p>
&lt;hr />
&lt;h2 id="contents">Contents&lt;/h2>
&lt;h3 id="the-basics">The basics&lt;/h3>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="plain">&lt;span class="giallo-l">&lt;span>1. Bitcoin Addresses&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>2. DNS Bootstrap and Tor V3&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>3. SegWit&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>4. libsecp256k1&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;h3 id="resource-usage">Resource usage&lt;/h3>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="plain">&lt;span class="giallo-l">&lt;span>5. Sync Time and AssumeUTXO&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>6. Utreexo&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;h3 id="attacking-bitcoin">Attacking Bitcoin&lt;/h3>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="plain">&lt;span class="giallo-l">&lt;span>7. Eclipse Attacks&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>8. Fake Nodes&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>9. Guix&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;h3 id="better-wallets">Better Wallets&lt;/h3>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="plain">&lt;span class="giallo-l">&lt;span>10. Script, P2SH, and Miniscript&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;h3 id="taproot">Taproot&lt;/h3>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="plain">&lt;span class="giallo-l">&lt;span>11. Taproot and Schnorr&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>12. Activation Options&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;h3 id="appendix">Appendix&lt;/h3>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="plain">&lt;span class="giallo-l">&lt;span>A. More Episodes&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>B. A crime on Testnet&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>C. Bitcoin White Paper&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>&lt;img src="/images/readings/2024-08-02/sjors-and-chema.jpg" alt="cover" />&lt;/p>
&lt;hr />
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/pQb24UWWSl8"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;hr />
&lt;p>&lt;strong>Related links&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Book source code: &lt;a rel="external" href="https://github.com/Sjors/nado-book/">GitHub/Sjors&lt;/a>&lt;/li>
&lt;li>Book website: &lt;a rel="external" href="https://www.btcwip.com/">www.btcwip.com&lt;/a>&lt;/li>
&lt;/ul></content></entry><entry xml:lang="en"><title>What Is Waterfall?</title><subtitle>What makes Waterfall a poor fit for modern software development?</subtitle><category term="agile" scheme="https://chemaclass.com/tags/agile/" label="Agile"/><category term="software-design" scheme="https://chemaclass.com/tags/software-design/" label="Software Design"/><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><category term="productivity" scheme="https://chemaclass.com/tags/productivity/" label="Productivity"/><published>2024-08-01T00:00:00+00:00</published><updated>2024-08-01T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/what-is-waterfall/"/><id>https://chemaclass.com/blog/what-is-waterfall/</id><summary type="html">Waterfall is like following a straight path where you move from one step to the next in a defined order — like water flowing down a waterfall through different stages. The problem is that each step can take a lot of time and resources to complete. Plus, you don't get feedback until the entire stage is finished, which can lead to a lot of wasted time. This is especially tricky in software development, where things are always changing and evolving.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2024-08-01/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>Waterfall is like following a straight path where you move from one step to the next in a defined order — like water flowing down a waterfall through different stages.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>The problem is that each step can take a lot of time and resources to complete. Plus, you don’t get feedback until the entire stage is finished, which can lead to a lot of wasted time. This is especially tricky in software development, where things are always changing and evolving.&lt;/p>
&lt;p>It usually follows a straightforward sequence like this:&lt;/p>
&lt;p>&lt;img src="/images/blog/2024-08-01/waterfall.jpg" alt="Waterfall img from Comic Agile" />&lt;/p>
&lt;h2 id="the-reality-of-waterfall">The reality of Waterfall&lt;/h2>
&lt;p>Waterfall can be like communism in theory — it seems perfect on paper but doesn’t work in the real world.&lt;/p>
&lt;ul>
&lt;li>Clients often don’t know exactly what they want.&lt;/li>
&lt;li>Requirements are constantly changing.&lt;/li>
&lt;li>Businesses need to quickly adapt to market shifts and client needs.&lt;/li>
&lt;li>Software needs to be flexible to keep up with these changes.&lt;/li>
&lt;/ul>
&lt;p>So, in a constantly changing world, Waterfall can really hurt a business. It tends to frustrate developers and teams, and it can also annoy clients and the businesses paying for the software. This usually leads to delays and extra costs.&lt;/p>
&lt;h2 id="why-companies-still-use-waterfall">Why companies still use Waterfall&lt;/h2>
&lt;p>Even with its problems, a lot of companies still use Waterfall because it seems straightforward and logical. This makes them reluctant to take the time to learn Agile. Plus, getting management to agree to switch to Agile can be a tough sell, especially since it requires an investment in time and learning.&lt;/p>
&lt;p>The big issue is when higher-ups dictate exactly how teams should work, leading to micromanagement. This messes up the flexibility that Agile brings. From what I’ve seen, this is a common problem.&lt;/p>
&lt;blockquote>
&lt;p>Looking back, switching to Agile could have fixed a lot of issues.&lt;/p>
&lt;/blockquote>
&lt;hr />
&lt;p>&lt;img src="/images/blog/2024-08-01/footer.jpg" alt="footer" />&lt;/p>
&lt;h2 id="why-agile-was-created">Why Agile was created&lt;/h2>
&lt;p>Agile was created to overcome the limits of the Waterfall method. It focuses on constant interaction with clients and teams.&lt;/p>
&lt;p>Agile builds autonomous and responsible teams that handle tasks from start to finish, reducing wasted time and resources. It emphasizes flexibility, collaboration, and customer feedback.&lt;/p>
&lt;p>Unlike Waterfall, Agile uses iterative development, breaking projects into small, manageable sprints or iterations that last 1-4 weeks. Each cycle includes planning, development, testing, and review, aiming to deliver value quickly and gather feedback to improve.&lt;/p>
&lt;h3 id="key-aspects-of-agile">Key aspects of Agile&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Iterative Development&lt;/strong>: Work in small chunks and adjust as you go.&lt;/li>
&lt;li>&lt;strong>Customer Collaboration&lt;/strong>: Keep talking with clients to make sure they’re happy.&lt;/li>
&lt;li>&lt;strong>Cross-Functional Teams&lt;/strong>: Teams with different skills working together.&lt;/li>
&lt;li>&lt;strong>Adaptive Planning&lt;/strong>: Stay flexible and tweak plans based on feedback.&lt;/li>
&lt;li>&lt;strong>Continuous Improvement&lt;/strong>: Always look for ways to get better.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>Read the original &lt;a rel="external" href="https://agilemanifesto.org/">Agile Manifesto&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;h3 id="where-can-you-start">Where can you start?&lt;/h3>
&lt;p>As a developer, you can boost your agility by diving into &lt;a href="/blog/effective-pair-programming/">pair programming&lt;/a> and &lt;a href="/blog/test-driven-development/">TDD&lt;/a>.&lt;/p>
&lt;ul>
&lt;li>With pair programming, two developers work side by side, which means you get instant feedback and shared problem-solving, leading to better code.&lt;/li>
&lt;li>TDD, on the other hand, involves writing tests before the code, which help specifying what you want to do, focusing on baby steps.&lt;/li>
&lt;/ul>
&lt;p>Together, these practices make your development process more flexible, collaborative, and high-quality, fitting right in with Agile’s focus on quick adjustments and continuous improvement. See more practices &lt;a href="/readings/extreme-programming-explained/#practices">here&lt;/a>.&lt;/p>
&lt;blockquote>
&lt;p>The key is collaboration, baby steps, and quick feedback on everything you work on.&lt;/p>
&lt;/blockquote>
&lt;h2 id="my-experience-with-agile">My experience with Agile&lt;/h2>
&lt;p>I’ve &lt;a href="/talks/">talked&lt;/a> about Agile at various tech events and explored it in depth because I’m passionate about how it can supercharge software teams. When done right, Agile can completely change how teams work, making them faster, more efficient, and better at delivering what clients and businesses really need.&lt;/p>
&lt;ul>
&lt;li>2022-06-26 | &lt;a rel="external" href="https://phpconference.com/mixed/update-your-team-to-be-more-extreme/">International PHP Conference&lt;/a> [Berlin, Germany] (EN)&lt;/li>
&lt;li>2022-09-16 | &lt;a rel="external" href="https://codetalks.de/">Code Talks&lt;/a> [Hamburg, Germany] (EN)&lt;/li>
&lt;li>2022-10-26 | &lt;a rel="external" href="https://phpconference.com/mixed/update-your-team-to-be-more-extreme/">International PHP Conference&lt;/a> [Munich, Germany] (EN)&lt;/li>
&lt;li>2022-12-21 | IES Ginés Pérez Chirinos [Murcia, Spain] (ES)&lt;/li>
&lt;li>2023-01-19 | &lt;a rel="external" href="https://devm.io/update-your-team-to-be-more-extreme/">devm.io&lt;/a> [Remote] (EN)&lt;/li>
&lt;li>2023-07-28 | &lt;a rel="external" href="https://www.wearedevelopers.com/world-congress">WeAreDeveloper World Congress&lt;/a> [Berlin, Germany] (EN)&lt;/li>
&lt;/ul>
&lt;h3 id="wearedevelopers-world-congress-in-berlin">WeAreDevelopers World Congress in Berlin&lt;/h3>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/dqtAyl-SvaY"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>Pretty Good Privacy</title><subtitle>How PGP secures your digital communication</subtitle><category term="security" scheme="https://chemaclass.com/tags/security/" label="Security"/><category term="privacy" scheme="https://chemaclass.com/tags/privacy/" label="Privacy"/><category term="cryptography" scheme="https://chemaclass.com/tags/cryptography/" label="Cryptography"/><published>2024-07-13T00:00:00+00:00</published><updated>2024-07-13T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/pretty-good-privacy/"/><id>https://chemaclass.com/blog/pretty-good-privacy/</id><summary type="html">PGP is an encryption program that ensures privacy and authentication for data communication. It is used for signing, encrypting, and decrypting texts, emails, files, directories, and whole disk partitions, enhancing the security of email communications.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2024-07-13/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>PGP (&lt;em>Pretty Good Privacy&lt;/em>) is an encryption program that ensures privacy and authentication for data communication. It is used for signing, encrypting, and decrypting texts, emails, files, directories, and whole disk partitions.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h2 id="history">History&lt;/h2>
&lt;p>PGP was developed by &lt;a rel="external" href="https://en.wikipedia.org/wiki/Phil_Zimmermann">Phil Zimmermann&lt;/a> out of concern for the lack of privacy in digital communications. He aimed to provide individuals with strong encryption tools. In 1991, PGP was released to the public for free, marking the beginning of a new era in digital security.&lt;/p>
&lt;h3 id="legal-challenges">Legal Challenges&lt;/h3>
&lt;p>In the early 1990s, strong encryption was classified as a weapon under U.S. export law. When PGP spread globally via the internet, Zimmermann faced a criminal investigation for “exporting munitions.”&lt;/p>
&lt;p>His defense was clever: he published the PGP source code in a book. Books are protected speech. The case was dropped in 1996, and encryption export restrictions were eventually relaxed in 2000.&lt;/p>
&lt;hr />
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/1-MPcUHhXoc"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;h2 id="key-features">Key Features&lt;/h2>
&lt;ul>
&lt;li>Encrypts and decrypts data to ensure secure communication&lt;/li>
&lt;li>Provides authentication to verify the identity of senders and receivers&lt;/li>
&lt;li>Generates public and private keys for secure key exchange&lt;/li>
&lt;li>Supports various encryption algorithms and hash functions&lt;/li>
&lt;/ul>
&lt;p>Today, PGP lives on as &lt;strong>OpenPGP&lt;/strong> (the standard) and &lt;strong>GPG&lt;/strong> (GNU Privacy Guard, the free implementation). When you verify a software download or sign a git commit, you’re often using GPG.&lt;/p>
&lt;h2 id="how-it-works">How it works&lt;/h2>
&lt;p>PGP uses a combination of &lt;a rel="external" href="https://en.wikipedia.org/wiki/Public-key_cryptography">public-key&lt;/a> and &lt;a rel="external" href="https://en.wikipedia.org/wiki/Symmetric-key_algorithm">symmetric-key&lt;/a> to ensure secure data transmission. It generates a keypair consisting of a public key and a private key. The public key is shared with others, while the private key is kept secret. When data is encrypted, it is encrypted with the public key, and only the corresponding private key can decrypt it.&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>Symmetric Key Encryption&lt;/strong>: PGP generates a unique, one-time-use session key to encrypt the message. This method is fast and efficient but requires the sender and recipient to share the same key securely.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Asymmetric Key Encryption&lt;/strong>: PGP solves the key exchange problem with asymmetric encryption. Each user has a public key and a private key. The session key is encrypted with the recipient’s public key and can only be decrypted by the recipient’s private key.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Digital Signatures&lt;/strong>: PGP provides authentication through digital signatures. The sender signs the message with their private key, allowing the recipient to verify the sender’s identity using the sender’s public key, ensuring the message has not been tampered with.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/Lq-yKJFHJpk"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;hr />
&lt;h2 id="my-public-key">My public key&lt;/h2>
&lt;h3 id="fingerprint">Fingerprint&lt;/h3>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="plain">&lt;span class="giallo-l">&lt;span>56D5 D60B 0934 0999 199C 3750 E51B 5BF4 5F85 D160&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;h3 id="import-directly">Import directly&lt;/h3>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="shellscript">&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);">curl&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> https://chemaclass.com/pgp.asc&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> |&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> gpg&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> -&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">-import&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;h3 id="download-the-asc-file">Download the .asc file&lt;/h3>
&lt;p>&lt;a href="/pgp.asc" id="download-link">Download public PGP key&lt;/a>&lt;/p></content></entry><entry xml:lang="en"><title>Programmable Money</title><subtitle>The power of Bitcoin's Script</subtitle><category term="bitcoin" scheme="https://chemaclass.com/tags/bitcoin/" label="Bitcoin"/><category term="software" scheme="https://chemaclass.com/tags/software/" label="Software"/><category term="cryptography" scheme="https://chemaclass.com/tags/cryptography/" label="Cryptography"/><category term="security" scheme="https://chemaclass.com/tags/security/" label="Security"/><published>2024-07-06T00:00:00+00:00</published><updated>2024-07-06T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/programmable-money/"/><id>https://chemaclass.com/blog/programmable-money/</id><summary type="html">Bitcoin is often referred to as programmable money because it allows for the execution of programmable transactions through its scripting language, leveraging each bit for precision and functionality.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2024-07-06/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>Bitcoin is often referred to as “programmable money” because it allows for the execution of programmable transactions through its scripting language.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h2 id="understanding-programmable-money">Understanding Programmable Money&lt;/h2>
&lt;p>Programmable money is the ability to embed logic and conditions into financial transactions. This programmability allows transactions to be executed automatically based on predefined rules without intermediaries or manual intervention. It transforms money from a static medium of exchange into a dynamic tool capable of executing complex agreements and automating financial operations.&lt;/p>
&lt;h2 id="the-script-language">The Script Language&lt;/h2>
&lt;p>Bitcoin’s programmability is powered by its built-in scripting language, &lt;a rel="external" href="https://en.bitcoin.it/wiki/Script">&lt;strong>Script&lt;/strong>&lt;/a>. Unlike traditional programming languages, Script is a stack-based, Forth-like language explicitly designed for Bitcoin transactions.&lt;/p>
&lt;p>It supports multi-signature, time-locked, and other conditional transfers that can be programmed into Bitcoin transactions. It is intentionally not Turing-complete, without loops.&lt;/p>
&lt;p>This video includes examples of the most commonly used locking/unlocking scripts.&lt;/p>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/6Fa04MnURhw"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;h2 id="key-features-of-bitcoin-s-script">Key Features of Bitcoin’s Script&lt;/h2>
&lt;h3 id="stack-based-execution">Stack-Based Execution&lt;/h3>
&lt;p>Script operates on a stack-based execution model where commands and data are pushed onto a stack and processed in a Last-In-First-Out (&lt;a rel="external" href="https://en.wikipedia.org/wiki/Stack_(abstract_data_type)">LIFO&lt;/a>) manner.&lt;/p>
&lt;h3 id="conditional-spending">Conditional Spending&lt;/h3>
&lt;p>A transaction that can only be spent if certain data is provided or specific criteria are met. This can be used for:&lt;/p>
&lt;ul>
&lt;li>escrow services&lt;/li>
&lt;li>atomic swaps&lt;/li>
&lt;li>and other complex financial arrangements&lt;/li>
&lt;/ul>
&lt;h3 id="multisignature">Multisignature&lt;/h3>
&lt;p>Transactions can be set up to require multiple signatures from different private keys before they can be spent. Useful for:&lt;/p>
&lt;ul>
&lt;li>joint accounts&lt;/li>
&lt;li>corporate funds&lt;/li>
&lt;li>and enhancing security, as no single party can unilaterally spend the funds&lt;/li>
&lt;/ul>
&lt;h3 id="timelocking">Timelocking&lt;/h3>
&lt;p>Transactions can include time-based conditions that prevent them from being spent until a certain time or block height is reached. This feature is useful for various purposes:&lt;/p>
&lt;ul>
&lt;li>delayed payments&lt;/li>
&lt;li>smart contracts&lt;/li>
&lt;li>and ensuring that funds are not spent prematurely (eg: with &lt;a rel="external" href="https://en.bitcoin.it/wiki/Lightning_Network">Lightning Network&lt;/a>)&lt;/li>
&lt;/ul>
&lt;h3 id="operation-codes">Operation Codes&lt;/h3>
&lt;p>Bitcoin’s Script performs specific operations within transactions with its &lt;a rel="external" href="https://en.bitcoin.it/wiki/Script#Opcodes">OP_Codes&lt;/a>. Here are some of them:&lt;/p>
&lt;ul>
&lt;li>&lt;code>OP_DUP&lt;/code>: &lt;small>Duplicates the top stack item.&lt;/small>&lt;/li>
&lt;li>&lt;code>OP_HASH160&lt;/code>: &lt;small>Hashes the top stack item twice (SHA-256 followed by RIPEMD-160).&lt;/small>&lt;/li>
&lt;li>&lt;code>OP_EQUALVERIFY&lt;/code>: &lt;small>Verifies that the top two items are equal and removes them.&lt;/small>&lt;/li>
&lt;li>&lt;code>OP_CHECKSIG&lt;/code>: &lt;small>Verifies a signature against a public key.&lt;/small>&lt;/li>
&lt;li>&lt;a rel="external" href="https://en.bitcoin.it/wiki/OP_RETURN">&lt;code>OP_RETURN&lt;/code>&lt;/a>: &lt;small>Marks the transaction output as invalid, often used to store data.&lt;/small>&lt;/li>
&lt;/ul>
&lt;hr />
&lt;h2 id="common-bitcoin-address-types">Common Bitcoin address types&lt;/h2>
&lt;p>In Bitcoin, different address types correspond to various ways to script transactions. Here, we’ll explore examples of Bitcoin Script for each major address type. Each address type has its own specific script format.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://chemaclass.com/blog/programmable-money/#p2pk-pay-to-pubkey-earliest-legacy-address-up">&lt;strong>P2PK&lt;/strong>&lt;/a>: Earliest legacy transactions using full public keys directly.&lt;/li>
&lt;li>&lt;a href="https://chemaclass.com/blog/programmable-money/#p2pkh-pay-to-pubkey-hash-legacy-address-up">&lt;strong>P2PKH&lt;/strong>&lt;/a>: Begins with &lt;code>1&lt;/code>. &lt;strong>Legacy&lt;/strong> transactions using public key hashes.&lt;/li>
&lt;li>&lt;a href="https://chemaclass.com/blog/programmable-money/#p2sh-pay-to-script-hash-up">&lt;strong>P2SH&lt;/strong>&lt;/a>: Begins with &lt;code>3&lt;/code>. &lt;strong>Legacy&lt;/strong>, encapsulates complex scripts like multisig.&lt;/li>
&lt;li>&lt;a href="https://chemaclass.com/blog/programmable-money/#p2ms-pay-to-multisig-up">&lt;strong>P2MS&lt;/strong>&lt;/a>: It is typically a type of P2SH or P2WSH address.&lt;/li>
&lt;li>&lt;a href="https://chemaclass.com/blog/programmable-money/#p2wpkh-pay-to-witness-public-key-hash-segwit-up">&lt;strong>P2WPKH&lt;/strong>&lt;/a>: Begins with &lt;code>bc1&lt;/code>. Native &lt;strong>SegWit&lt;/strong>, more efficient transactions.&lt;/li>
&lt;li>&lt;a href="https://chemaclass.com/blog/programmable-money/#p2wsh-pay-to-witness-script-hash-segwit-up">&lt;strong>P2WSH&lt;/strong>&lt;/a>: Begins with &lt;code>bc1&lt;/code>. &lt;strong>SegWit&lt;/strong> for complex scripts.&lt;/li>
&lt;li>&lt;a href="https://chemaclass.com/blog/programmable-money/#p2tr-pay-to-taproot-taproot-up">&lt;strong>P2TR&lt;/strong>&lt;/a>: Begins with &lt;code>bc1p&lt;/code>. SegWit &lt;strong>Taproot&lt;/strong> addresses, improving privacy and efficiency for complex transactions.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>Using native SegWit (P2WPKH and P2WSH) is preferable when possible, as it maximizes the benefits of the SegWit upgrade, but P2SH-SegWit can be useful for compatibility with older systems.&lt;/p>
&lt;/blockquote>
&lt;h3 id="p2pk-pay-to-pubkey-earliest-legacy-address-up">P2PK (Pay-to-PubKey) - Earliest Legacy Address &lt;small>&lt;a href="https://chemaclass.com/blog/programmable-money/#common-bitcoin-address-types">up&lt;/a>&lt;/small>&lt;/h3>
&lt;div class="status info">
Begins with "1" (e.g., 1A1zP1eP5QGefi2DMPTf...v7DivfNa)
&lt;/div>
&lt;p>Before P2PKH and P2SH became standard, Bitcoin addresses were not as flexible or feature-rich. Here are some considerations:&lt;/p>
&lt;ul>
&lt;li>Addresses starting with 1 but without hashing the public key.&lt;/li>
&lt;li>Not common in modern practice due to lack of privacy and efficiency.&lt;/li>
&lt;li>The P2PK format is largely &lt;strong>obsolete&lt;/strong> in favor of (at very least) P2PKH.&lt;/li>
&lt;/ul>
&lt;hr />
&lt;h3 id="p2pkh-pay-to-pubkey-hash-legacy-address-up">P2PKH (Pay-to-PubKey-Hash) - Legacy Address &lt;small>&lt;a href="https://chemaclass.com/blog/programmable-money/#common-bitcoin-address-types">up&lt;/a>&lt;/small>&lt;/h3>
&lt;div class="status info">
Begins with "1" (e.g., 1A1zP1eP5QGefi2DMPTf...v7DivfNa)
&lt;/div>
&lt;p>A typical P2PKH script consists of two main parts:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>ScriptPubKey&lt;/strong>: The locking script (also known as the output script) that specifies how funds can be spent.&lt;/li>
&lt;li>&lt;strong>ScriptSig&lt;/strong>: The unlocking script (also known as the input script) that provides the necessary data to unlock the funds.&lt;/li>
&lt;/ol>
&lt;h3 id="scriptpubkey-locking-script">ScriptPubKey (Locking Script)&lt;/h3>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="php">&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);">OP_DUP&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> OP_HASH160&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> &amp;lt;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">PubKHash&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;gt;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> OP_EQUALVERIFY&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> OP_CHECKSIG&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;ul>
&lt;li>&lt;code>OP_DUP&lt;/code>: Duplicates the top stack item (the public key).&lt;/li>
&lt;li>&lt;code>OP_HASH160&lt;/code>: Hashes the public key with SHA-256 followed by RIPEMD-160.&lt;/li>
&lt;li>&lt;code>&amp;lt;PubKHash&amp;gt;&lt;/code>: The hashed public key (a 20-byte value).&lt;/li>
&lt;li>&lt;code>OP_EQUALVERIFY&lt;/code>: Checks if the hashed public key matches the hash in the script.&lt;/li>
&lt;li>&lt;code>OP_CHECKSIG&lt;/code>: Verifies the provided signature against the public key.&lt;/li>
&lt;/ul>
&lt;h3 id="scriptsig-unlocking-script">ScriptSig (Unlocking Script)&lt;/h3>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="php">&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;lt;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">sig&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;gt;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> &amp;lt;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">PubK&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;gt;&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;ul>
&lt;li>&lt;code>&amp;lt;sig&amp;gt;&lt;/code>: The digital signature generated by the private key.&lt;/li>
&lt;li>&lt;code>&amp;lt;PubK&amp;gt;&lt;/code>: The public key corresponding to the address.&lt;/li>
&lt;/ul>
&lt;h3 id="execution-flow">Execution Flow&lt;/h3>
&lt;ol>
&lt;li>The &lt;code>ScriptSig&lt;/code> (unlocking script) is pushed onto the stack.&lt;/li>
&lt;li>The &lt;code>ScriptPubKey&lt;/code> (locking script) is executed.&lt;/li>
&lt;/ol>
&lt;p>&lt;img src="https://raw.githubusercontent.com/bitcoinbook/bitcoinbook/develop/images/mbc3_0703.png" alt="cover" />
&lt;img src="https://raw.githubusercontent.com/bitcoinbook/bitcoinbook/develop/images/mbc3_0704.png" alt="cover" />&lt;/p>
&lt;hr />
&lt;h3 id="p2sh-pay-to-script-hash-up">P2SH (Pay-to-Script-Hash) &lt;small>&lt;a href="https://chemaclass.com/blog/programmable-money/#common-bitcoin-address-types">up&lt;/a>&lt;/small>&lt;/h3>
&lt;div class="status info">
Begins with "3" (e.g., 3J2BtwzN2GEr6FCP.....81T2eiX8PVHh)
&lt;/div>
&lt;p>P2SH scripts are used for more complex scripts. The primary feature is that the address itself encodes a hash of a script, which will be used in the transaction.&lt;/p>
&lt;h3 id="scriptpubkey-locking-script-1">ScriptPubKey (Locking Script)&lt;/h3>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="php">&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);">OP_HASH160&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> &amp;lt;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">ScriptHash&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;gt;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> OP_EQUAL&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;ul>
&lt;li>&lt;code>OP_HASH160&lt;/code>: Hashes the script with SHA-256 followed by RIPEMD-160.&lt;/li>
&lt;li>&lt;code>&amp;lt;ScriptHash&amp;gt;&lt;/code>: The hashed script (a 20-byte value).&lt;/li>
&lt;li>&lt;code>OP_EQUAL&lt;/code>: Checks if the hash matches the provided script hash.&lt;/li>
&lt;/ul>
&lt;h3 id="scriptsig-unlocking-script-1">ScriptSig (Unlocking Script)&lt;/h3>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="php">&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;lt;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">sig&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;gt;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> &amp;lt;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">PubK&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;gt;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> ...&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> &amp;lt;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">ScriptSig&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;gt;&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;ul>
&lt;li>&lt;code>&amp;lt;sig&amp;gt;&lt;/code>: The digital signature.&lt;/li>
&lt;li>&lt;code>&amp;lt;PubK&amp;gt;&lt;/code>: The public key.&lt;/li>
&lt;li>&lt;code>&amp;lt;ScriptSig&amp;gt;&lt;/code>: The actual script that matches the script hash, which itself will be executed by the Bitcoin network.&lt;/li>
&lt;/ul>
&lt;hr />
&lt;h3 id="p2ms-pay-to-multisig-up">P2MS (Pay-to-Multisig) &lt;small>&lt;a href="https://chemaclass.com/blog/programmable-money/#common-bitcoin-address-types">up&lt;/a>&lt;/small>&lt;/h3>
&lt;h3 id="script-format">Script Format&lt;/h3>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="php">&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);">OP_M&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> &amp;lt;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">M&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;gt;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> &amp;lt;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">PubK1&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;gt;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> &amp;lt;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">PubK2&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;gt;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> ...&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> &amp;lt;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">PubKN&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;gt;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> OP_N&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> OP_CHECKMULTISIG&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;ul>
&lt;li>&lt;code>OP_M&lt;/code>: The minimum number of signatures required.&lt;/li>
&lt;li>&lt;code>&amp;lt;PubK1&amp;gt;, &amp;lt;PubK2&amp;gt;, ..., &amp;lt;PubKN&amp;gt;&lt;/code>: The public keys involved in the multisignature scheme.&lt;/li>
&lt;li>&lt;code>OP_N&lt;/code>: The total number of public keys provided.&lt;/li>
&lt;li>&lt;code>OP_CHECKMULTISIG&lt;/code>: The opcode that verifies the signatures against the provided public keys.&lt;/li>
&lt;/ul>
&lt;h3 id="scriptpubkey-locking-script-2">ScriptPubKey (Locking Script)&lt;/h3>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="php">&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);">OP_2&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> &amp;lt;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">PubK1&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;gt;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> &amp;lt;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">PubK2&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;gt;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> &amp;lt;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">PubK3&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;gt;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> OP_3&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> OP_CHECKMULTISIG&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>This script means that any 2 out of 3 provided public keys are required to sign the transaction for it to be valid.&lt;/p>
&lt;h3 id="scriptsig-unlocking-script-2">ScriptSig (Unlocking Script)&lt;/h3>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="php">&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;lt;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">sig1&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;gt;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> &amp;lt;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">sig2&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;gt;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> ...&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> &amp;lt;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">sigN&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;gt;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> &amp;lt;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">SerializedScript&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;gt;&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;ul>
&lt;li>&lt;code>&amp;lt;sig1&amp;gt;, &amp;lt;sig2&amp;gt;, ..., &amp;lt;sigN&amp;gt;&lt;/code>: The public keys.&lt;/li>
&lt;li>&lt;code>&amp;lt;SerializedScript&amp;gt;&lt;/code>: The serialized script (the same as the locking script but without the &lt;code>OP_M&lt;/code> and &lt;code>OP_N&lt;/code>).&lt;/li>
&lt;/ul>
&lt;div class="status warning-orange">
&lt;b>NOTE&lt;/b>: There is an oddity in CHECKMULTISIG execution.
&lt;small>&lt;a href="#there-is-an-oddity-in-checkmultisig-execution-up">See note at the bottom.&lt;/a>&lt;/small>
&lt;/div>
&lt;hr />
&lt;h3 id="p2wpkh-pay-to-witness-public-key-hash-segwit-up">P2WPKH (Pay-to-Witness-Public-Key-Hash) - Segwit &lt;small>&lt;a href="https://chemaclass.com/blog/programmable-money/#common-bitcoin-address-types">up&lt;/a>&lt;/small>&lt;/h3>
&lt;div class="status info">
Begins with "bc1q" (e.g., bc1qf0r2m0ck4psv6yrk9w.....kw8v5rj7ph3)
&lt;/div>
&lt;p>P2WPKH is a Segregated Witness (SegWit) address type that uses a different scripting format compared to legacy and P2SH addresses. Simplifies transactions by reducing data size and fees compared to legacy formats.&lt;/p>
&lt;h3 id="scriptpubkey-locking-script-3">ScriptPubKey (Locking Script)&lt;/h3>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="php">&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);">OP_0&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> OP_PUSHBYTES_20&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> &amp;lt;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">PubKHash&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;gt;&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;ul>
&lt;li>&lt;code>OP_0&lt;/code>: A single byte (0x00) indicating the version of the script.&lt;/li>
&lt;li>&lt;code>OP_PUSHBYTES_20&lt;/code>: Pushes 20 bytes (the public key hash) onto the stack.&lt;/li>
&lt;li>&lt;code>&amp;lt;PubKHash&amp;gt;&lt;/code>: The 20-byte hash of the public key.&lt;/li>
&lt;/ul>
&lt;h3 id="witness-data">Witness Data&lt;/h3>
&lt;p>For P2WPKH, the unlocking script is not required in the traditional sense (i.e., inside the unlocking script explicitly included in the transaction input). Instead, the unlocking information is provided as part of the witness data in the SegWit transaction format.&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="php">&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;lt;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">sig&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;gt;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> &amp;lt;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">PubK&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;gt;&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;ul>
&lt;li>&lt;code>&amp;lt;sig&amp;gt;&lt;/code>: Digital signature for the transaction.&lt;/li>
&lt;li>&lt;code>&amp;lt;PubK&amp;gt;&lt;/code>: Public key used to generate the public key hash.&lt;/li>
&lt;/ul>
&lt;hr />
&lt;h3 id="p2wsh-pay-to-witness-script-hash-segwit-up">P2WSH (Pay-to-Witness-Script-Hash) - Segwit &lt;small>&lt;a href="https://chemaclass.com/blog/programmable-money/#common-bitcoin-address-types">up&lt;/a>&lt;/small>&lt;/h3>
&lt;div class="status info">
Begins with bc1q (e.g.: bc1q4a3h5sdg4cfkhftgd24tj9g2sg...yj57jmfckhkrw5gslr9g59)
&lt;/div>
&lt;h3 id="scriptpubkey-locking-script-4">ScriptPubKey (Locking Script)&lt;/h3>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="php">&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);">OP_0&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> OP_PUSHBYTES_32&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> &amp;lt;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">ScriptHash&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;gt;&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;ul>
&lt;li>&lt;code>OP_0&lt;/code>: Indicates a witness version 0 (SegWit).&lt;/li>
&lt;li>&lt;code>OP_PUSHBYTES_32&lt;/code>: Pushes the next 32 bytes (the script hash) onto the stack.&lt;/li>
&lt;li>&lt;code>&amp;lt;ScriptHash&amp;gt;&lt;/code>: 32-byte hash of the redeem script.&lt;/li>
&lt;/ul>
&lt;h3 id="witness-data-1">Witness Data&lt;/h3>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="php">&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;lt;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">sig1&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;gt;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> &amp;lt;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">sig2&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;gt;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> ...&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> &amp;lt;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">RedeemScript&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;gt;&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;ul>
&lt;li>&lt;code>&amp;lt;sig1&amp;gt;, &amp;lt;sig2&amp;gt;&lt;/code>: Signatures required to unlock the transaction.&lt;/li>
&lt;li>&lt;code>&amp;lt;RedeemScript&amp;gt;&lt;/code>: The actual script that matches the script hash. This script will be executed as part of the witness data.&lt;/li>
&lt;/ul>
&lt;hr />
&lt;h3 id="p2tr-pay-to-taproot-taproot-up">P2TR (Pay-to-Taproot) - Taproot &lt;small>&lt;a href="https://chemaclass.com/blog/programmable-money/#common-bitcoin-address-types">up&lt;/a>&lt;/small>&lt;/h3>
&lt;div class="status info">
Begins with bc1p (e.g.: bc1pl9dfv7kvj4hj9s3a8l.....gjstmrpjl09g8ks3ukds70q4r2j5h)
&lt;/div>
&lt;p>Taproot combines &lt;a rel="external" href="https://en.bitcoin.it/wiki/Schnorr">Schnorr&lt;/a> signatures with &lt;a rel="external" href="https://en.bitcoin.it/wiki/BIP_0114#Merkelized_Abstract_Syntax_Tree">MAST&lt;/a>, enabling private, efficient spending conditions and making complex transactions &lt;strong>&lt;em>appear standard&lt;/em>&lt;/strong> unless conditions are revealed. It allows the efficient execution of complex transactions while hiding their details.&lt;/p>
&lt;h3 id="scriptpubkey-locking-script-5">ScriptPubKey (Locking Script)&lt;/h3>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="php">&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);">OP_1&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> &amp;lt;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">x&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">-&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">only&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> PubK&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;gt;&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;ul>
&lt;li>&lt;code>OP_1&lt;/code>: Indicates a witness version 1 (Taproot).&lt;/li>
&lt;li>&lt;code>&amp;lt;x-only PubK&amp;gt;&lt;/code>: A 32-byte Schnorr public key (without the y-coordinate).&lt;/li>
&lt;/ul>
&lt;h3 id="witness-data-2">Witness Data&lt;/h3>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="php">&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;lt;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">sig&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;gt;&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;ul>
&lt;li>&lt;code>&amp;lt;sig&amp;gt;&lt;/code>: A Schnorr signature proving possession of the private key corresponding to the x-only pubkey.&lt;/li>
&lt;/ul>
&lt;hr />
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/yU3Sr07Qnxg"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;hr />
&lt;h3 id="there-is-an-oddity-in-checkmultisig-execution-up">*There is an oddity in CHECKMULTISIG execution &lt;small>&lt;a href="https://chemaclass.com/blog/programmable-money/#scriptsig-unlocking-script-2">up&lt;/a>&lt;/small>&lt;/h3>
&lt;p>The implementation of &lt;code>OP_CHECKMULTISIG&lt;/code> pops one more item than it should. The extra item is disregarded when checking the signatures, so it has no direct effect on the OP itself. It must be present because if &lt;code>OP_CHECKMULTISIG&lt;/code> attempts to pop on an empty stack, it will cause a stack error and script failure.&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="php">&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);">OP_0&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> &amp;lt;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">sig2&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;gt;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> &amp;lt;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">sig3&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;gt;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> 2&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> &amp;lt;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">PubK1&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;gt;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> &amp;lt;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">PubK2&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;gt;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> &amp;lt;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">PubK3&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;gt;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> 3&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> OP_CHECKMULTISIG&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>The input script in this multisig is not &lt;code>&amp;lt;sig2&amp;gt; &amp;lt;sig3&amp;gt;&lt;/code> but &lt;code>OP_0 &amp;lt;sig2&amp;gt; &amp;lt;sig3&amp;gt;&lt;/code>.&lt;/p>
&lt;p>It because the custom early on to use &lt;code>OP_0&lt;/code> which later because a relay policy rule and eventually a consensus rule (&lt;a rel="external" href="https://github.com/bitcoin/bips/blob/master/bip-0147.mediawiki">BIP147&lt;/a>).&lt;/p>
&lt;p>It is possible that the original developer added the extra element in the original version of Bitcoin, so they could add a feature for allowing a map to be passed in a later soft fork (for performance reasons). However, that feature was never implemented, and the BIP147 update to the consensus rules in 2017 makes it impossible to add that feature in the future.&lt;/p>
&lt;p>Only Bitcoin’s original developer could tell whether the dummy stack element was the result of a bug or a plan for a future upgrade. From now on, if you see a multisig script, you should expect to see an extra &lt;code>OP_O&lt;/code> in the beginning, whose only purpose is as a workaround to an oddity in the consensus rules.&lt;/p>
&lt;hr />
&lt;h2 id="follow-ups">Follow-ups&lt;/h2>
&lt;ul>
&lt;li>Official docs of &lt;a rel="external" href="https://en.bitcoin.it/wiki/Script">Script&lt;/a> in the Bitcoin Wiki.&lt;/li>
&lt;li>&lt;a rel="external" href="https://siminchen.github.io/bitcoinIDE/build/editor.html">Bitcoin IDE&lt;/a> is an online Bitcoin Script visual emulator. Great for learning purposes.&lt;/li>
&lt;li>&lt;a rel="external" href="https://coins.github.io/bitcoin-scripts/script-editor/">Script Editor&lt;/a> is product-driven research on Bitcoin scalability and usability.&lt;/li>
&lt;li>&lt;a rel="external" href="https://bitcoin.sipa.be/miniscript/">Miniscript&lt;/a> is a language for writing (a subset of) Bitcoin Scripts in a structured way, enabling analysis, composition, generic signing, and more.&lt;/li>
&lt;/ul></content></entry><entry xml:lang="en"><title>Mastering Bitcoin</title><subtitle>Programming the Open Blockchain</subtitle><category term="bitcoin" scheme="https://chemaclass.com/tags/bitcoin/" label="Bitcoin"/><category term="software-design" scheme="https://chemaclass.com/tags/software-design/" label="Software Design"/><category term="privacy" scheme="https://chemaclass.com/tags/privacy/" label="Privacy"/><published>2024-07-05T00:00:00+00:00</published><updated>2024-07-05T00:00:00+00:00</updated><author><name>
Andreas M. Antonopoulos</name></author><author><name>
David A. Harding</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/mastering-bitcoin/"/><id>https://chemaclass.com/readings/mastering-bitcoin/</id><summary type="html">This book covers everything from the basics to the most profound technical aspects of how Bitcoin works. It is an excellent guide through the complex world of Bitcoin, providing the knowledge you need to participate in the Internet of Money.</summary><content type="html">&lt;p>This book covers everything from the basics to the most profound technical aspects of Bitcoin. It is an excellent guide through this complex world, providing the knowledge you need to participate in the Internet of money.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>The first edition of this book was published in December 2014. Ten years later, a third edition with up-to-date knowledge just came out. It is highly recommended to all people interested in this outstanding topic and the tech behind it.&lt;/p>
&lt;ul>
&lt;li>A broad introduction to Bitcoin and its underlying blockchain–ideal for nontechnical users, investors, and business executives.&lt;/li>
&lt;li>An explanation of Bitcoin’s technical foundation and cryptographic currency for developers, engineers, and software and systems architects.&lt;/li>
&lt;li>Details of the Bitcoin decentralized network, peer-to-peer architecture, transaction lifecycle, and security principles.&lt;/li>
&lt;li>New developments such as Taproot, Tapscript, Schnorr signatures, and the Lightning Network.&lt;/li>
&lt;li>A deep dive into Bitcoin applications, including how to combine the building blocks this platform offers into powerful new tools.&lt;/li>
&lt;li>User stories, analogies, examples, and code snippets illustrating key technical concepts.&lt;/li>
&lt;/ul>
&lt;hr />
&lt;h2 id="contents">Contents&lt;/h2>
&lt;ol>
&lt;li>Introduction&lt;/li>
&lt;li>How Bitcoin Works&lt;/li>
&lt;li>Bitcoin Core: The Reference Implementation&lt;/li>
&lt;li>Keys and Addresses&lt;/li>
&lt;li>Wallet recovery&lt;/li>
&lt;li>Transactions&lt;/li>
&lt;li>Authorization and Authentication&lt;/li>
&lt;li>Digital Signatures&lt;/li>
&lt;li>Transaction Fees&lt;/li>
&lt;li>The Bitcoin Network&lt;/li>
&lt;li>The Blockchain&lt;/li>
&lt;li>Mining and Consensus&lt;/li>
&lt;li>Bitcoin Security&lt;/li>
&lt;li>Second-Layer Applications&lt;/li>
&lt;/ol>
&lt;p>&lt;img src="/images/readings/2024-07-05/footer.jpg" alt="blog-footer" />&lt;/p>
&lt;blockquote>
&lt;p>Full book also on &lt;a rel="external" href="https://github.com/bitcoinbook/bitcoinbook">GitHub&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;h3 id="key-takeaways">Key takeaways&lt;/h3>
&lt;ol>
&lt;li>Your wallet doesn’t store any bitcoins, only the keys to access them. The coins are stored in the blockchain.&lt;/li>
&lt;li>Understanding &lt;strong>UTXOs&lt;/strong> is crucial to understanding how transactions work.
&lt;ul>
&lt;li>These are outputs from previous transactions that have not yet been spent&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>A transaction needs:
&lt;ul>
&lt;li>&lt;strong>inputs&lt;/strong>: UTXOs and an unlocking script (scriptSig) which proves ownership.&lt;/li>
&lt;li>&lt;strong>outputs&lt;/strong>: the recipient’s address and the amount to send.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>The unlocking script is written in a custom language called &lt;a rel="external" href="https://en.bitcoin.it/wiki/Script">&lt;strong>Script&lt;/strong>&lt;/a>.
&lt;ul>
&lt;li>Transaction validation is achieved through the execution of a script.&lt;/li>
&lt;li>This allows for a nearly infinite variety of conditions to be expressed.&lt;/li>
&lt;li>Script is a stack-based lang, processed from left to right.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Bitcoin is often referred to as “&lt;strong>programmable money&lt;/strong>” because it allows: Multisignature, timelocking and conditional spending.
&lt;ul>
&lt;li>Extends Bitcoin’s functionality beyond simple value transfers.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Common Bitcoin &lt;a href="/blog/programmable-money#common-bitcoin-address-types">&lt;strong>address types&lt;/strong>&lt;/a>:
&lt;ul>
&lt;li>P2PKH: Begins with &lt;code>1&lt;/code>. Standard transactions using public key hashes.&lt;/li>
&lt;li>P2SH: Begins with &lt;code>3&lt;/code>. Encapsulates complex scripts like multisig.&lt;/li>
&lt;li>P2WPKH: Begins with &lt;code>bc1&lt;/code>. Native SegWit, more efficient transactions.&lt;/li>
&lt;li>P2WSH: Begins with &lt;code>bc1&lt;/code>. SegWit for complex scripts.&lt;/li>
&lt;li>P2TR: Begins with &lt;code>bc1p&lt;/code>. Taproot, enhanced privacy and efficiency.&lt;/li>
&lt;li>Bech32: Starts with &lt;code>bc1&lt;/code>. Human-readable, designed for SegWit and Taproot.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Digital signatures serve three purposes in Bitcoin transactions:
&lt;ul>
&lt;li>First, it proves that the controller of a private key has &lt;strong>authorized&lt;/strong> the spending of those funds.&lt;/li>
&lt;li>Secondly, the proof of authorization is &lt;strong>undeniable&lt;/strong>.&lt;/li>
&lt;li>Thirdly, the authorized transaction &lt;strong>cannot be changed&lt;/strong> by unauthenticated third parties.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a rel="external" href="https://en.wikipedia.org/wiki/Schnorr_signature">Schnorr’s signatures&lt;/a> aren’t specific to the &lt;a rel="external" href="https://en.wikipedia.org/wiki/Elliptic-curve_cryptography">elliptic curve cryptography&lt;/a> (ECC) that Bitcoin uses, although it is most associated with ECC today. They have a number of nice properties:
&lt;ul>
&lt;li>&lt;strong>Provable security&lt;/strong>: strong security guarantees based on the hardness of the discrete logarithm problem, with formal proofs ensuring their robustness against attacks.&lt;/li>
&lt;li>&lt;strong>Linearity&lt;/strong>: allows for efficient aggregation of multiple signatures into a single compact signature, simplifying verification processes.&lt;/li>
&lt;li>&lt;strong>Batch verification&lt;/strong>: enabling multiple signatures to be verified simultaneously in a more computationally efficient manner.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>The best known secure secret sharing algorithm is &lt;a rel="external" href="https://en.wikipedia.org/wiki/Shamir&amp;#x27;s_secret_sharing">Shamir’s Secret Sharing&lt;/a>.&lt;/li>
&lt;li>Running a &lt;strong>full node&lt;/strong> gives you the pure Bitcoin experience: independent verification of all transactions without trusting any other system.&lt;/li>
&lt;li>&lt;strong>Merkle tres&lt;/strong> are used to summarize all transactions in a block, producing an overall commitment to the entire set of transactions and permitting a very efficient process to verify whether a transaction is included in a block.&lt;/li>
&lt;li>Mining is one of the inventions that make Bitcoin special, a &lt;strong>decentralized consensus&lt;/strong> mechanism that is the basis for P2P digital cash.
&lt;ul>
&lt;li>It secures the Bitcoin system and enables the emergence of network-wide consensus without a central authority.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>A &lt;strong>soft-fork&lt;/strong> is a forward-compatible change to the consensus rules that allows unupgraded clients to continue to operate in consensus with the new rules.&lt;/li>
&lt;/ol></content></entry><entry xml:lang="en"><title>Prisoner's Dilemma</title><subtitle>The dilemma of trust and self-interest</subtitle><category term="psychology" scheme="https://chemaclass.com/tags/psychology/" label="Psychology"/><category term="philosophy" scheme="https://chemaclass.com/tags/philosophy/" label="Philosophy"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><published>2024-06-27T00:00:00+00:00</published><updated>2024-06-27T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/prisoners-dilemma/"/><id>https://chemaclass.com/blog/prisoners-dilemma/</id><summary type="html">The Prisoner's Dilemma illustrates the complexities of strategic decision-making, where individuals must choose between cooperation and betrayal, often revealing insights into human behavior and the consequences of self-interest versus collective benefit.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2024-06-27/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>The Prisoner’s Dilemma is a hypothetical game set up showing a situation where people won’t want to work together even when it’s beneficial to do so.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>It’s just a long way of saying people don’t like to be taken advantage of. It’s often game theory 101.&lt;/p>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/t9Lo2fgxWHw"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;p>The Prisoner’s Dilemma illustrates the complexities of strategic decision-making, where individuals must choose between cooperation and betrayal, often revealing insights into human behavior and the consequences of self-interest versus collective benefit.&lt;/p>
&lt;h2 id="premise">Premise&lt;/h2>
&lt;p>Source: &lt;a rel="external" href="https://en.wikipedia.org//wiki/Prisoner&amp;#x27;s_dilemma">Wikipedia&lt;/a>&lt;/p>
&lt;blockquote>
&lt;p>Two members of a criminal gang are arrested and imprisoned.
Each prisoner is in solitary confinement with no means of speaking to or exchanging messages with the other.
The police admit they don’t have enough evidence to convict the pair on the principal charge.&lt;/p>
&lt;p>They plan to sentence both to a year in prison on a lesser charge.
Simultaneously, the police offer each prisoner a bargain.
If he testifies against his partner,
he will go free while the partner will get three years in prison on the main charge.
Oh, yes, there is a catch …&lt;/p>
&lt;p>If both prisoners testify against each other, both will be sentenced to two years in jail.
The prisoners are given a little time to think this over,
but in no case may either learn what the other has decided until he has irrevocably made his decision.&lt;/p>
&lt;p>Each is informed that the other prisoner is being offered the very same deal.
Each prisoner is concerned only with his own welfare—with minimizing his own prison sentence.&lt;/p>
&lt;/blockquote>
&lt;p>This leads to four different possible outcomes for prisoners A and B:&lt;/p>
&lt;ul>
&lt;li>If A and B both remain silent,
&lt;ul>
&lt;li>they will each serve &lt;strong>one year&lt;/strong> in prison.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>If A testifies against B but B remains silent,
&lt;ul>
&lt;li>&lt;strong>A&lt;/strong> will be set &lt;strong>free&lt;/strong> while &lt;strong>B&lt;/strong> serves &lt;strong>three years&lt;/strong> in prison.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>If A remains silent but B testifies against A,
&lt;ul>
&lt;li>&lt;strong>A&lt;/strong> will serve &lt;strong>three years&lt;/strong> in prison and &lt;strong>B&lt;/strong> will be set &lt;strong>free&lt;/strong>.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>If A and B testify against each other,
&lt;ul>
&lt;li>they will &lt;strong>each serve two years&lt;/strong>.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="the-iterated-prisoner-s-dilemma">The Iterated Prisoner’s Dilemma&lt;/h3>
&lt;p>It is just like the regular game except you play it multiple times with an opponent and add up the scores. But it can change the strategy and has more real world applications as it resembles a relationship.&lt;/p>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/BOvAbjfJ0x0"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;hr />
&lt;p>This is closely related to trust, human behavior, and social constructs in relationships that impact us both individually and collectively.&lt;/p>
&lt;p>In the Prisoner’s Dilemma, the best strategy is to start with cooperation, but then mimic the other player’s previous action in the following rounds – rewarding cooperation and punishing betrayal.&lt;/p>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/S0SQLQMLi8Q"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;blockquote>
&lt;p>Don’t trust, verify.&lt;/p>
&lt;/blockquote></content></entry><entry xml:lang="en"><title>The Genesis Book</title><subtitle>The Story of the People and Projects That Inspired Bitcoin</subtitle><category term="bitcoin" scheme="https://chemaclass.com/tags/bitcoin/" label="Bitcoin"/><category term="privacy" scheme="https://chemaclass.com/tags/privacy/" label="Privacy"/><category term="economics" scheme="https://chemaclass.com/tags/economics/" label="Economics"/><category term="philosophy" scheme="https://chemaclass.com/tags/philosophy/" label="Philosophy"/><published>2024-06-21T00:00:00+00:00</published><updated>2024-06-21T00:00:00+00:00</updated><author><name>
Aaron van Wirdum</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/the-genesis-book/"/><id>https://chemaclass.com/readings/the-genesis-book/</id><summary type="html">Bitcoin did not appear out of nowhere. For decades prior to Satoshi Nakamoto’s invention, a diverse group of computer scientists, privacy activists, and heterodox economists tried to create a digital form of money that could operate independently of government control. The Genesis Book tells the story of the people and projects that inspired the invention of the world’s first successful peer-to-peer electronic cash system.</summary><content type="html">&lt;p>Bitcoin did not appear out of nowhere. For decades prior to Satoshi Nakamoto’s invention, a diverse group of computer scientists, privacy activists, and heterodox economists tried to create a digital form of money that could operate independently of government control. The Genesis Book tells the story of the people and projects that inspired the invention of the world’s first successful peer-to-peer electronic cash system.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;hr />
&lt;h2 id="contents">Contents&lt;/h2>
&lt;h3 id="part-i-foundations">Part I: Foundations&lt;/h3>
&lt;ol>
&lt;li>Spontaneous Order&lt;/li>
&lt;li>Free and Open Source&lt;/li>
&lt;li>Neutral Money&lt;/li>
&lt;li>Cryptography&lt;/li>
&lt;li>Denationalization of Money&lt;/li>
&lt;li>eCash (and Trustless Time-stamps)&lt;/li>
&lt;li>The Extropians&lt;/li>
&lt;/ol>
&lt;h3 id="part-ii-cypherpunks">Part II: Cypherpunks&lt;/h3>
&lt;ol start="8">
&lt;li>The Cypherpunk Movement&lt;/li>
&lt;li>Cypherpunk Currency&lt;/li>
&lt;li>Hashcash&lt;/li>
&lt;li>Bit Gold&lt;/li>
&lt;li>B-money (and BitTorrent)&lt;/li>
&lt;li>RPOW&lt;/li>
&lt;/ol>
&lt;h3 id="part-iii-bitcoin">Part III: Bitcoin&lt;/h3>
&lt;ol start="14">
&lt;li>Twenty-First Century Fiat&lt;/li>
&lt;li>The White Paper&lt;/li>
&lt;li>The Release&lt;/li>
&lt;/ol>
&lt;hr />
&lt;blockquote>
&lt;p>The central bank declared the insurer “too big to fail,” and, along with the US Treasury, bailed it out with an injection of $68 billion (plus another $112 billion in guarantees).&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;p>If Friedrich Hayek’s analysis of monetary economics early in this career was correct, Bitcoin could help fix the economy. As an unbacked currency that operated without a central bank, bitcoin was an entirely homogeneous form of money. Anyone could control their own coins, and there were no reserve ratios to worry about. And, since bitcoin existed on the internet, it was borderless as well. Anyone with an internet connection, anywhere in the world, could download the software and start sending and receiving transactions to anyone else. This combination –a homogeneous, borderless type of money with a fixed supply– is what Hayek once described as neutral money.&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;p>Bitcoin would also facilitate international trade in a much more straightforward manner, where only the buyer and seller and (the prices of) their respective products are affected –not the price levels across their entire countries.&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;p>In Bitcoin, no one is in charge… and everyone is in charge.&lt;/p>
&lt;/blockquote>
&lt;hr />
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/TXs3maguye4"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>The Phoenix Project</title><subtitle>A Novel About IT, DevOps, And Helping Your Business Win</subtitle><category term="devops" scheme="https://chemaclass.com/tags/devops/" label="Devops"/><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><category term="agile" scheme="https://chemaclass.com/tags/agile/" label="Agile"/><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><published>2024-05-31T00:00:00+00:00</published><updated>2024-05-31T00:00:00+00:00</updated><author><name>
Gene Kim</name></author><author><name>
Kevin Behr</name></author><author><name>
George Spafford</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/the-phoenix-project/"/><id>https://chemaclass.com/readings/the-phoenix-project/</id><summary type="html">This is a story about an impossible project in which the people around are constantly playing politics, busy fixing critical bugs and wasting constant efforts on quick patches instead of helping the business thrive.</summary><content type="html">&lt;p>This is a story about an impossible project in which the people around are constantly playing politics, busy fixing critical bugs and wasting constant efforts on quick patches instead of helping the business thrive.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;blockquote>
&lt;p>If IT fails, the business fails.&lt;/p>
&lt;/blockquote>
&lt;p>&lt;strong>DevOps Principles&lt;/strong>: Flow, Feedback, and Continual Learning and Experimentation. These guiding concepts promote advancements in responsiveness, dependability, and teamwork.&lt;/p>
&lt;h4 id="summary">Summary&lt;/h4>
&lt;p>The book starts with the promotion of Bill as VP of IT, and with that the responsibility of delivering an imposible (Phoenix) project. The CEO warns him that if the project does not deliver in time, then the entire IT department will be outsourced and the current IT employees will be fired.&lt;/p>
&lt;p>Bill tries to understand the status quo, and finds out that the people are too busy firefighting constantly and dealing with too many responsibilities (in addition, they are understaffed). Everything is urgent and needs to be done asap. The deadline was already setup from above, and there is no planning or discussions with other departments. TL;DR: Corporate chaos, politics and bloodbath meetings.&lt;/p>
&lt;p>However, Bill gets to know one person in the company that helps him improve the status quo, not by telling him what to do but by asking him questions to help find the solution.&lt;/p>
&lt;p>For example, the first question: “What are the four types of work that IT does?” which is not answered immediately but during the story:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Business projects&lt;/strong>: these are the projects that directly affect business goals. They generate revenue and deliver value to customers.&lt;/li>
&lt;li>&lt;strong>Internal projects&lt;/strong>: these are regular tasks that keep the system working. Like system upgrades, security patches, etc. It tends to be invisible and can become a bottleneck for IT departments.&lt;/li>
&lt;li>&lt;strong>Changes&lt;/strong>: the result of the previous business and internal projects, to know what to change with and within them.&lt;/li>
&lt;li>&lt;strong>Unplanned work&lt;/strong>: this is the real productivity killer. This is related to all operational issues resulted from the previous three types of work.&lt;/li>
&lt;/ol>
&lt;hr />
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/6QNdL1I7OTM"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>What Kills Agility?</title><subtitle>Why Agile if you already do Scrum, Kanban, SAFe, or Waterfall?</subtitle><category term="agile" scheme="https://chemaclass.com/tags/agile/" label="Agile"/><category term="xp" scheme="https://chemaclass.com/tags/xp/" label="Xp"/><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><published>2024-05-30T00:00:00+00:00</published><updated>2024-05-30T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/what-kills-agility/"/><id>https://chemaclass.com/blog/what-kills-agility/</id><summary type="html">Why Agile, if you already do Scrum, Kanban, SAFe, or Waterfall? How we manage an organization defines its quality. Excellent management is crucial to avoid the Waterfall trap if we aim to build an Agile environment. But why would we want that? What's wrong with the way we already work?</summary><content type="html">&lt;p>&lt;img src="/images/blog/2024-05-30/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>Dozens of documents and spreadsheets, meetings over meetings, and yet without much impact, result in team misalignments—realized too late.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>How we manage an organization defines its quality. Excellent management is crucial to avoid the Waterfall trap if we aim to build an Agile environment. But why would we want that? What’s wrong with the way we already work?&lt;/p>
&lt;p>If you are already happy with how you and your team work together, that’s okay. However, what about reevaluating how you work to look for potential improvements?&lt;/p>
&lt;p>I am referring to evaluating your system and how you and the people around you act within it. What worked months or years ago might differ from what we could discover today—as part of continuous improvement.&lt;/p>
&lt;p>I dislike politics in the workplace, where each team looks out for themselves instead of having a bigger shared direction. This results in daily work filled with fear from above, passed down to the people below, maintaining an &lt;a href="/blog/unhealthy-working-environment">unhealthy working environment&lt;/a>. Game of Thrones is great as a fictional series, but not something to deal with in daily business.&lt;/p>
&lt;p>Agile was born precisely as a response to the excessive waste generated by politics and organizational micromanagement.&lt;/p>
&lt;p>Controlling and “slow performance” needed a more flexible approach. When people adopt a fixed mindset, they resist change, fear failure, and prioritize rigid processes and hierarchies. This conflicts with Agile’s core ideas of embracing change, continuous delivery with iterative development, flexible planning, and fostering collaboration and innovation.&lt;/p>
&lt;p>A fixed mindset leads to fear of experimentation and a reluctance to challenge the status quo, reducing progress and the potential for learning and growth.&lt;/p>
&lt;hr />
&lt;h2 id="what-kills-agility">What kills agility?&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Fixed mindset&lt;/strong>: Resistance to change, fear of failure, and prioritizing rigid processes over learning and adaptation strangle innovation and flexibility.&lt;/li>
&lt;li>&lt;strong>Excessive bureaucracy&lt;/strong>: Complex processes and excessive documentation slow down decision-making and responsiveness.&lt;/li>
&lt;li>&lt;strong>Micromanagement&lt;/strong>: Over-controlling leadership undermines team autonomy.&lt;/li>
&lt;li>&lt;strong>Lack of collaboration&lt;/strong>: Poor communication and teamwork hinder progress.&lt;/li>
&lt;li>&lt;strong>Ineffective feedback loops&lt;/strong>: Prevent adjustments and continuous improvement.&lt;/li>
&lt;li>&lt;strong>Fear of experimentation&lt;/strong>: A culture that punishes failure discourages experimentation and learning from mistakes.&lt;/li>
&lt;li>&lt;strong>Inflexible processes&lt;/strong>: Strict adherence without adapting to project needs.&lt;/li>
&lt;li>&lt;strong>Misaligned goals&lt;/strong>: Conflicting priorities reduce efficiency.&lt;/li>
&lt;li>&lt;strong>Lack of leadership’s support&lt;/strong>: Without backing from upper management, Agile initiatives can struggle to gain the necessary resources and commitment.&lt;/li>
&lt;li>&lt;strong>Poor technical practices&lt;/strong>: Neglecting technical excellence and good design can lead to a fragile codebase that is difficult to adapt and extend.&lt;/li>
&lt;/ul>
&lt;h3 id="what-can-you-do-about-it">What can you do about it?&lt;/h3>
&lt;p>Learn the basics of Extreme Programming (XP) and Lean Software Development.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>XP&lt;/strong>: Focused on software development practices and technical excellence, with specific practices like pair programming and Test-Driven Development (TDD).&lt;/li>
&lt;li>&lt;strong>Lean&lt;/strong>: Takes a broader approach, focusing on removing waste, optimizing flow, and improving processes across the organization.&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="/images/blog/2024-05-30/footer.jpg" alt="blog-cover" />&lt;/p></content></entry><entry xml:lang="en"><title>Radical Candor</title><subtitle>How to Get What You Want by Saying What You Mean</subtitle><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><category term="mentoring" scheme="https://chemaclass.com/tags/mentoring/" label="Mentoring"/><published>2024-04-17T00:00:00+00:00</published><updated>2024-04-17T00:00:00+00:00</updated><author><name>
Kim Scott</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/radical-candor/"/><id>https://chemaclass.com/readings/radical-candor/</id><summary type="html">Radical Candor is a management philosophy developed by Kim Scott, a former Google leader. It's a crash course on how to be a great manager, focusing on being empathetic and results-oriented. The core idea is to create a stress-free environment where people feel safe to speak their minds, get their jobs done, and feel respected.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>Radical Candor is a management philosophy developed by Kim Scott, a former Google leader. It’s a crash course on how to be a great manager, focusing on being empathetic and results-oriented. The core idea is to create a stress-free environment where people feel safe to speak their minds, get their jobs done, and feel respected.&lt;/p>
&lt;h3 id="key-insights">Key Insights&lt;/h3>
&lt;ul>
&lt;li>Command and control can hinder innovation and harm a team’s efficiency. Collaboration and innovation flourish when human relationships replace bullying and bureaucracy.&lt;/li>
&lt;li>The goal of Radical Candor is to help managers and leaders achieve collaboratively what they cannot achieve individually, by caring about the people they work with.&lt;/li>
&lt;li>Radical Candor is about being radically honest and open, while still being kind and respectful.&lt;/li>
&lt;/ul>
&lt;h3 id="the-two-dimensions-of-radical-candor">The Two Dimensions of Radical Candor&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Care Personally&lt;/strong>: This dimension involves showing genuine interest in people’s lives, well-being, and goals. It’s about being human and empathetic.&lt;/li>
&lt;li>&lt;strong>Challenge Directly&lt;/strong>: This dimension involves giving specific, timely, and actionable feedback that is both kind and clear. It’s about being straightforward and results-oriented.&lt;/li>
&lt;/ul>
&lt;h3 id="avoiding-the-three-behaviors">Avoiding the Three Behaviors&lt;/h3>
&lt;ol>
&lt;li>&lt;strong>Obnoxious Aggression&lt;/strong>: Being overly critical or aggressive.&lt;/li>
&lt;li>&lt;strong>Ruinous Empathy&lt;/strong>: Being overly sympathetic or enabling.&lt;/li>
&lt;li>&lt;strong>Manipulative Insincerity&lt;/strong>: Being insincere or manipulative in your feedback.&lt;/li>
&lt;/ol>
&lt;h3 id="radical-candor-in-action">Radical Candor in Action&lt;/h3>
&lt;ul>
&lt;li>Give specific and sincere praise and kind and clear criticism.&lt;/li>
&lt;li>Create a stress-free environment where people feel safe to speak their minds.&lt;/li>
&lt;li>Focus on collaboration and innovation, rather than command and control.&lt;/li>
&lt;li>Care about the people you work with and challenge them to do their best work.&lt;/li>
&lt;/ul>
&lt;p>By applying Radical Candor, managers and leaders can build strong relationships, motivate their teams, and achieve better results.&lt;/p>
&lt;hr />
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/O9hDTLo5rLA"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>Learning Concurrency in Golang</title><subtitle>A horse racing emulator explained step by step</subtitle><category term="golang" scheme="https://chemaclass.com/tags/golang/" label="Golang"/><category term="software-design" scheme="https://chemaclass.com/tags/software-design/" label="Software Design"/><category term="clean-code" scheme="https://chemaclass.com/tags/clean-code/" label="Clean Code"/><published>2024-04-02T00:00:00+00:00</published><updated>2024-04-02T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/learning-concurrency-in-golang/"/><id>https://chemaclass.com/blog/learning-concurrency-in-golang/</id><summary type="html">I wanted to learn a new programming language, so after trying some, I ended up with Golang as one of my favorites for its simplicity and capabilities. It has features I haven’t used in years, like multithreading and concurrency.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2024-04-02/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>I wanted to learn a new language, so after trying some, I ended up with Golang as one of my favorites for its simplicity and capabilities. It has features I haven’t used in years, like multithreading and concurrency.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>&lt;a rel="external" href="https://go.dev/">Golang&lt;/a> (or &lt;code>Go&lt;/code>) supports concurrency through lightweight threads called goroutines. These are different from traditional multithreading—like in Java, where you have to handle sync and coordination to manage shared resources safely. In contrast, Go’s goroutines are lightweight, managed by the Go runtime, and cheaper to create and manage.&lt;/p>
&lt;p>While parallelism is &lt;strong>doing&lt;/strong> several things simultaneously, concurrency is about &lt;strong>dealing&lt;/strong> with several things at the same time. When we talk about concurrency and parallelism, we don’t know the order of things. We don’t know what’s going to happen first or what’s going to end first. There is an undefined order of execution.&lt;/p>
&lt;blockquote>
&lt;p>Imagine you cooking: preparing a soup, a salad and an omelet. You would be one single unit, but you are preparing different dishes. You might finish the salad first or the soup or the omelet… We cannot guarantee that! This would be concurrency, as you are alone dealing with several things. As soon as your partner comes and helps you cook, then we will be talking about parallelism.&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="/images/blog/2024-04-02/concurrency-vs-multithreading.jpg" alt="cover" />&lt;/p>
&lt;p>I remember building a similar game in &lt;code>Java&lt;/code> when I was learning multithreading ten years ago… let’s use this opportunity to do it again with modern &lt;code>Go&lt;/code>.&lt;/p>
&lt;p>I built a terminal game emulator that mimics one horse racing. Each horse is a goroutine that runs in a shared bidimensional matrix. Once a horse reaches the end, it notifies the shared channel between all other horses –running in different processes– and they all stop, showing in the terminal the winner of the race.&lt;/p>
&lt;p>I separated the code into four areas to help visualize it:&lt;/p>
&lt;ul>
&lt;li>Entry point&lt;/li>
&lt;li>Generating the board&lt;/li>
&lt;li>Rendering the game&lt;/li>
&lt;li>Moving the horses&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="/images/blog/2024-04-02/race-horses-demo.gif" alt="cover" />&lt;/p>
&lt;h3 id="entry-point">Entry point&lt;/h3>
&lt;p>The struct &lt;code>Horse&lt;/code> represents each Horse in the race.
The game consists of a list of lines, in which each Horse is running.&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="go">&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">type&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> Horse&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> struct&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> Name&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> string&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> //&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> The name of the horse&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> Line&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> int&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> //&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> The competition line&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>}&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">func&lt;/span>&lt;span> (&lt;/span>&lt;span style="color: light-dark(#E36209, #FFAB70);">h &lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">Horse&lt;/span>&lt;span>)&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> Letter&lt;/span>&lt;span>(&lt;/span>&lt;span>)&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> string&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> return&lt;/span>&lt;span> fmt&lt;/span>&lt;span>.&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">Sprintf&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">%c&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>,&lt;/span>&lt;span> h&lt;/span>&lt;span>.&lt;/span>&lt;span>Name&lt;/span>&lt;span>[&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">0&lt;/span>&lt;span>]&lt;/span>&lt;span>)&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>}&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">func&lt;/span>&lt;span> (&lt;/span>&lt;span style="color: light-dark(#E36209, #FFAB70);">h &lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">Horse&lt;/span>&lt;span>)&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> Equals&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#E36209, #FFAB70);">other&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> *&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">Horse&lt;/span>&lt;span>)&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> bool&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> return&lt;/span>&lt;span> other&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> !=&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> nil&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> &amp;amp;&amp;amp;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> h&lt;/span>&lt;span>.&lt;/span>&lt;span>Line&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> ==&lt;/span>&lt;span> other&lt;/span>&lt;span>.&lt;/span>&lt;span>Line&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> &amp;amp;&amp;amp;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> h&lt;/span>&lt;span>.&lt;/span>&lt;span>Name&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> ==&lt;/span>&lt;span> other&lt;/span>&lt;span>.&lt;/span>&lt;span>Name&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>}&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">func&lt;/span>&lt;span> (&lt;/span>&lt;span style="color: light-dark(#E36209, #FFAB70);">h &lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">Horse&lt;/span>&lt;span>)&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> String&lt;/span>&lt;span>(&lt;/span>&lt;span>)&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> string&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> return&lt;/span>&lt;span> fmt&lt;/span>&lt;span>.&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">Sprintf&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">%s&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> (line:&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">%d&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">)&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>,&lt;/span>&lt;span> h&lt;/span>&lt;span>.&lt;/span>&lt;span>Name&lt;/span>&lt;span>,&lt;/span>&lt;span> h&lt;/span>&lt;span>.&lt;/span>&lt;span>Line&lt;/span>&lt;span>)&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>}&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>You can spawn a new process using the keyword &lt;code>go&lt;/code> when invoking any function.
In this game, this is used 1) to render the game &lt;code>RenderGame()&lt;/code> and 2) for each horse’s movement &lt;code>startRuningHorseInLine()&lt;/code>. The goal is to keep the “rendering” and “movement logic” working in parallel.&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="go">&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">func&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> main&lt;/span>&lt;span>(&lt;/span>&lt;span>)&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> const&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> lines&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> lineLength&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> 12&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> 30&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span> board&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> :=&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> NewRaceBoard&lt;/span>&lt;span>(&lt;/span>&lt;span>lines&lt;/span>&lt;span>,&lt;/span>&lt;span> lineLength&lt;/span>&lt;span>)&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> go&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> RenderGame&lt;/span>&lt;span>(&lt;/span>&lt;span>board&lt;/span>&lt;span>)&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span> winnerChan&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> :=&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> make&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">chan&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> Horse&lt;/span>&lt;span>)&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> for&lt;/span>&lt;span> line&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> :=&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> range&lt;/span>&lt;span> board&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);"> //&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> each horse will be moved in different processes&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> go&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> startRunningHorseInLine&lt;/span>&lt;span>(&lt;/span>&lt;span>board&lt;/span>&lt;span>,&lt;/span>&lt;span> line&lt;/span>&lt;span>,&lt;/span>&lt;span> winnerChan&lt;/span>&lt;span>)&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);"> //&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> wait until one horse reaches the end&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> winner&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> :=&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> &amp;lt;-&lt;/span>&lt;span>winnerChan&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);"> //&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> render one last time to ensure the latest board state&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);"> RenderRaceBoard&lt;/span>&lt;span>(&lt;/span>&lt;span>board&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> &amp;amp;&lt;/span>&lt;span>winner&lt;/span>&lt;span>)&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span> fmt&lt;/span>&lt;span>.&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">Println&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">Race finished!&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>)&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> fmt&lt;/span>&lt;span>.&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">Printf&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"># Winner: &lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">%s&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">\n&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>,&lt;/span>&lt;span> winner&lt;/span>&lt;span>)&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>}&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;h3 id="generating-the-board">Generating the board&lt;/h3>
&lt;p>The race board is a bidimensional matrix of pointers to Horses. Each line “contains” only one Horse; aka only one pointer will point to an actual Horse, the rest will be pointers to &lt;code>nil&lt;/code>. During the generation of the Board, we will create one Horse at the first position of each line.&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="go">&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">func&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> NewRaceBoard&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#E36209, #FFAB70);">lines&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#E36209, #FFAB70);"> lineLength&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> int&lt;/span>&lt;span>)&lt;/span>&lt;span> [&lt;/span>&lt;span>]&lt;/span>&lt;span>[&lt;/span>&lt;span>]&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">*&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">Horse&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> board&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> :=&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> make&lt;/span>&lt;span>(&lt;/span>&lt;span>[&lt;/span>&lt;span>]&lt;/span>&lt;span>[&lt;/span>&lt;span>]&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">*&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">Horse&lt;/span>&lt;span>,&lt;/span>&lt;span> lines&lt;/span>&lt;span>)&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> for&lt;/span>&lt;span> line&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> :=&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> range&lt;/span>&lt;span> board&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> board&lt;/span>&lt;span>[&lt;/span>&lt;span>line&lt;/span>&lt;span>]&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> make&lt;/span>&lt;span>(&lt;/span>&lt;span>[&lt;/span>&lt;span>]&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">*&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">Horse&lt;/span>&lt;span>,&lt;/span>&lt;span> lineLength&lt;/span>&lt;span>)&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> board&lt;/span>&lt;span>[&lt;/span>&lt;span>line&lt;/span>&lt;span>]&lt;/span>&lt;span>[&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">0&lt;/span>&lt;span>]&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> &amp;amp;&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">Horse&lt;/span>&lt;span>{&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> Name&lt;/span>&lt;span>:&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> generateHorseName&lt;/span>&lt;span>(&lt;/span>&lt;span>)&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> Line&lt;/span>&lt;span>:&lt;/span>&lt;span> line&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> return&lt;/span>&lt;span> board&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>}&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>The names are randomly generated using &lt;code>HorseNames&lt;/code>.&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="go">&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">var&lt;/span>&lt;span> HorseNames&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&lt;/span>&lt;span> [&lt;/span>&lt;span>]&lt;/span>&lt;span>[&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">2&lt;/span>&lt;span>]&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">string&lt;/span>&lt;span>{&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> {&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">Alloping&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">Giggles&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>}&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> {&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">A-lot&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">Gallop&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>}&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> {&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">BoJack&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">Jack&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>}&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> {&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">Baroness&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">Belle&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>}&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);"> //&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> ...&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>}&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">func&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> generateHorseName&lt;/span>&lt;span>(&lt;/span>&lt;span>)&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> string&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> name&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> :=&lt;/span>&lt;span> HorseNames&lt;/span>&lt;span>[&lt;/span>&lt;span>rand&lt;/span>&lt;span>.&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">Intn&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">len&lt;/span>&lt;span>(&lt;/span>&lt;span>HorseNames&lt;/span>&lt;span>)&lt;/span>&lt;span>)&lt;/span>&lt;span>]&lt;/span>&lt;span>[&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">0&lt;/span>&lt;span>]&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> surname&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> :=&lt;/span>&lt;span> HorseNames&lt;/span>&lt;span>[&lt;/span>&lt;span>rand&lt;/span>&lt;span>.&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">Intn&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">len&lt;/span>&lt;span>(&lt;/span>&lt;span>HorseNames&lt;/span>&lt;span>)&lt;/span>&lt;span>)&lt;/span>&lt;span>]&lt;/span>&lt;span>[&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">1&lt;/span>&lt;span>]&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> return&lt;/span>&lt;span> name&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> +&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> +&lt;/span>&lt;span> surname&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>}&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;h3 id="rendering-the-game">Rendering the game&lt;/h3>
&lt;p>Then &lt;code>RenderGame()&lt;/code>, &lt;code>renderRaceBoard()&lt;/code>, &lt;code>renderRaceLine()&lt;/code> and &lt;code>renderRacePosition()&lt;/code> are separated to help focus on each method’s responsibility –identifying what is the subject to be rendered.&lt;/p>
&lt;blockquote>
&lt;p>&lt;code>RenderGame()&lt;/code> is being executed in another process using &lt;code>go&lt;/code>.&lt;/p>
&lt;/blockquote>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="go">&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">func&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> RenderGame&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#E36209, #FFAB70);">board&lt;/span>&lt;span> [&lt;/span>&lt;span>]&lt;/span>&lt;span>[&lt;/span>&lt;span>]&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">*&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">Horse&lt;/span>&lt;span>)&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> for&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> time&lt;/span>&lt;span>.&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">Sleep&lt;/span>&lt;span>(&lt;/span>&lt;span>renderDelay&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> *&lt;/span>&lt;span> time&lt;/span>&lt;span>.&lt;/span>&lt;span>Millisecond&lt;/span>&lt;span>)&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);"> RenderRaceBoard&lt;/span>&lt;span>(&lt;/span>&lt;span>board&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> nil&lt;/span>&lt;span>)&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>}&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">func&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> RenderRaceBoard&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#E36209, #FFAB70);">board&lt;/span>&lt;span> [&lt;/span>&lt;span>]&lt;/span>&lt;span>[&lt;/span>&lt;span>]&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">*&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">Horse&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#E36209, #FFAB70);"> winner&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> *&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">Horse&lt;/span>&lt;span>)&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);"> //&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> use a &amp;quot;string buffer&amp;quot; to save the whole board state&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);"> //&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> so we can later use one IO call to render it&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> var&lt;/span>&lt;span> buffer&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> bytes&lt;/span>&lt;span>.&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">Buffer&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> buffer&lt;/span>&lt;span>.&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">WriteString&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">\n&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>)&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> for&lt;/span>&lt;span> line&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> :=&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> range&lt;/span>&lt;span> board&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);"> renderRaceLine&lt;/span>&lt;span>(&lt;/span>&lt;span>board&lt;/span>&lt;span>,&lt;/span>&lt;span> line&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> &amp;amp;&lt;/span>&lt;span>buffer&lt;/span>&lt;span>,&lt;/span>&lt;span> winner&lt;/span>&lt;span>)&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);"> clearScreen&lt;/span>&lt;span>(&lt;/span>&lt;span>)&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> fmt&lt;/span>&lt;span>.&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">Println&lt;/span>&lt;span>(&lt;/span>&lt;span>buffer&lt;/span>&lt;span>.&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">String&lt;/span>&lt;span>(&lt;/span>&lt;span>)&lt;/span>&lt;span>)&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>}&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">func&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> clearScreen&lt;/span>&lt;span>(&lt;/span>&lt;span>)&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> cmd&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> :=&lt;/span>&lt;span> exec&lt;/span>&lt;span>.&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">Command&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">clear&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>)&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> cmd&lt;/span>&lt;span>.&lt;/span>&lt;span>Stdout&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&lt;/span>&lt;span> os&lt;/span>&lt;span>.&lt;/span>&lt;span>Stdout&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> cmd&lt;/span>&lt;span>.&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">Run&lt;/span>&lt;span>(&lt;/span>&lt;span>)&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>}&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">func&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> renderRaceLine&lt;/span>&lt;span>(&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#E36209, #FFAB70);"> board&lt;/span>&lt;span> [&lt;/span>&lt;span>]&lt;/span>&lt;span>[&lt;/span>&lt;span>]&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">*&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">Horse&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#E36209, #FFAB70);"> line&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> int&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#E36209, #FFAB70);"> buffer&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> *&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">bytes&lt;/span>&lt;span>.&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">Buffer&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#E36209, #FFAB70);"> winner&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> *&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">Horse&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>)&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> buffer&lt;/span>&lt;span>.&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">WriteString&lt;/span>&lt;span>(&lt;/span>&lt;span>fmt&lt;/span>&lt;span>.&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">Sprintf&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> %.2d&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> | &lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>,&lt;/span>&lt;span> line&lt;/span>&lt;span>)&lt;/span>&lt;span>)&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> var&lt;/span>&lt;span> current&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> Horse&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> for&lt;/span>&lt;span> col&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> :=&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> range&lt;/span>&lt;span> board&lt;/span>&lt;span>[&lt;/span>&lt;span>line&lt;/span>&lt;span>]&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> h&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> :=&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> renderRacePosition&lt;/span>&lt;span>(&lt;/span>&lt;span>board&lt;/span>&lt;span>,&lt;/span>&lt;span> line&lt;/span>&lt;span>,&lt;/span>&lt;span> col&lt;/span>&lt;span>,&lt;/span>&lt;span> buffer&lt;/span>&lt;span>,&lt;/span>&lt;span> winner&lt;/span>&lt;span>)&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> if&lt;/span>&lt;span> h&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> !=&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> nil&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> current&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> *&lt;/span>&lt;span>h&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> buffer&lt;/span>&lt;span>.&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">WriteString&lt;/span>&lt;span>(&lt;/span>&lt;span>fmt&lt;/span>&lt;span>.&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">Sprintf&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">| &lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">%s&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>,&lt;/span>&lt;span> current&lt;/span>&lt;span>.&lt;/span>&lt;span>Name&lt;/span>&lt;span>)&lt;/span>&lt;span>)&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> if&lt;/span>&lt;span> current&lt;/span>&lt;span>.&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">Equals&lt;/span>&lt;span>(&lt;/span>&lt;span>winner&lt;/span>&lt;span>)&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> buffer&lt;/span>&lt;span>.&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">WriteString&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> [Won!]&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>)&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> buffer&lt;/span>&lt;span>.&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">WriteString&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">\n&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>)&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>}&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">func&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> renderRacePosition&lt;/span>&lt;span>(&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#E36209, #FFAB70);"> board&lt;/span>&lt;span> [&lt;/span>&lt;span>]&lt;/span>&lt;span>[&lt;/span>&lt;span>]&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">*&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">Horse&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#E36209, #FFAB70);"> line&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#E36209, #FFAB70);"> col&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> int&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#E36209, #FFAB70);"> buffer&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> *&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">bytes&lt;/span>&lt;span>.&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">Buffer&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#E36209, #FFAB70);"> winner&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> *&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">Horse&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>)&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> *&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">Horse&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> if&lt;/span>&lt;span> board&lt;/span>&lt;span>[&lt;/span>&lt;span>line&lt;/span>&lt;span>]&lt;/span>&lt;span>[&lt;/span>&lt;span>col&lt;/span>&lt;span>]&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> ==&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> nil&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> buffer&lt;/span>&lt;span>.&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">WriteString&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;quot;&lt;/span>&lt;span>)&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> return&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> nil&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span> current&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> :=&lt;/span>&lt;span> board&lt;/span>&lt;span>[&lt;/span>&lt;span>line&lt;/span>&lt;span>]&lt;/span>&lt;span>[&lt;/span>&lt;span>col&lt;/span>&lt;span>]&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> if&lt;/span>&lt;span> current&lt;/span>&lt;span>.&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">Equals&lt;/span>&lt;span>(&lt;/span>&lt;span>winner&lt;/span>&lt;span>)&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);"> removeChars&lt;/span>&lt;span>(&lt;/span>&lt;span>buffer&lt;/span>&lt;span>,&lt;/span>&lt;span> col&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">+&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">1&lt;/span>&lt;span>)&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> for&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> range&lt;/span>&lt;span> board&lt;/span>&lt;span>[&lt;/span>&lt;span>line&lt;/span>&lt;span>]&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> buffer&lt;/span>&lt;span>.&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">WriteString&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">-&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>)&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span> buffer&lt;/span>&lt;span>.&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">WriteString&lt;/span>&lt;span>(&lt;/span>&lt;span>current&lt;/span>&lt;span>.&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">Letter&lt;/span>&lt;span>(&lt;/span>&lt;span>)&lt;/span>&lt;span>)&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> return&lt;/span>&lt;span> current&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>}&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;h3 id="moving-the-horses">Moving the horses&lt;/h3>
&lt;p>In &lt;code>main(...)&lt;/code>, the &lt;code>winnerChan&lt;/code> is a shared channel that will be used by the first Horse reaching the last position in their line.&lt;/p>
&lt;p>Each Horse will run a loop until reaching the end of the line OR receiving (via the shared channel &lt;code>winnerChan&lt;/code>) the message that another Horse already won the race. Until then, each horse will move independently by randomly sleeping milliseconds before moving to the next position in their line.&lt;/p>
&lt;blockquote>
&lt;p>&lt;code>startRuningHorseInLine()&lt;/code> runs in another process using &lt;code>go&lt;/code>.&lt;/p>
&lt;/blockquote>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="go">&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">func&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> main&lt;/span>&lt;span>(&lt;/span>&lt;span>)&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);"> //&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);">...&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> winnerChan&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> :=&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> make&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">chan&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> Horse&lt;/span>&lt;span>)&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> for&lt;/span>&lt;span> line&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> :=&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> range&lt;/span>&lt;span> board&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);"> //&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> each horse will be moved in different processes&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> go&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> startHorseRunning&lt;/span>&lt;span>(&lt;/span>&lt;span>board&lt;/span>&lt;span>,&lt;/span>&lt;span> line&lt;/span>&lt;span>,&lt;/span>&lt;span> winnerChan&lt;/span>&lt;span>)&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);"> //&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> wait until one horse reaches the end&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> winner&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> :=&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> &amp;lt;-&lt;/span>&lt;span>winnerChan&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);"> //&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);">...&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>}&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">func&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> startRunningHorseInLine&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#E36209, #FFAB70);">board&lt;/span>&lt;span> [&lt;/span>&lt;span>]&lt;/span>&lt;span>[&lt;/span>&lt;span>]&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">*&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">Horse&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#E36209, #FFAB70);"> line&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> int&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#E36209, #FFAB70);"> winnerChan&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> chan&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> Horse&lt;/span>&lt;span>)&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> for&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> select&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> case&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> &amp;lt;-&lt;/span>&lt;span>winnerChan&lt;/span>&lt;span>:&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> //&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> check if another horse finished&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> return&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> //&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> in such a case, then stop the for loop&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> default&lt;/span>&lt;span>:&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> time&lt;/span>&lt;span>.&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">Sleep&lt;/span>&lt;span>(&lt;/span>&lt;span>time&lt;/span>&lt;span>.&lt;/span>&lt;span>Millisecond&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> *&lt;/span>&lt;span> time&lt;/span>&lt;span>.&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">Duration&lt;/span>&lt;span>(&lt;/span>&lt;span>rand&lt;/span>&lt;span>.&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">Intn&lt;/span>&lt;span>(&lt;/span>&lt;span>maxSleepDelay&lt;/span>&lt;span>)&lt;/span>&lt;span>)&lt;/span>&lt;span>)&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);"> moveHorseOnePos&lt;/span>&lt;span>(&lt;/span>&lt;span>board&lt;/span>&lt;span>,&lt;/span>&lt;span> line&lt;/span>&lt;span>,&lt;/span>&lt;span> winnerChan&lt;/span>&lt;span>)&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>}&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">func&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> moveHorseOnePos&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#E36209, #FFAB70);">board&lt;/span>&lt;span> [&lt;/span>&lt;span>]&lt;/span>&lt;span>[&lt;/span>&lt;span>]&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">*&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">Horse&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#E36209, #FFAB70);"> line&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> int&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#E36209, #FFAB70);"> winnerChan&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> chan&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> Horse&lt;/span>&lt;span>)&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> cols&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> :=&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> len&lt;/span>&lt;span>(&lt;/span>&lt;span>board&lt;/span>&lt;span>[&lt;/span>&lt;span>line&lt;/span>&lt;span>]&lt;/span>&lt;span>)&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> for&lt;/span>&lt;span> col&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> :=&lt;/span>&lt;span> cols&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> -&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> 1&lt;/span>&lt;span>;&lt;/span>&lt;span> col&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> &amp;gt;&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> 0&lt;/span>&lt;span>;&lt;/span>&lt;span> col&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">--&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> if&lt;/span>&lt;span> board&lt;/span>&lt;span>[&lt;/span>&lt;span>line&lt;/span>&lt;span>]&lt;/span>&lt;span>[&lt;/span>&lt;span>col&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">-&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">1&lt;/span>&lt;span>]&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> ==&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> nil&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> continue&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);"> //&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> here we identify that there is a horse in&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);"> //&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> the following column, so we move it to the&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);"> //&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> current column, and we set `nil` the other one&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> board&lt;/span>&lt;span>[&lt;/span>&lt;span>line&lt;/span>&lt;span>]&lt;/span>&lt;span>[&lt;/span>&lt;span>col&lt;/span>&lt;span>]&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&lt;/span>&lt;span> board&lt;/span>&lt;span>[&lt;/span>&lt;span>line&lt;/span>&lt;span>]&lt;/span>&lt;span>[&lt;/span>&lt;span>col&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">-&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">1&lt;/span>&lt;span>]&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> board&lt;/span>&lt;span>[&lt;/span>&lt;span>line&lt;/span>&lt;span>]&lt;/span>&lt;span>[&lt;/span>&lt;span>col&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">-&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">1&lt;/span>&lt;span>]&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> nil&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> if&lt;/span>&lt;span> col&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">+&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">1&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> ==&lt;/span>&lt;span> cols&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> winnerChan&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> &amp;lt;-&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> *&lt;/span>&lt;span>board&lt;/span>&lt;span>[&lt;/span>&lt;span>line&lt;/span>&lt;span>]&lt;/span>&lt;span>[&lt;/span>&lt;span>col&lt;/span>&lt;span>]&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> break&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>}&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;h3 id="source-code">Source code&lt;/h3>
&lt;p>The code displayed in this post is a simplified version, so if you would like to check the working source, you can do it here: &lt;a rel="external" href="https://github.com/Chemaclass/go-horse-racing">Chemaclass/go-horse-racing&lt;/a>.&lt;/p>
&lt;blockquote>
&lt;p>Thanks to my former Team Lead, Andrei Boar, who helped me review my first original solution and provided an &lt;a rel="external" href="https://gist.github.com/zuzuleinen/79413aa7933d7d6c6d84ec6ba8c3910a">alternative solution&lt;/a> (simpler and better!), which I applied to my original code. The main learning was using a &lt;code>chan Horse&lt;/code> to pass the winner Horse from &lt;code>main()&lt;/code>, instead of using a &lt;code>chan bool&lt;/code> and a &lt;code>sync.WaitGroup&lt;/code> between all threads.&lt;/p>
&lt;/blockquote></content></entry><entry xml:lang="en"><title>Effective Pair Programming</title><subtitle>Embracing quality practices in your engineering culture</subtitle><category term="pair-programming" scheme="https://chemaclass.com/tags/pair-programming/" label="Pair Programming"/><category term="xp" scheme="https://chemaclass.com/tags/xp/" label="Xp"/><category term="tdd" scheme="https://chemaclass.com/tags/tdd/" label="Tdd"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><category term="clean-code" scheme="https://chemaclass.com/tags/clean-code/" label="Clean Code"/><published>2024-03-28T00:00:00+00:00</published><updated>2024-03-28T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/effective-pair-programming/"/><id>https://chemaclass.com/blog/effective-pair-programming/</id><summary type="html">A practical guide to pair programming that works -- roles, rotation, when to pair, common pitfalls, and how to make sessions productive.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2024-03-28/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>What is pair programming? Let’s first establish what pair programming is: Two people working together on the same problem at the same time.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>It is not about one person showing off their skills in front of another, nor one person afraid of making mistakes due to an impostor syndrome.&lt;/p>
&lt;p>Each person will have a role:&lt;/p>
&lt;ul>
&lt;li>Navigator: he will pay attention to the bigger picture; eg: architecture, relation between collaborators, object design, etc.&lt;/li>
&lt;li>Driver: she will pay attention to the small details; eg: naming, code conventions, writing syntax, object design, etc.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>The pair could –and should– switch roles occasionally; eg: every X commits pushed, every 10 mins, … up to them.&lt;/p>
&lt;/blockquote>
&lt;p>Pair programming should not be considered a practice only for “seniors” to juniors, but regardless of the team members’ experience level.&lt;/p>
&lt;p>It is about the &lt;strong>collaboration flow&lt;/strong>, the quality communication, the absence of feeling judged, and the idea of welcoming vulnerability with your peers, knowing they will support and help you.&lt;/p>
&lt;p>It is about constantly challenging each other, seeking the most pragmatic solution while keeping it simple. Always looking for &lt;strong>quick feedback&lt;/strong> when speaking to each other, but also on the solution you agreed to implement and its direction.&lt;/p>
&lt;p>It is about the short, quick, and immediate feedback loop while talking to your partner, who &lt;strong>reviews your code on the fly&lt;/strong>. You can guide as a navigator or help the driver validate their ideas in a broader picture.&lt;/p>
&lt;p>It is about the constant &lt;strong>sharing&lt;/strong> of &lt;strong>knowledge&lt;/strong> atmosphere by default, reducing bus-factors and silo-knowledge areas to the maximum. Increasing the focus by having two minds working on the same task simultaneously.&lt;/p>
&lt;p>It is about &lt;strong>team cohesion&lt;/strong> and sharpening the feeling that we belong. When we understand each other’s strengths and weaknesses, we will realize how much we can help each other grow.&lt;/p>
&lt;p>&lt;img src="/images/blog/2024-03-28/footer.jpg" alt="cover" />&lt;/p>
&lt;h2 id="how-can-you-practice-pair-programming">How can you practice pair programming?&lt;/h2>
&lt;p>Pair programming can be done in different ways:&lt;/p>
&lt;ul>
&lt;li>You can start and finish a task with pairing. You can time-box it to 30, 60, 90 minutes. Either way, it is recommended to have pauses in the middle - Pomodoro.&lt;/li>
&lt;li>You can start the task together and stop when one of your peers feels confident enough to continue alone.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>It is up to the team –and the task in context– to decide when and how to apply pairing to get the best out of it.&lt;/p>
&lt;/blockquote>
&lt;p>This does not mean you must constantly work “no matter what” in pair. This is not about creating rules; on the contrary, it is about embracing this practice to the point you feel confident to choose when and how to use it to get the best out of it.&lt;/p>
&lt;p>Pair programming might become one of the best tools in your team toolbox for daily interactions. Not because you read it somewhere but because of the benefits you and your team will find.&lt;/p>
&lt;h3 id="common-patterns">Common Patterns&lt;/h3>
&lt;h4 id="different-strategies-for-effective-pairing">Different strategies for effective pairing&lt;/h4>
&lt;ul>
&lt;li>&lt;strong>Driver-Navigator&lt;/strong>: One person is driving the code (with the keyboard), focusing on the detail aspect of the task itself. The other is a navigator (no keyboard), having a more abstract picture of the task in mind.&lt;/li>
&lt;li>&lt;strong>Ping-Pong&lt;/strong>: Frequent switching driver-navigator roles in small interactions, e.g., every N minutes, every N commits, etc.&lt;/li>
&lt;li>&lt;strong>Backseat driver&lt;/strong>: The navigator engages actively with the driver.&lt;/li>
&lt;li>&lt;strong>Tourist guide&lt;/strong>: The navigator passively learns with the driver.&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="/images/blog/2024-03-28/good-pair-prog.jpg" alt="cover" />&lt;/p>
&lt;h4 id="anti-patterns-while-pairing">Anti-patterns while pairing&lt;/h4>
&lt;ul>
&lt;li>&lt;strong>The silent partner&lt;/strong>: The navigator is not participating, and they are being silent.&lt;/li>
&lt;li>&lt;strong>The solo act&lt;/strong>: The driver ignores all inputs from the navigator.&lt;/li>
&lt;li>&lt;strong>Distracted pair&lt;/strong>: The pair does not focus on the problem to solve.&lt;/li>
&lt;li>&lt;strong>The Dictator&lt;/strong>: One person is telling what to do, ignoring the input from the other.&lt;/li>
&lt;li>&lt;strong>Philosophical pair&lt;/strong>: The pair is &lt;a href="/blog/bikeshedding/">bikeshedding&lt;/a> into irrelevant topics.&lt;/li>
&lt;li>&lt;strong>The code war&lt;/strong>: The pair does not reach an agreement and starts an unnecessary war, which wastes time and effort.&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="/images/blog/2024-03-28/anti-pair-prog.jpg" alt="cover" />&lt;/p>
&lt;p>&lt;strong>Want more?&lt;/strong> Check this out: &lt;a rel="external" href="https://www.figma.com/file/FCmGwRPIO8cLowDRraJhgr/Learning-TDD">Learning Through KATAS&lt;/a>&lt;/p>
&lt;p>&lt;img src="/images/blog/2024-03-28/learning-through-katas.jpg" alt="cover" />&lt;/p>
&lt;blockquote>
&lt;p>Thanks to my friend &lt;a rel="external" href="https://x.com/evrtrabajo">Manu&lt;/a>, who helped me with this post. We even share a &lt;a rel="external" href="https://phpconference.com/agile-culture/practical-tdd-workshop/">workshop&lt;/a> on this topic.&lt;/p>
&lt;/blockquote></content></entry><entry xml:lang="en"><title>Deployments on Fridays</title><subtitle>Why "should we not" deploy to production on Fridays?</subtitle><category term="agile" scheme="https://chemaclass.com/tags/agile/" label="Agile"/><category term="xp" scheme="https://chemaclass.com/tags/xp/" label="Xp"/><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><category term="productivity" scheme="https://chemaclass.com/tags/productivity/" label="Productivity"/><published>2024-02-25T00:00:00+00:00</published><updated>2024-02-25T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/deployments-on-fridays/"/><id>https://chemaclass.com/blog/deployments-on-fridays/</id><summary type="html">I have heard multiple times, from various people, the idea of panic towards deploying on Fridays. How good is that idea of banning the day before weekend from delivering new value to our clients or customers?</summary><content type="html">&lt;p>&lt;img src="/images/blog/2024-02-25/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>I have heard multiple times, from various people, the idea of panic towards deploying on Fridays. How good is that idea of banning the day before weekend from delivering new value to our clients or customers?&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>The main argument in favor of NOT deploying on Friday is based on the idea that we “should be paranoid” with our software and that it could fail when we touch it. So, we “should assume” the worst whenever we deploy a new release version of our system.&lt;/p>
&lt;p>However, the critical factor here is Why? Why should we not deploy on Fridays? Is it OK to be afraid of our own software system, that we live in a constant panic of breaking it the day after we have done a deployment? How much impact should our releases have? How can we make sure the deployment won’t break the live system?&lt;/p>
&lt;p>Your Continuous Integration/Delivery pipelines, end-to-end and other types of tests in place, automated scaling policies, a previous staging sandbox to perform even manual tests if necessary, etc., will determine the security and confidence for any of your releases. However, the quality of these topics is a deal-breaker to have enough confidence on how, when and why would it make sense to release to production.&lt;/p>
&lt;p>The goal is build a system where deployments to production should be as often, smooth and easy as possible; any time, any day. Being afraid of your system should not be the aim. On the contrary, it should be something to work towards to fix it.&lt;/p>
&lt;p>The team dynamics are also an essential factor here. If we establish fear of deployments on Fridays, and fear of our system, that will end up in lack of accountability by default. This reminds me of &lt;a href="/readings/the-five-dysfunctions-of-a-team/">The Five Dysfunctions of a Team&lt;/a>.&lt;/p>
&lt;p>&lt;img src="/images/blog/2024-02-25/middle.jpg" alt="cover" />&lt;/p>
&lt;p>If you deploy small and frequent changes as soon as they can guarantee 100% quality value success, why delay such an incremental improvement to your system?&lt;/p>
&lt;p>Coming back to “Why should we not deploy on Fridays?” The only reason I can think of is being afraid that we have to work on Saturday on the broken thing we delivered on Friday. However, I wonder if any option was available, so we could have identified such a broken thing during the working Friday itself.&lt;/p>
&lt;p>Monitoring your live system is crucial to guarantee the health after each deployment. This is essential to ensure everything is working fine and smoothly. To build a resilience system, this should trigger alarms to notify someone responsible for addressing the issue, disable or revert the latest “broken” feature… there are many techniques to create awareness and act on them.&lt;/p>
&lt;p>In case of doubt, you could use feature flags to disable the feature you will deploy. Still, you prefer not to enable it during the weekend while keeping the option of adding value and deploying anytime always open.&lt;/p>
&lt;p>I believe &lt;strong>frequent&lt;/strong> and &lt;strong>small releases&lt;/strong> to production &lt;strong>are key&lt;/strong>; any time, any date, as far as it makes sense, and there is a clear path to bringing value soon to the customer to get feedback ASAP.&lt;/p>
&lt;blockquote>
&lt;p>Deliver quality value in small increments, as frequently as possible.&lt;/p>
&lt;/blockquote>
&lt;p>Being able to deploy on Fridays (if needed or wanted) impacts the team’s confidence. Similarly, forbidding deployments on Fridays impacts the team’s self-esteem as well.&lt;/p>
&lt;p>&lt;img src="/images/blog/2024-02-25/footer.jpg" alt="cover" />&lt;/p></content></entry><entry xml:lang="en"><title>The Lean Startup</title><subtitle>How Today's Entrepreneurs Use Continuous Innovation to Create Radically Successful</subtitle><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><category term="productivity" scheme="https://chemaclass.com/tags/productivity/" label="Productivity"/><category term="agile" scheme="https://chemaclass.com/tags/agile/" label="Agile"/><published>2024-01-26T00:00:00+00:00</published><updated>2024-01-26T00:00:00+00:00</updated><author><name>
Eric Ries</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/the-lean-startup/"/><id>https://chemaclass.com/readings/the-lean-startup/</id><summary type="html">Most startups fail. But many of those failures are preventable. The Lean Startup is a new approach being adopted across the globe, changing the way companies are built and new products are launched.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>Most startups fail. But many of those failures are preventable. The Lean Startup is a new approach being adopted across the globe, changing the way companies are built and new products are launched.&lt;/p>
&lt;p>Eric Ries defines a startup as an organization dedicated to creating something new under conditions of extreme uncertainty. This is just as true for one person in a garage or a group of seasoned professionals in a Fortune 500 boardroom. What they have in common is a mission to penetrate that fog of uncertainty to discover a successful path to a sustainable business.&lt;/p>
&lt;h2 id="key-takeaways">Key Takeaways&lt;/h2>
&lt;ul>
&lt;li>Test frequently and learn quickly&lt;/li>
&lt;li>Observe and measure real customer behaviour&lt;/li>
&lt;li>Focus exclusively on capturing actionable Metrics&lt;/li>
&lt;li>Be comfortable pivoting based on key learnings&lt;/li>
&lt;li>Embrace new accounting methods&lt;/li>
&lt;li>Learn what is not working and apply changes immediately: stay lean&lt;/li>
&lt;/ul>
&lt;h3 id="summary">Summary&lt;/h3>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/RSaIOCHbuYw"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;hr />
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/fEvKo90qBns"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>Great Engineering</title><subtitle>A great engineer is not just a great coder</subtitle><category term="software-design" scheme="https://chemaclass.com/tags/software-design/" label="Software Design"/><category term="career" scheme="https://chemaclass.com/tags/career/" label="Career"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><category term="clean-code" scheme="https://chemaclass.com/tags/clean-code/" label="Clean Code"/><published>2023-12-30T00:00:00+00:00</published><updated>2023-12-30T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/great-engineering/"/><id>https://chemaclass.com/blog/great-engineering/</id><summary type="html">Coding is not just another job. In the right environment, writing software can be really fun and, even more, it can be your personal hobby as well! So... you might be focused on coding, coding and more coding to level up your own career skills.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2023-12-30/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>Coding is not just another job. Writing software can be really fun and, even more, it can be your personal hobby as well! You might be focused on coding, coding and more coding to level up your own career skills.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>That itself is not bad at all! Practice makes the master, so a lot of coding will inevitably help you improve your coding skills… but there are &lt;a href="/blog/the-path-to-seniority-in-software/">other aspects&lt;/a> that you need to keep in mind in order to help you grow into a great engineer.&lt;/p>
&lt;p>As a software engineer, your job is not “just to write software” -for its own sake, but to &lt;strong>use software to solve actual business problems&lt;/strong>. To make that happen there are plenty of different methodologies out there, for sure. However, we must agree that you need to identify and understand your customer’s needs in order to know what to actually build.&lt;/p>
&lt;p>You need to know your product, at least until certain level, so you can design your software using a similar language closer to the business, which will help its evolution and overall quality. This will be beneficial for the future (and present) maintenance of the product.&lt;/p>
&lt;p>IT, Software, Product and People topics are highly interconnected, and having at least a common ground of understanding the relation between these can help the overall goal of every single individual.&lt;/p>
&lt;p>The result of a great team work is not equal as the sum of the individual parts, as it’s multiplying the created value among their peers. To that, great communication skills are a key part of it in order to create as much clarity as possible from any different abstraction level.&lt;/p>
&lt;p>That’s why a great engineer is a knowledgeable person about business, customer, product, and coding. Understanding these points have a strong impact on your daily work as it creates a difference between the average and the great engineer.&lt;/p>
&lt;hr />
&lt;p>Image original by &lt;a rel="external" href="https://hybridhacker.email">Nicola Ballotta&lt;/a>.&lt;/p></content></entry><entry xml:lang="en"><title>Invincible</title><subtitle>Achieve More, Suffer Less</subtitle><category term="philosophy" scheme="https://chemaclass.com/tags/philosophy/" label="Philosophy"/><category term="psychology" scheme="https://chemaclass.com/tags/psychology/" label="Psychology"/><category term="productivity" scheme="https://chemaclass.com/tags/productivity/" label="Productivity"/><published>2023-12-09T00:00:00+00:00</published><updated>2023-12-09T00:00:00+00:00</updated><author><name>
Marcos Vazquez</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/invincible/"/><id>https://chemaclass.com/readings/invincible/</id><summary type="html">Marcos Vazquez combines stoic philosophy with modern psychology to train your mind for clarity, determination, and discipline in the face of adversity.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>The quality of your life depends on the quality of your mind. Unfortunately, we spend little time improving our thoughts, and it is rarely taught at school. As a result, we go through life without really understanding how to use our mind.&lt;/p>
&lt;p>We have in our head the most sophisticated object in the world, but we barely know how it works. Most people are unable to direct their mental strength toward the goals they truly desire. They get distracted and frustrated. They can’t resist temptation or persevere in the face of adversity. In the end, they quit.&lt;/p>
&lt;p>Luckily, our mind can be trained, and this book will show you how. It combines &lt;strong>stoic philosophy&lt;/strong> with &lt;strong>modern psychology&lt;/strong>, and provides the tools to help you visualize with clarity, act with determination and resist with discipline.&lt;/p>
&lt;blockquote>
&lt;p>“We suffer not from the events in our lives, but from our judgement about them.” Epictetus.&lt;/p>
&lt;/blockquote>
&lt;p>Any external change requires an internal change first. If you want to transform your body, you must start from within. A weak mind will never create a strong body.&lt;/p>
&lt;p>This book will help you use your mind to improve your body, but it actually goes much further. It is not a simple guide to optimize your daily habits, but rather it aims to guide your own philosophy of life. The tools you will develop will help you with anything you want to achieve. Life is always simpler with clarity, determination and discipline.&lt;/p>
&lt;h4 id="the-philosophy-of-stoicism">The philosophy of Stoicism&lt;/h4>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/R9OCA6UFE-0"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>Forming, Storming, Norming and Performing</title><subtitle>Tuckman's Model to drive a team to high performance</subtitle><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><category term="psychology" scheme="https://chemaclass.com/tags/psychology/" label="Psychology"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><published>2023-11-25T00:00:00+00:00</published><updated>2023-11-25T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/forming-storming-norming-performing/"/><id>https://chemaclass.com/blog/forming-storming-norming-performing/</id><summary type="html">Embarking on the path to high team performance involves understanding Tuckman's Model — a roadmap through the stages of forming, storming, norming, performing, and adjourning. In this blog post, we explore practical strategies for each stage, empowering leaders and team members to cultivate collaboration, manage conflicts, and achieve true synergy.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2023-11-25/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>In 1965, psychologist Bruce Tuckman developed a model (Tuckman’s Model) that describes the stages of group development, forming and maturing into a cohesive and effective team.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>The model initially consisted of four stages: “&lt;em>&lt;strong>forming&lt;/strong>, &lt;strong>storming&lt;/strong>, &lt;strong>norming&lt;/strong>,&lt;/em> and &lt;em>&lt;strong>performing&lt;/strong>&lt;/em>,” adding one additional “&lt;em>&lt;strong>adjourning&lt;/strong>&lt;/em>” in 1977.&lt;/p>
&lt;p>It’s important to note that teams may not always progress through these stages linearly, and they might revert to a previous stage under certain circumstances.&lt;/p>
&lt;h2 id="forming">Forming&lt;/h2>
&lt;p>In this initial stage, team members are polite, tentative, and unsure about their roles. There is a reliance on the leader for guidance.&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Goal&lt;/strong>: Members are getting to know each other, and there is a focus on defining the team’s purpose, goals, and roles.&lt;/p>
&lt;/blockquote>
&lt;h3 id="leadership-approach">Leadership approach&lt;/h3>
&lt;ul>
&lt;li>Provide clear direction and guidance&lt;/li>
&lt;li>Clearly define team goals, roles, and expectations&lt;/li>
&lt;li>Act as a facilitator, encouraging open communication and helping team members get to know each other.&lt;/li>
&lt;/ul>
&lt;h2 id="storming">Storming&lt;/h2>
&lt;p>Conflict and disagreement emerge as team members start to express their individuality. There may be power struggles and challenges to the leader’s authority.&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Goal&lt;/strong>: The team clarifies its goals, members learn to resolve conflicts and address differences constructively.&lt;/p>
&lt;/blockquote>
&lt;h3 id="leadership-approach-1">Leadership approach&lt;/h3>
&lt;ul>
&lt;li>Facilitate conflict resolution&lt;/li>
&lt;li>Acknowledge and address conflicts constructively&lt;/li>
&lt;li>Encourage open and honest communication while guiding the team through the process of understanding and appreciating diverse perspectives&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="/images/blog/2023-11-25/middle.jpg" alt="cover" />&lt;/p>
&lt;h2 id="norming">Norming&lt;/h2>
&lt;p>Cohesion begins to develop, and team members establish norms and values. Roles become clearer, and there is a sense of unity.&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Goal&lt;/strong>: The team strives to establish norms, values, and a shared understanding. Members learn to appreciate each other’s strengths and weaknesses.&lt;/p>
&lt;/blockquote>
&lt;h3 id="leadership-approach-2">Leadership approach&lt;/h3>
&lt;ul>
&lt;li>Foster collaboration and inclusivity&lt;/li>
&lt;li>Encourage team members to establish norms and values collectively&lt;/li>
&lt;li>Recognize and celebrate individual strengths, fostering a sense of unity and mutual respect&lt;/li>
&lt;/ul>
&lt;h2 id="performing">Performing&lt;/h2>
&lt;p>The team is highly functional, with a focus on achieving its goals. Members work collaboratively, trust each other, and are mutually supportive.&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Goal&lt;/strong>: The team is committed to its common purpose and operates at a high level of efficiency and effectiveness.&lt;/p>
&lt;/blockquote>
&lt;h3 id="leadership-approach-3">Leadership approach&lt;/h3>
&lt;ul>
&lt;li>Empower autonomy and trust&lt;/li>
&lt;li>Provide opportunities for team members to take ownership of tasks and projects&lt;/li>
&lt;li>Foster an environment where individuals feel confident in their abilities and can collaborate seamlessly&lt;/li>
&lt;/ul>
&lt;h2 id="adjourning-or-mourning">Adjourning (or Mourning)&lt;/h2>
&lt;p>This stage involves the completion of the task or project. Team members may experience a sense of loss as the group disbands.&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Goal&lt;/strong>: Acknowledge and celebrate the team’s achievements, provide closure, and reflect on the overall experience.&lt;/p>
&lt;/blockquote>
&lt;h3 id="leadership-approach-4">Leadership approach&lt;/h3>
&lt;ul>
&lt;li>Acknowledge achievements and provide closure&lt;/li>
&lt;li>Recognize the team’s accomplishments and express gratitude for individual contributions&lt;/li>
&lt;li>Facilitate a reflective session to capture lessons learned and create a positive closure experience&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="/images/blog/2023-11-25/footer.jpg" alt="cover" />&lt;/p>
&lt;p>To develop a team to a high-performance level using &lt;a rel="external" href="https://en.wikipedia.org/wiki/Tuckman&amp;#x27;s_stages_of_group_development">Tuckman’s Model&lt;/a>, &lt;strong>leaders&lt;/strong> should be aware of the stages and &lt;strong>adapt&lt;/strong> their leadership style accordingly.&lt;/p>
&lt;p>This involves providing &lt;strong>guidance and structure&lt;/strong> during the &lt;em>forming&lt;/em> stage, &lt;strong>facilitating conflict resolution&lt;/strong> during &lt;em>storming&lt;/em>, &lt;strong>fostering collaboration and communication&lt;/strong> during &lt;em>norming&lt;/em>, &lt;strong>empowering autonomy&lt;/strong> during &lt;em>performing&lt;/em>, and &lt;strong>recognizing achievements&lt;/strong> during &lt;em>adjourning&lt;/em>.&lt;/p>
&lt;blockquote>
&lt;p>Regular communication, team-building activities, and constructively addressing conflicts are crucial throughout the process.&lt;/p>
&lt;/blockquote>
&lt;hr />
&lt;h3 id="video-summary">Video summary&lt;/h3>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/-RwkZxGPQb8"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>The Alchemist</title><category term="fiction" scheme="https://chemaclass.com/tags/fiction/" label="Fiction"/><category term="philosophy" scheme="https://chemaclass.com/tags/philosophy/" label="Philosophy"/><category term="career" scheme="https://chemaclass.com/tags/career/" label="Career"/><published>2023-11-07T00:00:00+00:00</published><updated>2023-11-07T00:00:00+00:00</updated><author><name>
Paulo Coelho</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/the-alchemist/"/><id>https://chemaclass.com/readings/the-alchemist/</id><summary type="html">A classic novel about Santiago, a boy who embarks on a journey seeking treasure in Egypt, learning the true importance of self-improvement and what really matters in life.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>The Alchemist is a classic novel in which a boy named Santiago embarks on a journey seeking treasure in the Egyptian pyramids after having a recurring dream about it. On the way meets mentors, falls in love, and most importantly, learns the true importance of who he is and how to improve himself and focus on what really matters in life.&lt;/p>
&lt;h4 id="video-summary">Video Summary&lt;/h4>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/b41MXNaFJj0"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>Crucial Conversations</title><subtitle>Tools for Talking When Stakes are High</subtitle><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><category term="psychology" scheme="https://chemaclass.com/tags/psychology/" label="Psychology"/><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><published>2023-10-31T00:00:00+00:00</published><updated>2023-10-31T00:00:00+00:00</updated><author><name>
Patterson</name></author><author><name>
Grenny</name></author><author><name>
McMillan</name></author><author><name>
Switzler</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/crucial-conversations/"/><id>https://chemaclass.com/readings/crucial-conversations/</id><summary type="html">Crucial Conversations gives you the tools you need to step up to life's most difficult and important conversations, say what's on your mind, and achieve the positive resolutions you want.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>When stakes are high, opinions vary, and emotions run strong, you have three choices: Avoid a crucial conversation and suffer the consequences; handle the conversation badly and suffer the consequences; or read Crucial Conversations and discover how to communicate best when it matters most.&lt;/p>
&lt;blockquote>
&lt;p>If you don’t talk it out, then you’ll act it out.&lt;/p>
&lt;/blockquote>
&lt;hr />
&lt;h3 id="chapters">Chapters&lt;/h3>
&lt;ol>
&lt;li>Know your heart&lt;/li>
&lt;li>Ensure safety&lt;/li>
&lt;li>Beware of reverting to your style under stress&lt;/li>
&lt;li>Make the content safe&lt;/li>
&lt;li>Control your emotions&lt;/li>
&lt;li>Share your stories&lt;/li>
&lt;li>Move from conversation to results&lt;/li>
&lt;/ol>
&lt;h2 id="key-takeaways">Key takeaways&lt;/h2>
&lt;p>A crucial conversation is a confrontation you need to handle with care, which usually is characterized by three factors:&lt;/p>
&lt;ol>
&lt;li>Stakes are high&lt;/li>
&lt;li>Opinions vary&lt;/li>
&lt;li>The parties involved have strong emotions&lt;/li>
&lt;/ol>
&lt;p>Examples:&lt;/p>
&lt;ul>
&lt;li>Calling a client who didn’t pay their invoices&lt;/li>
&lt;li>Talk to your boss about a promised promotion that is being delayed&lt;/li>
&lt;li>Confronting a teammate who is not doing their share of the project&lt;/li>
&lt;li>Talking to your siblings about your parent’s inheritance&lt;/li>
&lt;/ul>
&lt;p>Navigating through a crucial conversation is like defusing a bomb. Touch the wrong button or hit the wrong wire, and you create an explosion of emotions. The key is to have an honest and productive dialog to work out the situation.&lt;/p>
&lt;p>These are unplanned conversations, and we tend to avoid them because we believe that we are going to make it worse. We tend to react negatively because we are humans, and human beings “behave their worst at the most critical moments.”&lt;/p>
&lt;h3 id="the-story">The “Story”&lt;/h3>
&lt;p>Everybody walks into a crucial conversation with a story. Examples:&lt;/p>
&lt;ul>
&lt;li>My mate doesn’t care about the project because they don’t come to the meetings&lt;/li>
&lt;li>My boss doesn’t care about my career because they haven’t given me a promotion&lt;/li>
&lt;/ul>
&lt;p>If you approach a crucial conversation with a story in mind, there is no room for dialog, because your mind already made it up.&lt;/p>
&lt;h4 id="when-i-framework">When… I… framework&lt;/h4>
&lt;p>To create the space for a dialog, you need to start assuming you don’t know the whole story, and that &lt;strong>you need the help of the person&lt;/strong> you are talking to. You can use: &lt;code> When... I...&lt;/code> Example:&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>When&lt;/strong> [you don’t show up to team meetings],
&lt;strong>I&lt;/strong> [fear you don’t care about this project].&lt;/p>
&lt;/blockquote>
&lt;p>Invite them to share their own &lt;code>When...I...&lt;/code>, so you can discover together what might be the issue, misunderstanding, or misalignment between you two.&lt;/p>
&lt;p>The key is to avoid being passive/aggressive, but rather assertive, and honest with facts. This will help reduce the chance of being defensive and willing to help clarify the situation.&lt;/p>
&lt;h3 id="common-goal">Common goal&lt;/h3>
&lt;p>To avoid a confronting hit and get back to a productive dialog, you need to convince the person you’re talking to that you’re not their opponent or enemy, you are on the same side. To do this, you must communicate a common goal, value, or purpose.&lt;/p>
&lt;blockquote>
&lt;p>I don’t want to fight. I just want to find a way for both of us to get [common goal/purpose].&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;p>I know we both care about [common value], let’s see if we can both get what we want.&lt;/p>
&lt;/blockquote>
&lt;p>Make a good-faith guess. The more you engage in productive dialog, the more chance you have to find &lt;strong>agreements&lt;/strong>, and the more luckily you will &lt;strong>work together&lt;/strong> to resolve the problem at the heart of a crucial conversation.&lt;/p>
&lt;hr />
&lt;h3 id="keynote-mastering-the-art-of-crucial-conversations">Keynote: Mastering The Art of Crucial Conversations&lt;/h3>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/uc3ARpccRwQ"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;h4 id="video-summary">Video Summary&lt;/h4>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/Q2yG142cyNg"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>How to Test Private Methods?</title><subtitle>Testing private methods. When and how?</subtitle><category term="testing" scheme="https://chemaclass.com/tags/testing/" label="Testing"/><category term="tdd" scheme="https://chemaclass.com/tags/tdd/" label="Tdd"/><category term="software-design" scheme="https://chemaclass.com/tags/software-design/" label="Software Design"/><category term="clean-code" scheme="https://chemaclass.com/tags/clean-code/" label="Clean Code"/><published>2023-10-20T00:00:00+00:00</published><updated>2023-10-20T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/how-to-test-private-methods/"/><id>https://chemaclass.com/blog/how-to-test-private-methods/</id><summary type="html">From time to time I have had to face this question: how to test private methods? I have put together in an article the techniques that I usually use.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2023-10-20/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>This is a question that I have encountered with some frequency for a long time. So I thought I would put together my thoughts on the subject here.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h2 id="short-answer">Short answer&lt;/h2>
&lt;p>Never.&lt;/p>
&lt;h2 id="long-answer">Long answer&lt;/h2>
&lt;p>Never ever.&lt;/p>
&lt;hr />
&lt;h2 id="what-if">What if…?&lt;/h2>
&lt;p>If you really want to test a private method, consider extracting that private method logic into a separate class, and write a unit test for that class’ behavior.&lt;/p>
&lt;blockquote>
&lt;p>For this one, I was inspired by Fran Iglesias’ &lt;a rel="external" href="https://franiglesias.github.io/test-private-methods/">original post&lt;/a>.&lt;/p>
&lt;/blockquote></content></entry><entry xml:lang="en"><title>Unhealthy Working Environment</title><subtitle>Recognizing red flags of an unhealthy workplace</subtitle><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><category term="psychology" scheme="https://chemaclass.com/tags/psychology/" label="Psychology"/><published>2023-10-11T00:00:00+00:00</published><updated>2023-10-11T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/unhealthy-working-environment/"/><id>https://chemaclass.com/blog/unhealthy-working-environment/</id><summary type="html">An unhealthy working environment can have various symptoms that negatively impact both the physical and mental well-being of employees.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2023-10-11/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>An unhealthy working environment can have various symptoms that negatively impact employees’ physical and mental well-being.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>While writing about &lt;a href="/blog/the-peter-principle">The Peter Principle&lt;/a>, I mentioned: &lt;em>“Talk to each other. If you feel you can’t, that’s a &lt;strong>symptom of a non-healthy working environment&lt;/strong>, and that’s something more significant to deal with.”&lt;/em> But what are those symptoms?&lt;/p>
&lt;h2 id="symptoms">Symptoms&lt;/h2>
&lt;p>From all possible symptoms, these are the ones that I would highlight: High stress, poor communication, lack of recognition, micromanagement, lack of work-life balance, unfair treatment, lack of growth opportunities, unhealthy conflicts among colleagues, lack of clear goals and expectations, high turnover rates, low morale and motivation, and constant physical or emotional tiredness.&lt;/p>
&lt;p>Let’s go one by one.&lt;/p>
&lt;h3 id="high-stress">High stress&lt;/h3>
&lt;p>Excessive stress and pressure. This can be due to heavy workloads, unrealistic expectations, or a lack of support.&lt;/p>
&lt;h3 id="poor-communication">Poor communication&lt;/h3>
&lt;p>Ineffective communication, whether it’s between colleagues, teams, or between management and employees, can lead to misunderstandings, frustration, and unhealthy conflicts.&lt;/p>
&lt;h3 id="lack-of-recognition">Lack of recognition&lt;/h3>
&lt;p>When employees feel that their efforts are not acknowledged or rewarded, it can lead to feelings of demotivation and reduced job satisfaction.&lt;/p>
&lt;h3 id="micromanagement">Micromanagement&lt;/h3>
&lt;p>Overly controlling management styles can stifle creativity and autonomy, leading to frustration and decreased job satisfaction.&lt;/p>
&lt;h3 id="lack-of-work-life-balance">Lack of work-life balance&lt;/h3>
&lt;p>A healthy work-life balance is essential for employee well-being. Long working hours, excessive overtime, or unrealistic expectations can lead to burnout and reduced productivity.&lt;/p>
&lt;h3 id="unfair-treatment">Unfair treatment&lt;/h3>
&lt;p>Discrimination, favoritism, or unequal opportunities can create a toxic and divisive atmosphere among employees.&lt;/p>
&lt;h3 id="lack-of-growth-opportunities">Lack of growth opportunities&lt;/h3>
&lt;p>When employees feel that there is no room for advancement or professional growth, they may become disengaged and unfulfilled in their roles.&lt;/p>
&lt;p>&lt;img src="/images/blog/2023-10-11/middle.jpg" alt="blog-cover" />&lt;/p>
&lt;h3 id="unhealthy-conflicts-among-colleagues">Unhealthy conflicts among colleagues&lt;/h3>
&lt;p>Constant disagreements, conflicts, or a hostile atmosphere among colleagues can create a toxic working environment.&lt;/p>
&lt;h3 id="lack-of-clear-goals-and-expectations">Lack of clear goals and expectations&lt;/h3>
&lt;p>Employees need clear guidance on their roles, responsibilities, and performance expectations. Unclear or constantly changing goals can lead to confusion and frustration.&lt;/p>
&lt;h3 id="high-turnover-rates">High turnover rates&lt;/h3>
&lt;p>If there is a constant stream of employees leaving the company, it may be a sign that the working environment is not conducive to long-term employment.&lt;/p>
&lt;h3 id="low-morale-and-motivation">Low morale and motivation&lt;/h3>
&lt;p>When employees are consistently demotivated or have low morale, it can lead to decreased productivity and a negative atmosphere.&lt;/p>
&lt;h3 id="constant-physical-or-emotional-tiredness">Constant physical or emotional tiredness&lt;/h3>
&lt;p>Prolonged exposure to a non-healthy work environment can lead to physical and emotional exhaustion or even mental health issues.&lt;/p>
&lt;blockquote>
&lt;p>It’s important to note that these symptoms can vary from one workplace to another. Addressing these issues promptly and effectively is crucial to create a healthy and productive environment.&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="/images/blog/2023-10-11/footer.jpg" alt="blog-cover" />&lt;/p>
&lt;h2 id="what-can-you-do-about-it">What can you do about it?&lt;/h2>
&lt;h3 id="yourself">Yourself&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="/blog/embrace-the-change/">Embrace the change&lt;/a> &lt;small>Who moved my cheese?&lt;/small>&lt;/li>
&lt;li>&lt;a href="/blog/the-process-itself-is-the-goal/">The process itself is the goal&lt;/a> &lt;small>How to focus and have self-discipline&lt;/small>&lt;/li>
&lt;li>&lt;a href="/blog/have-you-always-been-like-this/">Have you always been like this?&lt;/a> &lt;small>How to find a balance of growth and happiness&lt;/small>&lt;/li>
&lt;/ul>
&lt;h3 id="your-managers-and-leaders">Your managers and leaders&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="/blog/great-leadership">Great leadership&lt;/a> &lt;small>Leadership starts within your own life and behaviour&lt;/small>&lt;/li>
&lt;li>&lt;a href="/blog/understanding-people">Understanding people&lt;/a> &lt;small>Misunderstandings, effective communication, and self-reflection&lt;/small>&lt;/li>
&lt;/ul></content></entry><entry xml:lang="en"><title>The Peter Principle</title><subtitle>The rise to a level of incompetence</subtitle><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><category term="career" scheme="https://chemaclass.com/tags/career/" label="Career"/><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><category term="psychology" scheme="https://chemaclass.com/tags/psychology/" label="Psychology"/><published>2023-09-30T00:00:00+00:00</published><updated>2023-09-30T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/the-peter-principle/"/><id>https://chemaclass.com/blog/the-peter-principle/</id><summary type="html">The Peter principle states that a person who is competent at their job will earn a promotion to a position that requires different skills. If the promoted person lacks the skills required for the new role, they will be incompetent at the new level, and will not be promoted again.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2023-09-30/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>A person who is competent at their job will get promoted to a position that requires other skills. If they lack the skills for the new role, they will be incompetent at the new level, and will not be promoted again.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>If the person is competent in the new role, they will be promoted again and will continue to be promoted until reaching a level at which they are incompetent. Being incompetent, the individual will not qualify for promotion again, and so will remain stuck at this final placement or Peter’s plateau.&lt;/p>
&lt;hr />
&lt;blockquote>
&lt;p>There are incentives at play. People work hard to reach a particular position or salary. Once they achieve that, some get lazy. Once people lose passion, they stop learning. They might fail to keep up with new developments, which might lead to poor work quality. To protect their comfort zone, they challenge any new idea or person that could make their life unconformable. Incompetent employees are often unhappy.&lt;/p>
&lt;/blockquote>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/IbFr5DAyZBM"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;hr />
&lt;h2 id="have-you-experienced-the-peter-principle">Have you experienced the Peter Principle?&lt;/h2>
&lt;p>I’ve seen this several times during my 10-year career, working in different companies with people in various departments at different levels. It’s indeed more dangerous than it seems because it can kill the spirit of a healthy environment and company.&lt;/p>
&lt;p>Creating awareness about this can help you to be cautious to avoid this from happening to yourself, or at least trigger warnings when you feel this might be happening to you.&lt;/p>
&lt;h3 id="what-can-you-do-about-it">What can you do about it?&lt;/h3>
&lt;p>If you can recognize this situation within your company, I recommend helping to create awareness about it. Talk to each other. If you feel you can’t, that’s a symptom of a &lt;a href="/blog/unhealthy-working-environment/">unhealthy working environment&lt;/a>, and that’s something more significant to deal with.&lt;/p>
&lt;p>If you are the one experiencing this in “first person,” I would recommend you:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>Talk to your manager; ask for training, mentoring, or whatever you need to get the skills you lack, from confidence, communication, or anything that could help your new role. Maybe you didn’t get enough or proper training for the new job, which requires different skills.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Consider pivoting back where you were good and keep mastering that, helping and inspiring those next to you. Not everybody has to be promoted all the time.&lt;/p>
&lt;/li>
&lt;/ul></content></entry><entry xml:lang="en"><title>It's Your Ship</title><subtitle>Management Techniques from the Best Damn Ship in the Navy</subtitle><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><category term="mentoring" scheme="https://chemaclass.com/tags/mentoring/" label="Mentoring"/><published>2023-09-20T00:00:00+00:00</published><updated>2023-09-20T00:00:00+00:00</updated><author><name>
D. Michael Abrashoff</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/its-your-ship/"/><id>https://chemaclass.com/readings/its-your-ship/</id><summary type="html">It's Your Ship is a leadership book written by D. Michael Abrashoff, a former commander of the USS Benfold, a guided missile destroyer. The book focuses on Abrashoff's experiences and the leadership principles he applied to transform the performance and culture of his ship.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>“It’s Your Ship” is a leadership book written by D. Michael Abrashoff, a former commander of the USS Benfold, a guided missile destroyer. The book focuses on Abrashoff’s experiences and the leadership principles he applied to transform the performance and culture of his ship.&lt;/p>
&lt;h2 id="key-takeaways">Key takeaways&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>Empowerment&lt;/strong>: Abrashoff emphasizes the importance of empowering team members. He believes that when people feel trusted and empowered, they take ownership of their work and perform at a higher level.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Listen and Communicate&lt;/strong>: He highlights the significance of active listening and open communication. He made an effort to listen to his crew members, seek their input, and address their concerns. This helped build trust and fostered a culture of open dialogue.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Lead by Example&lt;/strong>: Leaders should set the standard through their own actions. He worked hard to be a positive role model for his crew, demonstrating the behavior and work ethic he expected from them.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Delegate Responsibility&lt;/strong>: Abrashoff encourages leaders to delegate authority and responsibility. By giving his crew members more control over their areas of expertise, he allowed them to take ownership of their roles.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Foster a Culture of Innovation&lt;/strong>: Abrashoff promoted a culture of continuous improvement and innovation. He encouraged his crew to suggest and implement changes that would enhance efficiency and effectiveness.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Celebrate Achievements&lt;/strong>: It is important to recognize and celebrate the achievements and contributions of team members. This recognition serves as positive reinforcement and motivates individuals to continue performing at a high level.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Take Calculated Risks&lt;/strong>: Abrashoff was not afraid to take calculated risks in order to achieve better results. He was willing to challenge established procedures and norms when he believed it would lead to improvements.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Build Trust and Respect&lt;/strong>: Trust and respect are foundational elements of effective leadership. Abrashoff worked to build strong relationships with his crew members, which created a sense of camaraderie and mutual trust.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Adaptability and Flexibility&lt;/strong>: In a rapidly changing environment, leaders need to be adaptable and flexible. Being able to adjust to new circumstances and make quick decisions is crucial for success.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Continuous Learning and Improvement&lt;/strong>: A mindset of continuous learning and improvement is crucial. He encouraged his crew to seek out opportunities for professional development and to always strive for excellence.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>Overall, “It’s Your Ship” provides valuable insights into leadership principles that can be applied in various organizational settings.&lt;/p>
&lt;p>Abrashoff’s approach emphasizes the importance of empowering and valuing team members, fostering open communication, and constantly seeking ways to improve performance.&lt;/p>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/A-mZW2VZZgY"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>The Day of the Triffids</title><category term="fiction" scheme="https://chemaclass.com/tags/fiction/" label="Fiction"/><category term="psychology" scheme="https://chemaclass.com/tags/psychology/" label="Psychology"/><published>2023-08-13T00:00:00+00:00</published><updated>2023-08-13T00:00:00+00:00</updated><author><name>
John Wyndham</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/the-day-of-the-triffids/"/><id>https://chemaclass.com/readings/the-day-of-the-triffids/</id><summary type="html">This book is fantastic and frightening, but entirely plausible. It doesn't just seem scientifically possible, but its characters are living people shaken out of the civilization they know into the horror of a world dominated by triffids.</summary><content type="html">&lt;p>This book is fantastic and frightening but entirely plausible. It doesn’t seem scientifically possible, but its characters are living people shaken out of the civilization they know into the horror of a world dominated by “triffids”.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>The triffids are grotesque and dangerous plants, over seven feet tall, originally cultivated for their yield of high-grade oil. So long as conditions give mastery to their human directors, they are a valuable asset to mankind. But when a sudden universal disaster turns those conditions upside down, the triffids, seizing their opportunity, become an active and dreadful menace.&lt;/p>
&lt;h3 id="summary">Summary&lt;/h3>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/OQfdjhDOuCo"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;blockquote>
&lt;p>Summary based on the movie “&lt;a rel="external" href="https://www.imdb.com/title/tt1332653/">The Day of the Triffids&lt;/a> (2009)”&lt;/p>
&lt;/blockquote></content></entry><entry xml:lang="en"><title>How Do You Get Everyone on Board?</title><subtitle>How do you deal with people reluctant to change?</subtitle><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><category term="mentoring" scheme="https://chemaclass.com/tags/mentoring/" label="Mentoring"/><category term="xp" scheme="https://chemaclass.com/tags/xp/" label="Xp"/><published>2023-08-02T00:00:00+00:00</published><updated>2023-08-02T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/how-do-you-get-everyone-on-board/"/><id>https://chemaclass.com/blog/how-do-you-get-everyone-on-board/</id><summary type="html">I was invited to the WeAreDevelopers World Congress to give a tech talk about my experience with Extreme Programming and the profound benefits of embracing change in your work and life.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2023-08-02/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>I was invited to the WeAreDevelopers World Congress to give a tech talk about my experience with XP and the profound benefits of embracing change in your work and life.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>With more than 12k attendees, 300 speakers, and ~10 tracks in parallel, I was invited to give not one but two talks. One is about my experience with Extreme Programming and the profound benefits of embracing change in your work and life.&lt;/p>
&lt;p>I especially enjoyed the audience engagement and feedback they gave me after each talk. In particular, a question I had faced many times during my career: “&lt;strong>How do you deal with people reluctant to change?&lt;/strong>”&lt;/p>
&lt;hr />
&lt;p>This is one of the most complex topics affecting any team, regardless of their profession. But, especially in our constantly changing software industry, if you are reluctant to embrace change, you will do more harm than good to your team, career, and yourself.&lt;/p>
&lt;p>As stated in &lt;a href="/readings/peopleware/">Peopleware&lt;/a>, “&lt;em>our software profession is less about computers and more about humans and their interactions&lt;/em>”. This is usually the root problem for people; it’s a human problem first.&lt;/p>
&lt;p>To become truly agile, you must have a good foundation of &lt;strong>trust&lt;/strong> among your peers. Without trust, there is &lt;a href="/readings/the-five-dysfunctions-of-a-team/">no team&lt;/a>, and the primary responsibility of a &lt;a href="/blog/great-leadership/">good leader&lt;/a> is to help create a trusted environment without fear of healthy conflicts. Everyone feels they can speak and express freely in a safe environment.&lt;/p>
&lt;p>A &lt;strong>safe environment&lt;/strong> means you don’t need to carry on armor the whole day to protect yourself from others, so you will have more energy to drive excellence in your workplace.&lt;/p>
&lt;p>But still, despite your effort to create a trustable and safe environment, you might encounter people reluctant to change. For those, you might need to try different approaches. How can you help create trust among everyone?&lt;/p>
&lt;blockquote>
&lt;p>Don’t be afraid of failure; instead, think that everything you do is an experiment from which you will learn something. And anything that brings you closer to a better state is better than nothing.&lt;/p>
&lt;/blockquote>
&lt;p>The key here is to find a way to connect with people by understanding how they understand their potential so you can empower them and help them grow.&lt;/p>
&lt;p>&lt;img src="/images/blog/2023-08-02/middle.jpg" alt="middle" />&lt;/p>
&lt;h3 id="grant-time-for-reading">Grant time for reading&lt;/h3>
&lt;p>1:1 meetings are ideal for establishing personal connections with your peers. However, you might feel that the situation requires an additional push, especially if you have someone who doesn’t like to speak about themselves, and it is hard to know what they think about what’s happening.&lt;/p>
&lt;p>Here is an idea you could try:&lt;/p>
&lt;ul>
&lt;li>Give them a book containing ideas or knowledge that could benefit the whole.&lt;/li>
&lt;li>Allow reading this book during work time – eg: on Fridays after lunch. This is a company investment for the development of your team.&lt;/li>
&lt;li>The book should be read in 3-4 hours – or a couple of Fridays, depending on the number of pages.&lt;/li>
&lt;li>Don’t wait until the book is finished to talk about it. Follow the progress.&lt;/li>
&lt;li>You will have great topics to discuss during your next 1:1.&lt;/li>
&lt;/ul>
&lt;h3 id="you-could-use-any-book-for-this-exercise">You could use any book for this exercise&lt;/h3>
&lt;p>Any book would be fine. Still, if you are looking for great examples, these are my favourite three to start thriving a conversation:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;a href="/readings/who-moved-my-cheese/">Who moved my cheese?&lt;/a>&lt;/strong> is a metaphor of the different attitudes that people adopt as part of their identity in life when they have to confront any change.&lt;/li>
&lt;li>&lt;strong>&lt;a href="/readings/extreme-programming-explained/">Extreme Programming Explained&lt;/a>&lt;/strong> contains a compilation of values, principles, and practices highly related to the human touch in our software industry. Focusing on the team aspect, collaboration with your peers, and creating a sense of mastery and purpose in our craft.&lt;/li>
&lt;li>&lt;strong>&lt;a href="/readings/start-with-why/">Start with Why&lt;/a>&lt;/strong> addresses the importance of starting with “Why?” in order to define a purpose for anything we do.&lt;/li>
&lt;/ul>
&lt;p>Experiment with any book, timeframe, person, or group to create a shared understanding of the team’s foundational values and motivations. The goal is to engage in active knowledge-sharing while cultivating a team that feels they belong, fostering passion at work. This will help create trust, and you can start building on top of it.&lt;/p>
&lt;blockquote>
&lt;p>If you are looking for books to help scale up your leadership skills, there you go: “&lt;a href="/blog/great-leadership">Great Leadership&lt;/a>”.&lt;/p>
&lt;/blockquote>
&lt;hr />
&lt;p>You cannot force people to change. On the contrary, the more you try to force it, the harder they will make it for you. Instead, focus on understanding them by acknowledging what they feel and thinking about what they do to create a common ground of &lt;a href="/blog/understanding-people">understanding each other&lt;/a>.&lt;/p>
&lt;p>&lt;img src="/images/blog/2023-08-02/footer.jpg" alt="footer" />&lt;/p>
&lt;blockquote>
&lt;p>Photos from me at WeAreDevelopers World Congress, Berlin 2023.&lt;/p>
&lt;/blockquote></content></entry><entry xml:lang="en"><title>The Book Of Satoshi</title><subtitle>The Collected Writings of Bitcoin Creator Satoshi Nakamoto</subtitle><category term="bitcoin" scheme="https://chemaclass.com/tags/bitcoin/" label="Bitcoin"/><category term="economics" scheme="https://chemaclass.com/tags/economics/" label="Economics"/><category term="philosophy" scheme="https://chemaclass.com/tags/philosophy/" label="Philosophy"/><published>2023-07-10T00:00:00+00:00</published><updated>2023-07-10T00:00:00+00:00</updated><author><name>
Phil Champagne</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/the-book-of-satoshi/"/><id>https://chemaclass.com/readings/the-book-of-satoshi/</id><summary type="html">A compilation of Satoshi Nakamoto's emails, forum posts, and writings from 2008-2010 that detail Bitcoin's creation, design decisions, and the vision behind the protocol.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>Have you, like the rest of the world, speculated as to the identity of Satoshi Nakamoto, anonymous creator of Bitcoin?&lt;/p>
&lt;p>The world’s first cryptocurrency, Bitcoin went online in 2009 and has since revolutionized our concepts of currency and money. Not supported by any government or central bank, completely electronic, Bitcoin is a virtual currency based on advanced cryptographic systems.&lt;/p>
&lt;p>Like the currency he created, the identity of Bitcoin’s creator Satoshi Nakamoto is virtual, existing only online. The Nakamoto persona, which may represent an individual or a group, exists only in the online publications that introduced and explained Bitcoin during its earliest days. Here, collected and professionally published for the first time are the essential writings that detail Bitcoin’s creation.&lt;/p>
&lt;p>The Book of Satoshi provides a convenient way to parse through what Bitcoin’s creator wrote over the span of the two years that constituted his “public life” before he disappeared from the Internet . . . at least under the name Satoshi Nakamoto.&lt;/p>
&lt;p>Beginning on November 1st 2009 with the publication of the seminal paper describing Bitcoin, this public life ends at about the time PC World speculated as to a possible link between Bitcoin and WikiLeaks, the infamous website that publishes leaked classified materials. Was there a connection? You be the judge.&lt;/p>
&lt;p>Nakamoto’s true identity may never be known. Therefore the writings reproduced here are probably all the world will ever hear from him concerning Bitcoin’s creation, workings, and theoretical basis. Want to learn more about Bitcoin? Go directly to the source-the writings of the creator himself, Satoshi Nakamoto.&lt;/p>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/kaBmAV5DaXI"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>Never Ending Loop</title><subtitle>Writing to help myself sleep</subtitle><category term="career" scheme="https://chemaclass.com/tags/career/" label="Career"/><category term="philosophy" scheme="https://chemaclass.com/tags/philosophy/" label="Philosophy"/><category term="productivity" scheme="https://chemaclass.com/tags/productivity/" label="Productivity"/><published>2023-07-05T00:00:00+00:00</published><updated>2023-07-05T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/never-ending-loop/"/><id>https://chemaclass.com/blog/never-ending-loop/</id><summary type="html">It is hard sometimes to get to bed with the mind blank because, more often than not, I think about my next reading, learning, talk, or what I will write this or next month.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2023-07-05/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>It is hard sometimes to get to bed with the mind blank because, more often than not, I think about my next reading, learning, talk, or what I will write this or next month.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>It is funny to remind that eight years ago, I stayed up for hours until all kinds of thoughts got out on paper, so I used to write one or more of them every week. Sometimes innocent thoughts came to my brain and didn’t let me sleep properly. Sometimes deep and full of worry that reflected how I struggled with certain situations that I was living in or remembering from my past youth.&lt;/p>
&lt;p>I kept writing for three years; I wrote a lot —another format than I usually do today; a deep and personal &lt;a rel="external" href="https://chemaclass.com/books/">book&lt;/a> about my thoughts and feelings with the primary motivation of reading them later and doing some retrospectives to help me understand myself better. Nowadays, I like to mix my passion around software quality and people puzzles to achieve true excellence in my profession, always aiming for an honest and healthy egoism of helping others that could help me later. The better the people around me are, the better they will help others and me.&lt;/p>
&lt;p>Back then, I used to write about my current and past feelings, always with a touch of illusion wanting to express myself differently for my future self. I remember clearly, in the beginning, I wanted the main readers to be my siblings, my family, to know how I was doing so far away from all of them —after migrating to another country, far away from my family. However, as the months passed by, the main reader changed to be no one but myself.&lt;/p>
&lt;p>I spent hours on each thought, page, chapter… Drafting the initial idea and then reading it out loud once, twice, again, and again the day afterward. Helping this way to discover that part of myself that tried to reflect what was going on inside.&lt;/p>
&lt;p>I can see some similarities nowadays. However, I no longer see the need to write about those deep old past thoughts because they healed. Instead, I can reflect and see how they did and how.&lt;/p>
&lt;p>Writing is one of my favorite ways to express myself, especially when I cannot sleep. It reminds me of those years, and I think greatly about the incredible evolution since then.&lt;/p>
&lt;p>&lt;img src="/images/blog/2023-07-05/footer.jpg" alt="blog-footer" />&lt;/p>
&lt;blockquote>
&lt;p>Original photos from my trip to Tuscany, Italy, last month.&lt;/p>
&lt;/blockquote></content></entry><entry xml:lang="en"><title>Fahrenheit 451</title><subtitle>A classic of world literature set in a bleak, dystopian future. Today its message has grown more relevant than ever before.</subtitle><category term="fiction" scheme="https://chemaclass.com/tags/fiction/" label="Fiction"/><category term="philosophy" scheme="https://chemaclass.com/tags/philosophy/" label="Philosophy"/><category term="psychology" scheme="https://chemaclass.com/tags/psychology/" label="Psychology"/><published>2023-06-28T00:00:00+00:00</published><updated>2023-06-28T00:00:00+00:00</updated><author><name>
Ray Bradbury</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/fahrenheit-451/"/><id>https://chemaclass.com/readings/fahrenheit-451/</id><summary type="html">Ray Bradbury's dystopian masterpiece about a fireman whose job is to burn books, until a chance encounter makes him question everything about his society's war on knowledge.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>Guy Montag is a fireman. His job is to &lt;strong>destroy&lt;/strong> the most illegal of commodities, the &lt;strong>books&lt;/strong>, along with the houses in which they are hidden. Montag never questions the destruction his actions produce, returning each day to his bland life and wife, Mildred, who spends all day with her “television family.”&lt;/p>
&lt;p>But when he meets an eccentric young neighbor, Clarisse, who introduces him to a past where people didn’t live in fear and to a present where one sees the world through the ideas in books instead of the mindless chatter of television, Montag begins to question everything he has ever known.&lt;/p>
&lt;h3 id="summary">Summary&lt;/h3>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/YMZcp0EQO2s"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;blockquote>
&lt;p>Another great summary: &lt;a rel="external" href="https://youtu.be/_agaWPlVG8Q">https://youtu.be/_agaWPlVG8Q&lt;/a>&lt;/p>
&lt;/blockquote></content></entry><entry xml:lang="en"><title>The Blocksize War</title><subtitle>The battle for control over Bitcoin's protocol rules</subtitle><category term="bitcoin" scheme="https://chemaclass.com/tags/bitcoin/" label="Bitcoin"/><category term="economics" scheme="https://chemaclass.com/tags/economics/" label="Economics"/><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><published>2023-06-20T00:00:00+00:00</published><updated>2023-06-20T00:00:00+00:00</updated><author><name>
Jonathan Bier</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/the-blocksize-war/"/><id>https://chemaclass.com/readings/the-blocksize-war/</id><summary type="html">Jonathan Bier chronicles the Bitcoin blocksize war (2015-2017), exploring the key players, strategies, and ideological battles that shaped who controls Bitcoin's protocol.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>This book covers Bitcoin’s blocksize war, which was waged from August 2015 to November 2017. On the surface the battle was about the amount of data allowed in each Bitcoin block, however it exposed much deeper issues, such as who controls Bitcoin’s protocol rules.&lt;/p>
&lt;p>This book explores some of the major characters in the conflict and includes coverage, from both the front lines and behind the scenes, during some of the most acute phases of the struggle.&lt;/p>
&lt;p>The account in this book includes discussions with the key players from both sides during the war, exploring their motivations, strategy and thought processes as the exhausting campaign progressed and developed.&lt;/p>
&lt;h2 id="chapters">Chapters&lt;/h2>
&lt;ol>
&lt;li>First strike&lt;/li>
&lt;li>March to war&lt;/li>
&lt;li>Scaling I - Montreal&lt;/li>
&lt;li>Scaling II - Hong Kong&lt;/li>
&lt;li>SegWit&lt;/li>
&lt;li>Lightning network&lt;/li>
&lt;li>Bitcoin Classic&lt;/li>
&lt;li>Hong Kong Round table&lt;/li>
&lt;li>Faketoshi&lt;/li>
&lt;li>The DAO&lt;/li>
&lt;li>Scaling III - Milan&lt;/li>
&lt;li>Bitcoin unlimited&lt;/li>
&lt;li>Exchanges&lt;/li>
&lt;li>ASICBoost&lt;/li>
&lt;li>Dragons’s Den&lt;/li>
&lt;li>Litecoin&lt;/li>
&lt;li>User - Activated softfork&lt;/li>
&lt;li>New York agreement&lt;/li>
&lt;li>Bitcoin Cash&lt;/li>
&lt;li>SegWit2x&lt;/li>
&lt;li>Victory&lt;/li>
&lt;/ol>
&lt;h3 id="summary">Summary&lt;/h3>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/6YtS5ZNuuTw"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>Learned Helplessness</title><subtitle>An acceptance of powerlessness</subtitle><category term="psychology" scheme="https://chemaclass.com/tags/psychology/" label="Psychology"/><category term="productivity" scheme="https://chemaclass.com/tags/productivity/" label="Productivity"/><category term="career" scheme="https://chemaclass.com/tags/career/" label="Career"/><category term="philosophy" scheme="https://chemaclass.com/tags/philosophy/" label="Philosophy"/><published>2023-06-08T00:00:00+00:00</published><updated>2023-06-08T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/learned-helplessness/"/><id>https://chemaclass.com/blog/learned-helplessness/</id><summary type="html">Learned helplessness is the behavior exhibited by a subject after enduring repeated aversive beyond their control. It was initially thought to be caused by the subject's acceptance of their powerlessness by discontinuing attempts to escape or avoid the aversive stimulus.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2023-06-08/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>Learned helplessness is the behavior exhibited by a subject after enduring repeated aversive beyond their control.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>It was initially thought to be caused by the subject’s acceptance of their powerlessness by discontinuing attempts to escape or avoid the aversive stimulus.&lt;/p>
&lt;h2 id="experiments">Experiments&lt;/h2>
&lt;h3 id="a-classroom-with-different-assessments">A classroom with different assessments&lt;/h3>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/gFmFOmprTt0"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;blockquote>
&lt;p>Charisse Nixon, Ph.D Developmental Psychologist at Penn State Erie, The Behrend College and Director of Research and Evaluation for The Ophelia Project discusses the phenomenon of learned helplessness.&lt;/p>
&lt;/blockquote>
&lt;h3 id="original-docking-shocks-and-harnesses">Original: Docking shocks and harnesses&lt;/h3>
&lt;p>In 1967, the American psychologist Martin Seligman at the University of Pennsylvania researched docking shocks and harnesses.&lt;/p>
&lt;p>In &lt;strong>Part 1&lt;/strong> of this study, three groups of dogs were placed in harnesses. Group 1 dogs were put in a harness for some time and released later. Groups 2 and 3 consisted of “yoked pairs.” Dogs in Group 2 were given electric shocks randomly, which the dog could end by pressing a lever. Each dog in Group 3 was paired with a Group 2 dog; whenever a Group 2 dog got a shock, its paired dog in Group 3 got a shock of the same intensity and duration, but its lever did not stop the shock. To a dog in Group 3, it seemed that the shock ended randomly because their paired dog in Group 2 was causing it to stop. Thus, for Group 3 dogs, the shock was “inescapable.”&lt;/p>
&lt;p>In &lt;strong>Part 2&lt;/strong> of the experiment, the same three groups of dogs were tested in a shuttle-box apparatus (a chamber containing two rectangular compartments divided by a barrier a few inches high). The dogs could escape shocks on one side of the box by jumping over a low partition to the other. The dogs in Groups 1 and 2 quickly learned this task and escaped the shock. Most of the Group 3 dogs - which had previously “learned” that nothing they did affect the shocks - lay down passively and whined when shocked.&lt;/p>
&lt;hr />
&lt;p>Even though this experiment was demonstrated with different types of animals, it also applies to people. This is visible in children when they integrate early failure to ask for help, frustration, giving up, poor motivation, and procrastination. And these points carry on as people age.&lt;/p>
&lt;blockquote>
&lt;p>Because, if you “cannot do anything”, why would you even try it?&lt;/p>
&lt;/blockquote>
&lt;p>All this leads to anxiety and depression, and people think nothing can be done about their current situations and feelings.&lt;/p>
&lt;h2 id="learned-optimism">Learned optimism&lt;/h2>
&lt;p>The antidote to learned helplessness is &lt;strong>learned optimism&lt;/strong>. These people are higher achievers, have better overall health, and have lower levels of depression.&lt;/p>
&lt;h3 id="how-do-you-practice-it">How do you practice it?&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Permanence&lt;/strong>: bad events or failures are not permanent. So, you can recover faster than people stuck in these situations. However, good things or events happen for a good reason that you’ve worked on.&lt;/li>
&lt;li>&lt;strong>Pervasiveness&lt;/strong>: do not generalize failure. Failing in one area in your life should not affect other areas.&lt;/li>
&lt;li>&lt;strong>Personalization&lt;/strong>: bad events are external to blame, outside yourself, as you did all you could have done.&lt;/li>
&lt;/ul>
&lt;p>Isolate the problem and don’t extrapolate it to other areas. Stop generalizing failure.&lt;/p>
&lt;hr />
&lt;h3 id="english">English&lt;/h3>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/Z8n1oUhp-EM"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;h3 id="espanol">Español&lt;/h3>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/E99XmEIPmf8"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>Agile Project Management</title><subtitle>A Beginner's Guide to Agile Implementation and Leadership</subtitle><category term="agile" scheme="https://chemaclass.com/tags/agile/" label="Agile"/><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><category term="scrum" scheme="https://chemaclass.com/tags/scrum/" label="Scrum"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><published>2023-05-31T00:00:00+00:00</published><updated>2023-05-31T00:00:00+00:00</updated><author><name>
Jeremy Savell</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/agile-project-management/"/><id>https://chemaclass.com/readings/agile-project-management/</id><summary type="html">Projects that followed a Waterfall methodology tended to exceed their expenses in the first initiative over time, while the product delivered was below standard and difficult to use. That situation originated that a group of developers signed a brief, 68-word manifesto in 2001.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>A basic and straightforward overview of what Agile is, presenting some framework examples that are well known today, such as Scrum or Kanban—everything condensed in a 100’s pages book that you can read in a couple of hours.&lt;/p>
&lt;h2 id="chapters">Chapters&lt;/h2>
&lt;ol>
&lt;li>The fluid manifesto&lt;/li>
&lt;li>Being agile&lt;/li>
&lt;li>Agile process&lt;/li>
&lt;li>Planning for success&lt;/li>
&lt;li>Agile communication&lt;/li>
&lt;li>Scrum basics&lt;/li>
&lt;li>Introduction to Kanban&lt;/li>
&lt;li>Building an adaptive team&lt;/li>
&lt;li>Leadership and collaborative management&lt;/li>
&lt;li>Common errors behind agile failure&lt;/li>
&lt;li>Final words: agile is adaptation&lt;/li>
&lt;/ol>
&lt;hr />
&lt;blockquote>
&lt;p>“The benefits of Agile projects extend no only to the team using it, but also to the customer receiving the final product.”&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;p>“There is an underlying critical metric that consistently leads to the success of an Agile project: communication. Miscommunication, under-communication, or poor communication of any type leads to the collapse and failure of said project.”&lt;/p>
&lt;/blockquote>
&lt;hr />
&lt;h3 id="key-takeaways">Key takeaways&lt;/h3>
&lt;p>Projects that followed a &lt;strong>Waterfall&lt;/strong> methodology tended to exceed their expenses over time, while the product delivered was below standard and difficult to use.&lt;/p>
&lt;p>That situation originated that a group of developers signed a brief, 68-word manifesto in 2001.&lt;/p>
&lt;h4 id="a-brief-background">A brief background&lt;/h4>
&lt;p>During the 1960s, software got into a big crisis; creating software was complex but changing it later became pure chaos. &lt;strong>Waterfall&lt;/strong> to the rescue.&lt;/p>
&lt;p>&lt;strong>Waterfall&lt;/strong> outlined a simple, logical set of processes that a company would need to follow for a project to be successful. Its name comes from the metaphor of water gently cascading down a predictable, steady, incremental stream. Its life cycle of software development would be in six simple steps.&lt;/p>
&lt;ol>
&lt;li>Requirements&lt;/li>
&lt;li>Analysis&lt;/li>
&lt;li>Design&lt;/li>
&lt;li>Code&lt;/li>
&lt;li>Testing&lt;/li>
&lt;li>Operations&lt;/li>
&lt;/ol>
&lt;p>For 10 years, &lt;strong>Waterfall&lt;/strong> was the standard methodology in the software universe. And for 10 more years, chaos persisted. Although the intention was good, the reality is that the ever-changing set of constraints does not cope very well with this methodology because each step is dependent on the previous one.&lt;/p>
&lt;p>86% of the time a company uses the &lt;strong>Waterfall&lt;/strong> method for project management, the customer receives inadequate or useless software. A lot of software projects were unused or never finished.&lt;/p>
&lt;p>During the 70’ and 80’, &lt;strong>Iterations and Incremental Development (IID)&lt;/strong> proved to be a viable option. In the 90’ surges an &lt;strong>Evolutionary Delivery (ED)&lt;/strong>, which changes the situation. The developer is responsible for listening to the user’s reactions early and often. The user starts playing a direct role in the development process.&lt;/p>
&lt;p>A few years later, a new method surged &lt;strong>Rapid Iterative Production Prototyping (RIPP)&lt;/strong>, later called &lt;strong>Rapid Application Development (RAD)&lt;/strong>, which they claimed &lt;em>“Working software in 90 days… or your money back.”&lt;/em>&lt;/p>
&lt;p>Lastly, during the 90’ &lt;strong>Extreme Programming (XP)&lt;/strong>, &lt;strong>Scrum&lt;/strong>, and &lt;strong>Crystal&lt;/strong> were defined in detail.&lt;/p>
&lt;p>These distinct yet similar solutions were decentralized, working independently of one another. This realization led to that night in Utag the unification of these ideas under one banner, in one document.&lt;/p>
&lt;p>&lt;strong>Agile&lt;/strong> became the definitive standard for software development.&lt;/p>
&lt;h3 id="the-agile-manifesto">The Agile Manifesto&lt;/h3>
&lt;ul>
&lt;li>Individuals and interactions over processes and tools&lt;/li>
&lt;li>Working software over comprehensive documentation&lt;/li>
&lt;li>Customer collaboration over contract negotiation&lt;/li>
&lt;li>Responding to change over following a plan&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>That is, while there is value in the items on the rights, we value the items on the left more.&lt;/p>
&lt;/blockquote></content></entry><entry xml:lang="en"><title>Dedicated QA Teams in Software?</title><subtitle>How does it fit a dedicated QA person in your agile team?</subtitle><category term="testing" scheme="https://chemaclass.com/tags/testing/" label="Testing"/><category term="tdd" scheme="https://chemaclass.com/tags/tdd/" label="Tdd"/><category term="agile" scheme="https://chemaclass.com/tags/agile/" label="Agile"/><category term="clean-code" scheme="https://chemaclass.com/tags/clean-code/" label="Clean Code"/><published>2023-05-17T00:00:00+00:00</published><updated>2023-05-17T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/dedicated-qa-teams/"/><id>https://chemaclass.com/blog/dedicated-qa-teams/</id><summary type="html">This will be controversial, but let's talk about the QA position. The hidden truth behind the lack of software quality and why this should concern you if you write software.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2023-05-17/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>This will be controversial, but let’s talk about the QA position. The hidden truth behind the lack of software quality and why this should concern you if you write software.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h2 id="qa-is-a-role-not-a-position">QA is a role, not a position&lt;/h2>
&lt;p>As a software developer, when you write software, you are responsible for the quality of whatever you’re writing. A third person acting like QA could find that your solution doesn’t work like expected, but how come? You might argue they might catch edge cases, but how could that be possible if the software was already tested previously?&lt;/p>
&lt;p>A software team’s final goal is to make the QA position useless because they should find nothing but well-working software. But how do you get to that point? How can we ensure that the software we write is working as expected and there is no need for a QA person in our team?&lt;/p>
&lt;h2 id="the-hidden-truth-behind-the-lack-of-software-quality">The hidden truth behind the lack of software quality&lt;/h2>
&lt;p>Unfortunately, in our software industry, the demand for “fast, quick and dirty” projects ended up in poorly developed MVPs by simply applying patches and code over code with just manual testing checking happy paths - sometimes even ignoring edge cases.&lt;/p>
&lt;blockquote>
&lt;p>“The deadline is in one week, so you better finish it on time!”&lt;/p>
&lt;/blockquote>
&lt;p>We don’t learn the importance of what automated testing can bring to our daily job, so we don’t take it seriously, and therefore, we don’t practice it enough. And, for that exact reason, because we don’t practice it, we don’t know how to perform it properly - yes, I am talking about writing automated tests that prove the behavior of your software!&lt;/p>
&lt;p>Our inability to write testable code results in software that is hard to test, and thus we delegate testing to other third parties shifting the responsibility for the overall end quality of the product or service we write.&lt;/p>
&lt;h2 id="practice-makes-the-master">Practice makes the master&lt;/h2>
&lt;p>You must learn and apply proper testing techniques when they make sense. How and when effectively use test doubles, prepare solitary or sociable tests, which compromises and reasons backup your mind when choosing one or other paths toward your testing strategies?&lt;/p>
&lt;p>You are the latest and main responsible person in charge of your knowledge, so you better invest in yourself because no one else will do it for you.&lt;/p>
&lt;p>Look at everything you do as an opportunity for learning. Practice and get better by default at everything you do.&lt;/p>
&lt;p>If you don’t know how to start, here is my favourite tip: you can always practice and improve your testing skills using code-katas. Read more about this topic &lt;a href="/blog/test-driven-development/">here&lt;/a>.&lt;/p>
&lt;h2 id="nice-theory-but-why-bother">Nice theory, but… why bother?&lt;/h2>
&lt;p>Manual testing is, of course, necessary. It is another testing strategy that I am not blaming or attacking. We might still need a dedicated person in charge of discovering what new features we want to build to satisfy our clients. But this blog-post is not about that position.&lt;/p>
&lt;p>It is all about shortening the feedback loop. If you can write software to work in specific ways, can’t you write automated tests to prove that the software you wrote behaves the way you expect?&lt;/p>
&lt;p>If you have covered with automated tests the behavior of your software at any level that makes sense, what’s left for a dedicated QA person?&lt;/p>
&lt;p>Next time you think about “We need a QA person to test this,” try the exercise of thinking instead, “How can I write an automated test that verifies what I would expect if a QA person were checking this?”&lt;/p>
&lt;p>And that’s how you change the “full-time QA position” into a “role mentality for everyone that writes software.”&lt;/p>
&lt;p>Code never lies and never forgets; once it’s written and automated in your pipeline, you can run it anytime at zero cost.&lt;/p>
&lt;p>&lt;img src="/images/blog/2023-05-17/footer.jpg" alt="blog-footer" />&lt;/p></content></entry><entry xml:lang="en"><title>Effective Remote Work</title><subtitle>For Yourself, Your Team, and Your Company</subtitle><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><category term="productivity" scheme="https://chemaclass.com/tags/productivity/" label="Productivity"/><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><published>2023-04-17T00:00:00+00:00</published><updated>2023-04-17T00:00:00+00:00</updated><author><name>
James Stanier</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/effective-remote-work/"/><id>https://chemaclass.com/readings/effective-remote-work/</id><summary type="html">An effective remote work environment is about treating everyone as remote, with everyone in mind having the same level, equality, and information.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>An effective remote work environment is about treating everyone as remote, with everyone in mind having the same level, equality, and information.&lt;/p>
&lt;hr />
&lt;h2 id="part-1-getting-oriented-for-remote-work">Part 1 - Getting oriented for remote work&lt;/h2>
&lt;p>It covers the foundation for a possible remote work environment. It seems a bit common sense nowadays, especially after the covid hit, where we had no choice but to work remotely for more than a year. But I think it’s still good to see this foundational knowledge written to polish assumptions in the following chapters of the book.&lt;/p>
&lt;h3 id="chapters">Chapters&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>A remote future&lt;/strong>: A brief history of the future. Lockdown. Remote is here to stay. Time to get set up.&lt;/li>
&lt;li>&lt;strong>Getting set up&lt;/strong>: The office: what we want and what we don’t. The basics, briefly. In the real world. Installing mental scaffolding. The golden rule.&lt;/li>
&lt;/ul>
&lt;h2 id="part-2-building-effective-remote-teams">Part 2 - Building effective remote teams&lt;/h2>
&lt;p>Most likely, we all had the experience of casual remote work (before remote work was even a trend) when we felt that we were apart from the team dynamics when we were doing remote work for some reason. This is precisely why “treat everyone as remote” is so important - when at least one person works remotely.&lt;/p>
&lt;p>There are different ways to communicate depending on the urgency, intention, and how long and easy that message should be accessible. It’s about sync/async communication with our peers.&lt;/p>
&lt;p>Highly related to the previous paragraph, the quality of our messages should be considered when aiming for effective communication. We need to consider the right tools. A phone call is different from a chat message or an email. Use the right tools for the right messages within the proper context.&lt;/p>
&lt;h3 id="chapters-1">Chapters&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Treat everyone as remote&lt;/strong>: Out of sight, out of mind. A principle for cultural change. Taking practical action. Let’s build a model!&lt;/li>
&lt;li>&lt;strong>The spectrum of synchronousness&lt;/strong>: Synchronousness. Permanence. Restoring your humanity. Onward to Hyrule.&lt;/li>
&lt;li>&lt;strong>The same but different&lt;/strong>: A normal day in the office. Through the magic mirror. Conquering the dark world. Let’s discover some artifacts.&lt;/li>
&lt;li>&lt;strong>Artifacts for a better future&lt;/strong>: Comparing artifacts. Written artifacts. Codebase and recorded artifacts. Getting on board with onboarding.&lt;/li>
&lt;li>&lt;strong>Onboarding and orientation&lt;/strong>: The contribution curve. The onboarding equation. And here’s the trick. Considering communication.&lt;/li>
&lt;li>&lt;strong>Effective communication techniques&lt;/strong>: Why humans communicate. Principles for better remote communication. Techniques to improve interactions. The right tools and when to use them. Turning inwards.&lt;/li>
&lt;li>&lt;strong>Managing yourself&lt;/strong>: An organizational bedrock. On being unobserved. Riding peaks and troughs. From yourself to teams.&lt;/li>
&lt;li>&lt;strong>Managing teams&lt;/strong>: The output equation revisited. Shrinking the scale factor. Supercharging the scale factor. Time to take it up a level.&lt;/li>
&lt;/ul>
&lt;h2 id="part-3-creating-a-world-class-remote-culture">Part 3 - Creating a world-class remote culture&lt;/h2>
&lt;p>Even though a fully remote company might not be possible for some reasons out of our control, if the company claims to be remote-friendly, there are some aspects that we can consider:&lt;/p>
&lt;ol>
&lt;li>Do you treat everyone as remote?&lt;/li>
&lt;li>Do you provide a remote work-space setup?&lt;/li>
&lt;li>Do you spend money equally on in-office and remote staff?&lt;/li>
&lt;li>Do you optimize for asynchronous communication?&lt;/li>
&lt;li>Do you create artifacts from synchronous interactions?&lt;/li>
&lt;li>Do you measure staff by their impact?&lt;/li>
&lt;li>Do you allow staff to choose flexible hours?&lt;/li>
&lt;li>Are the members of the executive team remote workers?&lt;/li>
&lt;li>Do you use the best collaborative tools that money can buy?&lt;/li>
&lt;li>Do you hire staff anywhere in the world?&lt;/li>
&lt;li>Do you support families as well as employees?&lt;/li>
&lt;li>Do you give back to an employee’s local community?&lt;/li>
&lt;/ol>
&lt;blockquote>
&lt;p>This is a “Joel Test version for a remote working environment”. The Joel Test originated in the year 2000, during the dot-com bubble; a test to rate the quality of teams with “yes/no” questions. If a team can answer each question wit a yes, they’re likely a productive team. &lt;a rel="external" href="https://www.joelonsoftware.com/2000/08/09/the-joel-test-12-steps-to-better-code/">Read more about the original Joel Test&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;h3 id="chapters-2">Chapters&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>The remote working test&lt;/strong>: The joel test. Twelve questions about remote working. Making changes in your company. Something to guide us.&lt;/li>
&lt;li>&lt;strong>Creating a handbook&lt;/strong>: The GitLab handbook. Creating a handbook for your team. A handbook for the company. Fully making the shift.&lt;/li>
&lt;li>&lt;strong>Becoming fully remote&lt;/strong>: The spectrum of remoteness. The challenge of retrofitting fully remote culture. The triangle of transition. Learning from trailblazers. Now the difficult stuff.&lt;/li>
&lt;li>&lt;strong>The hard parts&lt;/strong>: Walking the curves. The physical and mental impact of working remotely. Supporting other remotely.&lt;/li>
&lt;li>&lt;strong>The path to equality is remote&lt;/strong>: Diversity and inclusion. Remote: The great leveler. This is just the beginning.&lt;/li>
&lt;/ul>
&lt;hr />
&lt;h2 id="book-summary">Book summary&lt;/h2>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/6BFIg6Opd1c"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>Introducing a New Tech Stack</title><subtitle>How to introduce new technologies in your team</subtitle><category term="software-design" scheme="https://chemaclass.com/tags/software-design/" label="Software Design"/><category term="architecture" scheme="https://chemaclass.com/tags/architecture/" label="Architecture"/><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><published>2023-04-14T00:00:00+00:00</published><updated>2023-04-14T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/introducing-a-new-tech-stack/"/><id>https://chemaclass.com/blog/introducing-a-new-tech-stack/</id><summary type="html">To introduce a new tech stack for the entire team, it's important to bring "why?" and a strategy to make it happen among the team because it will affect everyone.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2023-04-14/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>To introduce a new tech stack for the entire team, it’s important to bring “why?” and a strategy to make it happen among the team because it will affect everyone.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h2 id="why-that-new-tech-stack">Why that new tech stack?&lt;/h2>
&lt;p>To decide whether to use a new tech stack or not, remember that it is a team decision, according to the standardization and maintainability of the project when introducing such a new tech stack. But, most importantly, what problem do you want to solve by introducing it? Is it because it is “cool”? Or is there an actual “necessity” that this tech helps you with?&lt;/p>
&lt;h3 id="the-direction-of-the-technology">The direction of the technology&lt;/h3>
&lt;p>When proposing adopting a new library, framework, or entire new technology, an important aspect to consider is to be aware of its background and the direction where they are moving forward.&lt;/p>
&lt;p>What is the motivation for that tech, and why are you considering introducing it in your current stack?&lt;/p>
&lt;h3 id="coupling-and-dependencies">Coupling and dependencies&lt;/h3>
&lt;p>When adopting new technologies in our daily business, it’s not rare that we tend to couple ourselves with them. This makes it harder later to roll back if, after a while, we regret that decision.&lt;/p>
&lt;p>Don’t get me wrong, learning and experimenting with new technologies is great, but introducing it in your daily work is another story because it will affect the whole team. So we need to be a more careful with this.&lt;/p>
&lt;p>&lt;img src="/images/blog/2023-04-14/middle.jpg" alt="blog-middle" />&lt;/p>
&lt;h2 id="the-focus-of-the-conversation">The focus of the conversation&lt;/h2>
&lt;ul>
&lt;li>What does this new tech contribute to the project?&lt;/li>
&lt;li>What problem do we want to solve by introducing it?&lt;/li>
&lt;li>Can we solve that problem with our current tech?&lt;/li>
&lt;li>If we already have a similar tech, do we want to have a mix of both?&lt;/li>
&lt;li>What are the tradeoffs when using it vs. not using it?&lt;/li>
&lt;li>Does it worth the incremental complexity over time?&lt;/li>
&lt;li>What is the team strategy to onboard everyone if we aim to use it?&lt;/li>
&lt;/ul>
&lt;h3 id="architectural-decision-records-adrs">Architectural Decision Records (ADRs)&lt;/h3>
&lt;p>Whatever the outcome, you should write it down as an &lt;a rel="external" href="https://adr.github.io/">ADR&lt;/a> to revisit it as time passes. An ADR will record your team’s decisions regarding the pros and cons, among any other arguments you have found together, to decide what to do and why.&lt;/p>
&lt;p>ADRs are useful to understand old decisions and keep them in the version control – in the same project if possible. They are helpful for the current team, but also for new joiners.&lt;/p>
&lt;p>&lt;img src="/images/blog/2023-04-14/footer.jpg" alt="blog-footer" />&lt;/p>
&lt;blockquote>
&lt;p>Thanks to my friends &lt;a rel="external" href="https://x.com/evrtrabajo">Manu&lt;/a>, &lt;a rel="external" href="https://x.com/Tito_Kati">Antonio&lt;/a>, and &lt;a rel="external" href="https://x.com/JesusValera96">Jesus&lt;/a>, who helped me come up with this summary of ideas after brainstorming together.&lt;/p>
&lt;/blockquote></content></entry><entry xml:lang="en"><title>Accelerate</title><subtitle>Building and Scaling High Performing Technology Organizations</subtitle><category term="devops" scheme="https://chemaclass.com/tags/devops/" label="Devops"/><category term="software-design" scheme="https://chemaclass.com/tags/software-design/" label="Software Design"/><category term="agile" scheme="https://chemaclass.com/tags/agile/" label="Agile"/><category term="productivity" scheme="https://chemaclass.com/tags/productivity/" label="Productivity"/><published>2023-03-19T00:00:00+00:00</published><updated>2023-03-19T00:00:00+00:00</updated><author><name>
Nicole Forsgren</name></author><author><name>
Jez Humble</name></author><author><name>
Gene Kim</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/accelerate/"/><id>https://chemaclass.com/readings/accelerate/</id><summary type="html">The Science of Lean Software and DevOps: Building and Scaling High Performing Technology Organizations</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>Accelerate explores how software development teams using &lt;strong>Lean Software&lt;/strong> and &lt;strong>DevOps&lt;/strong> can measure their performance and the performance of software engineering teams impacts the overall performance of an organization.&lt;/p>
&lt;blockquote>
&lt;p>Note: DevOps is about integrating and automating software development (Dev) and IT operations (Ops), focusing on improving (and shortening) the systems development life cycle.&lt;/p>
&lt;/blockquote>
&lt;h2 id="key-capabilities">Key Capabilities&lt;/h2>
&lt;h3 id="continuous-delivery">Continuous Delivery&lt;/h3>
&lt;ul>
&lt;li>Use Version Control for all Production Artifacts&lt;/li>
&lt;li>Automate Your Deployment Process&lt;/li>
&lt;li>Implement Continuous Integration&lt;/li>
&lt;li>Use Trunk-Based Development Methods&lt;/li>
&lt;li>Implement Test Automation&lt;/li>
&lt;li>Continuous Delivery (CD)&lt;/li>
&lt;/ul>
&lt;h3 id="architecture">Architecture&lt;/h3>
&lt;ul>
&lt;li>Use a Loosely Coupled Architecture&lt;/li>
&lt;/ul>
&lt;h3 id="product-and-process">Product and Process&lt;/h3>
&lt;ul>
&lt;li>Gather and Implement Customer Feedback&lt;/li>
&lt;li>Make the Flow of Work Visible through the Value Stream&lt;/li>
&lt;li>Work in Small Batches&lt;/li>
&lt;li>Foster and Enable Team Experimentation&lt;/li>
&lt;/ul>
&lt;h3 id="lean-management-and-monitoring">Lean Management and Monitoring&lt;/h3>
&lt;ul>
&lt;li>Have a Lightweight Change Approval Processes&lt;/li>
&lt;li>Monitor across Application and Infrastructure to Inform Business Decisions&lt;/li>
&lt;li>Check System Health Proactively&lt;/li>
&lt;li>Improve Processes and Manage Work with WIP (Work-In-Process) Limits&lt;/li>
&lt;li>Visualize Work to Monitor Quality and Communicate throughout the Team&lt;/li>
&lt;/ul>
&lt;h3 id="cultural">Cultural&lt;/h3>
&lt;ul>
&lt;li>Support a Generative Culture&lt;/li>
&lt;li>Encourage and Support Learning&lt;/li>
&lt;li>Support and Facilitate Collaboration among Teams&lt;/li>
&lt;li>Provide Resources and Tools that Make Work Meaningful&lt;/li>
&lt;li>Support or Embody Transformational Leadership&lt;/li>
&lt;/ul>
&lt;h2 id="four-key-metrics">Four Key Metrics&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Change Lead Time&lt;/strong>
&lt;ul>
&lt;li>Time to implement, test, and deliver code for a feature&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Deployment Frequency&lt;/strong>
&lt;ul>
&lt;li>Number of deployments in a given duration of time&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Change Failure Rate&lt;/strong>
&lt;ul>
&lt;li>Percentage of failed changes over all changes (regardless of success)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Mean Time to Recovery&lt;/strong>
&lt;ul>
&lt;li>Time it takes to restore service after production failure&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/_d9cws_T9qk"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>Have You Always Been Like This?</title><subtitle>How to find a balance of growth and happiness</subtitle><category term="career" scheme="https://chemaclass.com/tags/career/" label="Career"/><category term="productivity" scheme="https://chemaclass.com/tags/productivity/" label="Productivity"/><category term="philosophy" scheme="https://chemaclass.com/tags/philosophy/" label="Philosophy"/><published>2023-03-16T00:00:00+00:00</published><updated>2023-03-16T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/have-you-always-been-like-this/"/><id>https://chemaclass.com/blog/have-you-always-been-like-this/</id><summary type="html">Have you always been like this? Constantly reading books, writing blog posts, public speaker in conferences and meet-ups, learning in your private time, etc...? The short answer is: no, and let me tell you how I ended up in this situation.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2023-03-16/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>I’ve got this question recently, a couple of times, and this is a great topic to share.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;blockquote>
&lt;p>“Have you always been like this? Constantly reading books, writing blog posts, public speaker in conferences and meet-ups, learning in your private time, etc…?”&lt;/p>
&lt;/blockquote>
&lt;p>The short answer is: no, and let me tell you how I ended up in this situation.&lt;/p>
&lt;hr />
&lt;h2 id="i-used-to-be-introvert">I used to be introvert&lt;/h2>
&lt;p>I used to be an introvert, but with work and effort, I managed to master some public speaking skills.&lt;/p>
&lt;blockquote>
&lt;p>Sharing knowledge is hard because first, you need to have it.&lt;/p>
&lt;/blockquote>
&lt;p>I used to dislike reading; I always preferred other sources of getting information and learning new things. Of all of them, reading was the most boring one.&lt;/p>
&lt;blockquote>
&lt;p>Reading is hard, because it needs your entire attention.&lt;/p>
&lt;/blockquote>
&lt;p>However, I have always enjoyed writing since I was a kid. For personal circumstances, writing was a way to express and reflect on me, doing regular retrospectives about the ideas in my head.&lt;/p>
&lt;h3 id="writing-to-the-rescue">Writing to the rescue&lt;/h3>
&lt;blockquote>
&lt;p>Combining “sharing knowledge” and “reading” from and to myself.&lt;/p>
&lt;/blockquote>
&lt;p>Writing was (and still is) a way to sort out my thoughts, especially during hard times; writing was a way to escape from the world. It helped me to understand myself better the day after. And it worked.&lt;/p>
&lt;p>Knowing your limitations can help you understand your reality and fight against it. Life is hard enough to accept whatever “is there,” even if you are dissatisfied with it - especially if you have a reason for that.&lt;/p>
&lt;p>I learned that I don’t want to waste my time in a life I will regret when I die. For that reason, I started seeking opportunities to grow at everything I do all the time.&lt;/p>
&lt;h3 id="will-i-always-be-like-this">Will I always be like this?&lt;/h3>
&lt;blockquote>
&lt;p>“Are you all the time 100% learning and being productive?”&lt;/p>
&lt;/blockquote>
&lt;p>You cannot be 100% productive all the time. That’s impossible because of our human nature. Life is about constant “ups and downs,” which is also part of its beauty. It’s your responsibility to understand yourself; I mean, truly understand your emotions and your persona.&lt;/p>
&lt;p>These are questions that can help you keep the focus while building yourself. When asking these types of questions, try looking from a rational and external point of view. Leave out emotions and personal feelings.&lt;/p>
&lt;ul>
&lt;li>Who are “you”?&lt;/li>
&lt;li>What differentiate “you” from other people?&lt;/li>
&lt;li>What differentiate “today’s you” from “you a year ago”?&lt;/li>
&lt;li>What about your “you” in 1 year?&lt;/li>
&lt;/ul>
&lt;hr />
&lt;p>Within your context and possibilities, you are what you choose to be. And that’s what differentiates you from your past and your future. The actions you do, the way you communicate and interact with others, the decisions you choose, etc…, differentiate you. That’s what differentiates you from yourself at another point in time.&lt;/p>
&lt;p>This is why I enjoy reading – or listening to a book – per month. This is why I enjoy learning anytime, all the time. This is why I like to share what I know with others. This is who I choose to be.&lt;/p>
&lt;p>A few years ago, I wrote about &lt;a href="/blog/the-process-itself-is-the-goal/">the process itself as the goal&lt;/a>, which says basically: “&lt;em>Repetition is the key. Make it easier to do what you want to do. Make it harder to do what you want to stop doing. Enjoy the process: that’s the goal.&lt;/em>”&lt;/p>
&lt;p>&lt;img src="/images/blog/2023-03-16/middle.jpg" alt="blog-middle" />&lt;/p>
&lt;h2 id="how-much-time-do-i-have">How much time do I have?&lt;/h2>
&lt;p>I like to prove myself wrong and challenge the status quo. I even decided to investigate, for example, how I could be one &lt;a rel="external" href="https://chemaclass.com/talks/">speaker&lt;/a> in an international conference last year. The hardest step is always the first; once you’re there, it’s more fun than you initially thought. I might write a dedicated post about this “public speaking” topic. For now, you can check some tips I wrote about &lt;a href="/blog/improve-your-tech-talk/">improving your public speaking talks&lt;/a>.&lt;/p>
&lt;p>Regarding reading, I need around 4 to 6 hours (on average) to finish a book. A typical working day can be divided into 3 slots of 8h; 8 sleep, 8 work, 8 leisure (or other obligations). I don’t work on the weekend, so those days are 16h each of leisure/obligations. So, assuming I work 5 days per week, this means &lt;em>5 days x 8 hours (working days) + 2 days x 16 hours (weekend) = 72 hours&lt;/em> of leisure/obligations time within a week!&lt;/p>
&lt;h3 id="time-is-not-the-problem">Time is not the problem&lt;/h3>
&lt;p>Within a month, I have &lt;strong>72 hours x 4 weeks = 288 hours&lt;/strong> of leisure/obligations time to spare with my girlfriend, talking to my family, playing music, partying or chilling with friends, going to the gym, walking in a park, traveling to other cities…, but also going to the supermarket, doing the dishes, preparing the evening meals, clean the apartment, commuting to work…, all of this requires time as well.&lt;/p>
&lt;p>The problem isn’t time but the priorities I define. Within a month, I can really do a lot of things. The issue I usually encounter is not having a clear goal about what I want to reach in the middle-long goal for myself.&lt;/p>
&lt;p>There might be others, but &lt;a href="/readings/the-power-of-habits/">The power of habits&lt;/a> and &lt;a href="/readings/atomic-habits/">Atomic habits&lt;/a> were the books I read so far about habits that impacted me the most, and I think they might help you if you are struggling with habits that you would like to change anyhow. It all starts by understanding yourself within your context.&lt;/p>
&lt;p>I don’t expect things to change from one day to another. I enjoy experimenting, combining habits, and trying different approaches to improve and get the best out of them over time. Losing fear of failure and seeking constant and continuous improvement is a life-changing mentality.&lt;/p>
&lt;p>What keeps me moving is &lt;u>the time I have left&lt;/u> and the idea of thinking, “&lt;strong>what would I like to have changed?&lt;/strong>” And in such a case, “&lt;strong>Why didn’t I?&lt;/strong>”&lt;/p>
&lt;p>&lt;img src="/images/blog/2023-03-16/footer.jpg" alt="blog-footer" />&lt;/p></content></entry><entry xml:lang="en"><title>21 Lessons</title><subtitle>What I've Learned from Falling Down the Bitcoin Rabbit Hole</subtitle><category term="bitcoin" scheme="https://chemaclass.com/tags/bitcoin/" label="Bitcoin"/><category term="economics" scheme="https://chemaclass.com/tags/economics/" label="Economics"/><category term="philosophy" scheme="https://chemaclass.com/tags/philosophy/" label="Philosophy"/><published>2023-03-11T00:00:00+00:00</published><updated>2023-03-11T00:00:00+00:00</updated><author><name>
Gigi</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/21-lessons/"/><id>https://chemaclass.com/readings/21-lessons/</id><summary type="html">Bitcoin as more than just money—a deep dive into economics, philosophy, and culture. Like Alice in Wonderland, exploring Bitcoin is full of surprises.</summary><content type="html">&lt;p>Gigi portrays Bitcoin as more than just money; it’s a deep dive into economics, philosophy, and culture. Like Alice in Wonderland, exploring Bitcoin is full of surprises, teaching about money, inflation, and the idea of decentralization. It redefines what ‘good money’ is, shows its cultural impact, and stresses that learning about Bitcoin is a personal journey that keeps evolving.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h2 id="key-takeaways">Key takeaways&lt;/h2>
&lt;h3 id="philosophical-and-conceptual-insights">Philosophical and Conceptual Insights&lt;/h3>
&lt;p>Bitcoin teaches more than traditional education, offering insights into economics and philosophy.
Engaging with Bitcoin feels like falling down a rabbit hole, full of learning and surprises.&lt;/p>
&lt;h3 id="economic-and-monetary-lessons">Economic and Monetary Lessons&lt;/h3>
&lt;p>Bitcoin brings back the idea of ‘sound money’, teaching about inflation and banking systems.
Issuing new money reduces the value of existing money, unlike Bitcoin which has a fixed supply.&lt;/p>
&lt;h3 id="technical-and-cultural-aspects">Technical and Cultural Aspects&lt;/h3>
&lt;p>Bitcoin’s core ideas include scarcity, security, and consensus, but the book isn’t a technical manual.
Bitcoin reflects a shift towards decentralization, influenced by movements like cypherpunk.&lt;/p>
&lt;h3 id="personal-and-educational-journey">Personal and Educational Journey&lt;/h3>
&lt;p>Each person might learn different lessons from Bitcoin, encouraging personal exploration.
Bitcoin’s lessons evolve, requiring ongoing study.&lt;/p>
&lt;hr />
&lt;p>“21 Lessons” focuses on why Bitcoin matters philosophically, economically, and culturally, rather than how to use it.&lt;/p>
&lt;blockquote>
&lt;p>You can buy the book or read it for free on their own website: &lt;a rel="external" href="https://21lessons.com/preface">https://21lessons.com/preface&lt;/a>&lt;/p>
&lt;/blockquote>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/-5lU92SEplU"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>Great Leadership</title><subtitle>Leadership starts within your own life and behaviour</subtitle><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><category term="mentoring" scheme="https://chemaclass.com/tags/mentoring/" label="Mentoring"/><published>2023-02-27T00:00:00+00:00</published><updated>2023-02-27T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/great-leadership/"/><id>https://chemaclass.com/blog/great-leadership/</id><summary type="html">As organizations grow, leaders must shift focus from customers to employees. Key principles for scaling leadership effectively.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2023-02-27/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>As business scales, the leaders’ primary focus must shift from customers to employees. Therefore, I would like to share what I consider critical points that any leader should address and focus on regularly.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>For each key point, you will have book recommendations that go deeper into the matter, giving you references from real experts behind them.&lt;/p>
&lt;hr />
&lt;p>I already wrote about the &lt;a href="/blog/the-beauty-of-leadership/">beauty of leadership&lt;/a>, and as a quick recap, to become a leader, you need specific skills:&lt;/p>
&lt;ul>
&lt;li>Excellent &lt;strong>communication&lt;/strong>, giving support, and enabling your people&lt;/li>
&lt;li>Leading by &lt;strong>example&lt;/strong>, especially to become a better self&lt;/li>
&lt;li>&lt;strong>Passion&lt;/strong> for sharing your leadership skills, so you build other leaders&lt;/li>
&lt;/ul>
&lt;p>To extend the previous post providing resources and examples, in this one, you will find books about the following topics:&lt;/p>
&lt;ul>
&lt;li>Motivation&lt;/li>
&lt;li>Leading through change&lt;/li>
&lt;li>Empowering your people&lt;/li>
&lt;li>Effective communication&lt;/li>
&lt;li>Persuasion&lt;/li>
&lt;li>Team dysfunctions&lt;/li>
&lt;li>Management principles&lt;/li>
&lt;li>CEO Mindset&lt;/li>
&lt;li>Engineering leadership&lt;/li>
&lt;/ul>
&lt;hr />
&lt;h2 id="for-starting-leaders">For “starting” leaders&lt;/h2>
&lt;h3 id="motivation">Motivation&lt;/h3>
&lt;p>First of all, you need to define a &lt;strong>purpose&lt;/strong> for your leadership. I would recommend “&lt;a href="/readings/start-with-why/">Start with Why&lt;/a>”, as this can help you clarify the difference between great leaders and those who are not.&lt;/p>
&lt;blockquote>
&lt;p>“The ability to inspire those around you and to achieve remarkable things starts with WHY.” – Start with Why&lt;/p>
&lt;/blockquote>
&lt;p>You need to be aware that leadership is not about being the boss of anyone but &lt;strong>serving&lt;/strong> others. It would help if you were a role example that your people would copy and follow, especially in hard times. This is a leadership philosophy in which the leader aims to serve. “&lt;a href="/readings/leaders-eat-last/">Leaders Eat Last&lt;/a>” goes deeper into this topic.&lt;/p>
&lt;p>After reading the previous two books, if you are looking for more, the cherry on top is “&lt;a href="/readings/the-infinite-game/">The infinite game&lt;/a>”, which is the third and last book (so far) by Simon Sinek. This book questions our daily mindset when confronting (business) problems. It’s about the need of a &lt;em>just cause, courageous leadership, trusting teams,&lt;/em> and a &lt;em>worthy rival.&lt;/em>&lt;/p>
&lt;blockquote>
&lt;p>“There is no such thing as the one “right” organization. There are only organizations, each of which has distinct strengths, distinct limitations, and specific applications. An organization is not absolute. It is a tool for making people productive in working together.“ – The infinite game&lt;/p>
&lt;/blockquote>
&lt;h3 id="leading-through-change">Leading through change&lt;/h3>
&lt;p>Leading through change is something you have to face in many moments in your life, whether you like it or not. “&lt;a href="/readings/who-moved-my-cheese/">Who moved my cheese?&lt;/a>” is a tale about the different attitudes people adopt as part of their identity when confronting change.&lt;/p>
&lt;p>How do you eliminate bad habits and start creating good ones? “&lt;a href="/readings/the-power-of-habits/">The Power of Habit&lt;/a>” and “&lt;a href="/readings/atomic-habits/">Atomic Habits&lt;/a>” are great books that help you understand that habits are like a muscle. You can train them.&lt;/p>
&lt;blockquote>
&lt;p>“Change how you identify yourself. The environment is more important than being motivated. Reduce friction for good habits and increase friction for bad habits.” – Atomic Habits&lt;/p>
&lt;/blockquote>
&lt;h3 id="empowering-your-people">Empowering your people&lt;/h3>
&lt;p>It would be best if you empowered your people to become leaders themselves. A great book I recommend is “&lt;a href="/readings/turn-the-ship-around/">Turn the ship around!&lt;/a>”, in which the author challenges the commonly accepted &lt;strong>leaders vs. followers&lt;/strong> model into a &lt;strong>leaders-to-leaders&lt;/strong> relationship.&lt;/p>
&lt;blockquote>
&lt;p>“Leadership is communicating to people their worth so clearly that they are inspired to see it in themselves.” – Turn the ship around!&lt;/p>
&lt;/blockquote>
&lt;h3 id="effective-communication">Effective communication&lt;/h3>
&lt;p>Communication is one of the most challenging skills you need because you constantly communicate with other people; with different backgrounds, experiences, expectations, and even understanding of life. And the important key aspect is not just what you say but how you say it to ensure your desired message is correctly delivered to the receiver.&lt;/p>
&lt;p>“&lt;a href="/readings/leadership-is-language/">Leadership is Language&lt;/a>” challenges the industrial-age playbook (where leaders give commands and employees follow them), giving you strategies that can help you such as: &lt;em>control the clock, collaborate, commit, complete, and improve&lt;/em>.&lt;/p>
&lt;blockquote>
&lt;p>“Your words matter more than you think.” – Leadership is Language&lt;/p>
&lt;/blockquote>
&lt;p>It is important to recognize our emotions and not let them control our actions. Creating an open, honest, and &lt;strong>safe environment&lt;/strong> is crucial to create trust among your peers.&lt;/p>
&lt;p>“&lt;a href="/readings/dare-to-lead/">Dare to lead&lt;/a>” addresses that leaders need to be more vulnerable. It shows that solid values guide you to do what is correct rather than easy. The importance of trust and difficult conversations even when they make you uncomfortable.&lt;/p>
&lt;blockquote>
&lt;p>“Great leaders must be brave and always dare to provide constructive feedback, speak the truth, and be clear about their expectations.” – Dare to lead&lt;/p>
&lt;/blockquote>
&lt;h3 id="persuasion">Persuasion&lt;/h3>
&lt;p>Regarding communication, you might need some good persuasion skills to convince others about your ideas. “&lt;a href="/readings/never-split-the-difference/">Never split the difference&lt;/a>” is a book about negotiation (from one FBI’s lead international kidnapping negotiator) that gives you great insides into how to negotiate effectively: negotiation begins with listening, using mirrors to encourage the other side to empathise, tactical empathy to getting an agreement, labelling emotions, among others.&lt;/p>
&lt;blockquote>
&lt;p>“Negotiation begins with listening, making it about the other people, validating their emotions, and creating enough trust and safety for a real conversation to begin.” – Never split the difference&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="/images/blog/2023-02-27/middle.jpg" alt="blog-middle" />&lt;/p>
&lt;hr />
&lt;h2 id="for-experienced-leaders">For “experienced” leaders&lt;/h2>
&lt;p>Assuming you have read the books above (for “starting leaders”) I can give you more recommendations.&lt;/p>
&lt;h3 id="team-dysfunctions">Team dysfunctions&lt;/h3>
&lt;p>One of the most difficult areas from the communication layer is dealing effectively with conflicts; so “&lt;a href="/readings/the-five-dysfunctions-of-a-team/">The Five Dysfunctions of a Team&lt;/a>” is a great book which addresses the “absence of trust, fear of conflict, lack of commitment, avoidance of accountability and inattention to results” as a pyramid of dysfunctions that you need to pay attention.&lt;/p>
&lt;h3 id="management-principles">Management principles&lt;/h3>
&lt;p>Although leadership is not the same as management, I find it quite useful knowing some theory behind management, and for this “&lt;a href="/readings/high-output-management/">High Output Management&lt;/a>” is a great starting point.&lt;/p>
&lt;p>After that one, if you want more, I can recommend something more advance with “&lt;a href="/readings/the-essential-drucker/">The Essential Drucker&lt;/a>”, which addresses the essential principles of management.&lt;/p>
&lt;blockquote>
&lt;p>“Management is about humans.” – The Essential Drucker&lt;/p>
&lt;/blockquote>
&lt;h3 id="ceo-mindset">CEO Mindset&lt;/h3>
&lt;p>Although not every leader might want to be a CEO, I find “&lt;a href="/readings/the-great-ceo-within/">The Great CEO Within&lt;/a>” a great book because this can help you understand the responsibilities from any organization’s most abstract point of view.&lt;/p>
&lt;p>Similarly, “&lt;a href="/readings/adapt-or-die/">Adapt or Die&lt;/a>” is a great book that covers the fundamental aspects of overall responsibilities and capabilities to thrive in any business, addressing aspects such as Product, Strategy, Growth Engine, Financial Model, People, Operations, Process, and Leadership.&lt;/p>
&lt;blockquote>
&lt;p>“Leadership is about helping people adapt and leading through change so the business and its people can thrive.” – Adapt or die&lt;/p>
&lt;/blockquote>
&lt;h3 id="engineering-leadership">Engineering leadership&lt;/h3>
&lt;p>Related to engineering and growing, I also recommend “&lt;a href="/readings/manager-path/">The Manager Path&lt;/a>”, and “&lt;a href="/readings/the-art-of-leadership/">The Art of Leadership&lt;/a>”, both great books; easy to read and full of wisdom.&lt;/p>
&lt;blockquote>
&lt;p>“Managers tell you where you are; leaders tell you where you are going.” – The Art of Leadership&lt;/p>
&lt;/blockquote>
&lt;hr />
&lt;p>I hope I got enough attention to create awareness about the key areas you must work on. I am aware that many other books could be included in this list. You might have others on your shelf. These are just a reference, not necessarily better or worse than others.&lt;/p>
&lt;p>I still have many other books I want/will read over time. Still, I thought it would be interesting to compile these already, aiming to create value, sharing especially for those who don’t know where to start or how to become better leaders themselves.&lt;/p>
&lt;p>However, these are the essential points to remember:&lt;/p>
&lt;ul>
&lt;li>You need to have &lt;strong>passion for your work&lt;/strong> and share this passion with the people around you. You cannot expect passion from your peers if you don’t have passion for what you do.&lt;/li>
&lt;li>You need to &lt;strong>empower your people&lt;/strong>, creating leaders instead of folks who follow orders from their superiors.&lt;/li>
&lt;li>You need to learn how to create a &lt;strong>safe environment&lt;/strong>, which is crucial for trust and honest relationships.&lt;/li>
&lt;li>You need to help &lt;strong>create agreements&lt;/strong> when dealing with conflict resolutions. Avoiding healthy conflicts doesn’t help long-term relationships.&lt;/li>
&lt;li>You have to look for &lt;strong>opportunities to grow&lt;/strong> everywhere and help our team grow with you.&lt;/li>
&lt;/ul>
&lt;p>Your primary responsibility is to help others improve, and this is only possible if you &lt;strong>embrace the change&lt;/strong> and &lt;strong>start with yourself&lt;/strong>.&lt;/p>
&lt;p>&lt;img src="/images/blog/2023-02-27/footer.jpg" alt="blog-footer" />&lt;/p>
&lt;h3 id="all-mentioned-authors">All mentioned authors&lt;/h3>
&lt;ul>
&lt;li>Simon Sinek: &lt;a href="/readings/start-with-why/">Start with Why&lt;/a>, &lt;a href="/readings/leaders-eat-last/">Leaders Eat Last&lt;/a>, &lt;a href="/readings/the-infinite-game/">The infinite game&lt;/a>&lt;/li>
&lt;li>Spencer Johnson: &lt;a href="/readings/who-moved-my-cheese/">Who moved my cheese?&lt;/a>&lt;/li>
&lt;li>Charles Duhigg: &lt;a href="/readings/the-power-of-habits/">The Power of Habit&lt;/a>&lt;/li>
&lt;li>James Clear: &lt;a href="/readings/atomic-habits/">Atomic Habits&lt;/a>&lt;/li>
&lt;li>L. David Marquet: &lt;a href="/readings/turn-the-ship-around/">Turn the ship around!&lt;/a>, &lt;a href="/readings/leadership-is-language/">Leadership is Language&lt;/a>&lt;/li>
&lt;li>Brené Brown: &lt;a href="/readings/dare-to-lead/">Dare to lead&lt;/a>&lt;/li>
&lt;li>Chris Voss: &lt;a href="/readings/never-split-the-difference/">Never split the difference&lt;/a>&lt;/li>
&lt;li>Patrick M. Lencioni: &lt;a href="/readings/the-five-dysfunctions-of-a-team/">The Five Dysfunctions of a Team&lt;/a>&lt;/li>
&lt;li>Andrew S. Grove: &lt;a href="/readings/high-output-management/">High Output Management&lt;/a>&lt;/li>
&lt;li>Peter F. Drucker: &lt;a href="/readings/the-essential-drucker/">The Essential Drucker&lt;/a>&lt;/li>
&lt;li>Matt Mochary: &lt;a href="/readings/the-great-ceo-within/">The Great CEO Within&lt;/a>&lt;/li>
&lt;li>Thomas H. Douglas: &lt;a href="/readings/adapt-or-die/">Adapt or Die&lt;/a>&lt;/li>
&lt;li>Camille Fournier: &lt;a href="/readings/manager-path/">The Manager Path&lt;/a>&lt;/li>
&lt;li>Michael Lopp: &lt;a href="/readings/the-art-of-leadership/">The Art of Leadership&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="extra-leadership-guide-for-the-reluctant-leader">Extra: Leadership Guide for the Reluctant Leader&lt;/h2>
&lt;p>Especially if you are a software developer, this video is for you.&lt;/p>
&lt;blockquote>
&lt;p>“Leadership is for everybody. It is for all y’all.”&lt;/p>
&lt;/blockquote>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/3PcL8UkorEg"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>Adapt or die</title><subtitle>How to Create Innovation, Solve People Puzzles, and Win in Business</subtitle><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><category term="productivity" scheme="https://chemaclass.com/tags/productivity/" label="Productivity"/><category term="philosophy" scheme="https://chemaclass.com/tags/philosophy/" label="Philosophy"/><published>2023-02-26T00:00:00+00:00</published><updated>2023-02-26T00:00:00+00:00</updated><author><name>
Thomas H. Douglas</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/adapt-or-die/"/><id>https://chemaclass.com/readings/adapt-or-die/</id><summary type="html">Told through the story of one bold company (People First IT), Adapt or Die takes readers through the unparalleled business system known as The Algorithm of Success that has the potential to inspire, ignite, and affect change for all aspects of an organization.</summary><content type="html">&lt;p>Told through the story of one bold company (People First IT), Adapt or Die takes readers through the unparalleled business system known as The Algorithm of Success that has the potential to inspire, ignite, and affect change for all aspects of an organization.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>Each chapter reveals more of the winning formula that all small and midsize businesses absolutely must have to succeed. Through real examples, research, and practical tools, Adapt or Die unpacks exactly how to create innovation, solve people puzzles, and win in business.&lt;/p>
&lt;blockquote>
&lt;p>“Leadership is about helping people adapt and leading through change so the business and its people can thrive.”&lt;/p>
&lt;/blockquote>
&lt;h2 id="why-businesses-fail">Why businesses fail?&lt;/h2>
&lt;p>Businesses fail because they…&lt;/p>
&lt;ul>
&lt;li>are unable or unwilling to have courageous conversations&lt;/li>
&lt;li>focus on money too much or too soon instead of on people&lt;/li>
&lt;li>can provide the value themselves but can’t make it scale&lt;/li>
&lt;li>fail to focus on people as their primary responsibility&lt;/li>
&lt;li>focus on people, but don’t have the necessary skills to make a difference&lt;/li>
&lt;li>listen to respond instead of listening to hear&lt;/li>
&lt;li>think that because their idea is unique and specific, so are their issues&lt;/li>
&lt;li>live in the business and fail to spend time on the business&lt;/li>
&lt;li>expect thing to happen without truly leading through change&lt;/li>
&lt;li>fail to fall in love with the truth and fight the truth instead&lt;/li>
&lt;/ul>
&lt;h2 id="how-to-help-growing-your-teamwork">How to help growing your teamwork&lt;/h2>
&lt;blockquote>
&lt;p>“As a business scales, the primary focus of the owner and the leadership must shift from focusing on customers to focusing on employees.”&lt;/p>
&lt;/blockquote>
&lt;p>By having courageous conversions about the full spectrum of skills required to go to the next level, focusing on improving the personal and professional career experience for that person and the people around them.&lt;/p>
&lt;p>These are the main points that everyone could develop:&lt;/p>
&lt;ul>
&lt;li>Good communications&lt;/li>
&lt;li>Focus &amp;amp; achieve goals &amp;amp; results&lt;/li>
&lt;li>Everyone contributes&lt;/li>
&lt;li>Offer each other support&lt;/li>
&lt;li>Good leadership&lt;/li>
&lt;li>Clear and good organization&lt;/li>
&lt;li>Constructive conflict drives innovation&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>“People is not usually the root problem. The taxonomy is 3Ps: product, process, or people. And “people” is the final step because leaders need to look at product and process first. In other words, “people first” when it comes to values, but “people last” when it comes to blame.“&lt;/p>
&lt;/blockquote>
&lt;h2 id="the-algorithm-of-success">The Algorithm of Success&lt;/h2>
&lt;p>As you can see in the diagram, all of this comes under leadership. If leadership is about helping others adapt to change, then it must be core to our organizations.&lt;/p>
&lt;p>&lt;img src="/images/readings/2023-02-26/aos-leadership.jpg" alt="blog-cover" />&lt;/p>
&lt;h3 id="product">Product&lt;/h3>
&lt;ul>
&lt;li>Promises&lt;/li>
&lt;li>Solve a problem or need&lt;/li>
&lt;li>Cash release triggers&lt;/li>
&lt;li>The way we create value&lt;/li>
&lt;li>Pain or Pleasure&lt;/li>
&lt;li>Innovation&lt;/li>
&lt;li>Connections: Logical, emotional and competitive&lt;/li>
&lt;/ul>
&lt;h3 id="strategy">Strategy&lt;/h3>
&lt;ul>
&lt;li>Target customer profile (Who)&lt;/li>
&lt;li>Value Creation Strategy (VCS)&lt;/li>
&lt;li>Core Values&lt;/li>
&lt;li>Shared vision&lt;/li>
&lt;li>Value loop&lt;/li>
&lt;li>Key processes&lt;/li>
&lt;/ul>
&lt;h3 id="the-growth-engine">The Growth Engine&lt;/h3>
&lt;ul>
&lt;li>Unique selling proposition&lt;/li>
&lt;li>Targeted marketing&lt;/li>
&lt;li>Sales channels&lt;/li>
&lt;li>Sales steps&lt;/li>
&lt;li>Measuring the Growth Engine&lt;/li>
&lt;li>Funnel &amp;amp; opportunity management&lt;/li>
&lt;li>Return on Sales&lt;/li>
&lt;/ul>
&lt;h3 id="the-financial-model">The Financial Model&lt;/h3>
&lt;ul>
&lt;li>Revenue management&lt;/li>
&lt;li>Cost of goods sold (COGS)&lt;/li>
&lt;li>Sales and marketing costs&lt;/li>
&lt;li>General administration&lt;/li>
&lt;li>EBITDA, ITDA, NOI&lt;/li>
&lt;li>Categorization&lt;/li>
&lt;li>Reporting&lt;/li>
&lt;/ul>
&lt;h3 id="people">People&lt;/h3>
&lt;ul>
&lt;li>Alignment&lt;/li>
&lt;li>People elevators&lt;/li>
&lt;li>Problem solving&lt;/li>
&lt;li>People banks&lt;/li>
&lt;li>Leadership code of conduct&lt;/li>
&lt;li>Career plans&lt;/li>
&lt;li>One-on-one’s&lt;/li>
&lt;li>Income managements&lt;/li>
&lt;/ul>
&lt;h3 id="operations">Operations&lt;/h3>
&lt;ul>
&lt;li>Identify the core operations&lt;/li>
&lt;li>Responsibilities&lt;/li>
&lt;li>Cadence management&lt;/li>
&lt;li>Meetings&lt;/li>
&lt;li>GSD (Get Shit Done)&lt;/li>
&lt;/ul>
&lt;h3 id="process">Process&lt;/h3>
&lt;ul>
&lt;li>Promises Kept&lt;/li>
&lt;li>Downstream / Upstream&lt;/li>
&lt;li>Accountability&lt;/li>
&lt;li>Repeatable&lt;/li>
&lt;li>Efficiencies&lt;/li>
&lt;/ul>
&lt;hr />
&lt;p>You can find the book in &lt;a rel="external" href="https://www.adaptordie.com/the-book/">https://www.adaptordie.com/the-book/&lt;/a>.&lt;/p></content></entry><entry xml:lang="en"><title>The infinite game</title><subtitle>A bold framework for leadership in today's ever-changing world</subtitle><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><category term="philosophy" scheme="https://chemaclass.com/tags/philosophy/" label="Philosophy"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><published>2023-01-29T00:00:00+00:00</published><updated>2023-01-29T00:00:00+00:00</updated><author><name>
Simon Sinek</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/the-infinite-game/"/><id>https://chemaclass.com/readings/the-infinite-game/</id><summary type="html">From the bestselling author of Start With Why and Leaders Eat Last, a bold framework for leadership in today's ever-changing world.</summary><content type="html">&lt;p>How do we win a game that has no end? Finite games, like football or chess, have known players, fixed rules and a clear endpoint. The winners and losers are easily identified. Infinite games, games with no finish line, like business or politics, or life itself, have players who come and go. The rules of an infinite game are changeable while infinite games have no defined endpoint. There are no winners or losers—only ahead and behind.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;blockquote>
&lt;p>Infinite-minded leaders understand that “best” is not a permanent state. Instead, they strive to be “better”. “Better” suggests a journey of constant improvement and makes us feel like we are being invited to contribute our talents and energies to make progress in that journey.&lt;/p>
&lt;/blockquote>
&lt;p>The question is, how do we play to succeed in the game we’re in? In this book, Simon Sinek offers a framework for leading with an infinite mindset:&lt;/p>
&lt;ol>
&lt;li>Just Cause&lt;/li>
&lt;li>Courageous leadership&lt;/li>
&lt;li>Trusting teams&lt;/li>
&lt;li>Worthy rival&lt;/li>
&lt;/ol>
&lt;hr />
&lt;h2 id="1-you-have-to-have-a-just-cause">#1 You have to have a Just Cause&lt;/h2>
&lt;p>A Just Cause is the answer of &lt;em>Why your organization exists?&lt;/em>&lt;/p>
&lt;p>A cause so just that people will be willing to sacrifice themselves to see the advancement of that cause. Eg: working more hours, giving your best ideas, or rejecting another job offer and staying here because you believe in what you are doing.&lt;/p>
&lt;p>In order to be happy, we need a sense of purpose or meaning; businesses are no different.
When we look at developing a Just Cause, there are a few things that we need to articulate. Firstly, we must stand for something that’s inclusive, and exists primarily for the benefit of others.&lt;/p>
&lt;p>In short, a Just Cause is a vision of a compelling future, making people want to be part of building this future, although they may never see it completed.&lt;/p>
&lt;h2 id="2-you-have-to-have-courageous-leadership">#2 You have to have courageous leadership&lt;/h2>
&lt;p>Courageous leaders are the ones that are willing to sacrifice the sort term in order to advance the long term.&lt;/p>
&lt;p>Leadership is the acceptance of the responsibility to create an environment in which people can work on their natural best.&lt;/p>
&lt;p>The senior most people in an organisation are not responsible for the result. They are responsible for the people that are responsible for the result.&lt;/p>
&lt;h2 id="3-you-have-to-have-trusting-teams">#3 You have to have trusting teams&lt;/h2>
&lt;p>A trusting team is an environment in which people feel safe to raise their hand and say “I made a mistake. I don’t feel qualify to do the job you asked me to do, and I need more training. I need help. I am scared.” Without any fear of humiliation or punishment, whatsoever.&lt;/p>
&lt;p>If you don’t have trusting teams, you have a group of people that work together lying and faking, and you’re forcing them to. It’s not their fault. You’re creating an environment in which people will not share mistakes because they think it will make them in trouble. Which means eventually things will compound and break.&lt;/p>
&lt;p>It’s the responsibility of the leader to get the environment right. Get the environment right, you’ll get trusted teams. Get the environment wrong, you are forcing people to protect themselves from you.&lt;/p>
&lt;h2 id="4-you-have-to-have-a-worthy-rival">#4 You have to have a worthy rival&lt;/h2>
&lt;p>Although the only true competitor in an infinite game is yourself, what competition does is help to reveal your weaknesses.&lt;/p>
&lt;p>The goal is not to be number one in the infinite game, because there is no such thing. It’s about building a strong foundation. It’s about looking long term.&lt;/p>
&lt;p>Money is a result, not a purpose.&lt;/p>
&lt;blockquote>
&lt;p>There is no such thing as the one “right” organization. There are only organizations, each of which has distinct strengths, distinct limitations, and specific applications. An organization is not absolute. It is a tool for making people productive in working together.&lt;/p>
&lt;/blockquote>
&lt;hr />
&lt;p>Leaders who embrace an infinite mindset build stronger, more innovative, more inspiring organizations. Ultimately, they are the ones who lead us into the future.&lt;/p>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/tye525dkfi8"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>Interview About XP and Agile</title><subtitle>Agile is about HOW you do certain things</subtitle><category term="agile" scheme="https://chemaclass.com/tags/agile/" label="Agile"/><category term="xp" scheme="https://chemaclass.com/tags/xp/" label="Xp"/><category term="tdd" scheme="https://chemaclass.com/tags/tdd/" label="Tdd"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><published>2023-01-09T00:00:00+00:00</published><updated>2023-01-09T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/interview-about-xp-and-agile/"/><id>https://chemaclass.com/blog/interview-about-xp-and-agile/</id><summary type="html">My interview with devm.io regarding Agile and Extreme Programming. Agile is more about HOW you do certain things, rather than WHAT things you do.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2023-01-09/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>My interview with &lt;strong>devm.io&lt;/strong> regarding Agile and Extreme Programming.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;hr />
&lt;p>&lt;strong>devm.io: We talked to Chema, a software developer and an Extreme Programming expert, about his favourite topic and his upcoming live event &lt;a rel="external" href="https://devm.io/update-your-team-to-be-more-extreme/">Update Your Team To Be More Extreme&lt;/a>.&lt;/strong>&lt;/p>
&lt;h2 id="could-you-tell-us-a-little-about-yourself-who-you-are-and-what-you-do">Could you tell us a little about yourself, who you are, and what you do?&lt;/h2>
&lt;p>Chema: My name is Jose Maria Valera Reales, but everyone calls me Chema. I’m originally from Spain but have lived in Berlin since 2015. I’ve been working as a software developer since 2013. In recent years, I have focused on achieving excellence and figuring out how to help my peers and, with them, the entire software community to improve in our profession.&lt;/p>
&lt;p>I am currently a Tech Lead at &lt;a rel="external" href="https://teufel.de/">Lautsprecher Teufel GmbH&lt;/a>, where I work with the e-commerce webshop team. I also enjoy &lt;a rel="external" href="https://github.com/Chemaclass">open-source software&lt;/a>, so I enjoy creating pull requests for other repositories, and I also love when I receive pull requests from others.&lt;/p>
&lt;h2 id="how-would-you-describe-extreme-programming-what-makes-it-so-extreme">How would you describe Extreme Programming? What makes it so “extreme?”&lt;/h2>
&lt;p>Extreme Programming is the most straightforward and pragmatic approach to embracing Agile in your software team. It incorporates solutions based on values, principles, and practices. You don’t have to use or do everything, but rather whatever fits you and your team in your context. However, these are helpful general solutions that work better when combined.&lt;/p>
&lt;p>From my experience, the word “extreme” can be misleading, but I see it as an opportunity to emphasise the difficulty of the fundamentals behind it. The critical point is realising that our “common sense” is not as “common” as we tend to think, nor the best practices for practical teamwork. Therefore, this is about pushing ourselves to extreme effectiveness, collaboration, and satisfaction while working with others.&lt;/p>
&lt;h2 id="you-will-host-a-live-event-on-devm-io-on-the-topic-on-january-19th-could-you-give-us-a-sneak-peek-of-what-your-audience-can-expect">You will host a live event on devm.io on the topic on January 19th. Could you give us a sneak peek of what your audience can expect?&lt;/h2>
&lt;p>We will explore how a software team works nowadays, the common issues we encounter, and what solutions we could apply to improve our team routines. We will look for the real meaning of Agile, focusing on Extreme Programming ideas.&lt;/p>
&lt;p>In addition, I will share some ideas to help your team create learning opportunities with concrete examples that any team can incorporate into their current work.&lt;/p>
&lt;h2 id="during-the-event-you-will-also-tell-us-something-about-katas-what-exactly-are-katas">During the event, you will also tell us something about Katas. What exactly are Katas?&lt;/h2>
&lt;p>The term “kata” comes from the repetitive movements done in karate that help you improve your fighting skills.&lt;/p>
&lt;p>Why “code katas?” Because as a group, we need to practice more. Most of our learning takes place on the job, so most of our mistakes are also made there. And because we want to keep PROD, we’re reluctant to try new things.&lt;/p>
&lt;p>Katas exist to help developers get the same benefits you would get from practice in any other profession. These simple, simulation exercises let you experiment and learn without the pressure of PROD. There are no right or wrong answers in any software kata: the benefit comes from the process, not the result.&lt;/p>
&lt;p>There are katas to help you improve your refactoring skills (such as Gilded Rose Refactoring Kata by Emily Bache) or your testing skills (easy ones like Fizz Buzz or Roman Numerals, or more advanced ones like the Bank Kata by Sandro Mancuso). They’re also great for building confidence when programming with others, watching and practising different roles collaboratively, fostering team cohesion, etc.&lt;/p>
&lt;h2 id="what-role-do-agile-methods-play-in-software-development-for-you">What role do Agile methods play in software development for you?&lt;/h2>
&lt;p>The very first question here is to define what Agile methods are. In the end, everyone communicates somehow, provides feedback to others, and simplifies to some level. Sometimes people have the courage to speak their minds and sometimes they do not, and usually, they try to respect their peers. So, for me, Agile is more about “how” you do certain things rather than “what” things you do.&lt;/p>
&lt;p>Agile is a highly collaborative working process at any level, which might have a challenging learning curve at the beginning, but it pays off sooner than you might expect.&lt;/p>
&lt;h2 id="which-topic-in-the-area-of-agile-should-receive-more-attention">Which topic in the area of agile should receive more attention?&lt;/h2>
&lt;p>Team building and embracing agility, starting with asking “why?” We need to challenge the status quo more often and ask ourselves why we work the way we do and how and what we could do differently to keep improving and never stop learning.&lt;/p>
&lt;blockquote>
&lt;p>You can also read the interview from the original link: &lt;a rel="external" href="https://devm.io/agile/extreme-programming-agile">https://devm.io/agile/extreme-programming-agile&lt;/a>.&lt;/p>
&lt;/blockquote></content></entry><entry xml:lang="en"><title>Momo</title><subtitle>Or the strange story of the time-thieves and the child who brought the stolen time back to the people</subtitle><category term="fiction" scheme="https://chemaclass.com/tags/fiction/" label="Fiction"/><category term="philosophy" scheme="https://chemaclass.com/tags/philosophy/" label="Philosophy"/><category term="psychology" scheme="https://chemaclass.com/tags/psychology/" label="Psychology"/><published>2022-12-17T00:00:00+00:00</published><updated>2022-12-17T00:00:00+00:00</updated><author><name>
Michael Ende</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/momo/"/><id>https://chemaclass.com/readings/momo/</id><summary type="html">Momo is a modern fairytale that shows the fight between good and evil in our contemporary society, focusing on the lack of time to care for other people.</summary><content type="html">&lt;p>Momo is a fairytale that shows the fight between good and evil in our contemporary society, focusing on the lack
of time to care for other people.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>This book is about the concept of time and how it is used in modern societies.&lt;/p></content></entry><entry xml:lang="en"><title>Ignoring Scrum to Get More Agile?</title><subtitle>Killing agility with excessive meetings</subtitle><category term="agile" scheme="https://chemaclass.com/tags/agile/" label="Agile"/><category term="scrum" scheme="https://chemaclass.com/tags/scrum/" label="Scrum"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><category term="productivity" scheme="https://chemaclass.com/tags/productivity/" label="Productivity"/><published>2022-12-06T00:00:00+00:00</published><updated>2022-12-06T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/ignoring-scrum-to-get-more-agile/"/><id>https://chemaclass.com/blog/ignoring-scrum-to-get-more-agile/</id><summary type="html">People become slaves to systems that are supposed to help. Boring meetings are killing agile. Meetings require active participation from everyone. Otherwise, you might not be essential to that meeting, and rather use your time with something else.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2022-12-06/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>Talking to a friend about agile, he asked me a fascinating question remarking how badly sometimes Agile and Scrum fit
together, especially regarding meetings. These are my thoughts about this topic.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;blockquote>
&lt;p>“Do you think it would make sense to just use agile and ignore scrum (sprints) completely in a product based
development company. I feel it’s hard to be agile when you have 10 hours of meetings per week.” Filip G.&lt;/p>
&lt;/blockquote>
&lt;p>That is related to the essence core of &lt;a href="/readings/xp-embrace-change/">Extreme Programming&lt;/a>, which is the first value: Effective Communication.&lt;/p>
&lt;blockquote>
&lt;p>“Probably some companies just don’t know how to properly use meetings and just have them out of habit.” Filip G.&lt;/p>
&lt;/blockquote>
&lt;p>I wouldn’t say completely ignore Scrum. Scrum (when done well) is a great “Product Management” Framework. To improve
your understanding of Scrum I recommend reading: &lt;a href="/readings/scrum-the-art-of-doing-twice">Scrum: The Art of Doing Twice the Work in Half the Time&lt;/a>.&lt;/p>
&lt;p>The main issue with scrum nowadays is that management took control over the whole thing, and developers are not really
educated about how to practice Scrum properly (in a real Agile way), and that’s where the problem starts. For this,
I recommend a book that addresses pretty well the common issues that most Scrum teams face in a fun and easy-reading book
&lt;a href="/readings/zombie-scrum-survival-guide/">Zombie Scrum Survival Guide: A Journey to Recovery&lt;/a>.&lt;/p>
&lt;p>It’s not about Agile yes, and Scrum no. They are totally compatible. The issue is to create awareness about how to focus
the team processes from an agile point of view.&lt;/p>
&lt;h2 id="agile-in-a-nutshell">Agile in a nutshell&lt;/h2>
&lt;p>I recently wrote a blog post about agile fundamentals, which I recommend you to read to get into the
details: &lt;a href="/blog/working-agile-with-non-agile-teams/">Working agile with non-agile teams&lt;/a>. But, the &lt;strong>tl;dr&lt;/strong>:
&lt;ins>Agile is about quick feedback. It’s about effective communication and reducing waste while aiming for simplicity.&lt;/ins>&lt;/p>
&lt;p>&lt;a rel="external" href="https://agilemanifesto.org/">Agile&lt;/a> is about keeping these values always present:&lt;/p>
&lt;ul>
&lt;li>Individuals and interactions over processes and tools&lt;/li>
&lt;li>Working software over comprehensive documentation&lt;/li>
&lt;li>Customer collaboration over contract negotiation&lt;/li>
&lt;li>Responding to change over following a plan&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>While there is value in the items on the right, we value the items on the left more.&lt;/p>
&lt;/blockquote>
&lt;h2 id="scrum-in-a-nutshell">Scrum in a nutshell&lt;/h2>
&lt;p>Scrum is a framework for project management emphasizing software development, although it is used in other fields like
sales, marketing, and more. It’s designed for teams of 5–9 people (see &lt;a href="/blog/dunbar-number/">Dunbar number&lt;/a>) who are
totally autonomous and responsible for breaking down their work into small chunks that can be completed in a time-boxed
iteration, called sprints, usually 1, 2, or 4 weeks.&lt;/p>
&lt;p>It’s common to find certain ceremonies/meetings like:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Stand-up&lt;/strong>: 15 min (or less) to keep everyone in the team sync and updated about the work and call out for action when
anyone is blocked or need especial attention or help.&lt;/li>
&lt;li>&lt;strong>Refinement&lt;/strong>: 2h? meeting to make sure the tickets are in a good shape before planning them to be worked on in the next
sprint.&lt;/li>
&lt;li>&lt;strong>Planning&lt;/strong>: 2h? meeting to plan the work to be done in the next sprint.&lt;/li>
&lt;li>&lt;strong>Demo/Review&lt;/strong>: 2h? meeting to show the work done for the whole team, stakeholders and other interested people.&lt;/li>
&lt;li>&lt;strong>Retrospective&lt;/strong>: 2h? meeting intended to enable the team to reflect and improve.&lt;/li>
&lt;/ul>
&lt;p>The critical question is how your team organizes these meetings and, most important of all, how effective these are.
These above are just some of the important meetings you have in any “Scrum Team” nowadays.&lt;/p>
&lt;p>Still, apart from those, you might encounter a lot of additional meetings that pile up, and suddenly your entire working
day is gone, and you feel you didn’t produce the value you expected. Unless your job is being in meetings every time,
like coordinating projects and talking to people all the time, it seems something is wrong.&lt;/p>
&lt;h3 id="boring-meetings">Boring meetings&lt;/h3>
&lt;p>Have you ever been in any of those meetings and thought, “&lt;em>This is boring, what a waste of time…&lt;/em>”. Well, I’ve
experienced that more than once. Who’s to blame? That would be the very first question that could come to your mind.
Followed by, “&lt;em>My boss, obviously, because he/she organized that meeting, to which I got invited, therefore I am forced
to attend, and this wasting time is their fault.&lt;/em>”&lt;/p>
&lt;p>This is a tricky question, and I don’t think it is an honest answer. However, there is an easy explanation for this
answer: pushing away responsibilities and blaming others rather than yourself is way easier.&lt;/p>
&lt;p>“&lt;em>I am forced to attend, and this wasting time is their fault&lt;/em>” it could be that that’s actually the actual fact.
You were really forced, and you’re wasting your time, and there is no other way… but is there no way to act on it,
really?&lt;/p>
&lt;p>When something doesn’t work the way I expect (e.g., I don’t like the outcome, or I think something is off), before
blaming and pushing away responsibilities to others, I want to reflect on it and identify the root of the issue. What
could I do to make the situation better?&lt;/p>
&lt;hr />
&lt;h2 id="what-can-you-do-about-it">What can you do about it?&lt;/h2>
&lt;p>Coming back to this context of “many meetings”, if you see yourself in a meeting again that feels off or boring, try
asking yourself:&lt;/p>
&lt;blockquote>
&lt;p>Am I feeling bored? Why so? Is it possible that I am not participating in the desired outcome of the meeting? And if
so, is my presence here in this meeting really necessary? Could I simply ask for a summary afterward and jump outside
the meeting to do something more productive?&lt;/p>
&lt;p>Contrarily, is it OK to feel bored in this meeting? Or should I participate and engage with my peers to
contribute to the outcome of the meeting?&lt;/p>
&lt;/blockquote>
&lt;p>In these situations, I encounter a pattern such as:&lt;/p>
&lt;ul>
&lt;li>If the meeting is not boring, it is productive and will produce a rich outcome for you and, hopefully, all participants.&lt;/li>
&lt;li>If the meeting is boring, then either A) it is OK to be boring, politely ask to leave, and you will get the summary
afterward, or B) it is not OK to be boring. Your participation is necessary for the outcome of the meeting. Try being
more engaging with your peers, and the meeting won’t be boring.&lt;/li>
&lt;/ul>
&lt;p>In the end, there are a lot of strategies, and it’s up to you to act on them whenever you see something that could be
improved.&lt;/p>
&lt;p>It’s OK to point out the “&lt;em>elephant in the room&lt;/em>” and ask for help to improve any situation you think - or feel - is not
working as it should.&lt;/p>
&lt;p>&lt;img src="/images/blog/2022-12-06/footer.jpg" alt="blog-footer" />&lt;/p></content></entry><entry xml:lang="en"><title>Recipes for Decoupling</title><category term="php" scheme="https://chemaclass.com/tags/php/" label="Php"/><category term="software-design" scheme="https://chemaclass.com/tags/software-design/" label="Software Design"/><category term="architecture" scheme="https://chemaclass.com/tags/architecture/" label="Architecture"/><category term="clean-code" scheme="https://chemaclass.com/tags/clean-code/" label="Clean Code"/><published>2022-11-28T00:00:00+00:00</published><updated>2022-11-28T00:00:00+00:00</updated><author><name>
Matthias Noback</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/recipes-for-decoupling/"/><id>https://chemaclass.com/readings/recipes-for-decoupling/</id><summary type="html">What is coupling, and why is it bad? What is decoupling, and how to do it efficiently? This book is a compilation of strategies to decouple your domain code from those infrastructure details, so you can enjoy a healthier system in the long run.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>What is coupling, and why is it bad? What is decoupling, and how to do it efficiently? This book is a compilation of
strategies to decouple your domain code from those infrastructure details, so you can enjoy a healthier system in the
long run.&lt;/p>
&lt;p>This book will teach you how to create &lt;a rel="external" href="https://phpstan.org/">&lt;strong>PHPStan&lt;/strong>&lt;/a> rules from no knowledge, and then it will
guide you across many decoupling opportunities like, for example:&lt;/p>
&lt;ul>
&lt;li>web framework&lt;/li>
&lt;li>cli frameworks&lt;/li>
&lt;li>form validation&lt;/li>
&lt;li>orm and database&lt;/li>
&lt;li>test framework&lt;/li>
&lt;/ul>
&lt;p>Read more about the book: &lt;a rel="external" href="https://matthiasnoback.nl/book/recipes-for-decoupling/">matthiasnoback.nl/book/recipes-for-decoupling/&lt;/a>&lt;/p>
&lt;blockquote>
&lt;p>Buy it here: &lt;a rel="external" href="https://leanpub.com/recipes-for-decoupling">leanpub.com/recipes-for-decoupling&lt;/a>&lt;/p>
&lt;/blockquote></content></entry><entry xml:lang="en"><title>Working Agile with Non-Agile Teams</title><subtitle>How can you work with other teams that aren't agile?</subtitle><category term="agile" scheme="https://chemaclass.com/tags/agile/" label="Agile"/><category term="xp" scheme="https://chemaclass.com/tags/xp/" label="Xp"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><published>2022-11-11T00:00:00+00:00</published><updated>2022-11-11T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/working-agile-with-non-agile-teams/"/><id>https://chemaclass.com/blog/working-agile-with-non-agile-teams/</id><summary type="html">Let's assume you already know what the agile manifesto is. Let's consider that you apply most of the extreme programming values, principles, and practices. How can you work with other teams that aren't agile?</summary><content type="html">&lt;p>&lt;img src="/images/blog/2022-11-11/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>Let’s assume you already know what the agile manifesto is. Let’s consider that you apply most of the “extreme
programming” values, principles, and practices. How can you work with other teams that aren’t agile?&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;blockquote>
&lt;ul>
&lt;li>Individuals and interactions over processes and tools&lt;/li>
&lt;li>Working software over comprehensive documentation&lt;/li>
&lt;li>Customer collaboration over contract negotiation&lt;/li>
&lt;li>Responding to change over following a plan&lt;/li>
&lt;/ul>
&lt;/blockquote>
&lt;p>You’re using short feedback loops, where things are constantly changing. You can feel that the team is alive and
every one is essential.&lt;/p>
&lt;p>You &lt;strong>embrace the change&lt;/strong> to the point that you &lt;strong>enjoy&lt;/strong> going out of your comfort zone whenever needed. Seeking to
create &lt;strong>value&lt;/strong> for your team and its dynamics, and always considering personal growth.&lt;/p>
&lt;p>But sure, let’s assume all that -and everything else I might have missed regarding “&lt;strong>agility&lt;/strong>,” how could you work
with an external team that is not agile? How could your “perfectly agile team” work with another group of people with
nothing to do with software? For example, a doctor.&lt;/p>
&lt;p>A doctor has no time to learn about your “agile values and principles for software development.” A doctor has no time to
learn about “extreme programming.” Similarly, they don’t have time to learn about testing, design, architecture, and
&lt;strong>good practices&lt;/strong> related to software in general.&lt;/p>
&lt;p>How could you create a &lt;strong>bridge&lt;/strong> between that doctor and your software team?&lt;/p>
&lt;h2 id="how-could-you-work-agile-with-that-doctor">How could you work agile with that doctor?&lt;/h2>
&lt;p>If you need to work with that doctor is because he/she should be a domain expert. I suggest getting one or two of your
team members to meet with that expert for 30/60 min, so they can talk and share their impressions. And then repeat this
as much as possible to shorten the feedback loop. For example, once a week.&lt;/p>
&lt;p>Collecting those requirements and impressions from the experts and then driving the design of your software according to
that is &lt;a rel="external" href="https://en.wikipedia.org//wiki/Domain-driven_design">Domain-Driven Design&lt;/a>. You can find a lot of documentation
about &lt;em>DDD&lt;/em> in books (like &lt;em>&lt;a href="/readings/domain-driven-design-distilled">Domain-Driven Design Distilled&lt;/a>&lt;/em>) or in many
blogs on the Internet.&lt;/p>
&lt;p>However, the critical aspect here is not what requirements or impressions are &lt;em>being resolved&lt;/em> but &lt;strong>how&lt;/strong>.
How could you work agile with that doctor?&lt;/p>
&lt;p>&lt;img src="/images/blog/2022-11-11/middle.jpg" alt="blog-middle" />&lt;/p>
&lt;blockquote>
&lt;p>Agile is about quick feedback. It’s about effective communication and reducing waste while aiming for simplicity.&lt;/p>
&lt;/blockquote>
&lt;h3 id="by-truly-applying-these-five-values-you-re-already-acting-agile">By truly applying these five values, you’re already acting agile&lt;/h3>
&lt;ul>
&lt;li>Communication&lt;/li>
&lt;li>Feedback&lt;/li>
&lt;li>Simplicity&lt;/li>
&lt;li>Courage&lt;/li>
&lt;li>Respect&lt;/li>
&lt;/ul>
&lt;p>These &lt;strong>abstract goals&lt;/strong> apply to any profession - and even life, not just software.&lt;/p>
&lt;blockquote>
&lt;p>Continuous communication helps shorten the feedback loop, which simplifies the tasks. Always with the courage to
address the truth and respect for each other.&lt;/p>
&lt;/blockquote>
&lt;h3 id="practices-are-the-things-that-you-do">Practices are the things that you do&lt;/h3>
&lt;ul>
&lt;li>Sit Together&lt;/li>
&lt;li>Pair Programming&lt;/li>
&lt;li>Test First&lt;/li>
&lt;li>Incremental Design&lt;/li>
&lt;li>and many more&lt;/li>
&lt;/ul>
&lt;p>And despite having a technical name, they might apply to any profession:&lt;/p>
&lt;blockquote>
&lt;ul>
&lt;li>Sit Together &amp;amp; Pair Programming: &lt;strong>think and do&lt;/strong> with other peers&lt;/li>
&lt;li>Test First: &lt;strong>verify your assumptions&lt;/strong> first, then solve the problem&lt;/li>
&lt;li>Incremental Design: whatever you do, &lt;strong>make it better&lt;/strong> incrementally&lt;/li>
&lt;/ul>
&lt;/blockquote>
&lt;h3 id="principles-guide-and-motivate-the-practices-to-the-values">Principles guide and motivate the practices to the values&lt;/h3>
&lt;ul>
&lt;li>Mutual Benefit&lt;/li>
&lt;li>Diversity&lt;/li>
&lt;li>Failure&lt;/li>
&lt;li>Opportunity&lt;/li>
&lt;li>Baby Steps&lt;/li>
&lt;li>Quality&lt;/li>
&lt;li>and many more&lt;/li>
&lt;/ul>
&lt;p>Mutual benefit is the most important because it’s about finding practices that benefit us now, us later, and the
customer too.&lt;/p>
&lt;blockquote>
&lt;p>Other principles include the diversity of ideas. Don’t be afraid of failure. Look at everything you do as
an opportunity for learning. Avoid giant steps because they have a higher risk of failing. Aim for a high-quality system
because they are more predictable and easier to change.&lt;/p>
&lt;/blockquote>
&lt;h2 id="the-question-remains-are-you-agile">The question remains: are you agile?&lt;/h2>
&lt;p>I truly believe an agile team is the one who can cope with change at team level. Therefore, you must first master
agile within your team, and then you can collaborate with other teams in an “agile way”.&lt;/p>
&lt;p>Once you have internalized these points above, you can apply them while working with anyone from any team.&lt;/p>
&lt;p>While these isolated ideas are good, they are even more powerful when combined. They create an atmosphere of curiosity
and active learning. It might even wake up some &lt;strong>passion&lt;/strong> for your profession that builds an aura of team cohesion, and
just like that, the team breathes on its own.&lt;/p>
&lt;p>Everyone cares and takes full responsibility for keeping the team healthy by building &lt;strong>trust&lt;/strong>. There is no fear of healthy
&lt;strong>conflicts&lt;/strong>. They feel empowered and &lt;strong>accountable&lt;/strong> to their commitments. The team &lt;strong>celebrates&lt;/strong> their results and
learns from their &lt;strong>mistakes&lt;/strong>; there is no need for masks anymore.&lt;/p>
&lt;p>That’s when the magic starts to happen, and suddenly you can work agile with any team, especially yours.&lt;/p>
&lt;p>&lt;img src="/images/blog/2022-11-11/footer.jpg" alt="blog-footer" />&lt;/p></content></entry><entry xml:lang="en"><title>The Essential Drucker</title><subtitle>The Best of Sixty Years of Peter Drucker's Essential Writings on Management</subtitle><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><category term="philosophy" scheme="https://chemaclass.com/tags/philosophy/" label="Philosophy"/><published>2022-10-29T00:00:00+00:00</published><updated>2022-10-29T00:00:00+00:00</updated><author><name>
Peter F. Drucker</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/the-essential-drucker/"/><id>https://chemaclass.com/readings/the-essential-drucker/</id><summary type="html">The Essential Drucker contains twenty-six selections on management in the organization, management and the individual, and management and society. It covers the basic principles and concerns of management and its problems, challenges, and opportunities, giving managers, executives, and professionals the tools to perform the tasks that the economy and society of tomorrow will demand of them.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>A twenty-six selections on management in the organization, management and the individual, and management and society.&lt;/p>
&lt;p>It covers the basic principles of management and its problems, challenges, and opportunities, giving managers,
executives, and professionals the tools to perform the tasks that the economy and society of tomorrow will demand
of them.&lt;/p>
&lt;hr />
&lt;h2 id="4-essential-principles-of-management">4 Essential Principles Of Management&lt;/h2>
&lt;ol>
&lt;li>Management is about humans&lt;/li>
&lt;li>Management should define an organization’s values, objective, goals &amp;amp; mission&lt;/li>
&lt;li>Management must enable the organization and members to grow and develop&lt;/li>
&lt;li>Results only exist outside the organization&lt;/li>
&lt;/ol>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/1il9VfJoaDo"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>Different Beliefs About Software Quality</title><subtitle>Some thoughts about software quality among your team</subtitle><category term="clean-code" scheme="https://chemaclass.com/tags/clean-code/" label="Clean Code"/><category term="agile" scheme="https://chemaclass.com/tags/agile/" label="Agile"/><category term="xp" scheme="https://chemaclass.com/tags/xp/" label="Xp"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><category term="career" scheme="https://chemaclass.com/tags/career/" label="Career"/><published>2022-10-08T00:00:00+00:00</published><updated>2022-10-08T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/different-beliefs-about-software-quality/"/><id>https://chemaclass.com/blog/different-beliefs-about-software-quality/</id><summary type="html">What to do when working on "bad software" and you can't improve it because it is against the beliefs of your peers? Should you change the company?</summary><content type="html">&lt;p>&lt;img src="/images/blog/2022-10-08/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>I recently got a great question on Twitter which got me thinking for a while and I decided to share my thoughts about it.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;hr />
&lt;h2 id="context">Context&lt;/h2>
&lt;p>But first, some context: I am feeling great because the codebase where I work is getting better and better, so I am tweeting this:&lt;/p>
&lt;blockquote>
&lt;p>“As software improves with time, you can feel you’re doing right.”&lt;/p>
&lt;/blockquote>
&lt;p>And then I got a question asking for suggestions:&lt;/p>
&lt;p>&lt;img src="/images/blog/2022-10-08/tweet.jpg" alt="blog-tweet" />&lt;/p>
&lt;p>So there we go…&lt;/p>
&lt;hr />
&lt;h2 id="my-answer">My answer&lt;/h2>
&lt;h3 id="create-agreements">Create agreements&lt;/h3>
&lt;p>The first thing is to create agreements about what quality software means for your team and yourself. This helps clarify
what software culture you want to establish and work towards that direction. Leaving your company should be the &lt;em>last
resort&lt;/em> once you have no other option.&lt;/p>
&lt;p>Before thinking about leaving your company, I would ask you:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Why do you think&lt;/strong> you cannot improve the working codebase of your company?&lt;/li>
&lt;li>&lt;strong>What can you do&lt;/strong> to reduce the friction between your different beliefs regarding what quality means for software?&lt;/li>
&lt;/ul>
&lt;p>There is no perfect codebase to work on because software is a living entity and constantly changes. So, at least for me,
quality software is the one that can cope with change smoothly.&lt;/p>
&lt;p>Once you have agreed on that goal, and while there are multiple ways to achieve that result, my favorite way of working
is keeping an &lt;strong>agile mindset&lt;/strong> with doses of &lt;strong>extreme programming&lt;/strong> values, principles, and practices in mind.&lt;/p>
&lt;h3 id="software-is-about-people">Software is about people&lt;/h3>
&lt;p>Software is not just about writing &lt;em>clean and solid code&lt;/em>. This is indeed desired, and we should aim for that, but we must
first understand why we want that. The “&lt;em>why&lt;/em>” is based on the &lt;strong>values&lt;/strong> that you have as a team.&lt;/p>
&lt;p>If you don’t share the same purpose, the same “why,” then you won’t &lt;em>enjoy&lt;/em> working together, and in such a case, I would
advise looking for another company that shares your values. But, before that, I would strongly suggest fixing the deeper
issue and helping your team improve.&lt;/p>
&lt;h3 id="understanding-your-why">Understanding your why&lt;/h3>
&lt;p>You first need to deeply understand your “&lt;em>why&lt;/em>” so you can transmit this to your peers and the people around you. Have
you tried all you can to create awareness about your “&lt;em>why&lt;/em>”?&lt;/p>
&lt;p>Some ideas include encouraging collaborative programming (pair/mob), presenting some internal tech talks, creating a
culture of sharing knowledge on a regular daily basis, creating awareness about the current status quo, and looking for
opportunities to improve everywhere.&lt;/p>
&lt;h3 id="your-career-path">Your career path&lt;/h3>
&lt;p>If, after several months of (really) trying these ideas, none of them work, look for a new company that shares your
beliefs. After all, you’re the first and primary responsible person for taking care of your career path.&lt;/p>
&lt;blockquote>
&lt;p>Original &lt;a rel="external" href="https://x.com/Chemaclass/status/1578425454562021376">twitter thread&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;hr />
&lt;p>&lt;img src="/images/blog/2022-10-08/footer.jpg" alt="blog-footer" />&lt;/p>
&lt;h2 id="extra-thoughts">Extra thoughts&lt;/h2>
&lt;p>If &lt;strong>you want something to be different&lt;/strong>, don’t wait till it’s changed automatically. Try to &lt;strong>change it&lt;/strong>; if it’s not
working, leave it. Maybe you don’t belong in that place.&lt;/p>
&lt;p>On the other hand, it’s crucial to reflect if you see that pattern often repeating (changing companies too quickly). In
such a case, maybe the problem isn’t the companies but yourself.&lt;/p>
&lt;p>Software development is not just about code but &lt;strong>business&lt;/strong>. It’s essential to be aware of finding a fair &lt;em>trade-off&lt;/em>
between speed, costs, and quality, depending on the situation. You might want to use some &lt;em>tech debt&lt;/em> to conquer the
market as soon as possible.&lt;/p>
&lt;p>It doesn’t make sense to have “low quality” as part of the identity of any team. Every team has certain quality
expectations. Therefore, the &lt;strong>key&lt;/strong> here is to &lt;strong>agree on what good quality is&lt;/strong>.&lt;/p>
&lt;blockquote>
&lt;p>Thanks to my former Engineer Manager, Evgenii Sokolov, who inspired me to write these extra lines after sharing the original post.&lt;/p>
&lt;/blockquote></content></entry><entry xml:lang="en"><title>Dare to lead</title><subtitle>Brave Work. Tough Conversations. Whole Hearts.</subtitle><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><category term="psychology" scheme="https://chemaclass.com/tags/psychology/" label="Psychology"/><category term="mentoring" scheme="https://chemaclass.com/tags/mentoring/" label="Mentoring"/><published>2022-09-30T00:00:00+00:00</published><updated>2022-09-30T00:00:00+00:00</updated><author><name>
Brené Brown</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/dare-to-lead/"/><id>https://chemaclass.com/readings/dare-to-lead/</id><summary type="html">Leadership is not about titles, status and power over people. Leaders are people who hold themselves accountable for recognising the potential in people and ideas, and developing that potential. This is a book for everyone who is ready to choose courage over comfort, make a difference and lead.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>Leadership is not about titles, status, and power over people. Leaders are people who hold themselves accountable for
recognising the potential in people and ideas and developing that potential. This book is for everyone ready to choose
courage over comfort, make a difference, and lead.&lt;/p>
&lt;h2 id="courage-and-vulnerability">Courage and vulnerability&lt;/h2>
&lt;h3 id="leaders-need-to-be-more-vulnerable">Leaders need to be more vulnerable&lt;/h3>
&lt;p>The problem is that most people associate that vulnerability as a synonym for weakness, but that’s not true.&lt;/p>
&lt;blockquote>
&lt;p>“Vulnerability is the universal human emotion we feel when we expose ourselves to others during times of risk or
uncertainty.”&lt;/p>
&lt;/blockquote>
&lt;p>And this is what the core of leadership is about: the courage &lt;strong>to act how we should&lt;/strong> despite fear, uncertainty, or
danger in our way.&lt;/p>
&lt;h2 id="values">Values&lt;/h2>
&lt;p>The modern workplace might feel like a “gladiator arena.” While it might not be a matter of a life-dead situation, it
still requires bravery, and plenty of sweetness and tears, to the point that we can feel so overwhelmed that we are
tempted to leave. So, according to Brené:&lt;/p>
&lt;blockquote>
&lt;p>“One of the most significant sources of motivation for sticking it out is to be crystal clear about our core values.”&lt;/p>
&lt;/blockquote>
&lt;p>Values are the &lt;strong>ideals&lt;/strong> that we have that bring purpose to what we do in our life. They guide us and give us something to
hold on to during dark and difficult times. Strong values guide us &lt;strong>to do what is correct&lt;/strong> rather than easy.&lt;/p>
&lt;h2 id="honesty">Honesty&lt;/h2>
&lt;p>A great leader encourages potential in people and possesses the courage to guide this potential as it develops. One of
the critical skills for doing this is courage and the ability to deliver &lt;strong>honest and open feedback&lt;/strong>.&lt;/p>
&lt;p>Unfortunately, many leaders are afraid to give tuff feedback and leave their employees in the dark. Yes, sometimes the
truth hurts, but we often avoid difficult conversations because they make &lt;strong>us&lt;/strong> uncomfortable.&lt;/p>
&lt;blockquote>
&lt;p>“Great leaders must be brave and always dare to provide constructive feedback, speak the truth, and be clear about
their expectations.”&lt;/p>
&lt;/blockquote>
&lt;p>In the long run, this is kinder and more productive.&lt;/p>
&lt;h2 id="trust">Trust&lt;/h2>
&lt;blockquote>
&lt;p>“Trust is an essential aspect of our working relationships.”&lt;/p>
&lt;/blockquote>
&lt;h3 id="7-behaviours-that-encourage-trust">7 behaviours that encourage trust&lt;/h3>
&lt;p>Expressed together with the acronym: &lt;em>BRAVING&lt;/em>&lt;/p>
&lt;ol>
&lt;li>Setting &lt;strong>B&lt;/strong>oundaries - respect one another’s boundaries&lt;/li>
&lt;li>&lt;strong>R&lt;/strong>eliability - which means to follow-up words with actions&lt;/li>
&lt;li>&lt;strong>A&lt;/strong>ccountability - being responsible and acknowledging mistakes&lt;/li>
&lt;li>&lt;strong>V&lt;/strong>ault - the ability to keep confidential information private&lt;/li>
&lt;li>&lt;strong>I&lt;/strong>ntegrity - choosing courage over comfort&lt;/li>
&lt;li>&lt;strong>N&lt;/strong>on-judgment - talk to one another without judgment&lt;/li>
&lt;li>&lt;strong>G&lt;/strong>enerosity - assuming that people meet you with the best intentions&lt;/li>
&lt;/ol>
&lt;h2 id="failure">Failure&lt;/h2>
&lt;p>The ability to fail and recover from it is an &lt;strong>essential skill&lt;/strong> for any great leader. Fear of failure holds us back and
stops us from achieving true greatness.&lt;/p>
&lt;p>It is crucial to &lt;strong>take off the armor of perfectionism&lt;/strong> and jump into the uncertainty of life. Only this way do
we indeed gain the courage to succeed and lead.&lt;/p>
&lt;hr />
&lt;h3 id="summary">Summary&lt;/h3>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/uk68F2Jl3q8"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>The Beauty of Leadership</title><subtitle>Team Lead? Tech Lead? What is leadership and what is not?</subtitle><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><category term="mentoring" scheme="https://chemaclass.com/tags/mentoring/" label="Mentoring"/><published>2022-09-25T00:00:00+00:00</published><updated>2022-09-25T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/the-beauty-of-leadership/"/><id>https://chemaclass.com/blog/the-beauty-of-leadership/</id><summary type="html">Leadership is action, not a title. It has nothing to do with management or hierarchy. What it really means and how anyone can lead.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2022-09-25/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>Leadership is not a synonym for management, it has nothing to do with titles or personal attributes. So, what is it? How
can we become leaders? And most importantly, why?&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>While researching this topic, I found &lt;a rel="external" href="https://www.forbes.com/sites/kevinkruse/2013/04/09/what-is-leadership/">“What is leadership” by Kevin Kruse&lt;/a>, which I liked particularly. I thought about
sharing the key takeaways from that blog post as it expresses very well the general points about what &lt;em>is&lt;/em> and what &lt;em>is not&lt;/em>
leadership.&lt;/p>
&lt;hr />
&lt;h2 id="what-is-not-leadership">What is not leadership?&lt;/h2>
&lt;p>Leadership has nothing to do with titles. Just because you have a C-level title, doesn’t automatically make you a
“leader”. You don’t need a leading title to become a leader.&lt;/p>
&lt;p>Leadership has nothing to do with your personal attributes. Leadership is not an adjective. You don’t have to be an
extroverted charismatic person to practice leadership.&lt;/p>
&lt;p>Leadership and management are not synonymous. Management needs to plan, measure, monitor, coordinate, solve, hire, fire,
etc. Managers manage &lt;em>things&lt;/em>. Leaders lead &lt;strong>people&lt;/strong>.&lt;/p>
&lt;h2 id="what-is-leadership">What is leadership?&lt;/h2>
&lt;blockquote>
&lt;p>“A leader is someone who has followers.” Peter Drucker.&lt;/p>
&lt;/blockquote>
&lt;p>This definition is too simplistic and can be dangerous. Just because you have “under you” some people that do what you
say simply “following orders” doesn’t mean that you are a leader. You might be a commander, but not necessarily a
leader.&lt;/p>
&lt;blockquote>
&lt;p>“The capacity to translate vision into reality.” Warren Bennis.&lt;/p>
&lt;/blockquote>
&lt;p>Every sprint, you vision fruits in your garden. And you work towards it and make that happen. This makes you a gardener,
not a leader.&lt;/p>
&lt;blockquote>
&lt;p>“Leaders will be those who empower others.” Bill Gates.&lt;/p>
&lt;/blockquote>
&lt;p>Empowering others is essential, but it’s missing the vision or common goal.&lt;/p>
&lt;blockquote>
&lt;p>“Leadership is influence.” John Maxwell.&lt;/p>
&lt;/blockquote>
&lt;p>A manager has the power to fire team members, which provides a lot of influence. Same as a robber with a gun who has
“influence” over their victims. We are missing the source of influence.&lt;/p>
&lt;h3 id="so-what-about-combining-them-all">So, what about combining them all?&lt;/h3>
&lt;blockquote>
&lt;p>“Leadership is a process of social influence, which maximizes the efforts of others toward the achievement of a goal.” Kevin Kruse&lt;/p>
&lt;/blockquote>
&lt;p>Key elements of this definition:&lt;/p>
&lt;ul>
&lt;li>Leadership starts from social influence, not authority or power&lt;/li>
&lt;li>Leadership requires others, not necessarily direct reports&lt;/li>
&lt;li>It includes a goal&lt;/li>
&lt;li>No mention of a title or attributes of any kind&lt;/li>
&lt;/ul>
&lt;p>&lt;em>End from the key takeaways by &lt;a rel="external" href="https://www.forbes.com/sites/kevinkruse/2013/04/09/what-is-leadership/">“What is leadership” by Kevin Kruse&lt;/a>.&lt;/em>&lt;/p>
&lt;hr />
&lt;p>&lt;img src="/images/blog/2022-09-25/footer.jpg" alt="blog-cover" />&lt;/p>
&lt;h2 id="why-would-anyone-want-to-become-a-leader">Why would anyone want to become a leader?&lt;/h2>
&lt;p>We need to make clear that there are two different conceptions when asking that question, and we need to separate them
from the beginning.&lt;/p>
&lt;p>There is the “leader title” aspect, which is usually attached to the management position. I am &lt;strong>not&lt;/strong> talking about
that one. You can be a great manager and an appalling leader.&lt;/p>
&lt;p>A leader is a person with the &lt;strong>multiplier&lt;/strong> factor attitude that wants to develop specific skills (related to their
social influence) to boost even more the value they produce.&lt;/p>
&lt;p>So, can anyone become a leader? What are those &lt;em>skills&lt;/em> that you need to be a leader?&lt;/p>
&lt;h2 id="can-everyone-become-a-leader">Can everyone become a leader?&lt;/h2>
&lt;p>Now that we found a definition of leadership, we can agree that this definition could have different degrees
applied depending on the type of person and responsibilities they want.&lt;/p>
&lt;p>However, to become a leader, you need specific skills. These are the ones I find the most important:&lt;/p>
&lt;ul>
&lt;li>Excellent &lt;strong>communication&lt;/strong>, giving support, and enabling the people around you&lt;/li>
&lt;li>Leading by &lt;strong>example&lt;/strong>, especially to become a better self&lt;/li>
&lt;li>&lt;strong>Passion&lt;/strong> for sharing your leadership skills, so you build other leaders&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>Leadership starts within your own life and behaviour.&lt;/p>
&lt;/blockquote>
&lt;p>I am aware that not everyone might want to accept the necessary changes to become a leader, but I truly believe
everyone can grow certain leadership skills to some extent, which also means &lt;strong>inspiring&lt;/strong> the people around you.&lt;/p>
&lt;h2 id="how-to-become-a-better-leader">How to become a better leader?&lt;/h2>
&lt;p>You can get inspiration from a lot of different sources. While it’s true that you can learn a lot from your own mistakes
and successes, and even from the people around you, I think it’s very optimal to listen to the wisdom from other people’s
experiences outside your circle. For example listening to podcasts, ted-talks, books, or even audiobooks.&lt;/p></content></entry><entry xml:lang="en"><title>Understanding People</title><subtitle>Misunderstandings, effective communication, and self-reflection</subtitle><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><category term="psychology" scheme="https://chemaclass.com/tags/psychology/" label="Psychology"/><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><published>2022-08-22T00:00:00+00:00</published><updated>2022-08-22T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/understanding-people/"/><id>https://chemaclass.com/blog/understanding-people/</id><summary type="html">One of the most complicated challenges for everyone is avoiding misunderstandings and being aware that other people don't think the same way as you do.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2022-08-22/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>One of the most complicated challenges for everyone is avoiding misunderstandings and being aware that other people
don’t think the same way as you do.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h2 id="different-perceptions">Different perceptions&lt;/h2>
&lt;p>People have different experiences and backgrounds, and we all have different perceptions of reality. This is the first
thing we need to be aware of if we want to create self-awareness of our role in communication with others or empathy.&lt;/p>
&lt;p>Very often, the real issue behind friction in a team is due to miscommunication. Sometimes no one knows how or why two
or more team members don’t like each other anymore, but the conflict is obvious.&lt;/p>
&lt;p>This can be a problem because it prevents the team from working as effectively as possible. Often, the reason for that
friction is because of their &lt;strong>inability to understand each other’s motivation and problems&lt;/strong>.&lt;/p>
&lt;p>And this misfunction often leads to misunderstandings.&lt;/p>
&lt;h2 id="misunderstandings">Misunderstandings&lt;/h2>
&lt;p>Our understanding of a conversation might differ from what the other person perceives, which could (and often will)
cause a problem. This can become a serious problem related to the relationship’s direction between both parties.&lt;/p>
&lt;h2 id="how-to-solve-this">How to solve this?&lt;/h2>
&lt;p>Avoiding misunderstandings is not always easy, but by improving your communication skills, you can get better at this
step by step.&lt;/p>
&lt;h3 id="empathy">Empathy&lt;/h3>
&lt;p>Empathy is the ability to understand what other people feel, see things from their point of view, and imagine yourself
in their place. Essentially, it is putting yourself in someone else’s position.&lt;/p>
&lt;h3 id="effective-communication">Effective communication&lt;/h3>
&lt;p>In most cases, the solution does not start by fixing the other person. Instead, it helps to work on &lt;strong>making yourself
more explicit&lt;/strong>. For example:&lt;/p>
&lt;ul>
&lt;li>Work on clarifying the expectations around the common goal
&lt;ul>
&lt;li>Create an open and honest conversation about your expectations&lt;/li>
&lt;li>Assumptions are dangerous&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Provide as much context as needed
&lt;ul>
&lt;li>Even if it seems evident to you at first instance&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Every little detail counts
&lt;ul>
&lt;li>More information is always better than less&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>While aiming for effective communication, we need to &lt;strong>reduce the risk of misunderstandings to the minimum&lt;/strong>.&lt;/p>
&lt;h3 id="self-reflection">Self-reflection&lt;/h3>
&lt;p>Healthy conflicts are expected and acceptable. We shouldn’t be afraid of disagreements. It’s ok to change our minds
when discovering new possibilities; the sooner, the better.&lt;/p>
&lt;p>In my experience, understanding people is complicated for multiple reasons, but most especially because of
misunderstandings we generate due to missing context, more than disagreements.&lt;/p>
&lt;p>If something doesn’t work as expected, start looking at yourself, not blaming others when dealing with people. What
could you have said to create more clarity? What would you do differently?&lt;/p>
&lt;p>Self-reflection is essential to improve and correct your attitude, adapting to the evolution of the constant change we
are surrounded by, &lt;strong>especially when dealing with people&lt;/strong>.&lt;/p>
&lt;blockquote>
&lt;p>Look over your reach area, share your thoughts, and don’t be ashamed of your mistakes as far as you take them as
learning opportunities.&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="/images/blog/2022-08-22/footer.jpg" alt="blog-cover" />&lt;/p></content></entry><entry xml:lang="en"><title>Continuous Discovery Habits</title><subtitle>Discover Products that Create Customer Value and Business Value</subtitle><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><category term="agile" scheme="https://chemaclass.com/tags/agile/" label="Agile"/><category term="productivity" scheme="https://chemaclass.com/tags/productivity/" label="Productivity"/><published>2022-08-21T00:00:00+00:00</published><updated>2022-08-21T00:00:00+00:00</updated><author><name>
Teresa Torres</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/continuous-discovery-habits/"/><id>https://chemaclass.com/readings/continuous-discovery-habits/</id><summary type="html">Continuous Discovery Habits (2021) explores how product managers and designers can keep making a positive impact on their customers’ lives. It explores an optimal decision-making process for product teams, so that they can continue to improve their offerings.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>This book explores how product managers and designers can keep making a positive impact on their customers’ lives.
It explores an optimal decision-making process for product teams, so that they can continue to improve their offerings.&lt;/p>
&lt;h4 id="part-1-what-is-continuous-discovery">Part 1: What is continuous discovery?&lt;/h4>
&lt;ol>
&lt;li>The What and Why of Continuous Discovery&lt;/li>
&lt;li>A Common Framework for Continuous Discovery&lt;/li>
&lt;/ol>
&lt;h4 id="part-2-the-continuous-discovery-habits">Part 2: The continuous discovery habits&lt;/h4>
&lt;ol start="3">
&lt;li>Focusing on Outcomes Over Outputs&lt;/li>
&lt;li>Visualizing What You Know&lt;/li>
&lt;li>Continuous Interviewing&lt;/li>
&lt;li>Mapping the Opportunity Space&lt;/li>
&lt;li>Prioritizing Opportunities, Not Solutions&lt;/li>
&lt;li>Supercharged Ideation&lt;/li>
&lt;li>Identifying Hidden Assumptions&lt;/li>
&lt;li>Testing Assumptions, Not Ideas&lt;/li>
&lt;li>Measuring Impact&lt;/li>
&lt;li>Managing the Cycles&lt;/li>
&lt;li>Show Your Work&lt;/li>
&lt;/ol>
&lt;h4 id="part-3-developing-your-continuous-discovery-habits">Part 3: Developing your continuous discovery habits&lt;/h4>
&lt;ol start="14">
&lt;li>Start Small, and Iterate&lt;/li>
&lt;li>What’s Next?&lt;/li>
&lt;/ol>
&lt;blockquote>
&lt;p>Focusing on outcomes over outputs will help you create the right products for your customers.&lt;/p>
&lt;/blockquote>
&lt;hr />
&lt;h3 id="the-what-why-of-continuous-discovery">The What &amp;amp; Why of Continuous Discovery&lt;/h3>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/yNCcQODWYh0"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>The Great CEO Within</title><subtitle>The Tactical Guide to Company Building</subtitle><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><category term="productivity" scheme="https://chemaclass.com/tags/productivity/" label="Productivity"/><category term="mentoring" scheme="https://chemaclass.com/tags/mentoring/" label="Mentoring"/><published>2022-08-01T00:00:00+00:00</published><updated>2022-08-01T00:00:00+00:00</updated><author><name>
Matt Mochary</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/the-great-ceo-within/"/><id>https://chemaclass.com/readings/the-great-ceo-within/</id><summary type="html">Learn how to efficiently scale your business from startup to corporation by implementing a system of accountability, effective problem-solving, and transparent feedback.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>Matt Mochary coaches the CEOs of many of the fastest-scaling technology companies in Silicon Valley.
He shares his highly effective leadership and business-operating tools with any CEO or manager in the world.&lt;/p>
&lt;p>Learn how to efficiently scale your business from startup to corporation by implementing a system of accountability,
effective problem-solving, and transparent feedback.&lt;/p>
&lt;blockquote>
&lt;p>Reading, talking to other experts in a particular area, practicing, and teaching are the best ways to learn and
improve yourself.&lt;/p>
&lt;/blockquote>
&lt;h2 id="3-key-takeaways">3 Key takeaways&lt;/h2>
&lt;ul>
&lt;li>You need to learn how to manage yourself before you can manage your business.&lt;/li>
&lt;li>Don’t ignore conflict. Be transparent, give and take feedback often, and be an active listener.&lt;/li>
&lt;li>Be obsessed with learning about your customer. Do so by asking better questions.&lt;/li>
&lt;/ul>
&lt;hr />
&lt;h2 id="summary">Summary&lt;/h2>
&lt;h3 id="the-team">The team&lt;/h3>
&lt;ul>
&lt;li>Do not create a 50/50 partnership, because despite it sounds ideal, it actually leads to real pain if there is no easy way to break a deadlock.&lt;/li>
&lt;li>Find a partner who has complementary skills to yours. Give a large percentage of the company; it worth it.&lt;/li>
&lt;li>Founding teams should never grow beyong six until there is a true product-market fit (PMF).&lt;/li>
&lt;li>Metrics that PMF are important. For example revenue, renewal rates, …&lt;/li>
&lt;/ul>
&lt;h3 id="getting-things-done">Getting things done&lt;/h3>
&lt;ul>
&lt;li>Read “Getting Things Done: The art of stress-free productivity”, by David Allen.&lt;/li>
&lt;/ul>
&lt;h3 id="inbox-zero">Inbox zero&lt;/h3>
&lt;ul>
&lt;li>Keep your inbox clean as a single triage room at a hospital.
&lt;ul>
&lt;li>It is important to distinguish the urgent cases from the ones that aren’t.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="top-goal">Top goal&lt;/h3>
&lt;ul>
&lt;li>Schedule two hours each day to work on your top goal only.&lt;/li>
&lt;li>The earlier in the day you schedule this top goal, the better.&lt;/li>
&lt;/ul>
&lt;h3 id="on-time-and-present">On-time and present&lt;/h3>
&lt;ul>
&lt;li>Don’t waste other people’s time.&lt;/li>
&lt;li>If you know you’re going to be late, let the other people know as soon as possible.&lt;/li>
&lt;li>Be present and focus on what’s being discussed.&lt;/li>
&lt;/ul>
&lt;h3 id="when-you-say-it-twice-write-it-down">When you say it twice write it down&lt;/h3>
&lt;ul>
&lt;li>Write down all processes. In doubt, write everything.&lt;/li>
&lt;/ul>
&lt;h3 id="gratitude">Gratitude&lt;/h3>
&lt;ul>
&lt;li>Focus on the positives.&lt;/li>
&lt;li>We perform our best when we are having fun and feeling good.&lt;/li>
&lt;li>Be appreciative. Tell people when they’ve done something good.&lt;/li>
&lt;/ul>
&lt;h3 id="energy-audit">Energy audit&lt;/h3>
&lt;ul>
&lt;li>Audit your time and figure out how much of it is spend on activities that energize you and what activities drain you.
&lt;ul>
&lt;li>Delegate or outsouce the things that drain you as much as possible.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="health">Health&lt;/h3>
&lt;ul>
&lt;li>Your mental and physical health is the most important resource we all have.
&lt;ul>
&lt;li>Take care of yourself and the people around you.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="decision-making">Decision-making&lt;/h3>
&lt;ul>
&lt;li>Require that anyone who wants to discuss an issue write it up, along with the desired solution, ahead of time.&lt;/li>
&lt;li>This method, thought time-consuming, yields extraordinarily thoughtful decisions in a very shrt amount of time.&lt;/li>
&lt;/ul>
&lt;h3 id="getting-buy-in">Getting buy-in&lt;/h3>
&lt;ul>
&lt;li>When people feel they are part of the decision and their input matters.&lt;/li>
&lt;li>When people are given more influence, they feel more invested.&lt;/li>
&lt;/ul>
&lt;h3 id="issues-and-proposed-solution">Issues and proposed solution&lt;/h3>
&lt;ul>
&lt;li>Require that anyone who presents an issue at a team meeting do so in writing.
&lt;ul>
&lt;li>It should include both a detailed description of the issue and their proposed solution. They cannot say “I don’t know.” They must at least present a guess.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>All issues should be presented at the weekly team meeting.&lt;/li>
&lt;li>Allow 5 min to discuss each proposed solution.
&lt;ul>
&lt;li>If consensus is reached in that time - great.&lt;/li>
&lt;li>Otherwise, don’t spend more time debating, and use RAPID framework instead.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="loudest-voice-in-the-roomo">Loudest voice in the roomo&lt;/h3>
&lt;ul>
&lt;li>Be aware of who is in the room when you have a group discussion.&lt;/li>
&lt;li>Avoid influencing other people’s ideas by wriring down their vote or thoughts before you share your perspective.&lt;/li>
&lt;li>Let juniors ask and speak first.&lt;/li>
&lt;/ul>
&lt;h3 id="sloppy-agreements">Sloppy agreements&lt;/h3>
&lt;ul>
&lt;li>Sloppy agreements are when people don’t show up on time, or don’t complete the goals they declare.&lt;/li>
&lt;li>The antidote is “impeccable agreements”:
&lt;ul>
&lt;li>precisely defined&lt;/li>
&lt;li>fully agreed to by all relevant people&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>There must be consequences of breaking agreements.&lt;/li>
&lt;li>If you can’t meet the agreement, then you have an obligation to let other members of the agreement circle know asap.&lt;/li>
&lt;/ul>
&lt;h3 id="transparency">Transparency&lt;/h3>
&lt;ul>
&lt;li>Don’t hide negative information.&lt;/li>
&lt;li>Our imaginations are much more powerful than reality.&lt;/li>
&lt;li>Share all relevant information with your team, both negative and positive.
&lt;ul>
&lt;li>Let them adapt.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="conflict-resolution">Conflict resolution&lt;/h3>
&lt;ul>
&lt;li>Interpersonal conflict is almost due to people:
&lt;ul>
&lt;li>Not fully sharing their thoughts and feelings&lt;/li>
&lt;li>Not feeling heard&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Prove to people that you have heard them by summarizing what you just said back to you until they say “that’s right!”.&lt;/li>
&lt;/ul>
&lt;h3 id="issue-identification">Issue identification&lt;/h3>
&lt;ul>
&lt;li>Ask people to pretend they’re the CEO and answer:
&lt;ul>
&lt;li>“What are the 3 most important issues for me to solve in the next 90 days?”&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Ask people to write down their thoughts about the company when they feel their joy, excitement, sadness, anger and fear.&lt;/li>
&lt;/ul>
&lt;h3 id="conscious-leadership">Conscious leadership&lt;/h3>
&lt;ul>
&lt;li>Be more interested in learning than been right.&lt;/li>
&lt;/ul>
&lt;h3 id="customer-obsession">Customer obsession&lt;/h3>
&lt;ul>
&lt;li>Focus on the outcome, not the output.&lt;/li>
&lt;li>You are solving a customer problem, not just making a product.&lt;/li>
&lt;/ul>
&lt;h3 id="culture">Culture&lt;/h3>
&lt;ul>
&lt;li>You don’t choose your values. You have them.&lt;/li>
&lt;li>Use your values as a guide to who you hire and when you fire.&lt;/li>
&lt;li>Don’t forget to celebrate. Make an effort to publicly acknowledge achievements.&lt;/li>
&lt;li>Don’t measure hours. Measure output.&lt;/li>
&lt;li>You prevent office politics by never allowing lobbying to be successful.&lt;/li>
&lt;/ul>
&lt;h3 id="company-folder-system-and-wiki">Company folder system and wiki&lt;/h3>
&lt;ul>
&lt;li>Have a company wiki and make it mandatory that all new hires read it.&lt;/li>
&lt;li>Whenever you find yourself doing something twice, write down exactly what it is that you did.
&lt;ul>
&lt;li>Everyone on the team should contribute.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="goal-tracking">Goal tracking&lt;/h3>
&lt;ul>
&lt;li>Never assign someone an action without them agreeing to it verbally or in writing.&lt;/li>
&lt;/ul>
&lt;h3 id="areas-of-responsibility">Areas of responsibility&lt;/h3>
&lt;ul>
&lt;li>When more than one person shares a responsibility, it often does not get done well, or at all.&lt;/li>
&lt;li>One person is assigned to each function in the company.&lt;/li>
&lt;/ul>
&lt;h3 id="no-single-point-of-failure">No single point of failure&lt;/h3>
&lt;ul>
&lt;li>Write down all processes.&lt;/li>
&lt;li>Cross-train a second person for each role.&lt;/li>
&lt;/ul>
&lt;h3 id="key-performance-indicators-kpi">Key Performance Indicators (KPI)&lt;/h3>
&lt;ul>
&lt;li>Known your 5-6 most significant KPIs and track them religiously. Make them visible to the entire team.&lt;/li>
&lt;/ul>
&lt;h3 id="collaboration">Collaboration&lt;/h3>
&lt;ul>
&lt;li>Set vision and goals for the company, each dept, and each individual.&lt;/li>
&lt;li>Communicate that vision and those goals to every team member.&lt;/li>
&lt;li>Tracking and reporting progress towards those goals on a regular timetable (usually weekly).&lt;/li>
&lt;li>Feedback on what’s going right and what needs to be adapted.&lt;/li>
&lt;/ul>
&lt;h3 id="objectives-and-key-results-okr">Objectives and Key Results (OKR)&lt;/h3>
&lt;ul>
&lt;li>Target 3 objectives with 3 key results for each.&lt;/li>
&lt;li>For the company, department, team, individual.
&lt;ul>
&lt;li>Cascade them down so they are in alignment.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>The objective = “where do we want to go?”. No necessarily measurable.&lt;/li>
&lt;li>Key results = “how do we know that we’re getting there?”. It should be measurable.&lt;/li>
&lt;li>Gather your leadership team and have everyone come to the meeting with their ideas for what the OKRs should be for the quarter.
&lt;ul>
&lt;li>Let individuals come up with their own OKRs. They will be more invested.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="feedback">Feedback&lt;/h3>
&lt;ul>
&lt;li>Never give negative feedback using a one-way communication method
&lt;ul>
&lt;li>Like email, text, or voicemail.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h4 id="the-problem-with-no-giving-feedback">The problem with no giving feedback&lt;/h4>
&lt;ul>
&lt;li>You won’t notice your company’s problems.&lt;/li>
&lt;li>Communication will break down.&lt;/li>
&lt;li>Your best talent will leave you.&lt;/li>
&lt;/ul>
&lt;h4 id="4-a-s-of-seeking-feedback">4 A’s of seeking feedback&lt;/h4>
&lt;ol>
&lt;li>Ask for it.&lt;/li>
&lt;li>Acknowledge it - repeat what they said. Make them feel heard and understood.&lt;/li>
&lt;li>Appreciate it.&lt;/li>
&lt;li>Act on it.&lt;/li>
&lt;/ol>
&lt;h4 id="how-to-give-negative-feedback">How to give negative feedback&lt;/h4>
&lt;ol>
&lt;li>Ask for permission.&lt;/li>
&lt;li>State the behaviour (fact).&lt;/li>
&lt;li>State how the behaviour makes you feel (feelings).&lt;/li>
&lt;li>State your thoughts, opinions, and judgments around the situation (story).&lt;/li>
&lt;li>Make a request - a change you’d lie to see in the future.&lt;/li>
&lt;li>Ask if they accept the feedback.&lt;/li>
&lt;/ol>
&lt;h3 id="fundraising">Fundraising&lt;/h3>
&lt;ul>
&lt;li>Pick a partner, not a enterprise.&lt;/li>
&lt;li>When you need to speak to an investor, ask 3-5 people in your network who know that person to send an email of recommendation to them.&lt;/li>
&lt;li>Stack the referrals close together (in the same week) so that you get noticed.&lt;/li>
&lt;li>Talk about your company once you know that the investor likes and trust you.&lt;/li>
&lt;li>Sell yourself, not the company.&lt;/li>
&lt;/ul>
&lt;h3 id="recruiting">Recruiting&lt;/h3>
&lt;ul>
&lt;li>Spend as little time as possible with the candidates that you don’t hire, and as much time as possible with the candidates that you want to hire.&lt;/li>
&lt;li>As the hiring manager, write out a 90 roadmap for the position you need to fill.&lt;/li>
&lt;/ul>
&lt;h3 id="on-boarding">On-boarding&lt;/h3>
&lt;ul>
&lt;li>Give onboarding even more attention, time and energy than you give to recruiting.&lt;/li>
&lt;li>Assign each new team member a buddy with whom they’ll check in each day for 15 minutes for the first 2 weeks.&lt;/li>
&lt;/ul>
&lt;h3 id="firing">Firing&lt;/h3>
&lt;ul>
&lt;li>Whe you make the announcement, praise the person’s contributions to the company, and take ownership yourself for the fact that you weren’t able to match their skills to the company’s needs.&lt;/li>
&lt;li>Do not blame or criticise the person. Instead, take responsibility for the situation.&lt;/li>
&lt;/ul>
&lt;h3 id="effective-sales">Effective sales&lt;/h3>
&lt;ul>
&lt;li>Build trust.&lt;/li>
&lt;li>Sell results, not features.&lt;/li>
&lt;li>Identify customers’ pains.&lt;/li>
&lt;/ul>
&lt;h3 id="build-trust">Build trust&lt;/h3>
&lt;ul>
&lt;li>Ask customers about them.
&lt;ul>
&lt;li>Listen actively and reflect back what they say.&lt;/li>
&lt;li>At the second meeting show that you remember what they said at the first.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Be explicit about not talking about your company.&lt;/li>
&lt;li>Ask for a limited amount of time.&lt;/li>
&lt;li>Invite them to a purely social event.&lt;/li>
&lt;/ul>
&lt;h3 id="customer-development">Customer development&lt;/h3>
&lt;ul>
&lt;li>Asking the right questions will help you identify customer’s specific challenges.&lt;/li>
&lt;li>You need to understand their pain before presenting your solution.
&lt;ol>
&lt;li>What are their goals?&lt;/li>
&lt;li>What are the challenges preventing them from reaching those goals?&lt;/li>
&lt;li>What are their ideal solutions to overcoming those obstacles?&lt;/li>
&lt;/ol>
&lt;/li>
&lt;/ul>
&lt;h3 id="sell-results-not-features">Sell results, not features&lt;/h3>
&lt;ul>
&lt;li>Most people don’t care about your product functionality or features. They care about their business results.&lt;/li>
&lt;li>Focus on the why.&lt;/li>
&lt;li>Focus on painting the vision of a world where customer’s desires are fulfilled with the help of your product.&lt;/li>
&lt;/ul>
&lt;h3 id="building-a-sales-team-pipeline">Building a sales team &amp;amp; pipeline&lt;/h3>
&lt;ul>
&lt;li>Don’t hire sales people right away.&lt;/li>
&lt;li>In most cases, sales people will never be able to sell better than the founders, and they won’t be able to sell the product if you are not able to.&lt;/li>
&lt;li>Only hire a sales team if:
&lt;ul>
&lt;li>You have found an initial version of product-market fit (this means that a significant proportion of your paying customers are renewing their contracts).&lt;/li>
&lt;li>You have figure out what you are selling and who you are selling to.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="the-structure-of-a-sales-team">The structure of a sales team&lt;/h3>
&lt;ul>
&lt;li>Generating leads and closing deals are distinct functions that must be split.&lt;/li>
&lt;li>Senior salespeople are expensive, so their time is best spent focusing on the most high-value activity: closing deals.&lt;/li>
&lt;li>Ideal sales team structure:
&lt;ul>
&lt;li>Qualifiers - sales development reps: focus on generating leads.&lt;/li>
&lt;li>Closers - account executives: focus on closing leads.&lt;/li>
&lt;li>Farmers - customer success: focus on tending existing customers.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="lead-generation">Lead generation&lt;/h3>
&lt;ul>
&lt;li>Predictable leads is the first step to achieve predictable revenue.&lt;/li>
&lt;/ul>
&lt;h3 id="marketing">Marketing&lt;/h3>
&lt;ul>
&lt;li>Start by concentrating all of your efforts on the low-hanging fruit - the small customer segment that has a particular problem that your product solves 10x better than the competition.&lt;/li>
&lt;li>Move on to the next customer segment only after you have the resources to do so.&lt;/li>
&lt;/ul>
&lt;h3 id="product-market-fit-pmf">Product market fit (PMF)&lt;/h3>
&lt;ul>
&lt;li>Designing a significantly better solution to your target customers’ problem than existing in the marketplace.&lt;/li>
&lt;li>How do you know when you have achieved PMF?
&lt;ul>
&lt;li>Ask your customers. They will tell you by renewing their subscriptions, buying more product(s), etc.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>B2B, PMF = long term contracts&lt;/li>
&lt;li>B2C, PMF = second purchase, renewing subscription, sharing in social media.&lt;/li>
&lt;/ul>
&lt;hr />
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/tBimI7QNjBA"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;p>Matt Mochary shares insights on developing his coaching method, understanding &amp;amp; overcoming primal fear, addressing
imposter syndrome &amp;amp; more.&lt;/p></content></entry><entry xml:lang="en"><title>The Project Management Triangle</title><subtitle>The Iron Triangle</subtitle><category term="agile" scheme="https://chemaclass.com/tags/agile/" label="Agile"/><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><category term="productivity" scheme="https://chemaclass.com/tags/productivity/" label="Productivity"/><published>2022-07-25T00:00:00+00:00</published><updated>2022-07-25T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/the-project-management-triangle/"/><id>https://chemaclass.com/blog/the-project-management-triangle/</id><summary type="html">A triangle of time, quality and cost. it's an indicator that these three parameters are interconnected. You can fix one or two of them, but not three.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2022-07-25/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>A triangle of time, quality and cost. it’s an indicator that these three parameters are interconnected.
You can fix one or two of them, but not three.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h3 id="the-triple-constraint">The triple constraint&lt;/h3>
&lt;ul>
&lt;li>Cheap and fast: the quality will suffer.&lt;/li>
&lt;li>Cheap and good: it will take more time.&lt;/li>
&lt;li>Fast and good: it will push the price up.&lt;/li>
&lt;/ul>
&lt;h2 id="waterfall-vs-agile">Waterfall vs Agile&lt;/h2>
&lt;p>In software methodologies, you can adapt this idea by changing &lt;strong>quality&lt;/strong> to &lt;strong>scope&lt;/strong>:&lt;/p>
&lt;p>&lt;img src="/images/blog/2022-07-25/middle.jpg" alt="blog-cover" />&lt;/p>
&lt;h3 id="waterfall">Waterfall&lt;/h3>
&lt;p>In waterfall projects, the scope is fixed, while the time and money will be more variable. Depending if it’s more
important finishing on time or on budget.&lt;/p>
&lt;h3 id="agile">Agile&lt;/h3>
&lt;p>On the other hand, in an agile environment we usually work on a few weeks’ iterations, so this is the fix part: the
time, in order to deliver value as soon as possible, and so get feedback and recalibrate again and again.&lt;/p>
&lt;p>The costs in a software team are also fixed by the people that belong to it.&lt;/p>
&lt;blockquote>
&lt;p>Time is fixed, cost is fixed, so by the rule of the iron triangle, the scope must be variable.&lt;/p>
&lt;/blockquote>
&lt;p>An agile team cannot predict the scope of their work in one-year project, however, they don’t need to. Their &lt;strong>focus
should be on deliver constantly value as much as possible&lt;/strong>, or at least at the end of every iteration, reflecting their
learnings and recalibrating their priorities again and again.&lt;/p>
&lt;p>As you can see, one funny fact is that the waterfall and agile share an inverted triangle with their fixed and variables
parameters. Really interesting indeed.&lt;/p>
&lt;p>&lt;img src="/images/blog/2022-07-25/footer.jpg" alt="blog-cover" />&lt;/p>
&lt;h2 id="reference">Reference&lt;/h2>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/MKEyF2dmGaM"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>The Starfish and the Spider</title><subtitle>The Unstoppable Power of Leaderless Organizations</subtitle><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><category term="philosophy" scheme="https://chemaclass.com/tags/philosophy/" label="Philosophy"/><published>2022-07-19T00:00:00+00:00</published><updated>2022-07-19T00:00:00+00:00</updated><author><name>
Ori Brafman</name></author><author><name>
Rod Beckstrom</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/the-starfish-and-the-spider/"/><id>https://chemaclass.com/readings/the-starfish-and-the-spider/</id><summary type="html">If you cut off a spider's head, it dies; if you cut off a starfish's leg it grows a new one, and that leg can grow into an entirely new starfish. Traditional top-down organizations are like spiders, but now starfish organizations are changing the face of business and the world.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>If you cut off a spider’s head, it dies; if you cut off a starfish’s leg it grows a new one, and that leg can grow into
an entirely new starfish. Traditional top-down organizations are like spiders, but now starfish organizations are
changing the face of business and the world.&lt;/p>
&lt;p>What’s the hidden power behind the success of Wikipedia, craigslist, and Skype? What do eBay and General Electric have
in common with the abolitionist and women’s rights movements? What fundamental choice put General Motors and Toyota on
vastly different paths?&lt;/p>
&lt;p>Ori Brafman and Rod Beckstrom have discovered some unexpected answers, gripping stories, and a tapestry of unlikely
connections. The Starfish and the Spider explores what happens when starfish take on spiders and reveals how established
companies and institutions, from IBM to Intuit to the U.S. government, are also learning how to incorporate starfish
principles to achieve success.&lt;/p>
&lt;hr />
&lt;p>In this talk, Rod Beckstrom, does a great overview of the main ideas of his book:&lt;/p>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/fumQ0s7DCEY"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>Clean Craftsmanship</title><subtitle>Disciplines, Standards, and Ethics</subtitle><category term="clean-code" scheme="https://chemaclass.com/tags/clean-code/" label="Clean Code"/><category term="tdd" scheme="https://chemaclass.com/tags/tdd/" label="Tdd"/><category term="refactoring" scheme="https://chemaclass.com/tags/refactoring/" label="Refactoring"/><category term="testing" scheme="https://chemaclass.com/tags/testing/" label="Testing"/><category term="xp" scheme="https://chemaclass.com/tags/xp/" label="Xp"/><published>2022-07-11T00:00:00+00:00</published><updated>2022-07-11T00:00:00+00:00</updated><author><name>
Robert C. Martin</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/clean-craftsmanship/"/><id>https://chemaclass.com/readings/clean-craftsmanship/</id><summary type="html">Robert C. Martin covers the three pillars of software craftsmanship: TDD disciplines with practical examples, professional standards for teams, and the ethical responsibilities of programmers.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>The book is divided into three parts: the disciplines, the standards, and the ethics.&lt;/p>
&lt;p>The 1st part is the most technical one. It guides you with TDD examples, showing how testing can help you to design your code.&lt;/p>
&lt;p>The 2nd part is about productivity, quality, and courage.&lt;/p>
&lt;p>The 3rd part is about how did we get here in terms of people who develop software, and our responsibility within
our ethics about do no harm, integrity, and teamwork.&lt;/p>
&lt;hr />
&lt;p>One of my favourite parts from the book:&lt;/p>
&lt;blockquote>
&lt;p>Our software industry is wildly dynamic and changing; therefore, we must all be continuously aggressive learners.&lt;/p>
&lt;p>How and when do you do this learning? If your employer provides you the time and space to do this kind of learning, then
take as much advantage of it as you can. If your employer is not helpful, then you’ll have to learn on your own time.&lt;/p>
&lt;p>Be prepared to spend several hours per month on it. Make sure you have the personal time set aside for it.&lt;/p>
&lt;p>Yes, I know you have family obligations, bills to pay, planes to catch, and you’ve got a life. Okay, but you also have a
profession. And professions need care and maintenance. I expect us all to be continuous aggressive learners.&lt;/p>
&lt;p>&lt;code>Chapter 11. Courage - Continuous Aggressive Learning&lt;/code>&lt;/p>
&lt;/blockquote>
&lt;hr />
&lt;h2 id="index">Index&lt;/h2>
&lt;h3 id="part-i-the-disciplines">Part I: The Disciplines&lt;/h3>
&lt;h4 id="chapter-1-craftsmanship">Chapter 1. Craftsmanship&lt;/h4>
&lt;ul>
&lt;li>Extreme Programming&lt;/li>
&lt;li>Test-Driven Development&lt;/li>
&lt;li>Refactoring&lt;/li>
&lt;li>Simple Design&lt;/li>
&lt;li>Collaborative Programming&lt;/li>
&lt;li>Acceptance Tests&lt;/li>
&lt;/ul>
&lt;h4 id="chapter-2-test-driven-development">Chapter 2. Test-Driven Development&lt;/h4>
&lt;ul>
&lt;li>Overview&lt;/li>
&lt;li>The Basics&lt;/li>
&lt;/ul>
&lt;h4 id="chapter-3-advanced-tdd">Chapter 3. Advanced TDD&lt;/h4>
&lt;ul>
&lt;li>Getting Stuck&lt;/li>
&lt;li>Arrange, Act, Assert&lt;/li>
&lt;li>Test Doubles&lt;/li>
&lt;li>Architecture&lt;/li>
&lt;/ul>
&lt;h4 id="chapter-4-test-design">Chapter 4. Test Design&lt;/h4>
&lt;ul>
&lt;li>Testing Databases&lt;/li>
&lt;li>Testing GUIs&lt;/li>
&lt;li>Test Patterns&lt;/li>
&lt;li>Test-Specific Subclass&lt;/li>
&lt;li>Humble Object&lt;/li>
&lt;li>Test Design&lt;/li>
&lt;li>Breaking the Correspondence&lt;/li>
&lt;/ul>
&lt;h4 id="chapter-5-refactoring">Chapter 5. Refactoring&lt;/h4>
&lt;ul>
&lt;li>What Is Refactoring?&lt;/li>
&lt;li>The Basic Toolkit&lt;/li>
&lt;li>Extract Method&lt;/li>
&lt;li>The Disciplines&lt;/li>
&lt;/ul>
&lt;h4 id="chapter-6-simple-design">Chapter 6. Simple Design&lt;/h4>
&lt;ul>
&lt;li>YAGNI&lt;/li>
&lt;li>Covered by Tests&lt;/li>
&lt;li>Coverage&lt;/li>
&lt;li>Design?&lt;/li>
&lt;li>Maximize Expression&lt;/li>
&lt;li>The Underlying Abstraction&lt;/li>
&lt;li>Minimize Duplication&lt;/li>
&lt;li>Minimize Size&lt;/li>
&lt;/ul>
&lt;h4 id="chapter-7-collaborative-programming">Chapter 7. Collaborative Programming&lt;/h4>
&lt;h4 id="chapter-8-acceptance-tests">Chapter 8. Acceptance Tests&lt;/h4>
&lt;ul>
&lt;li>The Discipline&lt;/li>
&lt;li>The Continuous Build&lt;/li>
&lt;/ul>
&lt;h3 id="part-ii-the-standards">Part II: The Standards&lt;/h3>
&lt;h4 id="chapter-9-productivity">Chapter 9. Productivity&lt;/h4>
&lt;ul>
&lt;li>We Will Never Ship S**T&lt;/li>
&lt;li>Inexpensive Adaptability&lt;/li>
&lt;li>We Will Always Be Ready&lt;/li>
&lt;li>Stable Productivity&lt;/li>
&lt;/ul>
&lt;h4 id="chapter-10-quality">Chapter 10. Quality&lt;/h4>
&lt;ul>
&lt;li>Continuous Improvement&lt;/li>
&lt;li>Fearless Competence&lt;/li>
&lt;li>Extreme Quality&lt;/li>
&lt;li>We Will Not Dump on QA&lt;/li>
&lt;li>QA Will Find Nothing&lt;/li>
&lt;li>Test Automation&lt;/li>
&lt;li>Automated Testing and User Interfaces&lt;/li>
&lt;li>Testing the User Interface&lt;/li>
&lt;/ul>
&lt;h4 id="chapter-11-courage">Chapter 11. Courage&lt;/h4>
&lt;ul>
&lt;li>We Cover for Each Other&lt;/li>
&lt;li>Honest Estimates&lt;/li>
&lt;li>You Must Say NO&lt;/li>
&lt;li>Continuous Aggressive Learning&lt;/li>
&lt;li>Mentoring&lt;/li>
&lt;/ul>
&lt;h3 id="part-iii-the-ethics">Part III: The Ethics&lt;/h3>
&lt;ul>
&lt;li>The First Programmer&lt;/li>
&lt;li>Seventy-Five Years&lt;/li>
&lt;li>Nerds and Saviors&lt;/li>
&lt;li>Role Models and Villains&lt;/li>
&lt;li>We Rule the World&lt;/li>
&lt;li>Catastrophes&lt;/li>
&lt;li>The Oath&lt;/li>
&lt;/ul>
&lt;h4 id="chapter-12-harm">Chapter 12. Harm&lt;/h4>
&lt;ul>
&lt;li>First, Do No Harm&lt;/li>
&lt;li>Best Work&lt;/li>
&lt;li>Repeatable Proof&lt;/li>
&lt;/ul>
&lt;h4 id="chapter-13-integrity">Chapter 13. Integrity&lt;/h4>
&lt;ul>
&lt;li>Small Cycles&lt;/li>
&lt;li>Relentless Improvement&lt;/li>
&lt;li>Maintain High Productivity&lt;/li>
&lt;/ul>
&lt;h4 id="chapter-14-teamwork">Chapter 14. Teamwork&lt;/h4>
&lt;ul>
&lt;li>Work as a Team&lt;/li>
&lt;li>Estimate Honestly and Fairly&lt;/li>
&lt;li>Respect&lt;/li>
&lt;li>Never Stop Learning&lt;/li>
&lt;/ul>
&lt;hr />
&lt;p>I found this chat in YouTube where Uncle Bob talks about most of the topics form his book &lt;strong>Clean Craftsmanship&lt;/strong>.&lt;/p>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/sPXk11hrWTM"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="plain">&lt;span class="giallo-l">&lt;span>Listen out for:&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>* Quote &amp;amp; Intro - [00:00:00]&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>* Career Journey - [00:07:29]&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>* Clean Craftsmanship - [00:10:53]&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>* Programmer as a Profession - [00:15:31]&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>* Craftsmanship - [00:18:45]&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>* Disciplines - [00:22:45]&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>* Disciplines: Test-Driven Development - [00:28:49]&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>* Disciplines: Refactoring - [00:34:31]&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>* Code Coverage - [00:39:02]&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>* Standard: Never Ship S**t - [00:42:35]&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>* Standard: Always Be Ready - [00:47:15]&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>* Ethics: Do No Harm - [00:50:00]&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>* Ethics: Estimate Honestly - [00:53:56]&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>* 2 Tech Lead Wisdom - [00:57:50]&lt;/span>&lt;/span>&lt;/code>&lt;/pre></content></entry><entry xml:lang="en"><title>Modern Software Engineering</title><subtitle>Doing What Works to Build Better Software Faster</subtitle><category term="software-design" scheme="https://chemaclass.com/tags/software-design/" label="Software Design"/><category term="testing" scheme="https://chemaclass.com/tags/testing/" label="Testing"/><category term="architecture" scheme="https://chemaclass.com/tags/architecture/" label="Architecture"/><category term="agile" scheme="https://chemaclass.com/tags/agile/" label="Agile"/><published>2022-06-29T00:00:00+00:00</published><updated>2022-06-29T00:00:00+00:00</updated><author><name>
David Farley</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/modern-software-engineering/"/><id>https://chemaclass.com/readings/modern-software-engineering/</id><summary type="html">This book presents software development as an engineering practice at every level. To master software engineering, we must become experts at learning and managing complexity.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>This book presents software development as an engineering practice at every level.
To master software engineering, we must become experts at learning and managing complexity.&lt;/p>
&lt;h3 id="optimize-for-learning">Optimize for learning&lt;/h3>
&lt;p>To optimize for learning, the book presents five behaviors to consider:&lt;/p>
&lt;ul>
&lt;li>Working iteratively&lt;/li>
&lt;li>Feedback&lt;/li>
&lt;li>Incrementalism&lt;/li>
&lt;li>Empiricism&lt;/li>
&lt;li>Being Experimental&lt;/li>
&lt;/ul>
&lt;p>The main idea is to work on small steps, collect feedback, and adjust.&lt;/p>
&lt;h3 id="optimize-for-managing-complexity">Optimize for managing complexity&lt;/h3>
&lt;p>The book presents other five ideas to manage complexity:&lt;/p>
&lt;ul>
&lt;li>Modularity&lt;/li>
&lt;li>Cohesion&lt;/li>
&lt;li>Separation of Concerns&lt;/li>
&lt;li>Information Hiding and Abstraction&lt;/li>
&lt;li>Managing Coupling&lt;/li>
&lt;/ul>
&lt;p>We need to manage the complexity of our systems.&lt;/p>
&lt;h3 id="tools-to-support-engineering-in-software">Tools to support engineering in software&lt;/h3>
&lt;p>Going deeper into some ideas that were already discussed in the book, like:&lt;/p>
&lt;ul>
&lt;li>Testability&lt;/li>
&lt;li>Deployability&lt;/li>
&lt;li>Controlling the variables&lt;/li>
&lt;li>Continuous Delivery&lt;/li>
&lt;/ul>
&lt;hr />
&lt;p>A great video explaining the core ideas behind this book by his author:&lt;/p>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/TRqYQnCfgH8"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>The Path to Seniority in Software</title><subtitle>How to become a Senior Software Developer?</subtitle><category term="career" scheme="https://chemaclass.com/tags/career/" label="Career"/><category term="mentoring" scheme="https://chemaclass.com/tags/mentoring/" label="Mentoring"/><category term="clean-code" scheme="https://chemaclass.com/tags/clean-code/" label="Clean Code"/><category term="tdd" scheme="https://chemaclass.com/tags/tdd/" label="Tdd"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><published>2022-06-08T00:00:00+00:00</published><updated>2022-06-08T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/the-path-to-seniority-in-software/"/><id>https://chemaclass.com/blog/the-path-to-seniority-in-software/</id><summary type="html">Real seniority goes beyond job titles. It's about impact, mentoring others, owning outcomes, and raising the bar for your entire team.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2022-06-08/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>We all have been junior developers at some point. This is easy to know because it is at the very beginning of your
carrier. Your responsibilities were narrowed down by other peers who were looking after you.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>Suddenly, at some point, after some months or years, you got your promotion or another job, where you weren’t a junior
anymore, but an intermediate.&lt;/p>
&lt;p>An intermediate (also known as middle) is something between junior and senior. You know now that you are not a junior
anymore, you know how to deliver value but yet you also have mixed feelings about seniority. You want to be a senior,
but you don’t know how. There is no clear path to achieving this goal.&lt;/p>
&lt;p>Wait for a second… there are actually two easy ways to get the senior title! You can get promoted as such in your
company, or you can start a new position as a “senior” in another company, easy right?&lt;/p>
&lt;h2 id="marketing-and-politics">Marketing and politics&lt;/h2>
&lt;p>Unfortunately, the “seniority” level is very much polluted by marketing and politics. First, what
does it mean “senior” in this context? In all the companies where I have been working (if not all) I have always been
surrounded by people who claimed to be “seniors” when in reality only a few I would consider such.&lt;/p>
&lt;p>Our senior industry is falsified by companies’ need of having experts on paper more than in reality, and this is a
problem we need to deal with and speak about.&lt;/p>
&lt;p>Seniority generally means more experience, but how do you calculate this? It is easy from a company’s point of view:
more years in the industry. But, is the number of years you have been working really relevant in an industry that is
constantly changing and evolving? Actually, this wouldn’t be a big issue if you have the software fundamentals
well interiorized, but funny enough, I have seen these fundamentals just in ~10% of all seniors during my almost 10 years of
experience and 7 companies I have worked with.&lt;/p>
&lt;p>The fact that you have been working for 10 or more years doesn’t necessarily mean you are a “senior” with software.
What else can we measure in order to identify if you deserve indeed this title?&lt;/p>
&lt;h3 id="it-is-not-all-about-the-money">It is not all about the money&lt;/h3>
&lt;p>Let us be honest, senior titles are better paid than junior or middle positions. If you have the chance to get a higher
salary because you got the “senior” in your job title, well, it wouldn’t be clever to reject it. But, independently of
politics and marketing, we must address some seniority fundamentals to understand better what the word “senior” means in
this context.&lt;/p>
&lt;blockquote>
&lt;p>It is not all about the money, but also about the responsibilities that come with seniority.&lt;/p>
&lt;/blockquote>
&lt;h2 id="seniority-fundamentals">Seniority fundamentals&lt;/h2>
&lt;p>Being senior in our software industry is not about “the number of years of experience” but:&lt;/p>
&lt;ul>
&lt;li>How well can you &lt;strong>transmit your knowledge&lt;/strong> to others? Sharing your knowledge is an important task for a senior person.&lt;/li>
&lt;li>How well can you &lt;strong>collaborate&lt;/strong> with other people? Including the PM/PO and other teams. Collaboration is crucial
to creating a constant feedback loop.&lt;/li>
&lt;li>How well can you &lt;strong>work together&lt;/strong> with your peers? Pair-programming embraces team cohesion and helps the team become
better.&lt;/li>
&lt;li>How well are your &lt;strong>testing&lt;/strong> skills? Testing is highly related to the quality of your work, and a senior should aim
for an incremental design.&lt;/li>
&lt;li>How well is your understanding of &lt;strong>delivering value constantly&lt;/strong> in small chunks? The sooner you deliver value, the
sooner you get feedback about it.&lt;/li>
&lt;li>How well is your &lt;strong>technical knowledge&lt;/strong> related to quality software and the trade-offs to get there?
SOLID principles, clean code, TDD, refactoring as part of your daily job, low coupling, high cohesion, appropriate
data structures, and choosing the right solution (KISS, YAGNI…).&lt;/li>
&lt;li>How well are you capable to adapt and &lt;strong>cope with changes&lt;/strong>? Change is inevitable, and therefore we must learn how to
deal with changes, especially the ones that we cannot control.&lt;/li>
&lt;li>How developed is your &lt;strong>entrepreneurial thinking&lt;/strong>? Always keeping the organization’s goals in mind.&lt;/li>
&lt;/ul>
&lt;p>As you can see, there is no mention of concrete technology or years of experience. Why? Because technology is just an
“implementation detail”, and experience comes by practicing and attitude, not by letting the time pass by.&lt;/p>
&lt;h3 id="attitude-is-important">Attitude is important&lt;/h3>
&lt;p>We’ve got two persons:&lt;/p>
&lt;p>A) a person who is working for 15 years, doing relatively the same every day, and without caring about his own skills.
He just does what others tell him to do.&lt;/p>
&lt;p>B) a person who is working for 5 years, challenging herself every week, trying different approaches when dealing with
problems, and sharpening her own skills constantly.&lt;/p>
&lt;p>Can you see the main difference? No, it’s not the 10 years difference of “experience” between them, but their &lt;strong>attitude&lt;/strong>.&lt;/p>
&lt;p>We wrongly understand that &lt;em>a year of experience must come with learning and knowledge&lt;/em>, so we tend to use time as a
measurement of seniority. But I argue that the “attitude factor” is equal or even more important. I have been surrounded
by many people who call themselves seniors with 3, 6, 10, and more years of “experience” but lacking attitude, and you
could clearly see this problem on a daily basis.&lt;/p>
&lt;blockquote>
&lt;p>You need this combination to build yourself as a truly senior developer; time, experience, and most importantly:
attitude towards &lt;strong>improving your own skills and the ones that surround you&lt;/strong>.&lt;/p>
&lt;/blockquote></content></entry><entry xml:lang="en"><title>Bikeshedding</title><subtitle>Also known as the Law of triviality</subtitle><category term="psychology" scheme="https://chemaclass.com/tags/psychology/" label="Psychology"/><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><category term="productivity" scheme="https://chemaclass.com/tags/productivity/" label="Productivity"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><published>2022-05-27T00:00:00+00:00</published><updated>2022-05-27T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/bikeshedding/"/><id>https://chemaclass.com/blog/bikeshedding/</id><summary type="html">Bikeshedding explains why teams waste time on trivial decisions while ignoring complex, important ones. Learn to recognize and avoid it.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2022-05-27/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>The term was coined as a metaphor to illuminate Parkinson’s Law of triviality. People within an organization typically give disproportionate weight to trivial issues.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h2 id="bikeshed-ing">Bikeshed +-ing&lt;/h2>
&lt;p>The concept was first presented as a corollary of his broader “&lt;a rel="external" href="https://en.wikipedia.org/wiki/Parkinson%27s_law">Parkinson’s law&lt;/a>”
spoof of management. “Bikeshedding” is a dramatized form of the “&lt;a rel="external" href="https://en.wikipedia.org/wiki/Law_of_triviality">Law of triviality&lt;/a>”.&lt;/p>
&lt;p>&lt;a rel="external" href="https://en.wikipedia.org/wiki/C._Northcote_Parkinson">C. Northcote Parkinson&lt;/a> observed that a committee whose job is to &lt;strong>approve plans for a nuclear power plant&lt;/strong> may spend the majority
of its time on relatively unimportant but easy-to-grasp issues, such as what materials to use for the staff bikeshed
while neglecting the design of the power plant itself, which is &lt;strong>far more important&lt;/strong> but also far more difficult to
criticize constructively. As he put it:&lt;/p>
&lt;blockquote>
&lt;p>“The time spent on any item of the agenda will be in inverse proportion to the sum of money involved.”&lt;/p>
&lt;/blockquote>
&lt;h3 id="people-within-an-organization-typically-give-disproportionate-weight-to-trivial-issues">People within an organization typically give &lt;strong>disproportionate weight to trivial issues&lt;/strong>&lt;/h3>
&lt;p>This has been true in all companies where I’ve been working. From time to time, when you have important mixed with
not-so-important topics together (or even not important at all!), it’s pretty common to see yourself “bikeshedding”
with your peers about the trivial topics instead of confronting the important things that will bring real value soon to
the end customer/consumer.&lt;/p>
&lt;p>This is more common than we think, and it can happen to everyone.&lt;/p>
&lt;h3 id="what-can-we-do-about-it">What can we do about it?&lt;/h3>
&lt;p>Create awareness about this problem with your team. Honest communication and trust are crucial for the solution.&lt;/p>
&lt;p>Break down steps:&lt;/p>
&lt;ul>
&lt;li>You need to be aware of this problem.&lt;/li>
&lt;li>You see value in changing this team behavior.&lt;/li>
&lt;li>You are able to point to the problem when you see it occurring.&lt;/li>
&lt;li>You expect the same from your team members.&lt;/li>
&lt;/ul>
&lt;h3 id="references">References&lt;/h3>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/D4hUq_aNXaA"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>Bitcoin: Blockchain y su investigación</title><subtitle>Published in 2017, most of the technology shown is already history</subtitle><category term="bitcoin" scheme="https://chemaclass.com/tags/bitcoin/" label="Bitcoin"/><category term="economics" scheme="https://chemaclass.com/tags/economics/" label="Economics"/><category term="philosophy" scheme="https://chemaclass.com/tags/philosophy/" label="Philosophy"/><published>2022-05-10T00:00:00+00:00</published><updated>2022-05-10T00:00:00+00:00</updated><author><name>
Félix Brezo</name></author><author><name>
Yaiza Rubio</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/bitcoin-la-tecnologia-blockchain-y-su-investigacion/"/><id>https://chemaclass.com/readings/bitcoin-la-tecnologia-blockchain-y-su-investigacion/</id><summary type="html">How is created Bitcoin address? How does it work the creation of the private &amp; public keys and how are they known as wallets? And many other interesting questions.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>This book was published in 2017, so most of the technology shown is already history. And that’s precisely what I really
like from the book itself, the “historical part” and the origin of the blockchain.&lt;/p>
&lt;p>How is created Bitcoin address? How does it work the creation of the private &amp;amp; public keys and how are they known as
wallets? And many other interesting questions.&lt;/p>
&lt;p>Back then, we got some websites and services that were using Bitcoin as a payment method, and there was a beauty trend.&lt;/p>
&lt;ul>
&lt;li>The &lt;strong>first half of the book&lt;/strong> is the best part, and I would say it’s still relevant due to the origin of this tech.&lt;/li>
&lt;li>The &lt;strong>second half&lt;/strong>, on the other hand, I would say is “more optional” and for curious people. There are no learnings
from this part, besides the trend that you can see we already had back in 2016/2017. Today in 2022 the tech (and
projects using blockchain) has evolved a lot.&lt;/li>
&lt;/ul>
&lt;p>I would really like to read a new book with an updated investigation 5 years after the first edition.&lt;/p>
&lt;blockquote>
&lt;p>The book is available only in Spanish: &lt;a rel="external" href="https://0xword.com/es/libros/87-bitcoin-la-tecnologia-blockchain-y-su-investigacion.html">0xWord&lt;/a>&lt;/p>
&lt;/blockquote></content></entry><entry xml:lang="en"><title>Docker: SecDevOps</title><subtitle>From introduction to advanced concepts</subtitle><category term="docker" scheme="https://chemaclass.com/tags/docker/" label="Docker"/><category term="devops" scheme="https://chemaclass.com/tags/devops/" label="Devops"/><published>2022-04-29T00:00:00+00:00</published><updated>2022-04-29T00:00:00+00:00</updated><author><name>
Fran Ramírez</name></author><author><name>
Elías Grande</name></author><author><name>
Rafael Troncoso</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/docker-secdevops/"/><id>https://chemaclass.com/readings/docker-secdevops/</id><summary type="html">A great book about Docker, from introduction to advanced concepts all covered by easy-to-follow examples.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>A great book about Docker, from introduction to advanced concepts all covered by easy-to-follow examples.&lt;/p>
&lt;p>Best practices about how to build docker images and keep a good security layer when running containers as well, from the docker daemon and all tech behind docker.&lt;/p>
&lt;blockquote>
&lt;p>The book is available only in Spanish: &lt;a rel="external" href="https://0xword.com/es/libros/103-docker-secdevops.html">0xWord&lt;/a>&lt;/p>
&lt;/blockquote></content></entry><entry xml:lang="en"><title>Dunbar Number</title><category term="psychology" scheme="https://chemaclass.com/tags/psychology/" label="Psychology"/><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><published>2022-04-02T00:00:00+00:00</published><updated>2022-04-02T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/dunbar-number/"/><id>https://chemaclass.com/blog/dunbar-number/</id><summary type="html">Dunbar's number is a suggested cognitive limit to the number of people with whom one can maintain stable social relationships.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2022-04-02/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>A cognitive limit to the number of people with whom one can maintain stable social relationships, in which an individual knows who each person is and how each person relates to every other person.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>The study shows that:&lt;/p>
&lt;ul>
&lt;li>Close relationship: 5 people.&lt;/li>
&lt;li>Share deep trust: 15 people.&lt;/li>
&lt;li>Meaningful relations: 50 people.&lt;/li>
&lt;li>Active contacts: 150 people.&lt;/li>
&lt;/ul>
&lt;h2 id="why-is-this-limit-150">Why is this limit 150?&lt;/h2>
&lt;p>This is due to the limit of our cognitive ability. This is our ability to reason, solve problems, and comprehend complex
ideas. As the team size increases, the cognitive load of the team does it as well and communication suffers, thereby
breaking down the benefit of a large team.&lt;/p>
&lt;h3 id="origin">Origin&lt;/h3>
&lt;p>In the 1990s, the British anthropologist Robin Dunbar found a correlation between primate brain size and average social
group size. By using the average human brain size and extrapolating from the results of primates, he proposed that
humans can comfortably maintain 150 stable relationships. Dunbar theorised that:&lt;/p>
&lt;blockquote>
&lt;p>“this limit is a direct function of relative neocortex size, and that this, in turn, limits group size […]
the limit imposed by neocortical processing capacity is simply on the number of individuals with whom a stable
inter-personal relationship can be maintained”.&lt;/p>
&lt;/blockquote>
&lt;p>The number also includes past colleagues, such as high school friends, with whom a person would want to reacquaint
themselves if they met again.&lt;/p>
&lt;h2 id="how-is-this-related-to-teams">How is this related to Teams?&lt;/h2>
&lt;ul>
&lt;li>Single teams: 5-9 people.
&lt;ul>
&lt;li>There is a shared trust among the team members.&lt;/li>
&lt;li>The trust is build among time.&lt;/li>
&lt;li>Therefore, they must be a long term team.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Group: 50 people.
&lt;ul>
&lt;li>They can have meaning relationship.&lt;/li>
&lt;li>They share a domain or subdomain.&lt;/li>
&lt;li>They understand the challenges and help each other out.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Division: 150 people&lt;/li>
&lt;/ul>
&lt;h3 id="references">References&lt;/h3>
&lt;ul>
&lt;li>&lt;a rel="external" href="https://en.wikipedia.org/wiki/Robin_Dunbar">Robin Dunbar&lt;/a>&lt;/li>
&lt;li>&lt;a rel="external" href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbar’s number&lt;/a>&lt;/li>
&lt;/ul></content></entry><entry xml:lang="en"><title>Team Topologies</title><subtitle>Organizing Business and Technology Teams for Fast Flow</subtitle><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><category term="architecture" scheme="https://chemaclass.com/tags/architecture/" label="Architecture"/><category term="devops" scheme="https://chemaclass.com/tags/devops/" label="Devops"/><category term="agile" scheme="https://chemaclass.com/tags/agile/" label="Agile"/><published>2022-03-31T00:00:00+00:00</published><updated>2022-03-31T00:00:00+00:00</updated><author><name>
Matthew Skelton</name></author><author><name>
Manuel Pais</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/team-topologies/"/><id>https://chemaclass.com/readings/team-topologies/</id><summary type="html">Team Topologies focuses on how to set up dynamic team structures and interaction modes that can help teams adapt quickly to new conditions, and achieve fast and safe software delivery.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>Team Topologies focuses on how to set up dynamic team structures and interaction modes that can help teams adapt quickly to new conditions, and achieve fast and safe software delivery.&lt;/p>
&lt;h2 id="team-structure">Team structure&lt;/h2>
&lt;ul>
&lt;li>High cohesion: Group related things together.&lt;/li>
&lt;li>Loose coupling: There must be clear boundaries between the teams.&lt;/li>
&lt;li>Cognitive load: It’s like the RAM of the team. The team can burn down if you load with more than the team can handle.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>In order to avoid bottleneck teams, you need to make sure their cognitive load is not very high.&lt;/p>
&lt;/blockquote>
&lt;h2 id="conway-s-law">Conway’s Law&lt;/h2>
&lt;ul>
&lt;li>The organization structure will influence the architecture of the team.&lt;/li>
&lt;li>Conway’s Law says that organizations will design systems that copy their communication structure.&lt;/li>
&lt;li>In other words, there will be no focus on the optimal architecture for the project.&lt;/li>
&lt;li>First you need to define the architecture of the project, and then form the teams.&lt;/li>
&lt;/ul>
&lt;h2 id="team-first-thinking">Team-First Thinking&lt;/h2>
&lt;ul>
&lt;li>Who is in the team matters less than the team dynamics.&lt;/li>
&lt;li>When measuring performance, teams matter more than individuals.&lt;/li>
&lt;li>Team = group of 5-9 who work towards a shared goals as a unit.
&lt;ul>
&lt;li>Check &lt;a href="/blog/dunbar-number/">Dunbar number&lt;/a>.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Forming a team takes from 2 weeks to 3 months.&lt;/li>
&lt;li>Cognitive load is the total amount of mental effort being used in the working memory.&lt;/li>
&lt;li>3 Types of cognitive load:
&lt;ul>
&lt;li>Intrinsic: Fundamentals of the problem space. Example: programming language.&lt;/li>
&lt;li>Extraneous: Environment related. Example: how to deploy.&lt;/li>
&lt;li>Germane: Special attention is required. Example: business domain.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Heuristics:
&lt;ul>
&lt;li>3 types of domain: Simple, complicated, complex.&lt;/li>
&lt;li>If the domain is too big, split it into subdomains.&lt;/li>
&lt;li>One team, either:
&lt;ul>
&lt;li>2-3 simple domains.&lt;/li>
&lt;li>1 complex domain.&lt;/li>
&lt;li>Avoid 2 complicated domains, better split the team.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Define a Team API:
&lt;ul>
&lt;li>Code: endpoints, libraries, clients, …&lt;/li>
&lt;li>Versioning.&lt;/li>
&lt;li>Documentation.&lt;/li>
&lt;li>Practices and principles.&lt;/li>
&lt;li>Communication tools.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="team-topologies">Team Topologies&lt;/h2>
&lt;blockquote>
&lt;p>Instead of structuring teams according to know-how or activities, organize teams according to business domain areas.&lt;/p>
&lt;/blockquote>
&lt;ul>
&lt;li>Success of topology depends both on team members and surrounding environment, teams and interactions.&lt;/li>
&lt;li>Split responsibilities to breakdown silos.&lt;/li>
&lt;li>Types of dependencies: Knowledge, task, and resource.&lt;/li>
&lt;li>Four types of teams:
&lt;ul>
&lt;li>Stream-aligned: deliver features, projects, products to the market asap.&lt;/li>
&lt;li>Enabling: grow the capabilities for the Stream-aligned team(s).&lt;/li>
&lt;li>Complicated-subsystem: reduce the cognitive load of the Stream-aligned team(s).&lt;/li>
&lt;li>Platform: make the Stream-aligned team(s) autonomous.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="team-interactions">Team Interactions&lt;/h2>
&lt;ul>
&lt;li>Collaboration. Work closely between teams with different skill sets.&lt;/li>
&lt;li>X-as-a-Service. Clear ownership, small cognitive load.&lt;/li>
&lt;li>Facilitation. Helping to clear impediments, focus on quality interactions between other teams.&lt;/li>
&lt;/ul></content></entry><entry xml:lang="en"><title>The Psychology of Money</title><subtitle>Timeless Lessons on Wealth, Greed, and Happiness by Morgan Housel</subtitle><category term="psychology" scheme="https://chemaclass.com/tags/psychology/" label="Psychology"/><category term="economics" scheme="https://chemaclass.com/tags/economics/" label="Economics"/><category term="philosophy" scheme="https://chemaclass.com/tags/philosophy/" label="Philosophy"/><published>2022-02-27T00:00:00+00:00</published><updated>2022-02-27T00:00:00+00:00</updated><author><name>
Morgan Housel</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/the-psychology-of-money/"/><id>https://chemaclass.com/readings/the-psychology-of-money/</id><summary type="html">There is no reason to risk what you have and need for what you don't have and don't need. Timeless lessons on wealth, greed, and happiness.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>Having more money will make you happier ONLY if that means you’ll have more control over your time.&lt;/p>
&lt;blockquote>
&lt;p>“I did not intend to get rich. I just wanted to get independent.” Charlie Munger.&lt;/p>
&lt;/blockquote>
&lt;h2 id="money-misunderstandings">Money Misunderstandings&lt;/h2>
&lt;h3 id="compounding">Compounding&lt;/h3>
&lt;ul>
&lt;li>Start investing with whatever you can afford, and stay invested.&lt;/li>
&lt;li>Leverage the power of compounding.&lt;/li>
&lt;/ul>
&lt;h3 id="volatility">Volatility&lt;/h3>
&lt;ul>
&lt;li>It’s not possible to get high returns without volatility.&lt;/li>
&lt;li>It’s the emotional price you need to pay if you want good annual returns.&lt;/li>
&lt;li>Embrace volatility. Volatility is a fee, not a fine.&lt;/li>
&lt;/ul>
&lt;h3 id="tail-investments">Tail investments&lt;/h3>
&lt;ul>
&lt;li>It’s hard to predict what will be the “next big thing”, therefore it’s important to diversify.&lt;/li>
&lt;li>A tail investment is single investment that massively outperform all others, and made up for several bad investments.&lt;/li>
&lt;li>Make many diversified investments to benefit from a few tail investments.&lt;/li>
&lt;/ul>
&lt;h2 id="quotes">Quotes&lt;/h2>
&lt;blockquote>
&lt;p>“There is no reason to risk what you have and need for what you don’t have and don’t need.”&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;p>“Long tails – the farthest ends of a distribution of outcomes – have tremendous influence in finance, where a small number of events can account for the majority of outcomes.”&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;p>“The ability to do what you want, when you want, with who you want, for as long as you want, is priceless. It is the highest dividend money pays.”&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;p>“Like everything else worthwhile, successful investing demands a price. But its currency is not dollars and cents. It’s volatility, fear, doubt, uncertainty, and regret – all of which are easy to overlook until you’re dealing with them in real time.”&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;p>“Few things matter more with money than understanding your own time horizon and not being persuaded by the actions and behaviors of people playing different games than you are.”&lt;/p>
&lt;/blockquote>
&lt;hr />
&lt;h2 id="video-summary">Video Summary&lt;/h2>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/yNMnjMgdIWw"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>Update Your Team to Be More Extreme</title><subtitle>How can you help your peers to embrace the change?</subtitle><category term="xp" scheme="https://chemaclass.com/tags/xp/" label="Xp"/><category term="agile" scheme="https://chemaclass.com/tags/agile/" label="Agile"/><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><category term="mentoring" scheme="https://chemaclass.com/tags/mentoring/" label="Mentoring"/><category term="tdd" scheme="https://chemaclass.com/tags/tdd/" label="Tdd"/><published>2022-02-26T00:00:00+00:00</published><updated>2022-02-26T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/update-your-team-to-be-more-extreme/"/><id>https://chemaclass.com/blog/update-your-team-to-be-more-extreme/</id><summary type="html">Our profession is constantly evolving; therefore, it demands a non-stop learning process. Embracing the change is not optional in our software industry. We need to create spaces to get out of our comfort zone.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2022-02-26/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>Our software profession is constantly evolving; it demands a non-stop learning process. We must embrace the change in our industry.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>We need to create spaces to get out of our comfort zone, so our cognitive brain can train and improve how to adapt to our surroundings, which are constantly transforming.&lt;/p>
&lt;h2 id="why-code-katas-tech-talks-or-research-fridays">Why code katas, tech talks or research Fridays?&lt;/h2>
&lt;p>The goal is to help create an environment that aims for continuous improvement towards looking for learning everywhere, all the time, as the core attitude for the individuals and the group.&lt;/p>
&lt;h3 id="create-learnings-opportunities">Create learnings opportunities&lt;/h3>
&lt;blockquote>
&lt;p>Schedule some time every X weeks for practicing together.&lt;/p>
&lt;/blockquote>
&lt;p>At the end of each iteration, or even 2 or 4 weeks, we celebrate and work on katas in pairs/mob for 2 hours. That space is also an opportunity to create an internal tech-talk presentation to share exciting knowledge with the team non-directly-related to our “regular daily business”.&lt;/p>
&lt;p>The goal is to get out of our comfort zone, improving our recognition for change in general while learning other subjects regularly.&lt;/p>
&lt;h2 id="what-is-a-code-kata">What is a code kata?&lt;/h2>
&lt;p>As a group, software developers don’t practice enough. Most of our learning takes place on the job, so most of our mistakes get made there as well.&lt;/p>
&lt;p>The term “kata” comes from the repetitive movements done in karate that help you improve your fighting skills.&lt;/p>
&lt;p>Code Katas exists to help developers get the same benefits as practicing in any other profession. There are simple, artificial exercises that let you experiment and learn without the pressure in a production environment.&lt;/p>
&lt;blockquote>
&lt;p>There are no right or wrong answers in any software kata: the benefit comes from the process, not the result.&lt;/p>
&lt;/blockquote>
&lt;h3 id="motivation">Motivation&lt;/h3>
&lt;ul>
&lt;li>Work on refactoring techniques.&lt;/li>
&lt;li>Work on TDD examples.&lt;/li>
&lt;li>Work on SOLID principles.&lt;/li>
&lt;li>Work on live coding sessions.&lt;/li>
&lt;li>Work on driver-navigator concepts.&lt;/li>
&lt;li>Work on team cohesion.&lt;/li>
&lt;li>Have fun while learning and practicing together.&lt;/li>
&lt;/ul>
&lt;p>If you’re interested in my thoughts about TDD and katas, I wrote a post about it not long ago:
&lt;a href="/blog/test-driven-development/">Test-Driven Development&lt;/a>.&lt;/p>
&lt;h2 id="what-is-a-tech-talk">What is a tech-talk?&lt;/h2>
&lt;p>Tech talks allow us to share some knowledge related to our tech industry with our team members.&lt;/p>
&lt;p>It can be any FrontEnd, BackEnd, DevOps related. But I encourage also:&lt;/p>
&lt;ul>
&lt;li>a new programming language that you are learning,&lt;/li>
&lt;li>a summary of one book that you finished,&lt;/li>
&lt;li>a new technology that you are studying or feeling curious about,&lt;/li>
&lt;li>a piece of software that you would like to share and present thoughts about it,&lt;/li>
&lt;li>a new tool that helps you to improve your productivity,&lt;/li>
&lt;li>really: &lt;u>anything related to creating value or knowledge.&lt;/u>&lt;/li>
&lt;/ul>
&lt;h3 id="how-can-i-present-a-tech-talk">How can I present a tech talk?&lt;/h3>
&lt;p>I wrote this article with some tips about &lt;a href="/blog/improve-your-tech-talk/">how to improve your tech-talk&lt;/a>. Some key
questions that might help you to find something on your own:&lt;/p>
&lt;ul>
&lt;li>What have you learned recently (in the last X months)?&lt;/li>
&lt;li>What knowledge might be interesting to be shared with your peers?&lt;/li>
&lt;li>Which aspect of yourself you’d like to improve professionally and/or personally?&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>Just one rule: Be curious and “&lt;a href="/blog/embrace-the-change/">embrace the change&lt;/a>.”&lt;/p>
&lt;/blockquote>
&lt;h2 id="research-and-learning-fridays">Research and learning Fridays&lt;/h2>
&lt;p>Block the last Friday of the month for research and learning purposes.
The whole team will have a dedicated space for growth and experiment.&lt;/p>
&lt;p>It’s crucial to build trust with your team, so you all know everyone will use this time as good as possible. Don’t micromanage this time forcing keeping a record in a wikipage with what everyone does in detail.&lt;/p>
&lt;p>Although, it would be nice that the team shares what they do during this time, mostly to create transparency among themselves. A verbal announcement to the peers the day before, with their intentions. Even the day after with the learnings key-takeaways.&lt;/p>
&lt;h3 id="summary">Summary&lt;/h3>
&lt;p>You can help your team to be more extreme by helping with a dedicated team space for growth and experimentation.&lt;/p>
&lt;ul>
&lt;li>Provide flexibility to experiment with these ideas as they see fit.&lt;/li>
&lt;li>It is an opportunity for self-growth and learning at the same time.&lt;/li>
&lt;li>It is, ultimately, up to the person and the team.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>Do not micromanage this dedicated time. Focus on the outcome. Help your team to grow, and they will enjoy growing with you.&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="/images/blog/2022-02-26/footer.jpg" alt="blog-footer" />&lt;/p>
&lt;h2 id="tech-talk">Tech Talk&lt;/h2>
&lt;p>After writing this blog post (originally in Feb, 2022), I was invited to do
a &lt;a href="/talks/update-your-team-to-be-more-extreme">tech talk&lt;/a> in different conferences about this topic.&lt;/p></content></entry><entry xml:lang="en"><title>The Power of Authority and Obedience</title><subtitle>Milgram's experiment</subtitle><category term="psychology" scheme="https://chemaclass.com/tags/psychology/" label="Psychology"/><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><published>2022-01-24T00:00:00+00:00</published><updated>2022-01-24T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/the-power-of-authority-and-obedience/"/><id>https://chemaclass.com/blog/the-power-of-authority-and-obedience/</id><summary type="html">Milgram was interested in researching how far people would go in obeying an instruction if it involved harming another person, and how easily people could be influenced into committing atrocities. For example, Germans in WWII.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2022-01-24/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>Milgram was interested in researching how far people would go in obeying an instruction if it involved harming another
person, and how easily people could be influenced into committing atrocities. Eg: Germans in WWII.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h2 id="the-experiment">The experiment&lt;/h2>
&lt;p>During the 1960s, the psychologist Stanley Milgram conducted a series of obedience experiments directly related to the
power of authority and obedience, even when they might end-up in fatal ending.&lt;/p>
&lt;p>Milgran examined justifications for acts of genocide offered by those accused at the World War II, Nuremberg War
Criminal trials. Their defence often was based on “obedience” - that they were just following orders from their
superiors. Milgram came up with the experiment to answer this question:&lt;/p>
&lt;blockquote>
&lt;p>Could it be that Eichmann and his million accomplices in the Holocaust were just following orders?
Could we call them all accomplices?&lt;/p>
&lt;/blockquote>
&lt;h3 id="the-procedure">The procedure&lt;/h3>
&lt;p>The selected participants for his experiment were by newspaper advertising to take part in a study of learning at Yale
University; 40 men were recruited, and in exchange for their participation, each person was paid $4.50.&lt;/p>
&lt;p>The participant was paired with another person and they drew lots to find out who would be the “learner” and who would
be the “teacher”. The draw was fixed, so that the participant was always the teacher, and the learner was one of
Milgram’s confederate (pretending to be a real participant).&lt;/p>
&lt;p>The learner was taken into a room and had electrodes attached to his arms, and the teacher and researcher went into a
room next door that contained an electric shock generator and a row of switches marked from 15 volts (slight shock) to
300 volts (severe shock) to 450 volts (XXX).&lt;/p>
&lt;p>&lt;img src="/images/blog/2022-01-24/video-fragment.jpg" alt="blog-footer" />&lt;/p>
&lt;p>The learner gave mainly wrong answers (on purpose), and for each of these, the teacher had to give him an electric
shock. When the teacher refused to administer a shock, the researcher gave a series of orders to ensure they continued:&lt;/p>
&lt;ol>
&lt;li>“Please continue.”&lt;/li>
&lt;li>“The experiment requires that you continue.”&lt;/li>
&lt;li>“It is absolutely essential that you continue.”&lt;/li>
&lt;li>“You have no other choice; you must go on.”&lt;/li>
&lt;/ol>
&lt;h3 id="results">Results&lt;/h3>
&lt;p>65% of participants (teachers) continued to the highest level of 450 volts. All participants continued to 300 volts.&lt;/p>
&lt;p>Milgram did more than just one experiment. He carried out 18 variations of this study. All he did was alter the
situation to see how this affected obedience.&lt;/p>
&lt;h3 id="conclusion">Conclusion&lt;/h3>
&lt;p>The simple explanation would be that it was something about them as people that caused them to obey, but a more
realistic explanation is that the situation they were in caused them to behave in the way that they did.&lt;/p>
&lt;p>Some of the aspects of the situation that may have influenced their behaviour included the location, the behaviour of
the researcher and the fact that it was an experiment for which they had volunteered and been paid.&lt;/p>
&lt;p>People tend to obey orders from other people if they recognise their authority. This response to legitimate authority is
learned in a variety of situations, for example in the family, school, and work.&lt;/p>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/rdrKCilEhC0"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;hr />
&lt;h2 id="milgrams-agency-theory">Milgrams’ agency theory&lt;/h2>
&lt;p>Milgram explained the behaviour of the participants by suggesting that people have two states of behaviour when they are
in a social situation:&lt;/p>
&lt;ul>
&lt;li>The autonomous state: people direct their own actions, and they take responsibility for the results of those actions.&lt;/li>
&lt;li>The agentic state: people allow others to direct their actions and then pass off the responsibility for the
consequences to the person giving the orders. They act as agents for another person’s will.&lt;/li>
&lt;/ul>
&lt;p>Two things must be in place for a person to enter the agentic state:&lt;/p>
&lt;ol>
&lt;li>The person giving the orders is perceived as legitimate for that.&lt;/li>
&lt;li>The person being ordered believe that the authority will accept responsibility for what happens.&lt;/li>
&lt;/ol>
&lt;p>For example, when participants were reminded that they had responsibility for their own actions, almost none of them
were prepared to obey. In contrast, many participants who refused to go on did so if the researcher said that he would
take responsibility.&lt;/p>
&lt;h2 id="milgram-experiment-variations">Milgram experiment variations&lt;/h2>
&lt;p>Among many others, these are some of the variations:&lt;/p>
&lt;h3 id="uniform">Uniform&lt;/h3>
&lt;p>When the role of the researcher was taken over by an “ordinary person without a uniform” (always a confederate), the
obedience dropped to 20%.&lt;/p>
&lt;h3 id="change-of-location">Change of location&lt;/h3>
&lt;p>Obedience dropped to 47.5% when the experiment was moved to a set of offices instead of the impressive Yale University.&lt;/p>
&lt;h3 id="social-support-condition">Social support condition&lt;/h3>
&lt;p>Two other participants (confederates) were also teachers but refused to obey. One at 150 volts, and the other at 210
volts. The presence of others who are seen to disobey the authority figure reduces the level of obedience to 10%.&lt;/p>
&lt;h3 id="absent-experimenter-condition">Absent experimenter condition&lt;/h3>
&lt;p>When the researcher instructed and prompted the teacher by telephone from another room, obedience fell to 20.5%. Many
participants cheated and missed out shocks or gave less voltage than ordered. The proximity of authority figure affects
obedience.&lt;/p>
&lt;h3 id="the-moral-questions-milgram-raised">The moral questions Milgram raised&lt;/h3>
&lt;p>Why did so many of the participants in this experiment perform a seemingly sadistic act when instructed by an authority
figure? According to Milgram, there are some situational factors that can explain such high levels of obedience:&lt;/p>
&lt;ul>
&lt;li>The physical presence of an authority figure increased compliance.&lt;/li>
&lt;li>The fact that Yale (a trusted academic institution) sponsored the study led many participants to believe that the
experiment must be safe.&lt;/li>
&lt;li>The selection of teacher and learner status seemed random.&lt;/li>
&lt;li>Participants assumed that the researcher was a competent expert.&lt;/li>
&lt;li>The shocks were said to be painful, not dangerous.&lt;/li>
&lt;/ul>
&lt;p>Milgram’s experiment has become a classic in psychology, demonstrating the dangers of obedience. The research suggested
that situational variables have a stronger sway than personality factors in determining obedience.&lt;/p>
&lt;blockquote>
&lt;p>Often it is not so much the kind of person a man is as the kind of situation in which he finds himself that determines how he will act.&lt;/p>
&lt;p>Stanley Milgram, 1974.&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="/images/blog/2022-01-24/footer.jpg" alt="blog-footer" />&lt;/p>
&lt;h3 id="resources">Resources&lt;/h3>
&lt;ul>
&lt;li>&lt;a rel="external" href="https://en.wikipedia.org/wiki/Milgram_experiment">Wikipedia&lt;/a>&lt;/li>
&lt;li>&lt;a rel="external" href="https://www.simplypsychology.org/milgram.html">Simply psychology&lt;/a>&lt;/li>
&lt;li>&lt;a rel="external" href="https://www.verywellmind.com/the-milgram-obedience-experiment-2795243">Very well mind&lt;/a>&lt;/li>
&lt;/ul></content></entry><entry xml:lang="en"><title>Modern CTO</title><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><category term="software-design" scheme="https://chemaclass.com/tags/software-design/" label="Software Design"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><published>2022-01-23T00:00:00+00:00</published><updated>2022-01-23T00:00:00+00:00</updated><author><name>
Joel Beasley</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/modern-cto/"/><id>https://chemaclass.com/readings/modern-cto/</id><summary type="html">In Modern CTO, Joel Beasley provides readers with an in-depth road map on how to successfully navigate the unexplored and jagged transition between these two roles. Drawing from personal experience, Joel gives a refreshing take on the challenges, lessons, and things to avoid on this journey.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>Developers are not CTOs, but developers can learn how to be CTOs.&lt;/p>
&lt;p>In Modern CTO, Joel Beasley provides readers with an in-depth road map on how to successfully navigate the unexplored
and jagged transition between these two roles. Drawing from personal experience, Joel gives a refreshing take on the
challenges, lessons, and things to avoid on this journey.&lt;/p>
&lt;p>These are the topics you’ll find in the book:&lt;/p>
&lt;h4 id="a-modern-cto-knows">A Modern CTO knows…&lt;/h4>
&lt;ul>
&lt;li>Developers are not CTOs&lt;/li>
&lt;li>The spaghetti code MVP epidemic&lt;/li>
&lt;li>Over-engineering is a problem&lt;/li>
&lt;li>Whether to hire, buy, or out-build their competitor&lt;/li>
&lt;li>How not to scale prematurely&lt;/li>
&lt;li>How to solve any problem&lt;/li>
&lt;li>How to work with programers when you aren’t one&lt;/li>
&lt;li>UX mistakes to watch out for&lt;/li>
&lt;li>When to speak up&lt;/li>
&lt;li>When to hire &amp;amp; fire consultants&lt;/li>
&lt;li>How to analyze failure&lt;/li>
&lt;li>How to bounce back from unforeseen constraints&lt;/li>
&lt;li>Answer the question: “How difficult is it to code…?”&lt;/li>
&lt;li>How to avoid the “bottom of the ninth” guy&lt;/li>
&lt;li>When to respond to feedback&lt;/li>
&lt;li>How to validate an expert in any field&lt;/li>
&lt;li>How to effectively communicate complex ideas&lt;/li>
&lt;/ul>
&lt;h3 id="favorite-quotes">Favorite quotes&lt;/h3>
&lt;blockquote>
&lt;p>If I rest on past achievements, I’ll never grow.&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;p>LEVERAGE OTHERS’ EXPERIENCE Books condense a lifetime of experience into a few hours’ read. Powerful right?&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;p>There are only two reasons you write bad code:&lt;/p>
&lt;p>1)You know how to write good code, but you choose to write bad code.
2)You don’t know how to write good code. And both suck.&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;p>As the CTO, you must have a business focus.&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;p>Always return to your core goals. […] I make sure each core goal has a clearly defined “why?” behind it, this way
if I ever get lost, I go back to my “why.”&lt;/p>
&lt;/blockquote>
&lt;p>– Reference to “&lt;a href="/readings/start-with-why">Start with Why&lt;/a>” by Simon Sinek.&lt;/p>
&lt;blockquote>
&lt;p>When you’re the boss, remember this golden rule: Ask people what they think instead of telling them what to do.&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;p>If I can’t asses the human component, I can’t lead a team. […] Team composition carries as much or perhaps even
greater weight than programming expertise.&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;p>As CTO, if you can’t explain value simply, it means you don’t understand the business value behind your technology.&lt;/p>
&lt;/blockquote></content></entry><entry xml:lang="en"><title>Leaders Eat Last</title><subtitle>Why Some Teams Pull Together and Others Don't</subtitle><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><category term="psychology" scheme="https://chemaclass.com/tags/psychology/" label="Psychology"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><published>2022-01-16T00:00:00+00:00</published><updated>2022-01-16T00:00:00+00:00</updated><author><name>
Simon Sinek</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/leaders-eat-last/"/><id>https://chemaclass.com/readings/leaders-eat-last/</id><summary type="html">A company's biggest strength doesn't lie in its products or services. It always lies in its people, and in their ability to cooperate closely and rally behind the organization, especially during a crisis.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>A company’s biggest strength doesn’t lie in its products or services. It always lies in its people, and in their ability
to cooperate closely and rally behind the organization, especially during a crisis.&lt;/p>
&lt;p>However, loyalty and commitment must be earned. Today, work has become a contractual, transactional relationship in many
organizations. Intense competition and layoffs are the norm. Hardly anyone believes in loyalty to a company anymore,
much less lifetime employment.&lt;/p>
&lt;h2 id="the-4-chemicals-e-d-s-o">The 4 Chemicals (E.D.S.O.)&lt;/h2>
&lt;p>Each of us is an individual and a part of social groups. We make daily decisions that require us to weigh our
self-interests against group interests. This dilemma also happens in our bodies via 4 key chemicals:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>Endorphins&lt;/strong> and &lt;strong>dopamine&lt;/strong> drive us to satisfy our personal needs, e.g. to find food, develop solutions and
persevere through problems. They help us to get things done, so we can survive.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Serotonin&lt;/strong> and &lt;strong>oxytocin&lt;/strong> encourage us to work together with others. They build feelings of trust, loyalty and
camaraderie, strengthen our social bonds and increase our inclination to cooperate with others to achieve what we
can’t on our own.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h2 id="circles-of-safety">Circles of Safety&lt;/h2>
&lt;p>Traditionally, our family provides a Circle of Safety where we feel safe and supported. Inside the circle, we have a
healthy balance of &lt;strong>E.D.S.O&lt;/strong>. and low Cortisol levels. In organizations, Circles of Safety provide people with a sense of
belonging and security. This facilitates communication, cooperation, problem-solving and innovation, allowing people to
direct their attention to external threats and opportunities. In contrast, when people feel threatened by internal
politics and infighting, they turn their attention inward to focus on self-preservation, making the group more
vulnerable as a whole.&lt;/p>
&lt;p>Leaders must earn others’ respect and loyalty by making the most sacrifices and being willing to eat last. They must
give trust to earn trust.&lt;/p>
&lt;h2 id="a-society-that-s-out-of-balance">A Society that’s Out of Balance&lt;/h2>
&lt;p>Each of the 4 &lt;strong>E.D.S.O.&lt;/strong> chemicals play important roles in our survival. When they’re in balance, people prosper the way
they’re designed to, and their groups/organizations prosper too. Unfortunately, the modern workplace tends to be overflowed
with Cortisol and dopamine addiction. We lack Circles of Safety and have become dangerously imbalanced. How did we get
here?&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Abstraction and Dehumanization&lt;/strong>: how management via numbers, global systems and virtual interactions can be
dangerous and lead to careless acts.&lt;/li>
&lt;li>&lt;strong>Destructive Abundance&lt;/strong>: how humans respond to shortage vs excess, and why/how leaders have become so blinded by the
commercial interest that they’ve forgotten who they’re supposed to serve.&lt;/li>
&lt;li>&lt;strong>Social Changes&lt;/strong>: how our societal norms and values have changed with the post-WWII Boomer Generation, followed by
Gen-Xers and Gen-Ys, to become increasingly dopamine-addicted and imbalanced.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>Simon Sinek offers many detailed examples and stories of leaders in all walks from the military to politics and businesses.&lt;/p>
&lt;/blockquote>
&lt;hr />
&lt;h2 id="ted-talk-why-leaders-eat-last">TED Talk: Why Leaders Eat Last&lt;/h2>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/ReRcHdeUG9Y"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>My Friend Of Misery - Metallica (bass cover)</title><category term="music" scheme="https://chemaclass.com/tags/music/" label="Music"/><published>2022-01-13T00:00:00+00:00</published><updated>2022-01-13T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/music/my-friend-of-misery/"/><id>https://chemaclass.com/music/my-friend-of-misery/</id><summary type="html">&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/RlldEq76kE0"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></summary><content type="html">&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/RlldEq76kE0"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;span id="continue-reading">&lt;/span></content></entry><entry xml:lang="en"><title>Jonathan Livingston Seagull</title><subtitle>A story</subtitle><category term="fiction" scheme="https://chemaclass.com/tags/fiction/" label="Fiction"/><category term="philosophy" scheme="https://chemaclass.com/tags/philosophy/" label="Philosophy"/><category term="psychology" scheme="https://chemaclass.com/tags/psychology/" label="Psychology"/><category term="career" scheme="https://chemaclass.com/tags/career/" label="Career"/><published>2022-01-08T00:00:00+00:00</published><updated>2022-01-08T00:00:00+00:00</updated><author><name>
Richard Bach</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/jonathan-livingston-seagull/"/><id>https://chemaclass.com/readings/jonathan-livingston-seagull/</id><summary type="html">A fable in novella form about a seagull who is trying to learn about life and flight, and a homily about self-perfection.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>A fable in novella form about a seagull who is trying to learn about life and flight, and a homily about self-perfection.&lt;/p>
&lt;h2 id="plot">Plot&lt;/h2>
&lt;p>The book tells the story of Jonathan Livingston Seagull, a seagull who is bored with daily squabbles over food. Seized
by a passion for flight, he pushes himself and learns everything he can about flying. His increasing unwillingness to
conform finally results in his expulsion from the flock. Now an outcast, he continues to learn, becoming increasingly
pleased with his abilities while leading a peaceful and happy life.&lt;/p>
&lt;p>One day Jonathan meets two gulls who take him to a “higher plane of existence” in which there is no heaven, but a better
world found through perfection of knowledge. There he meets another seagull who loves to fly. He discovers that his
sheer tenacity and desire to learn make him “pretty well a one-in-a-million bird.” In this new place, Jonathan befriends
the wisest gull, Chiang, who takes him beyond his previous self-education, and teaches him how to move instantaneously
to anywhere else in the universe. The secret, Chiang says, is to “begin by knowing that you have already arrived.”&lt;/p>
&lt;p>But, unsatisfied with his new life, Jonathan returns to Earth to find others like himself to tell them what he’d learned
and to spread his love for flight. His mission is successful, and Jonathan gathers around himself a flock of other gulls
who have been outlawed for not conforming. The first of his students, Fletcher Lynd Seagull, ultimately becomes a
teacher in his own right, and Jonathan leaves to teach other flocks.&lt;/p>
&lt;blockquote>
&lt;p>This novella has been translated into over thirty languages.&lt;/p>
&lt;/blockquote>
&lt;hr />
&lt;h2 id="audiobook">Audiobook&lt;/h2>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/8COt1n3jDqA"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>The Five Dysfunctions of a Team</title><subtitle>A Leadership Fable</subtitle><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><category term="psychology" scheme="https://chemaclass.com/tags/psychology/" label="Psychology"/><published>2021-12-07T00:00:00+00:00</published><updated>2021-12-07T00:00:00+00:00</updated><author><name>
Patrick M. Lencioni</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/the-five-dysfunctions-of-a-team/"/><id>https://chemaclass.com/readings/the-five-dysfunctions-of-a-team/</id><summary type="html">This book is a leadership fable about a tech company that is struggling to get more customers. The C level is not working as a team, and they have a hard time coming to any agreements which result in negative morale. Until the new CEO, Catherine Petersen, joins the team, and she is able to recognize the problems and help the team overcome them by understanding the situation.</summary><content type="html">&lt;p>This book is a leadership fable about a tech company that is struggling to get more customers. The C level is not
working as a team, and they have a hard time coming to any agreements which result in negative morale. Until the new
CEO, Catherine Petersen, joins the team, and she is able to recognize the problems and help the team overcome them by
understanding the situation.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>This is the first book I read from the author Patrick Lencioni, who is an American writer who writes books on business
management. He is the founder and president of the Table group, a management consulting focused on organizational
health.&lt;/p>
&lt;h2 id="book-summary">Book summary&lt;/h2>
&lt;p>Kathryn Petersen, Decision Tech’s CEO, faces the ultimate leadership crisis: Uniting a team in such disarray that it
threatens to bring down the entire company. Will she succeed? Will she be fired? Will the company fail?&lt;/p>
&lt;p>Throughout the story, Lencioni reveals the five dysfunctions which go to the very heart of why teams even the best
ones-often struggle. He outlines a powerful model and actionable steps that can be used to overcome these common hurdles
and build a cohesive, effective team.&lt;/p>
&lt;h2 id="the-5-dysfunction-model">The 5 dysfunction model&lt;/h2>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/GCxct4CR-To"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;h3 id="1-absence-of-trust">1) Absence of trust&lt;/h3>
&lt;p>The fear of being vulnerable prevents team members from building trust with each other.&lt;/p>
&lt;p>This occurs when team members are reluctant to be vulnerable with one another and are unwilling to admit their mistakes,
weaknesses or needs for help. Without a certain comfort level among team members, a foundation of trust is impossible.&lt;/p>
&lt;h3 id="2-fear-of-conflict">2) Fear of conflict&lt;/h3>
&lt;p>The desire to preserve artificial harmony stifles productive ideological conflict within the team.&lt;/p>
&lt;p>Teams that are lacking on trust are incapable of engaging in unfiltered, passionate debate about key issues, causing
situations where team conflict can easily turn into veiled discussions and back channel comments. In a work setting
where team members do not openly air their opinions, inferior decisions are the result.&lt;/p>
&lt;h3 id="3-lack-of-commitment">3) Lack of commitment&lt;/h3>
&lt;p>The lack of clarity and/or buy-in prevents team members from making decisions they stick to.&lt;/p>
&lt;p>Without conflict, it is difficult for team members to commit to decisions, creating an environment where ambiguity
prevails. Lack of direction and commitment can make employees, particularly star employees, disgruntled.&lt;/p>
&lt;h3 id="4-avoidance-of-accountability">4) Avoidance of accountability&lt;/h3>
&lt;p>The need to avoid interpersonal discomfort prevents team members from holding each other accountable for their behaviors
and performance.&lt;/p>
&lt;p>When teams don’t commit to a clear plan of action, even the most focused and driven individuals hesitate to call their
peers on actions and behaviors that may seem counterproductive to the overall good of the team.&lt;/p>
&lt;h3 id="5-inattention-to-results">5) Inattention to results&lt;/h3>
&lt;p>The pursuit of individual goals and personal status erodes the team’s focus on collective success.&lt;/p>
&lt;p>Team members naturally tend to put their own needs (ego, career development, recognition, etc.) ahead of the collective
goals of the team when individuals aren’t held accountable. If a team has lost sight of the need for achievement, the
business ultimately suffers.&lt;/p>
&lt;p>&lt;img src="/images/readings/2021-12-07/the-model.jpg" alt="blog-cover" />&lt;/p>
&lt;hr />
&lt;h2 id="video-summary">Video Summary&lt;/h2>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/Ro0NBgHo_a8"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>Start with Why</title><subtitle>How Great Leaders Inspire Everyone to Take Action</subtitle><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><category term="philosophy" scheme="https://chemaclass.com/tags/philosophy/" label="Philosophy"/><category term="career" scheme="https://chemaclass.com/tags/career/" label="Career"/><published>2021-11-28T00:00:00+00:00</published><updated>2021-11-28T00:00:00+00:00</updated><author><name>
Simon Sinek</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/start-with-why/"/><id>https://chemaclass.com/readings/start-with-why/</id><summary type="html">Start with Why asks (and answers) the questions: why are some people and organizations more innovative, more influential, and more profitable than others? Why do some command greater loyalty from customers and employees alike? Even among the successful, why are so few able to repeat their success over and over?</summary><content type="html">&lt;p>&lt;em>Start with Why&lt;/em> asks (and answers) the questions: why are some people and organizations more innovative, more
influential, and more profitable than others? Why do some command greater loyalty from customers and employees alike?
Even among the successful, why are so few able to repeat their success over and over?&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;hr />
&lt;p>The ability to inspire those around you and to achieve remarkable things starts with WHY. Those who start with WHY never
manipulate, they inspire.&lt;/p>
&lt;p>People like Martin Luther King Jr., Steve Jobs, and the Wright Brothers had little in common, but they all started with
WHY. They realized that people won’t truly buy into a product, service, movement, or idea until they understand the WHY
behind it.&lt;/p>
&lt;ul>
&lt;li>The ability to inspire those around you and to achieve remarkable things starts with WHY.&lt;/li>
&lt;li>Any organization can explain what it does; some can explain how they do it; but very few can clearly articulate why.&lt;/li>
&lt;li>Your WHY is your purpose, cause or belief.&lt;/li>
&lt;li>Every inspiring leader and organization, regardless of size or industry, starts with WHY.&lt;/li>
&lt;li>When your WHY goes fuzzy, it becomes much more difficult to maintain the growth, loyalty, and inspiration that helped
drive your original success.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>People don’t buy WHAT you do, they buy WHY you do it.&lt;/p>
&lt;/blockquote>
&lt;p>Great leaders are able to inspire people to act. And those who are able to inspire give people a sense of purpose or
belonging that has little to do with any external incentive or benefit to be gained.&lt;/p>
&lt;hr />
&lt;h2 id="video-summary">Video Summary&lt;/h2>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/u4ZoJKF_VuA"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>London vs Chicago</title><subtitle>It's an integration, not a choice</subtitle><category term="tdd" scheme="https://chemaclass.com/tags/tdd/" label="Tdd"/><category term="testing" scheme="https://chemaclass.com/tags/testing/" label="Testing"/><category term="software-design" scheme="https://chemaclass.com/tags/software-design/" label="Software Design"/><category term="refactoring" scheme="https://chemaclass.com/tags/refactoring/" label="Refactoring"/><published>2021-11-20T00:00:00+00:00</published><updated>2021-11-20T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/london-vs-chicago/"/><id>https://chemaclass.com/blog/london-vs-chicago/</id><summary type="html">There are two known schools in TDD: the mockist school (aka Outside-in) and the classicist school (aka Inside-out).</summary><content type="html">&lt;p>&lt;img src="/images/blog/2021-11-20/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>There are two known schools in TDD: the mockist school (aka Outside-in) and the classicist school (aka Inside-out).&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h3 id="why-london-and-chicago">Why London and Chicago?&lt;/h3>
&lt;p>Two companies, one from London and another from Chicago, claimed to do TDD, but they were focused on different aspects.
The London company was building software from outside-in, while the Chicago company from inside-out. Let’s see them in more detail.&lt;/p>
&lt;h2 id="outside-in-london-school">Outside-in: London School&lt;/h2>
&lt;p>It provides a behavior-driven approach to TDD. Starting from the outside of the application and working in moving to
lower layers. For example, starting from the API/Controllers down to the application or domain layers.&lt;/p>
&lt;h3 id="pros">PROS&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Behavioral Focused&lt;/strong>: this requires a lot of test doubles because you will test a lot of abstractions that don’t exist
yet as you are creating a high level of logic first. You aren’t going to write dead-code but it will be easy to create
tests highly coupled to the logic and therefore making refactoring a difficult task.&lt;/li>
&lt;li>&lt;strong>Command-Query separation&lt;/strong>: is a discipline for managing side effects. Either you perform an action (command) or you ask
for a value (query).&lt;/li>
&lt;/ul>
&lt;h3 id="cons">CONS&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Fragile Tests&lt;/strong>: it tends to create tests that break easily because they are usually too coupled to the production code.&lt;/li>
&lt;li>&lt;strong>Difficult Refactoring&lt;/strong>: for the same reason as “Fragile Tests”, having tests coupled to production code make continuous
refactoring very difficult and time-consuming.&lt;/li>
&lt;/ul>
&lt;h2 id="inside-out-chicago-school">Inside-out: Chicago School&lt;/h2>
&lt;p>It’s an informal, exploratory, state-based approach of TDD. Starting from the inside of the application (usually the
domain) and works out towards the APIs.&lt;/p>
&lt;h3 id="pros-1">PROS&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Strong Safety Net&lt;/strong>: it tends to produce tests that are decoupled from the implementation. Enabling you to adopt a more
experimental style of changing software without fear of breaking it. This is desired for continuous refactoring.&lt;/li>
&lt;li>&lt;strong>High Cohesion&lt;/strong>: as tests become more general, the production code becomes more specific. This promotes high cohesion,
and with high cohesion comes loose coupling. Something that promotes high code quality: extensibility,
maintainability, and testability.&lt;/li>
&lt;li>&lt;strong>Minimizes Test Doubles&lt;/strong>: building from the inside out requires fewer test doubles since you are building on top of the
previously written tests. This helps to develop less fragile tests.&lt;/li>
&lt;/ul>
&lt;h3 id="cons-1">CONS&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>YAGNI&lt;/strong>: it’s often over-engineering solutions, with code that is not really needed (or even used!) in the end.&lt;/li>
&lt;/ul>
&lt;h2 id="conclusion">Conclusion&lt;/h2>
&lt;p>It’s not about choosing one over the other. It’s about understanding your context and driving optimization towards those
qualities that need to be optimized. London and Chicago each have their pros and cons. The best approach to TDD is an
integrated adoption of these two schools.&lt;/p>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/rbSDGr-_UwY"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;hr />
&lt;h3 id="references">References&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="/blog/test-driven-development/">Test-Driven (Development)&lt;/a>&lt;/li>
&lt;li>&lt;a href="/blog/tdd-vs-bdd/">TDD vs BDD&lt;/a>&lt;/li>
&lt;li>&lt;a rel="external" href="https://gist.github.com/xpepper/2e3519d2cb8568a0b13739d9ae497f21">Notes about “London vs Chicago TDD styles”&lt;/a>&lt;/li>
&lt;/ul></content></entry><entry xml:lang="en"><title>Leadership is Language</title><subtitle>The hidden power of what you say, and what you don't</subtitle><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><category term="productivity" scheme="https://chemaclass.com/tags/productivity/" label="Productivity"/><published>2021-10-22T00:00:00+00:00</published><updated>2021-10-22T00:00:00+00:00</updated><author><name>
L. David Marquet</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/leadership-is-language/"/><id>https://chemaclass.com/readings/leadership-is-language/</id><summary type="html">In this book, the former submarine commander Captain L. David Marquet dives deep into one of the most investigated marine disasters, the sinking of the El Faro, and surfaces with new ideas on leadership and language.</summary><content type="html">&lt;p>A radical playbook to empower your people and put your team on a path to continuous improvement.&lt;/p>
&lt;p>In this book, the former submarine commander Captain &lt;a rel="external" href="https://x.com/ldavidmarquet">L. David Marquet&lt;/a> dives deep into one of the most investigated
marine disasters, the sinking of the El Faro, and surfaces with new ideas on leadership and language.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;hr />
&lt;p>You might imagine that an effective leader is someone who makes quick, intelligent decisions, gives inspiring speeches,
and issues clear orders to their team, so they can execute a plan to achieve your organization’s goals. Unfortunately,
that’s an outdated model of leadership that just doesn’t work anymore.&lt;/p>
&lt;blockquote>
&lt;p>Your words matter more than you think.&lt;/p>
&lt;/blockquote>
&lt;p>David gives six plays that all leaders should use to improve how their teams operate. He says a big problem with leaders
today is that they are trapped in an industrial-age playbook. In the industrial age leaders gave commands and employees
followed, and that was it. But that way of leading is no longer effective, it is outdated.&lt;/p>
&lt;h3 id="the-six-plays">The six plays&lt;/h3>
&lt;ul>
&lt;li>Control the clock, don’t obey the clock–Pre-plan decision points and give your people the tools they need to hit
pause on a plan of action if they notice something wrong.&lt;/li>
&lt;li>Collaborate, don’t coerce–As the leader, you should be the last one to offer your opinion.&lt;/li>
&lt;li>Commit, don’t comply–Rather than expect your team to comply with specific directions, explain your overall goals, and
get their commitment to achieving it one piece at a time.&lt;/li>
&lt;li>Complete, not continue–If every day feels like a repetition of the last, you’re doing something wrong.&lt;/li>
&lt;li>Improve, don’t prove–Ask your people to improve on plans and processes, rather than prove that they can meet fixed
goals or deadlines.&lt;/li>
&lt;li>Connect, don’t conform–Flatten hierarchies in your organization and connect with your people to encourage them to
contribute to decision-making&lt;/li>
&lt;/ul>
&lt;hr />
&lt;h2 id="video-summary">Video Summary&lt;/h2>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/CQfao96j1fo"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>Red Work vs Blue Work</title><subtitle>Managing the two kinds of work</subtitle><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><category term="productivity" scheme="https://chemaclass.com/tags/productivity/" label="Productivity"/><category term="agile" scheme="https://chemaclass.com/tags/agile/" label="Agile"/><published>2021-10-21T00:00:00+00:00</published><updated>2021-10-21T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/red-work-blue-work/"/><id>https://chemaclass.com/blog/red-work-blue-work/</id><summary type="html">Blue Work and Red Work are concepts that David Marquet describes in his book 'Leadership is Language. Both require different mindsets and both have different languages.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2021-10-21/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>“Blue Work” and “Red Work” are concepts that &lt;a rel="external" href="https://x.com/ldavidmarquet">David Marquet&lt;/a>
describes in his book &lt;a href="/readings/leadership-is-language/">Leadership is Language&lt;/a>. Both require different mindsets and
have different languages.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;blockquote>
&lt;p>“Doing” in our traditional leadership style will not take us to where we need to be in the future.&lt;/p>
&lt;/blockquote>
&lt;h2 id="what-is-red-work">What is “Red Work”?&lt;/h2>
&lt;p>Red Work is about &lt;strong>doing and reducing variability&lt;/strong>. Red Work focuses on a proving mindset and a performance mindset.&lt;/p>
&lt;p>In Red Work, you seek for completing a task without a lot of need for deciding what or how. Red Work is being in control
and taking control. Such as:&lt;/p>
&lt;ul>
&lt;li>Process work and avoid errors.&lt;/li>
&lt;li>Having predictability and controllability.&lt;/li>
&lt;/ul>
&lt;p>We need a mechanism to stop Red Work and ask: &lt;strong>are we doing the right thing?&lt;/strong>&lt;/p>
&lt;h2 id="what-is-blue-work">What is “Blue Work”?&lt;/h2>
&lt;p>Blue Work is about &lt;strong>deciding, thinking, planning&lt;/strong>. Blue Work focuses on improving with an embarrassing mindset.&lt;/p>
&lt;blockquote>
&lt;p>The correct place to do Blue Work is at the beginning and at the end of a decision point.&lt;/p>
&lt;/blockquote>
&lt;p>Blue Work is crucial for a good starting point, allowing us to decide the best way to do something with the information
that we have right now.&lt;/p>
&lt;p>It’s also important to establish short iterations between the different actions or activities that we want to complete,
so we can have some “Blue Work time” and reflect again. Blue Work is perfect to do retrospectives and see what could be
improved.&lt;/p>
&lt;p>It’s the time to stop and “control the clock”, collaborate and make a commitment for the next iteration. Blue Work is
also about:&lt;/p>
&lt;ul>
&lt;li>Thinking work.&lt;/li>
&lt;li>Decision-making.&lt;/li>
&lt;li>Looking to achieve excellence.&lt;/li>
&lt;li>Getting more people to do independent thinking answers.&lt;/li>
&lt;li>Embracing variability and looking for different inputs.&lt;/li>
&lt;/ul>
&lt;p>Blue Work in isolation is useless. The job of Blue Work is to make Red Work better. Endless Blue Work, planning without
outcome doesn’t bring any real benefits.&lt;/p>
&lt;hr />
&lt;blockquote>
&lt;p>Nowadays, especially in our modern software industry, there is no room for the old school of “Red-Workers” and
“Blue-Workers”, but “Red Work” and “Blue Work”, and everyone should be involved in both.&lt;/p>
&lt;/blockquote>
&lt;p>It is, therefore, everyone’s responsibility to be aware of these different types of work and find a good balance between
them. Leaders involve everyone in both Red Work and Blue Work.&lt;/p>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/OEX1EVc-zjk"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;hr />
&lt;h3 id="references">References&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="/readings/leadership-is-language/">Leadership is Language&lt;/a> Book&lt;/li>
&lt;li>&lt;a rel="external" href="https://www.infoq.com/podcasts/david-marquet/">https://www.infoq.com/podcasts/david-marquet/&lt;/a>&lt;/li>
&lt;/ul></content></entry><entry xml:lang="en"><title>TDD vs BDD</title><subtitle>Design or Workflow?</subtitle><category term="tdd" scheme="https://chemaclass.com/tags/tdd/" label="Tdd"/><category term="testing" scheme="https://chemaclass.com/tags/testing/" label="Testing"/><category term="software-design" scheme="https://chemaclass.com/tags/software-design/" label="Software Design"/><published>2021-09-25T00:00:00+00:00</published><updated>2021-09-25T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/tdd-vs-bdd/"/><id>https://chemaclass.com/blog/tdd-vs-bdd/</id><summary type="html">These are two different techniques. The key to each of them is about the mindset and context of what you want to achieve.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2021-09-25/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>These are two different techniques. The key to each of them is about the mindset and context of what you want to achieve.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h2 id="bdd-is-a-test-driven-feature">BDD is a “test-driven feature”&lt;/h2>
&lt;p>Basically, it’s a test-first driven development, where the main focus is ensuring the expected final behavior, and
therefore the result of the software logic that you want to have at the end.&lt;/p>
&lt;p>In BDD the main focus is the behavior of your domain logic that doesn’t exist yet. It is, from an abstract point of
view, about the whole functionality and domain requirements.&lt;/p>
&lt;h2 id="tdd-is-about-the-rhythm">TDD is about the rhythm&lt;/h2>
&lt;ol>
&lt;li>Specify what you want.&lt;/li>
&lt;li>Make it work.&lt;/li>
&lt;li>Make it better.&lt;/li>
&lt;/ol>
&lt;p>TDD is not just about the already known “red-green-refactor” mentality, but mostly about the workflow that helps you
understand the constant design decisions you are doing every time for every logic you are designing.&lt;/p>
&lt;blockquote>
&lt;p>TDD is about constant feedback about your decisions.&lt;/p>
&lt;/blockquote>
&lt;p>In the context of OOP (to make the examples clearer), there are always tons of different ways to design your class:&lt;/p>
&lt;ul>
&lt;li>What’s the name of this method’s class?&lt;/li>
&lt;li>What are the dependencies or collaborators for this class?&lt;/li>
&lt;li>How will this class behave when I use this other class inside it?&lt;/li>
&lt;li>What’s the expected outcome of this method when I give these arguments?&lt;/li>
&lt;li>etc, etc…&lt;/li>
&lt;/ul>
&lt;p>We do these questions (and many more) every time, and we do give them an answer as well, but usually without any
rational thinking or feedback about it. We just do what we think is “the best” at that particular time focusing on
making something work, but is it enough to make it work?&lt;/p>
&lt;h2 id="the-constant-feedback-loop">The constant feedback loop&lt;/h2>
&lt;p>Testing is not just a great tool because it gives you some safety-net so you can refactor with confidence, but also
because it helps design a better system. &lt;strong>How is that?&lt;/strong> Because before going for any solution, it makes you think about
the decisions that you need to do. You are challenging yourself to understand the arguments of your decisions, and why A
and not B is a better solution in a particular context.&lt;/p>
&lt;p>BDD and TDD aren’t mutually exclusive, in fact, they can and should coexist. It depends mostly on the context of what
you want to build and test.&lt;/p>
&lt;p>&lt;img src="/images/blog/2021-09-25/bdd-and-tdd.jpg" alt="blog-bdd-and-tdd" />&lt;/p>
&lt;p>BDD is about Test-First feature development. The goal is not how but what. The feedback loop is long because you will
get “green” feedback once the feature is implemented and working as expected.&lt;/p>
&lt;p>TDD is also another Test-First driven but, unlike BDD, it is about a shorter and quicker feedback loop.&lt;/p>
&lt;ol>
&lt;li>First, you &lt;strong>specify what you want&lt;/strong>. You think about the design of your class or method. Its name or signature. Its
dependencies. But all of this by baby steps, one at a time.&lt;/li>
&lt;li>Second, you &lt;strong>make that little thing work&lt;/strong> in the simplest possible way.&lt;/li>
&lt;li>Finally, you &lt;strong>make it better&lt;/strong>. Because software is hard and complicated enough to make it right on the first try, so
refactoring is a must to keep a system healthy. At this point, with a “green running test”, you can refactor and
improve your logic safely.&lt;/li>
&lt;/ol>
&lt;p>The above is basically TDD, right, but… what’s so special about it? The constant &lt;strong>feedback loop&lt;/strong> and &lt;strong>design
decisions&lt;/strong> that you need to make before you are actually writing the solution. This is the power of TDD.&lt;/p>
&lt;h3 id="why-so-small-steps-in-tdd">Why so small steps in TDD?&lt;/h3>
&lt;p>Theoretically you “must” write little steps for every iteration, but why? &lt;strong>It’s all about the feedback loop&lt;/strong>. This is
up to you, your expectations, and your experience with testing.&lt;/p>
&lt;p>&lt;img src="/images/blog/2021-09-25/footer.jpg" alt="blog-footer" />&lt;/p>
&lt;hr />
&lt;h3 id="resources">Resources&lt;/h3>
&lt;ul>
&lt;li>&lt;a rel="external" href="https://chemaclass.com/blog/test-driven-development/">https://chemaclass.com/blog/test-driven-development/&lt;/a>&lt;/li>
&lt;li>&lt;a rel="external" href="https://blog.testlodge.com/tdd-vs-bdd/">https://blog.testlodge.com/tdd-vs-bdd/&lt;/a>&lt;/li>
&lt;/ul></content></entry><entry xml:lang="en"><title>The Bitcoin Standard</title><subtitle>The Decentralized Alternative to Central Banking</subtitle><category term="bitcoin" scheme="https://chemaclass.com/tags/bitcoin/" label="Bitcoin"/><category term="economics" scheme="https://chemaclass.com/tags/economics/" label="Economics"/><category term="philosophy" scheme="https://chemaclass.com/tags/philosophy/" label="Philosophy"/><published>2021-09-20T00:00:00+00:00</published><updated>2021-09-20T00:00:00+00:00</updated><author><name>
Saifedean Ammous</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/the-bitcoin-standard/"/><id>https://chemaclass.com/readings/the-bitcoin-standard/</id><summary type="html">The Bitcoin Standard analyzes the historical context to the rise of Bitcoin, the economic properties that have allowed it to grow quickly, and its likely economic, political, and social implications.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>The Bitcoin Standard analyzes the historical context to the rise of Bitcoin, the economic properties that have allowed
it to grow quickly, and its likely economic, political, and social implications.&lt;/p>
&lt;p>While Bitcoin is a new invention of the digital age, the problem it purports to solve is as old as human society itself:
transferring value across time and space. Ammous takes the reader on an engaging journey through the history of
technologies performing the functions of money, from primitive systems of trading limestones and seashells, to metals,
coins, the gold standard, and modern government debt.&lt;/p>
&lt;p>With this background in place, the book moves on to explain the operation of Bitcoin in a functional and intuitive way.
Bitcoin is a decentralized, distributed piece of software that converts electricity and processing power into
indisputably accurate records, thus allowing its users to utilize the Internet to perform the traditional functions of
money without having to rely on, or trust, any authorities or infrastructure in the physical world.&lt;/p>
&lt;p>The final chapter of the book explores some of the most common questions surrounding Bitcoin:&lt;/p>
&lt;ul>
&lt;li>Is Bitcoin mining a waste of energy?&lt;/li>
&lt;li>Is Bitcoin for criminals?&lt;/li>
&lt;li>Who controls Bitcoin, and can they change it if they please?&lt;/li>
&lt;li>How can Bitcoin be killed?&lt;/li>
&lt;/ul>
&lt;p>The Bitcoin Standard is the essential resource for a clear understanding of the rise of the Internet’s decentralized,
apolitical, free-market alternative to national central banks.&lt;/p>
&lt;hr />
&lt;h2 id="video-summary">Video Summary&lt;/h2>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/t1brCcgi174"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;blockquote>
&lt;p>Extra: Lex Fridman Podcast with the author of this book&lt;/p>
&lt;/blockquote>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/gp4U5aH_T6A"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>Turn the Ship Around!</title><subtitle>A True Story of Turning Followers into Leaders</subtitle><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><category term="mentoring" scheme="https://chemaclass.com/tags/mentoring/" label="Mentoring"/><published>2021-09-12T00:00:00+00:00</published><updated>2021-09-12T00:00:00+00:00</updated><author><name>
L. David Marquet</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/turn-the-ship-around/"/><id>https://chemaclass.com/readings/turn-the-ship-around/</id><summary type="html">The book is about his leadership theories to how he implemented a fresh leadership model. Including the limitations of a hierarchical top-down model, why/how he failed to empower his team earlier in his career, and how the circumstances for Santa Fe were ideal for him to experiment with the new leader-leader approach.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>The book is about his leadership theories to how he implemented a fresh leadership model. Including the limitations of a
hierarchical top-down model, why/how he failed to empower his team earlier in his career, and how the circumstances for
Santa Fe were ideal for him to experiment with the new leader-leader approach.&lt;/p>
&lt;p>Most people unconsciously divide the world into &lt;strong>leaders vs followers&lt;/strong>, and make assumptions about what each group
can/can’t do. Such assumptions influence our thoughts and actions that impact the performance of individual employees and
the organization.&lt;/p>
&lt;p>It is common for enthusiastic employees to suggest new ideas, and then they are told “it’s not your job” or “that won’t
work”. People feel frustrated and eventually stop trying or leave the organization. &lt;strong>Bosses also feel
frustrated&lt;/strong> when their staff would rather &lt;strong>do the minimum&lt;/strong> rather than to &lt;strong>innovate or take responsibility&lt;/strong>.&lt;/p>
&lt;img border="0" style="width: 100%" src="https://i0.wp.com/readingraphics.com/uploads/2019/06/Turn-the-Ship-Around_Overview.png" >
&lt;blockquote>
&lt;p>The leader-leader model recognizes that everyone has the ability and &lt;strong>potential to lead&lt;/strong>.
It taps on individual potential at all levels, reduces dependency on a single leader and delivers sustained performance.&lt;/p>
&lt;/blockquote>
&lt;h3 id="the-3-key-components-control-competence-and-clarity">The 3 key components: Control, Competence and Clarity&lt;/h3>
&lt;h4 id="control">Control&lt;/h4>
&lt;p>Control refers to the freedom and authority to make decisions about why, what and how you’re going to work. The goal is
to delegate decision-making control as far as possible in the organization.&lt;/p>
&lt;ul>
&lt;li>Find the genetic code for control and rewrite it.&lt;/li>
&lt;li>Act your way to new thinking.&lt;/li>
&lt;li>Short, early conversations make efficient work.&lt;/li>
&lt;li>Use “I intend to…” to turn passive followers into active leaders.&lt;/li>
&lt;li>Resist the urge to provide solutions.&lt;/li>
&lt;li>Eliminate top-down monitoring systems.&lt;/li>
&lt;li>Think out loud (both superiors and subordinates).&lt;/li>
&lt;/ul>
&lt;h4 id="competence">Competence&lt;/h4>
&lt;p>People at every level must be technically competent to make the right decisions. If you give people additional
responsibility without equipping them with the required knowledge and resources, things will fall apart.&lt;/p>
&lt;ul>
&lt;li>Take deliberate action.&lt;/li>
&lt;li>We learn (everywhere, all the time).&lt;/li>
&lt;li>Don’t brief, certify.&lt;/li>
&lt;li>Continually and consistently repeat the message.&lt;/li>
&lt;li>Specify goals, not methods.&lt;/li>
&lt;/ul>
&lt;h4 id="clarity">Clarity&lt;/h4>
&lt;p>For people at all levels to make effective decisions, they must be fully aligned with the organization’s purpose, and
thoroughly understand the organization’s goals and decision-making criteria.&lt;/p>
&lt;ul>
&lt;li>Achieve excellence, don’t just avoid errors.&lt;/li>
&lt;li>Build trust and take care of your people.&lt;/li>
&lt;li>Use your legacy for inspiration.&lt;/li>
&lt;li>Use guiding principles for decision criteria.&lt;/li>
&lt;li>Use immediate recognition to reinforce desired behaviours.&lt;/li>
&lt;li>Begin with the end in mind.&lt;/li>
&lt;li>Encourage a questioning attitude over blind obedience.&lt;/li>
&lt;/ul>
&lt;img border="0" style="width: 100%" src="https://i2.wp.com/readingraphics.com/wp-content/uploads/2019/06/Turn-the-Ship-Around_the-Leader-Leader-Model.png" >
&lt;h2 id="favourite-quotes">Favourite quotes&lt;/h2>
&lt;blockquote>
&lt;p>Leadership is communicating to people their worth and potential so clearly that they are inspired to see it in themselves.&lt;/p>
&lt;/blockquote>
&lt;hr />
&lt;h2 id="summary">Summary&lt;/h2>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/OqmdLcyES_Q"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;p>David Marquet talks about leadership that turns the ship around in his keynote at the Worldwebforum.&lt;/p>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/ivwKQqf4ixA"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>The Catcher in the Rye</title><category term="fiction" scheme="https://chemaclass.com/tags/fiction/" label="Fiction"/><category term="psychology" scheme="https://chemaclass.com/tags/psychology/" label="Psychology"/><category term="philosophy" scheme="https://chemaclass.com/tags/philosophy/" label="Philosophy"/><published>2021-08-08T00:00:00+00:00</published><updated>2021-08-08T00:00:00+00:00</updated><author><name>
J. D. Salinger</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/the-catcher-in-the-rye/"/><id>https://chemaclass.com/readings/the-catcher-in-the-rye/</id><summary type="html">The novel is a deeper reflection of Salinger's own youth, his complicated relationship with growing up and the generational trauma affected by World War II.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>It was originally intended for adults but is often read by adolescents for its themes of angst, alienation, and as a
critique on superficiality in society.&lt;/p>
&lt;p>The novel is a deeper reflection of Salinger’s own youth, his complicated relationship with growing up and the
generational trauma affected by World War II.&lt;/p>
&lt;p>Undeniably autobiographical, Salinger drew on his personal experiences fighting in the war and his New York creating the
character of &lt;strong>Holden Caulfield&lt;/strong>.&lt;/p>
&lt;p>The novel’s protagonist has become an icon for teenage rebellion. The novel also deals with complex issues of innocence,
identity, belonging, loss, connection, sex, and depression.&lt;/p>
&lt;p>From chapter 22:&lt;/p>
&lt;blockquote>
&lt;p>— “You don’t like anything that’s happening.” It made me even more depressed when she said that.&lt;/p>
&lt;p>— “Yes I do. Yes I do. Sure I do. Don’t say that. Why the hell do you say that?”&lt;/p>
&lt;p>— “Because you don’t. You don’t like any schools. You don’t like a million things. You don’t.”&lt;/p>
&lt;p>— “I do! That’s where you’re wrong—that’s exactly where you’re wrong! Why the hell do you have to say that?” I said. Boy, was she depressing me.&lt;/p>
&lt;p>— “Because you don’t,” she said. “Name one thing.”&lt;/p>
&lt;p>— “One thing? One thing I like?” I said. “Okay.”&lt;/p>
&lt;p>The trouble was, I couldn’t concentrate too hot. Sometimes it’s hard to concentrate.&lt;/p>
&lt;/blockquote>
&lt;h2 id="summary">Summary&lt;/h2>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/WSq-WQgKnyE"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>Test-Driven (Development)</title><subtitle>What is challenging about it?</subtitle><category term="tdd" scheme="https://chemaclass.com/tags/tdd/" label="Tdd"/><category term="testing" scheme="https://chemaclass.com/tags/testing/" label="Testing"/><category term="software-design" scheme="https://chemaclass.com/tags/software-design/" label="Software Design"/><category term="refactoring" scheme="https://chemaclass.com/tags/refactoring/" label="Refactoring"/><published>2021-08-01T00:00:00+00:00</published><updated>2021-08-01T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/test-driven-development/"/><id>https://chemaclass.com/blog/test-driven-development/</id><summary type="html">TDD is a design practice, not just a testing technique. Writing tests first changes how you think about code and shape its structure.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2021-08-01/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>The complexity here is not about writing tests itself, but the habits that we have to change to create software that is
easy to be tested.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h2 id="the-root-of-the-problem">The root of the problem&lt;/h2>
&lt;p>Without (a solid) experience in testing, developers can have a hard time while trying to apply testing in general as
part of their daily job. It’s not simply because of the topic’s complexity, but &lt;strong>because they are used to write
code that is hard to test.&lt;/strong>&lt;/p>
&lt;p>Writing tests for already working software (mainly when it was done without considering testing at all) translates as
something boring, next to useless, usually accompanied by a lack of motivation, blaming the wrong subject in this
context: “the tests itself are reducing my speed”.&lt;/p>
&lt;blockquote>
&lt;p>In a domain context, if a piece of software logic is hard to be tested, the problem is not the test, but the code which wasn’t well written.&lt;/p>
&lt;/blockquote>
&lt;p>There are already hundreds of tutorials, books, and documentation about testing, but I can share my experience and how I
do apply this great (and mandatory) philosophy in my daily work.&lt;/p>
&lt;h3 id="test-driven-is-based-on-this-simple-rule">Test-Driven is based on this simple rule&lt;/h3>
&lt;ul>
&lt;li>Instead of: design code -&amp;gt; develop code -&amp;gt; write tests.&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="/images/blog/2021-08-01/non-tdd-style.png" alt="non-tdd-style" />&lt;/p>
&lt;ul>
&lt;li>It’s about: write failing automated test -&amp;gt; run failing test -&amp;gt; develop code to make test pass -&amp;gt; run test -&amp;gt; repeat.&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="/images/blog/2021-08-01/tdd-style.png" alt="tdd-style" />&lt;/p>
&lt;p>The idea of driving your code by testing can be understood depending on the abstraction level of what you’re writing at
the moment. You don’t want to create a wrong coupling between the tests and the code being tested. You want to test the
behavior of your logic.&lt;/p>
&lt;p>TDD is based on a loop of baby steps that helps you find &lt;strong>patterns&lt;/strong> and guide your software design every little iteration
with &lt;strong>constant refactorings&lt;/strong>. It’s the best choice if you want to ensure the expected behavior of all possible paths of
your logic.&lt;/p>
&lt;p>The beauty of this is that you don’t need to know the full algorithm from the very beginning. Instead, you are
&lt;strong>discovering&lt;/strong> how your logic should be by expressing the desired implementation, step by step, on automated tests.&lt;/p>
&lt;p>Considering writing tests for your software at the same time you’re writing it, will &lt;strong>irremediably force you to write
better software&lt;/strong>. Because you want to write software which has to be easy to be tested, and therefore it will end up with
higher quality.&lt;/p>
&lt;blockquote>
&lt;p>I already wrote another post about the relation between software &lt;strong>quality and testing&lt;/strong>: &lt;a href="/blog/the-art-of-testing/">The Art of Testing: where design meets quality&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;h2 id="improve-your-test-driven-skills">Improve your Test-Driven skills&lt;/h2>
&lt;p>&lt;img src="/images/blog/2021-08-01/tdd-style-with-git.png" alt="tdd-style" />&lt;/p>
&lt;p>The best way to learn Test-Driven is doing software katas. Try them alone and with others. Both are equally important.&lt;/p>
&lt;ul>
&lt;li>Alone: to challenge your inner self without any distraction but yourself.&lt;/li>
&lt;li>With others: pair-programming is essential in our job. Katas are the best tools to train our communication skills and
learn together from each other.&lt;/li>
&lt;/ul>
&lt;h3 id="what-s-a-code-kata">What’s a Code Kata?&lt;/h3>
&lt;p>Software developers don’t practice enough. Most of our learning takes place on the job, which means that most of our
mistakes get made there as well.&lt;/p>
&lt;p>Other creative professions practice: musicians play technical pieces, poets constantly rewrite works. In karate, most of
a student’s time is spent learning and refining basic moves. These are katas.&lt;/p>
&lt;h3 id="what-is-the-goal-of-a-kata-what-should-we-have-at-the-end">What is the goal of a kata? What should we have at the end?&lt;/h3>
&lt;p>Katas exist to help developers get the same benefits as practicing in any other profession. There are simple, artificial
exercises that let you experiment and learn without the pressure of a production environment.&lt;/p>
&lt;blockquote>
&lt;p>There are no right or wrong answers in any software kata: the benefit comes from the process, not from the result.&lt;/p>
&lt;/blockquote>
&lt;h3 id="tips">Tips&lt;/h3>
&lt;ul>
&lt;li>Once you have resolved a kata, try it again in a few weeks or months.&lt;/li>
&lt;li>Try to explore new solutions. Be creative in the process and do not rush.&lt;/li>
&lt;li>When doing them in groups, they are not a competition to see who will accomplish more of the exercise.&lt;/li>
&lt;li>The focus should be on the process, never on the result.&lt;/li>
&lt;li>The true valuable outcome of any kata is the learnings that you (and your team) will get after talking about it and
sharing your experiences.&lt;/li>
&lt;/ul>
&lt;p>You can find a lot of katas on the Internet. For example:&lt;/p>
&lt;ul>
&lt;li>&lt;a rel="external" href="http://codekata.com">http://codekata.com&lt;/a>&lt;/li>
&lt;li>&lt;a rel="external" href="https://codingdojo.org/kata">https://codingdojo.org/kata&lt;/a>&lt;/li>
&lt;li>&lt;a rel="external" href="https://github.com/gamontal/awesome-katas">https://github.com/gamontal/awesome-katas&lt;/a>&lt;/li>
&lt;/ul>
&lt;hr />
&lt;h3 id="tdd-is-more-as-a-workflow-than-a-design">TDD is more as a workflow than a design&lt;/h3>
&lt;blockquote>
&lt;p>“TDD is a design tool.” That’s what Sandro has said for years. But not anymore. After working with different teams and in different organisations, and also carefully inspecting how he works, Sandro changed his mind about the role of TDD in software design.&lt;/p>
&lt;/blockquote>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/KyFVA4Spcgg"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;p>TDD in a nutshell; it’s about the rhythm.&lt;/p>
&lt;ol>
&lt;li>Specify what you want.&lt;/li>
&lt;li>Make it work.&lt;/li>
&lt;li>Make it better.&lt;/li>
&lt;/ol>
&lt;hr />
&lt;h2 id="kent-beck">Kent Beck&lt;/h2>
&lt;blockquote class="twitter-tweet">&lt;p lang="en" dir="ltr">1. Change the code as usual&lt;br>2. Write a test that only passes after the change&lt;br>3. Revert to before 1&lt;br>4. Type the test again (copy/paste is cheating &amp;amp; invalidates the warranty of the exercise)&lt;br>5. Make it compile by changing the code&lt;br>6. See it fail&lt;br>7. Change the code to make it pass&lt;/p>&amp;mdash; Kent Beck 🌻 (@KentBeck) &lt;a href="https://twitter.com/KentBeck/status/1421257650113634304?ref_src=twsrc%5Etfw">July 30, 2021&lt;/a>&lt;/blockquote> &lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8">&lt;/script>
&lt;hr />
&lt;p>Images original by &lt;a rel="external" href="https://x.com/evrtrabajo">Emmanuel Valverde Ramos&lt;/a>.&lt;/p></content></entry><entry xml:lang="en"><title>Lord of the Flies</title><category term="fiction" scheme="https://chemaclass.com/tags/fiction/" label="Fiction"/><category term="psychology" scheme="https://chemaclass.com/tags/psychology/" label="Psychology"/><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><category term="philosophy" scheme="https://chemaclass.com/tags/philosophy/" label="Philosophy"/><published>2021-07-10T00:00:00+00:00</published><updated>2021-07-10T00:00:00+00:00</updated><author><name>
William Golding</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/lord-of-the-flies/"/><id>https://chemaclass.com/readings/lord-of-the-flies/</id><summary type="html">Labeled a parable, an allegory, a myth, a morality tale, a parody, a political treatise, even a vision of the apocalypse. It has established itself as a true classic. The book focuses on a group of British boys stranded on an uninhabited island, and their disastrous attempt to govern themselves.</summary><content type="html">&lt;p>Labeled a parable, an allegory, a myth, a morality tale, a parody, a political treatise, even a vision of the
apocalypse. It has established itself as a true classic.&lt;/p>
&lt;p>The book focuses on a group of British boys stranded on an uninhabited island, and their disastrous attempt to govern
themselves.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>Themes include the tension between groupthink and individuality, between rational and emotional reactions,
and between morality and immorality.&lt;/p>
&lt;p>The first chapters start slowly, but they are necessary to build up the context of the story, which scales pretty
quickly later on.&lt;/p>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/NnnZ6y1HPqI"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>Responsibilities of a Tech Lead</title><subtitle>It's not a promotion. It's a role change.</subtitle><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><category term="mentoring" scheme="https://chemaclass.com/tags/mentoring/" label="Mentoring"/><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><published>2021-07-01T00:00:00+00:00</published><updated>2021-07-01T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/tech-lead/"/><id>https://chemaclass.com/blog/tech-lead/</id><summary type="html">The Trident Career Model by Patrick Kua has three tracks. Each track represents where people spend most of their time or energy.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2021-07-01/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>The Trident Career Model by Patrick Kua has three tracks. Each track represents where people spend most of their time or
energy.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h2 id="archetypal-story">Archetypal Story&lt;/h2>
&lt;h3 id="individual-contributor">Individual Contributor&lt;/h3>
&lt;ul>
&lt;li>70–80% time spent on “Executing, doing”.&lt;/li>
&lt;li>Designing. Testing. Coding.&lt;/li>
&lt;/ul>
&lt;h3 id="management">Management&lt;/h3>
&lt;ul>
&lt;li>70–80% time spent on “Managing the system”.&lt;/li>
&lt;li>Planning. Organizing. Supporting. Budgeting.&lt;/li>
&lt;/ul>
&lt;h3 id="technical-leader">Technical Leader&lt;/h3>
&lt;ul>
&lt;li>70–80% time spent on “Leading Technical Topics &amp;amp; Teams”.&lt;/li>
&lt;li>Aligning Team. Technical Vision. Growing Tech Knowledge. Tech Risk &amp;amp; Tech Debt Management.&lt;/li>
&lt;/ul>
&lt;p>What is a Tech Lead?&lt;/p>
&lt;blockquote>
&lt;p>“A Tech Lead is a software engineer, responsible for leading a development team, and responsible for the quality of its technical deliverables.” (&lt;a rel="external" href="https://www.patkua.com/blog/the-definition-of-a-tech-lead/">source&lt;/a>)&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="/images/blog/2021-07-01/responsibilities.jpg" alt="blog-img" />&lt;/p>
&lt;h2 id="a-tech-lead-is-a-developer-who-is-a-leader">A Tech Lead is a Developer who is a Leader&lt;/h2>
&lt;p>A good leader is making sure that the team is moving in the same direction. The team moves further altogether, rather
than simply people who are working “together”.&lt;/p>
&lt;h2 id="leadership-skills-to-invest-in">Leadership skills to invest in&lt;/h2>
&lt;ul>
&lt;li>Empathy&lt;/li>
&lt;li>Self-Awareness&lt;/li>
&lt;li>Motivation&lt;/li>
&lt;li>Conflict Resolution&lt;/li>
&lt;li>Communication&lt;/li>
&lt;li>Coaching&lt;/li>
&lt;li>Feedback&lt;/li>
&lt;li>Influencing&lt;/li>
&lt;li>Delegation&lt;/li>
&lt;/ul>
&lt;p>The Tech Lead role is a leadership position, not necessarily a management position.&lt;/p>
&lt;h2 id="surprises-struggle">Surprises &amp;amp; Struggle&lt;/h2>
&lt;ul>
&lt;li>Feeling Alone: “Outsider”. Different role. Shield/Filter.&lt;/li>
&lt;li>Uncertainty: No right answer. Binary habit. Imperfect information.&lt;/li>
&lt;li>People are puzzling: Unique. Different Strengths. Archetypes.&lt;/li>
&lt;/ul>
&lt;h2 id="a-great-tech-lead">A Great Tech Lead&lt;/h2>
&lt;p>A great Tech Leader is really focusing on developing others, so the team will get better capabilities.&lt;/p>
&lt;h3 id="tell-or-delegate">Tell or Delegate?&lt;/h3>
&lt;p>The goal is to reach a complete delegation, step by step. It’s about starting to shift responsibilities to other people,
so they grow as well. It can also depend on the skills, motivations, and urgency of the task.&lt;/p>
&lt;p>&lt;img src="/images/blog/2021-07-01/leadership-model.jpg" alt="blog-img" />&lt;/p>
&lt;blockquote>
&lt;p>“Nobody is perfect, but a team can be.” - Meredith Belbin&lt;/p>
&lt;/blockquote>
&lt;h2 id="key-points">Key points&lt;/h2>
&lt;ul>
&lt;li>Tech Lead is a role change.&lt;/li>
&lt;li>It requires leadership skills.&lt;/li>
&lt;li>Others have been on this journey.&lt;/li>
&lt;li>There are many resources available.&lt;/li>
&lt;li>Move from maker mode to multiplier.&lt;/li>
&lt;/ul>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/F81W-JcRgXM"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;hr />
&lt;h2 id="recommended-books-on-this-field">Recommended books on this field&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="/readings/xp-embrace-change/">Extreme Programming&lt;/a>&lt;/li>
&lt;li>&lt;a href="/readings/manager-path/">The Manager’s Path&lt;/a>&lt;/li>
&lt;li>&lt;a href="/readings/the-art-of-leadership/">The art of Leadership&lt;/a>&lt;/li>
&lt;li>&lt;a href="/readings/peopleware">Peopleware&lt;/a>&lt;/li>
&lt;li>&lt;a href="/readings/high-output-management/">High Output Managment&lt;/a>&lt;/li>
&lt;li>&lt;a href="/readings/become-an-effective-software-engineering-manager">Become an Effective Software Engineering Manager&lt;/a>&lt;/li>
&lt;/ul>
&lt;hr />
&lt;h2 id="references">References&lt;/h2>
&lt;ul>
&lt;li>&lt;a rel="external" href="https://www.thekua.com/atwork/2019/02/the-trident-model-of-career-development/">The Trident Model of Career Development&lt;/a>&lt;/li>
&lt;li>&lt;a rel="external" href="https://www.thekua.com/atwork/2015/06/tech-lead-circles-of-responsibility/">Tech Lead – Circles of Responsibility&lt;/a>&lt;/li>
&lt;/ul></content></entry><entry xml:lang="en"><title>Become an Effective Software Engineering Manager</title><subtitle>How to Be the Leader Your Development Team Needs</subtitle><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><category term="career" scheme="https://chemaclass.com/tags/career/" label="Career"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><published>2021-06-27T00:00:00+00:00</published><updated>2021-06-27T00:00:00+00:00</updated><author><name>
James Stanier</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/effective-software-em/"/><id>https://chemaclass.com/readings/effective-software-em/</id><summary type="html">A great compilation of all topics that are important for management: 1:1s, performance reviews, hiring and laying off, workplace politics, remote work, and others.</summary><content type="html">&lt;p>A great compilation of all topics that are important for management: 1:1s, performance reviews, hiring and laying off,
workplace politics, remote work, and others.&lt;/p>
&lt;p>The book is divided into 3 parts: the first part covers things a new manager should know, the second and third parts go
into topics that all managers should master.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>Although I kept nodding along with the bits of advice, I sometimes felt it was too “wordy” or going into too many
details that I wasn’t interested in. That said, I kept moving forward, and I am glad that I finished it, gathering a lot
of useful tips.&lt;/p>
&lt;hr />
&lt;p>My takeaways from this book:&lt;/p>
&lt;h2 id="part-1-getting-oriented">Part 1 - Getting Oriented&lt;/h2>
&lt;h3 id="chapter-01-a-new-adventure">Chapter 01: A New Adventure&lt;/h3>
&lt;ul>
&lt;li>Practical advice on things to do the first week and finding misalignment signals on your first week.&lt;/li>
&lt;/ul>
&lt;h3 id="chapter-02-manage-yourself-first">Chapter 02: Manage Yourself First&lt;/h3>
&lt;ul>
&lt;li>A good reminder of how getting your things an order comes first - this is a pre-requisite to you being efficient, as a
manager.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>“Your calendar it is both for you and other people to use. Keep it tidy and meaningful. It represents you. Making meetings public by default can help others reason better about how to schedule time with you.”&lt;/p>
&lt;/blockquote>
&lt;h2 id="part-2-working-with-individuals">Part 2 - Working with Individuals&lt;/h2>
&lt;h3 id="chapter-03-interfacing-with-humans">Chapter 03: Interfacing with Humans&lt;/h3>
&lt;ul>
&lt;li>This chapter covers a lot of ground on how to communicate with others.&lt;/li>
&lt;li>Think twice before broadcasting information.&lt;/li>
&lt;li>Be consistent in your communications style.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>“Don’t communicate when you want to, but when you need to.”&lt;/p>
&lt;/blockquote>
&lt;h3 id="chapter-04-one-to-ones">Chapter 04: One-to-Ones&lt;/h3>
&lt;ul>
&lt;li>It’s their meeting, not yours.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>“Try to get your direct reports to do 70% of the talking. If you feel like solving their problem for them, don’t. Ask another question and let them arrive at the conclusion themselves. This is an art that takes some practice.”&lt;/p>
&lt;/blockquote>
&lt;h3 id="chapter-05-the-right-job-for-the-person">Chapter 05: The Right Job for the Person&lt;/h3>
&lt;ul>
&lt;li>Motivation and the hierarchy of needs. Developing skills with some practical examples on doing so.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>“However, as their manager, you can work with them to place these career achievements at the bottom of their skill tree, and then plan out the milestones along the way that they can aim for to make measurable progress. Thus pushing the frontier of their zone of proximal development further and further.”&lt;/p>
&lt;/blockquote>
&lt;h3 id="chapter-06-the-most-wonderful-time-of-the-year-performance-reviews">Chapter 06: The Most Wonderful Time of the Year (Performance Reviews)&lt;/h3>
&lt;ul>
&lt;li>Preparing for performance reviews ahead of time. Getting peer feedback, and doing this via email, for example.&lt;/li>
&lt;/ul>
&lt;h3 id="chapter-07-join-us-hiring">Chapter 07: Join Us! (Hiring)&lt;/h3>
&lt;ul>
&lt;li>The case for not needing the most senior candidate.&lt;/li>
&lt;li>Culture fit.&lt;/li>
&lt;li>Setting up an interview process.&lt;/li>
&lt;/ul>
&lt;h3 id="chapter-08-game-over-attrition">Chapter 08: Game Over (Attrition)&lt;/h3>
&lt;ul>
&lt;li>People leaving is normal.&lt;/li>
&lt;li>Voluntary resignations that are:
&lt;ul>
&lt;li>“good reasons”, aka you could have not done much about it.&lt;/li>
&lt;li>“bad reasons”, that is you could have caught (and addressed) things early like coworker conflict, lack of
challenge, compensation.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>“As a manager, you are doomed to failure if you think that you are going to keep everyone in your current team indefinitely. […]
You should never fight to keep staff if you cannot actually provide the conditions under which they can become happier than they already are. You’ll just defer their departure.”&lt;/p>
&lt;/blockquote>
&lt;h3 id="chapter-09-how-to-win-friends-and-influence-people-being-well-connected">Chapter 09: How to win friends and influence people (Being well-connected)&lt;/h3>
&lt;ul>
&lt;li>Building your network . Making introductions, checking in with others.&lt;/li>
&lt;li>Coaching and mentoring.&lt;/li>
&lt;/ul>
&lt;h2 id="part-3-the-bigger-picture">Part 3 - The Bigger Picture&lt;/h2>
&lt;h3 id="chapter-10-humans-are-hard">Chapter 10: Humans are Hard&lt;/h3>
&lt;ul>
&lt;li>Working harder or faster isn’t what you should be focusing on. Instead, you should be creating the conditions that
make your staff happy and productive through nurturing their autonomy, mastery, and purpose.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>“At more senior levels, During bad times, you will get the fingers pointed at you as you are fundamentally accountable, even though it may have not been your fault.”&lt;/p>
&lt;/blockquote>
&lt;h3 id="chapter-11-projects-are-hard">Chapter 11: Projects are Hard&lt;/h3>
&lt;ul>
&lt;li>“The eye off Sauron” - working on high-stakes projects.&lt;/li>
&lt;li>Things slowing down as the team is growing. More (legacy) code, more problems to deal with.&lt;/li>
&lt;li>Scope, resources and time balance.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>“Lead from the front: As a leader, you need to set the example for the rest of the team. Put in the work. The hardest projects can become career-defining moments. Own them and be there.”&lt;/p>
&lt;/blockquote>
&lt;h3 id="chapter-12-the-information-stock-exchange">Chapter 12: The Information Stock Exchange&lt;/h3>
&lt;ul>
&lt;li>Spies and gatekeepers.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>“As a manager, you will be required to make regular decisions about how much you should share with other staff and when.”&lt;/p>
&lt;/blockquote>
&lt;ul>
&lt;li>Workplace politics.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>“In workplace politics, your network of peers is important as it allows you to be more broadly informed about how the wider business feels about your own initiatives and priorities.”&lt;/p>
&lt;/blockquote>
&lt;h3 id="chapter-13-letting-go-of-control">Chapter 13: Letting Go of Control&lt;/h3>
&lt;ul>
&lt;li>Remove distractions and recharge properly outside work.&lt;/li>
&lt;li>Use 10% of your time each week to do nothing and let your thoughts emerge.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>“Let go of outcomes that you cannot control. Be accepting of trying your best, and encourage the same behavior in your staff. Unpredictable results are normal. Failure is acceptable. As long as you are trying your best, and you are enabling your team to try your best, then you have nothing to worry about.”&lt;/p>
&lt;/blockquote>
&lt;h3 id="chapter-14-good-housekeeping">Chapter 14: Good Housekeeping&lt;/h3>
&lt;ul>
&lt;li>Turn problems into learning opportunities.&lt;/li>
&lt;li>Work on improving the team communication.&lt;/li>
&lt;/ul>
&lt;h3 id="chapter-15-dual-ladders">Chapter 15: Dual Ladders&lt;/h3>
&lt;ul>
&lt;li>Designing an Individual Contributor and Manager track is vital to a healthy engineering organization culture.&lt;/li>
&lt;/ul>
&lt;h3 id="chapter-16-the-modern-workplace">Chapter 16: The Modern Workplace&lt;/h3>
&lt;ul>
&lt;li>Diversity and inclusion.&lt;/li>
&lt;li>Remote working.&lt;/li>
&lt;li>Lead by example: work-life-balance.&lt;/li>
&lt;/ul>
&lt;h3 id="chapter-17-startups">Chapter 17: Startups&lt;/h3>
&lt;ul>
&lt;li>Management doesn’t mean bureaucracy.&lt;/li>
&lt;li>Good management is a light touch and continued collaboration.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>“Remember that start-up experience is highly sought after because being impactful in that environment involves being enterprising, self-motivated, collaborative, and quick to learn. Even if the start-up itself doesn’t work out, your next gig will be all the better for it.”&lt;/p>
&lt;/blockquote>
&lt;h3 id="chapter-18-the-crystal-ball">Chapter 18: The Crystal Ball&lt;/h3>
&lt;ul>
&lt;li>Your career vision. Looking back, looking ahead.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>“An important part of a long and fulfilling life is purpose. Purpose is not about economic status or feeling well-being. It’s about a life worth living.”&lt;/p>
&lt;/blockquote>
&lt;hr />
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/Cf6tX1ZPwvE"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>Conformity Experiments</title><subtitle>The uncomfortable truth about human nature</subtitle><category term="psychology" scheme="https://chemaclass.com/tags/psychology/" label="Psychology"/><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><published>2021-06-01T00:00:00+00:00</published><updated>2021-06-01T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/conformity-experiments/"/><id>https://chemaclass.com/blog/conformity-experiments/</id><summary type="html">To what extent do social forces alter people's opinions? Which aspect of the group influence is most important — the size of the majority, or the unanimity of opinion?</summary><content type="html">&lt;p>&lt;img src="/images/blog/2021-06-01/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>To what extent do social forces alter people’s opinions? Which aspect of the group influence is most important — the size of the majority, or the unanimity of opinion?&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h1 id="the-psychologist-solomon-asch">The psychologist Solomon Asch&lt;/h1>
&lt;p>During the early years of World War II, when Hitler was at the height of power, Solomon Asch began studying the impact of propaganda and indoctrination while he was a professor at Brooklyn College’s psychology department. He also was a professor for 19 years at Swarthmore College.&lt;/p>
&lt;p>During the 1950s, Asch became famous for his series of experiments that demonstrated the effects of social pressure on conformity. How far would people go to conform to others in a group? Asch’s research demonstrated that participants were surprisingly likely to conform to a group, even when they personally believed that the group was incorrect.&lt;/p>
&lt;h2 id="asch-asked">Asch asked&lt;/h2>
&lt;p>To what extent do social forces alter people’s opinions?
Which aspect of the group influence is most important — the size of the majority, or the unanimity of opinion?&lt;/p>
&lt;blockquote>
&lt;p>Asch believed that people behave according to how they perceive the world, not to how it actually is.&lt;/p>
&lt;/blockquote>
&lt;h2 id="the-asch-experiment">The Asch experiment&lt;/h2>
&lt;p>Asch used an experiment to study conformity based on a “simple vision test”.&lt;/p>
&lt;p>Using a line judgment task, Asch put a naive participant in a room with other confederates/stooges. The confederates had agreed in advance what their responses were going to be when presented with the line task. Giving intentionally the same wrong answer most of the time.&lt;/p>
&lt;p>The real participant didn’t know this and was led to believe that the other people were also real participants like himself.&lt;/p>
&lt;p>Each person in the room had to state aloud which comparison line (A, B, or C) was most like the target line. The answer was always obvious. The real participant sat at the end of the row and gave his answer last.&lt;/p>
&lt;p>Asch was interested to see if the real participant would conform to the majority view. The confederates gave the wrong answer most of the time (known as critical trials).&lt;/p>
&lt;h2 id="findings">Findings&lt;/h2>
&lt;p>Nearly 75% of the participants in the conformity experiments went along with the rest of the group at least one time.&lt;/p>
&lt;p>Asch also found that having one of the confederates give the correct answer while the rest of the confederates gave the incorrect answer dramatically lowered conformity, which means that having social support is an important tool in combating conformity.&lt;/p>
&lt;blockquote>
&lt;p>After combining the trials, the results indicated that participants conformed to the incorrect group answer approximately one-third of the time.&lt;/p>
&lt;/blockquote>
&lt;h2 id="conclusion">Conclusion&lt;/h2>
&lt;p>Why did the participants conform so easily? When they were interviewed after the experiment, most of them said that they did not really believe their conforming answers, but had gone along with the group for fear of being ridiculed.&lt;/p>
&lt;p>A few of them said that they really did believe the group’s answers were correct.&lt;/p>
&lt;p>Apparently, people conform for two main reasons: because they want to fit in with the group (normative influence) and because they believe the group is better informed than they are (informational influence).&lt;/p>
&lt;blockquote>
&lt;p>Conformity can be influenced both by a need to fit in and a belief that other people are smarter or better informed.&lt;/p>
&lt;/blockquote>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/TYIh4MkcfJA"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;h2 id="factors-that-influence-conformity">Factors that influence conformity&lt;/h2>
&lt;p>Asch went on to conduct further experiments in order to determine which factors influenced, and how and when people conform. He found that:&lt;/p>
&lt;ul>
&lt;li>Conformity tends to increase when more people are present.&lt;/li>
&lt;li>Conformity also increases when the task becomes more difficult.&lt;/li>
&lt;li>Conformity increases when other members of the group are of a higher social status.&lt;/li>
&lt;li>Conformity tends to decrease, however, when people are able to respond privately (i.e., when the group can’t know the naive participants’ answers).&lt;/li>
&lt;/ul>
&lt;hr />
&lt;h3 id="resources">Resources&lt;/h3>
&lt;ul>
&lt;li>&lt;a rel="external" href="https://en.wikipedia.org/wiki/Solomon_Asch">Solomon Asch | Wikipedia&lt;/a>&lt;/li>
&lt;/ul></content></entry><entry xml:lang="en"><title>Peopleware</title><subtitle>Productive Projects and Teams</subtitle><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><category term="productivity" scheme="https://chemaclass.com/tags/productivity/" label="Productivity"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><category term="psychology" scheme="https://chemaclass.com/tags/psychology/" label="Psychology"/><published>2021-05-28T00:00:00+00:00</published><updated>2021-05-28T00:00:00+00:00</updated><author><name>
Tom DeMarco</name></author><author><name>
Timothy Lister</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/peopleware/"/><id>https://chemaclass.com/readings/peopleware/</id><summary type="html">Software development is about people: when, how and where they can best work together. Not about programming languages or tools. Not about fast computers, networks or internet access.</summary><content type="html">&lt;p>Software development is about people: when, how and where they can best work together. Not about programming languages
or tools. Not about fast computers, networks or internet access.&lt;/p>
&lt;p>Soft skills are truly important in IT, more than people tend to think.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>Developing software is about people that communicate with their
customers and stakeholders, are supported by their managers and collaborate in teams.&lt;/p>
&lt;h3 id="some-of-my-favourite-quotes-from-this-book">Some of my favourite quotes from this book&lt;/h3>
&lt;ul>
&lt;li>
&lt;p>Staying late or arriving early is a damaging indictment of the office environment.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Someone who can help a project to take solid form and progress is worth two people who just do work.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>People should be asking and wondering why things are getting done the way they are being done.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>There must be always a trade between quality and quantity.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Organisations tend to expand and create a “busy day”, creating a lot of meetings rather than trust their employees to self-organize.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>The human elements are usually the bottleneck of a project.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>People won’t work harder if you put them under pressure. They might work more for some time, but they will also get overburden and leave.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Managers’ real role is to make it possible for people to work, rather than forcing them to.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Anything you need to quantify can be measured in any way that it’s superior to not measuring at all.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>The ultimate management sin is wasting people’s time.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Change won’t even get started unless people feel safe.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Change only has a chance of succeeding if failure (at least a little of failure) is also okay.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Experience gets turned into learning when an organization alters itself to take account of what experience has shown.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>Professionals want to develop themselves, and want to be happy at work. This book provides ideas in what managers and
developers can do to address these and other similar topics. If you are concerned with people, and looking for ways to
improve how you collaboratively develop and deliver software, then this book is for you.&lt;/p>
&lt;hr />
&lt;blockquote>
&lt;ol start="21">
&lt;li>The Whole Is Greater Than the Sum of the Parts&lt;/li>
&lt;/ol>
&lt;p>We tend to use the word team fairly loosely in the business world, calling any group of people assigned to work
together a “team.” But many of these groups just don’t seem like teams. They don’t have a common definition
of success or any identifiable team spirit. Something is missing. What is missing is a phenomenon we call jell.&lt;/p>
&lt;p>Concept of the Jelled Team&lt;/p>
&lt;p>A jelled team is a group of people so strongly knit that the whole is greater than the sum of the parts.
The production of such a team is greater than that of the same people working in unjelled form. Just as important,
the enjoyment that people derive from their work is greater than what you’d expect given the nature of the work itself.&lt;/p>
&lt;/blockquote>
&lt;hr />
&lt;p>I found also a nice serie that shares some thoughts over each chapter of this book.&lt;/p>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/dBQMorJBueE"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>Open-Source Software</title><subtitle>The power of contributing to OSS 🖥</subtitle><category term="open-source" scheme="https://chemaclass.com/tags/open-source/" label="Open Source"/><category term="git" scheme="https://chemaclass.com/tags/git/" label="Git"/><category term="career" scheme="https://chemaclass.com/tags/career/" label="Career"/><category term="productivity" scheme="https://chemaclass.com/tags/productivity/" label="Productivity"/><published>2021-05-03T00:00:00+00:00</published><updated>2021-05-03T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/open-source-software/"/><id>https://chemaclass.com/blog/open-source-software/</id><summary type="html">A practical guide to open-source software: its benefits, how to start contributing, and why sharing code accelerates your career growth.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2021-05-03/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>What is Open-Source Software (OSS)? What are their benefits? How can you start contributing to any OSS? Pet projects? Knowledge sharing? Why all of these?&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h2 id="what-is-oss">What is OSS?&lt;/h2>
&lt;p>OSS shares similarities with free software, but it’s not the same. Free software is a form of OSS, but that doesn’t necessarily mean that it has to be free. For example:&lt;/p>
&lt;ul>
&lt;li>&lt;a rel="external" href="https://github.com/sebastianbergmann/phpunit/blob/master/LICENSE">PHPUnit&lt;/a> is an example of OSS which is free.&lt;/li>
&lt;li>&lt;a rel="external" href="https://github.com/spryker/spryker-core/blob/master/LICENSE">Spryker&lt;/a> is an example of OSS which is not free.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>OSS is basically software that is public, open to the world.&lt;/p>
&lt;/blockquote>
&lt;h2 id="benefits">Benefits&lt;/h2>
&lt;h3 id="for-companies">For Companies&lt;/h3>
&lt;ul>
&lt;li>Adoption: the easier the access, the easier the adoption.&lt;/li>
&lt;li>Training and tutorials help the system to grow.&lt;/li>
&lt;li>Tech: often on the cutting edge of technology.
Tech moves fast. They will get obsolete if they don’t.&lt;/li>
&lt;li>Community: the people around want to improve as it grows.
Public channels enable easy access and community building.&lt;/li>
&lt;li>Trust: the software is public and accessible.
Everyone can check the quality of the software anytime.&lt;/li>
&lt;/ul>
&lt;h3 id="for-individual-contributors">For Individual Contributors&lt;/h3>
&lt;ul>
&lt;li>Flexibility: decide on what you want to work on.&lt;/li>
&lt;li>Self-confidence: the experience improves your skills.&lt;/li>
&lt;li>Training: without the pressure of a PROD environment.&lt;/li>
&lt;li>Tech: play with the latest features of your tech.
Try upcoming versions of your coding lang, or even try new ones!&lt;/li>
&lt;li>Soft skills: improve your communication skills.
Good communication in the project is important.
Especially when you face disagreements.&lt;/li>
&lt;/ul>
&lt;h2 id="contributing-to-oss">Contributing to OSS&lt;/h2>
&lt;h3 id="getting-started-with-github">Getting Started with GitHub&lt;/h3>
&lt;p>Nowadays, it’s really trivial to start contributing to OSS:&lt;/p>
&lt;ul>
&lt;li>You can start your own project. A pet project fits here perfectly!&lt;/li>
&lt;li>You can contribute to an existing OSS project.&lt;/li>
&lt;/ul>
&lt;h3 id="pet-projects">Pet Projects&lt;/h3>
&lt;p>A pet project is a playground to create software and train your professional skills. Creating pet projects in your public GitHub profile has all the benefits of contributing to OSS, plus you’re your own boss:&lt;/p>
&lt;ul>
&lt;li>You dictate the roadmap.&lt;/li>
&lt;li>You decide what to do and how.&lt;/li>
&lt;li>You’re your own boss.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>The project is there for you. &lt;br>
You are responsible to play, explore and pass your limits.&lt;/p>
&lt;/blockquote>
&lt;h3 id="my-pet-projects">My Pet Projects&lt;/h3>
&lt;p>&lt;strong>Active:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;a rel="external" href="https://github.com/Chemaclass/php-best-practices">php-best-practices&lt;/a>: what I consider best practices for web-dev.&lt;/li>
&lt;li>&lt;a rel="external" href="https://github.com/Chemaclass/php-scaffolding">php-scaffolding&lt;/a>: a basic PHP scaffolding with Docker.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Inactive:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;a rel="external" href="https://github.com/Chemaclass/stock-ticker">stock-ticker&lt;/a>: get a notification with the news from your favorites Tickers.&lt;/li>
&lt;li>&lt;a rel="external" href="https://github.com/Chemaclass/JiraStatusNotifier">jira-status-notifier&lt;/a>: Notify when the JIRA tickets don’t move along.&lt;/li>
&lt;li>&lt;a rel="external" href="https://github.com/Chemaclass/EdifactParser">edifact-parser&lt;/a>: a parser for a UN/EDIFACT file format in PHP.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Abandoned:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;a rel="external" href="https://github.com/Chemaclass/knob-mvc">knob-mvc&lt;/a>: a framework to create WordPress templates (2015/2017).&lt;/li>
&lt;/ul>
&lt;h3 id="my-oss-organization-contributions">My OSS Organization Contributions&lt;/h3>
&lt;p>&lt;strong>Active:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;a rel="external" href="https://github.com/phel-lang/phel-lang">phel-lang&lt;/a>: Phel is a functional programming language that compiles to PHP.
It is a dialect of Lisp inspired by Clojure and Janet. I already wrote a post about
this: &lt;a href="/blog/phel-first-release/">Phel: A Lisp that compiles to PHP&lt;/a>&lt;/li>
&lt;li>&lt;a rel="external" href="https://github.com/gacela-project/gacela">gacela-project&lt;/a>: Gacela is a PHP framework that helps you to improve the
design of your application by splitting the logic into different modules.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Abandoned:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;a rel="external" href="https://github.com/NuevaMetal/nm_template">nm_template&lt;/a>: The base template for NuevaMetal (2013–2016).&lt;/li>
&lt;/ul>
&lt;h2 id="knowledge-sharing-and-impact">Knowledge Sharing and Impact&lt;/h2>
&lt;h3 id="blog-posts">Blog Posts&lt;/h3>
&lt;ul>
&lt;li>Pull Requests vs Pair Programming&lt;/li>
&lt;li>The process itself is the goal&lt;/li>
&lt;li>The art of refactoring; When, How, and Why&lt;/li>
&lt;li>The art of testing: Where design meets quality&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>… and many more on &lt;a rel="external" href="https://chemaclass.com/blog/">https://chemaclass.com/blog/&lt;/a>&lt;/p>
&lt;/blockquote>
&lt;h3 id="the-beauty-of-oss">The Beauty of OSS&lt;/h3>
&lt;ul>
&lt;li>Seeing the corrections that you constantly keep doing&lt;/li>
&lt;li>Seeing how your own code gets old with time&lt;/li>
&lt;li>Seeing the many mistakes that you have done&lt;/li>
&lt;li>Seeing how you are getting better at coding over time&lt;/li>
&lt;/ul>
&lt;p>Developing a sixth sense to smell patterns which you have already done and their positive &amp;amp; negative experiences.&lt;/p>
&lt;p>&lt;strong>Showing your skills and helping the community around you.&lt;/strong>&lt;/p>
&lt;blockquote>
&lt;p>Open-Source Software offers you one of the best opportunities to start building your career path towards continuous improvement.&lt;/p>
&lt;/blockquote>
&lt;hr />
&lt;p>This is a (Spanish) talk that I did remotely on April 2021,
for &lt;a rel="external" href="https://www.meetup.com/phpmad/events/277733306/">PHPMad Madrid Community&lt;/a>. I basically present all these ideas
together with a live demo of how to contribute to a real OSS.&lt;/p>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/GE5wR_SC_P4"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;hr /></content></entry><entry xml:lang="en"><title>The Art of Leadership</title><subtitle>Small Things, Done Well</subtitle><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><category term="mentoring" scheme="https://chemaclass.com/tags/mentoring/" label="Mentoring"/><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><published>2021-04-19T00:00:00+00:00</published><updated>2021-04-19T00:00:00+00:00</updated><author><name>
Michael Loop</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/the-art-of-leadership/"/><id>https://chemaclass.com/readings/the-art-of-leadership/</id><summary type="html">Leadership practices are small things done repetitively over time. Managers tell you where you are, leaders tell you where you're going.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>&lt;h3 id="some-nice-keynotes">Some nice keynotes&lt;/h3>
&lt;ul>
&lt;li>Leadership practices are small things done repetitively over time.&lt;/li>
&lt;li>Empathy is a powerful skillset.&lt;/li>
&lt;li>The practice of one on ones is important in connecting to a team.&lt;/li>
&lt;li>Asking for feedback can build trust and relationships.&lt;/li>
&lt;li>Respond to feedback with a thank you and follow up comprehension questions.&lt;/li>
&lt;li>Feedback is a gift.&lt;/li>
&lt;li>It’s not personal, it’s professional.&lt;/li>
&lt;li>Leadership is an outfit that you choose to wear for others to see.&lt;/li>
&lt;li>Managers tell you where you are, leaders tell you where you’re going.&lt;/li>
&lt;li>Your peers become your allies.&lt;/li>
&lt;/ul>
&lt;hr />
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/Mf15xcXBedU"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>97 Things Every Engineering Manager should know</title><subtitle>Collective Wisdom from the Experts</subtitle><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><category term="mentoring" scheme="https://chemaclass.com/tags/mentoring/" label="Mentoring"/><published>2021-04-05T00:00:00+00:00</published><updated>2021-04-05T00:00:00+00:00</updated><author><name>
Camille Fournier</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/97-things-every-em-should-know/"/><id>https://chemaclass.com/readings/97-things-every-em-should-know/</id><summary type="html">As a manager your work is to create clarity, clarity, and more clarity.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>&lt;h3 id="the-main-takeaway">The main takeaway&lt;/h3>
&lt;blockquote>
&lt;p>As a manager your work is to create clarity, clarity, and more clarity.&lt;/p>
&lt;/blockquote>
&lt;h3 id="key-insights">Key Insights&lt;/h3>
&lt;ul>
&lt;li>As a manager, you need to fix your personal quirks.&lt;/li>
&lt;li>Consider doing experiments instead of making decisions.&lt;/li>
&lt;li>“Bad news test” - Given two tasks, which one would you rather be sharing bad news about? Delegate that task.&lt;/li>
&lt;li>On a struggling team, start by answering two questions:
&lt;ul>
&lt;li>How do I create clarity?&lt;/li>
&lt;li>How do I create capacity?&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Ask for clarification.&lt;/li>
&lt;li>To give constructive feedback, pay attention to how the person gets stuck, sidetracked or sloppy.&lt;/li>
&lt;li>Management is not a promotion. It is a career change.&lt;/li>
&lt;li>Most of the dysfunctions come from some lack of clarity goal.&lt;/li>
&lt;li>For a fixed deadline, scope and quality are always negotiable.&lt;/li>
&lt;li>Emotional contagion is real.&lt;/li>
&lt;li>As a new manager, listen and understand before you try to change something.&lt;/li>
&lt;li>Good interview questions:
&lt;ul>
&lt;li>What have you learned in the past six months?&lt;/li>
&lt;li>Tell me about the time when you failed and what you learned from that?&lt;/li>
&lt;li>Do you have the skills, expertise and experience to perform the job?&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Complains are good: they show that you are trusted.&lt;/li>
&lt;/ul>
&lt;hr />
&lt;p>Another blog post with way more detailed key insights:
&lt;a rel="external" href="https://danlebrero.com/2021/03/24/97-things-every-engineering-manager-should-know-summary/">Danlebrero Blog&lt;/a> ;)&lt;/p>
&lt;hr />
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/oxgfehnJ7GE"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>Pull Requests vs Pair Programming</title><subtitle>Why choosing when you can have both?</subtitle><category term="pair-programming" scheme="https://chemaclass.com/tags/pair-programming/" label="Pair Programming"/><category term="code-review" scheme="https://chemaclass.com/tags/code-review/" label="Code Review"/><category term="agile" scheme="https://chemaclass.com/tags/agile/" label="Agile"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><published>2021-04-01T00:00:00+00:00</published><updated>2021-04-01T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/pull-request-vs-pair-prog/"/><id>https://chemaclass.com/blog/pull-request-vs-pair-prog/</id><summary type="html">Let's talk about the benefits of Pull Requests and Pair Programming, and my thoughts on these after some years of experience with them.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2021-04-01/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>Let’s talk about the benefits of Pull Requests and Pair Programming, and my thoughts on these after some years of experience with them.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h2 id="pull-requests">Pull Requests&lt;/h2>
&lt;p>A Pull Request (PR) is basically a way of showing your suggested code changes such that they are easily comparable with the existing source code. This is part of a workflow that helps developers to share knowledge about the changes that are being done within the system.&lt;/p>
&lt;blockquote>
&lt;p>A Pull Request is the moment where you ask your peers to review and check out your code changes.&lt;/p>
&lt;/blockquote>
&lt;p>Usually, it’s also used:&lt;/p>
&lt;ol>
&lt;li>For discussions about code style.&lt;/li>
&lt;li>To spot potential bugs.&lt;/li>
&lt;li>For architectural or design discussions once the solution is done.&lt;/li>
&lt;/ol>
&lt;h3 id="pull-requests-aren-t-the-best-tool-for-everything">Pull Requests aren’t the best tool for everything&lt;/h3>
&lt;p>The main problem with these topics above is that PR’s are usually ready when the feature/bug is already being worked on and in the last stage of its development process.
It [a PR] is an “already changed proposal [I have already worked on this change, here’s the code] to be merged into the current system [someone please look it over]”.&lt;/p>
&lt;p>The concept of “Draft PR” exists to make explicit that a PR is not ready to be merged, so it’s still a “work in progress thing”, but that’s another topic.&lt;/p>
&lt;p>Pull Requests are, indeed, one of the best tools that we have in our industry to share knowledge about the changes that we are doing in the system, but sometimes they might be misused, as for example:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Discussions about code style&lt;/strong>. Code style shouldn’t be discussed in a PR. There should be already a CI running a code style checker, that’s all. If you want to talk about code style, request a change in your code style checker, but not in a random PR.&lt;/li>
&lt;li>&lt;strong>Spot bugs&lt;/strong>. Bugs and desired behavior should be covered by automated tests. The developer is the first responsible person for this topic.&lt;/li>
&lt;li>&lt;strong>Architectural or design discussions&lt;/strong>. Once a particular solution is developed and ready for review, it is usually really hard to “rollback” that idea and rewrite it again. Because “why would you do that? For some subjective opinion? It’s done already. And it seems to work just fine.”&lt;/li>
&lt;/ol>
&lt;p>Having an extra person looking at the changes that we have done for “designing decisions” might be beneficial, but we could have addressed “potential disagreements” in a sooner stage.&lt;/p>
&lt;h3 id="what-should-the-purpose-of-a-pull-request-be">What should the purpose of a Pull Request be?&lt;/h3>
&lt;ol>
&lt;li>Sharing knowledge about the proposed changes with the team.&lt;/li>
&lt;li>Ensuring the team aligns and agrees across the multiples changes that are getting submitted every day in order to keep a healthy direction for the project. Yes, this might include double-checking the outcome design, but… What if that is now too late? How could we solve all those issues?&lt;/li>
&lt;/ol>
&lt;h2 id="pair-programming">Pair Programming&lt;/h2>
&lt;p>The concept of “Pair Programming” can be understood from different points of view. Pair thinking and pair programming, driver-navigator roles concepts, or pure live coding from one side. Actually, this is way easier than it looks like at first instance:&lt;/p>
&lt;ul>
&lt;li>Either you watch and help the other person to write code,&lt;/li>
&lt;li>Or you type while getting another pair of eyes watching and helping you.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>Pair Programming helps the team to work together.&lt;/p>
&lt;/blockquote>
&lt;p>Pair programming is the joy of working with an extra brain and another pair of eyes, where the key is to &lt;strong>build a context&lt;/strong> where you two &lt;strong>share the same goal&lt;/strong> in order to find the &lt;strong>best possible solution&lt;/strong>. All of this while learning from each other every single second.
Pair Programming is not about developing the best solution at the very beginning. It’s about making it work, sharing ideas, and finding a better solution together. After that, you can refactor and clean the code.&lt;/p>
&lt;h3 id="pair-programming-is-a-continuous-code-review">Pair Programming is a continuous code review&lt;/h3>
&lt;p>Pull Requests are an asynchronous way to share code changes, while Pair Programming is totally &lt;strong>synchronous&lt;/strong> because it happens at the same time.&lt;/p>
&lt;p>That said, Pull Requests and Pair Programming aren’t mutually exclusive, they can coexist. They are tools, and we should wisely choose them in order to achieve our objectives.&lt;/p>
&lt;p>The most common fear that I saw while encouraging to do Pair Programming is that some people are shy and they don’t like to have other eyes around them while they are coding because of:&lt;/p>
&lt;ul>
&lt;li>Fear that they don’t know what to code or where to start.&lt;/li>
&lt;li>Fear that others will laugh at their solutions.&lt;/li>
&lt;li>Fear to don’t succeed in public.&lt;/li>
&lt;li>Fear to not be able to develop the expected solution for multiple reasons: misunderstanding the task or lack of knowledge.&lt;/li>
&lt;li>Fear to change your mind in front of others.&lt;/li>
&lt;li>Fear to discuss and make decisions loud.&lt;/li>
&lt;li>Fear of disagreeing with others.&lt;/li>
&lt;/ul>
&lt;h2 id="after-several-years-of-experience-on-this-topic">After several years of experience on this topic&lt;/h2>
&lt;p>The pattern which rejects Pair Programing is basically “fear”, and being out of your comfort zone. And this is due to the misunderstanding of the roots of the actual Pair Programming concept.&lt;/p>
&lt;p>Pair Programming is not “to show off in front of your colleagues” or “to be screwed by your peers”, but to be transparent (showing your skills as they really are) and improve as a team lifting up each other.&lt;/p>
&lt;p>Programming is an iterative process that needs a continuous refactoring of our way of thinking in order to achieve better solutions, day by day. Therefore, programming with another person next to you (with a different way of thinking) will help the team to get the best from each other while discarding the waste or bad habits if necessary.&lt;/p>
&lt;p>Pair Programming doesn’t need to be always set for everything. As a tool, it’s flexible, and we can choose how, when and for what reason.&lt;/p>
&lt;p>A personal rule of thumb, before starting tasks that might involve touching multiple modules or complex business rules, think about a quick Pair Thinking/Programming with another more experienced colleague in that field.&lt;/p>
&lt;blockquote>
&lt;p>Everything depends on a particular context and people: the developers, the pairs, the tasks, the mood.&lt;/p>
&lt;/blockquote>
&lt;h3 id="still-uncomfortable-with-pair-programming">Still uncomfortable with Pair Programming?&lt;/h3>
&lt;p>If you still feel uncomfortable having another person next to you while you write code, it might be because you aren’t particularly happy with your own code, or the process that you follow in order to achieve some result. My favorite way to work on this is by exercising on your own and working on improving your skills as a software developer.&lt;/p>
&lt;ul>
&lt;li>Create and play around with your own pet projects.&lt;/li>
&lt;li>Work on code katas on your own and with others.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>Practice makes the master.&lt;/p>
&lt;/blockquote>
&lt;h2 id="summary">Summary&lt;/h2>
&lt;ul>
&lt;li>Don’t get me wrong, Pull Requests are great. Keep doing them.&lt;/li>
&lt;li>Team collaboration is essential. Pair Programming aims for this.&lt;/li>
&lt;li>Pair Programming encourages the team to proactively work together.&lt;/li>
&lt;li>Don’t be afraid of coding while having eyes around you. Ask questions when something is unclear. Ask for help when you don’t know how to solve something.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>It’s totally ok not knowing everything. The most important thing is to know how to work together.&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="/images/blog/2021-04-01/footer.jpg" alt="blog-img" />&lt;/p></content></entry><entry xml:lang="en"><title>Embrace the Change</title><subtitle>Who moved my cheese?🧀</subtitle><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><category term="psychology" scheme="https://chemaclass.com/tags/psychology/" label="Psychology"/><category term="career" scheme="https://chemaclass.com/tags/career/" label="Career"/><category term="philosophy" scheme="https://chemaclass.com/tags/philosophy/" label="Philosophy"/><published>2021-03-01T00:00:00+00:00</published><updated>2021-03-01T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/embrace-the-change/"/><id>https://chemaclass.com/blog/embrace-the-change/</id><summary type="html">The tale is a beautiful metaphor of the different attitudes that people adopt as part of their identity in life when they have to confront any change.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2021-03-01/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>The book &lt;em>Who moved my cheese?&lt;/em> presents a tale inside the main story that consists of 4 characters: two mice, &lt;strong>Sniff&lt;/strong> and &lt;strong>Scurry&lt;/strong>, and two little persons, &lt;strong>Hem&lt;/strong> and &lt;strong>Haw&lt;/strong>.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>Published in 1998, and I just read it at the beginning of 2021. Better late than never. Actually, thanks to my brother Jesús, who recommended it to me.&lt;/p>
&lt;blockquote>
&lt;p>They live in a Maze (that represents one’s environment) and in order to survive they need to go out of their comfort zone and look for cheese (which represents happiness and success).&lt;/p>
&lt;p>The tale starts when both groups end up at “Cheese Station C”, full of cheese. The humans established routines while the mouses kept their instincts active.&lt;/p>
&lt;p>One day the mousses arrive at the “Cheese Station C” and find no cheese left. So they go out to find more cheese somewhere else. On the contrary, when Hem and Haw see that there is no cheese left, they start complaining. Hem, angry and annoyed, demands “Who moved my cheese?!”. Both humans counted on the cheese supply would be endless constant, so they weren’t prepared for that unexpected. The main difference here is how Haw and Hem react to this situation.&lt;/p>
&lt;p>Hem denies moving away from the “Cheese Station C”, so he keeps going there every day expecting to find cheese without success, being weaker, and with continuous fear of doing something different. Haw, on the other hand, decides to laugh at the situation, turns down his fear, and goes out looking for more cheese.&lt;/p>
&lt;p>… I will leave the rest of the tale to you.&lt;/p>
&lt;/blockquote>
&lt;p>The tale is a beautiful metaphor of the different attitudes that people adopt as part of their identity in life when they have to confront any change.&lt;/p>
&lt;blockquote>
&lt;p>Noticing small changes early helps you adapt to the bigger changes that are to come.&lt;/p>
&lt;/blockquote>
&lt;p>This book is full of lessons that apply to everyone no matter who they are or when they read it. I fully recommend it.&lt;/p>
&lt;h3 id="my-favorite-lessons-of-the-book">My favorite lessons of the book&lt;/h3>
&lt;ol>
&lt;li>Change happens.
They keep moving the cheese.&lt;/li>
&lt;li>Anticipate change.
Get ready for the cheese to move.&lt;/li>
&lt;li>Monitor change.
Smell the cheese often so you know when it’s getting old.&lt;/li>
&lt;li>Adapt to change quickly.
The quicker you let go of old cheese, the sooner you can enjoy new cheese.&lt;/li>
&lt;li>Change.
Move with the cheese.&lt;/li>
&lt;li>Enjoy change.
Enjoy the taste of new cheese&lt;/li>
&lt;li>Be ready to change quickly and enjoy it again.
They keep moving the cheese.&lt;/li>
&lt;/ol>
&lt;blockquote>
&lt;p>“Everyone knows that not all change is good or even necessary. But in a world that is constantly changing, it is to our advantage to learn how to adapt and enjoy something better. It is not what is in the story of “Who moved my cheese?” but how you interpret it and apply it to your own situation that gives it the value.“ - Ken Blanchard.&lt;/p>
&lt;/blockquote>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/OvYCLxqkfvY"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;blockquote>
&lt;p>“Life moves on and so should we” — Spencer Johnson&lt;/p>
&lt;/blockquote></content></entry><entry xml:lang="en"><title>Zombie Scrum Survival Guide</title><subtitle>A Journey to Recovery</subtitle><category term="scrum" scheme="https://chemaclass.com/tags/scrum/" label="Scrum"/><category term="agile" scheme="https://chemaclass.com/tags/agile/" label="Agile"/><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><category term="productivity" scheme="https://chemaclass.com/tags/productivity/" label="Productivity"/><published>2021-03-01T00:00:00+00:00</published><updated>2021-03-01T00:00:00+00:00</updated><author><name>
Christiaan Verwijs</name></author><author><name>
Johannes Schartau</name></author><author><name>
Barry Overeem</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/zombie-scrum-survival-guide/"/><id>https://chemaclass.com/readings/zombie-scrum-survival-guide/</id><summary type="html">Zombie Scrum Survival Guide reveals why Scrum runs aground and shows how to supercharge your Scrum outcomes, while having a lot more fun along the way.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>I really enjoy the ideas and experiments presented in the book. It points out a lot of “big elephants in many rooms” for
a lot of teams claiming to do Scrum or Agile in a really questionable way, aka: Zombie Scrum.&lt;/p>
&lt;h3 id="summary">Summary&lt;/h3>
&lt;p>Zombie Scrum Survival Guide reveals why Scrum runs aground and shows how to supercharge your Scrum outcomes, while
having a lot more fun along the way. Humorous, visual, and extremely relatable, it offers practical approaches,
exercises, and tools for escaping Zombie Scrum. Even if you’re surrounded by skeptics, this book will be the antidote to
help you build more of what users need, ship faster, improve more continuously, interact more successfully in any team,
and feel a lot better about what you’re doing. Suddenly, one day soon, you’ll remember: that’s why we adopted Scrum in
the first place!&lt;/p>
&lt;ul>
&lt;li>Learn how Zombie Scrum infects you, why it spreads, and how to inoculate yourself.&lt;/li>
&lt;li>Get closer to your stakeholders, and wake up to their understanding of value.&lt;/li>
&lt;li>Discover why Zombie teams can’t learn, and what to do about it.&lt;/li>
&lt;li>Clear away the specific obstacles to real continuous improvement.&lt;/li>
&lt;li>Make self-managed teams real so people can behave like humans, not Zombies.&lt;/li>
&lt;/ul>
&lt;hr />
&lt;p>This is a nice webinar, when they offer a fresh perspective on Zombie Scrum, share key insights from the book, and
discuss their latest findings on the relentless ongoing research.&lt;/p>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/ylGfrsXXQMs"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>Agile Product Management with Scrum</title><subtitle>Creating Products that Customers Love</subtitle><category term="agile" scheme="https://chemaclass.com/tags/agile/" label="Agile"/><category term="scrum" scheme="https://chemaclass.com/tags/scrum/" label="Scrum"/><category term="management" scheme="https://chemaclass.com/tags/management/" label="Management"/><published>2021-02-22T00:00:00+00:00</published><updated>2021-02-22T00:00:00+00:00</updated><author><name>
Roman Pichler</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/agile-product-management-with-scrum/"/><id>https://chemaclass.com/readings/agile-product-management-with-scrum/</id><summary type="html">Understanding the product owner’s role and envisioning the product.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>&lt;h3 id="coverage-includes">Coverage includes&lt;/h3>
&lt;ul>
&lt;li>Understanding the product owner’s role&lt;/li>
&lt;li>Envisioning the product&lt;/li>
&lt;li>Grooming the product backlog&lt;/li>
&lt;li>Planning the release&lt;/li>
&lt;li>Collaborating in sprint meetings&lt;/li>
&lt;li>Transitioning into product ownership&lt;/li>
&lt;/ul></content></entry><entry xml:lang="en"><title>Phel: The Lisp That Compiles to PHP</title><subtitle>A new functional language with full interoperability with PHP</subtitle><category term="php" scheme="https://chemaclass.com/tags/php/" label="Php"/><category term="open-source" scheme="https://chemaclass.com/tags/open-source/" label="Open Source"/><category term="software-design" scheme="https://chemaclass.com/tags/software-design/" label="Software Design"/><published>2021-02-01T00:00:00+00:00</published><updated>2021-02-01T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/phel-first-release/"/><id>https://chemaclass.com/blog/phel-first-release/</id><summary type="html">The new Functional Programming language build-in for PHP.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2021-02-01/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>A new Functional Programming language build-in on the PHP ecosystem.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h1 id="the-phel-language">The Phel Language&lt;/h1>
&lt;p>Phel is a Functional Programming (&lt;a rel="external" href="https://en.wikipedia.org/wiki/Functional_programming">FP&lt;/a>) language that compiles to PHP. It is a dialect of &lt;a rel="external" href="https://en.wikipedia.org/wiki/Lisp_(programming_language)">Lisp&lt;/a> inspired by Clojure and Janet.&lt;/p>
&lt;h2 id="features">Features&lt;/h2>
&lt;ul>
&lt;li>Built on PHP’s ecosystem&lt;/li>
&lt;li>Good error reporting&lt;/li>
&lt;li>Different Datastructures (Arrays, Tables, and Tuples)&lt;/li>
&lt;li>Macros&lt;/li>
&lt;li>Recursive functions&lt;/li>
&lt;li>Powerful but simple Syntax&lt;/li>
&lt;li>REPL&lt;/li>
&lt;/ul>
&lt;h2 id="why-phel">Why Phel?&lt;/h2>
&lt;p>Phel is a creation of Jens Haase, and as he mentions on the website, “it is the result of many &lt;a rel="external" href="https://phel-lang.org/blog/functional-programming-in-php">failed attempts to do functional programming in PHP&lt;/a>”. He was looking for something with these characteristics:&lt;/p>
&lt;ul>
&lt;li>A LISP-inspired&lt;/li>
&lt;li>Functional Programming language&lt;/li>
&lt;li>That runs on cheap hosting providers&lt;/li>
&lt;li>It is easy to write and debug&lt;/li>
&lt;/ul>
&lt;p>From my point, it was ending May 2020 when I finished the
book &lt;a href="/readings/7-languages-in-7-weeks/">Seven Languages in Seven Weeks&lt;/a>, in which I learned the basics of Prolog, Erlang,
Clojure, Haskell… I even created a &lt;a rel="external" href="https://github.com/Chemaclass/7LangIn7Weeks">repository in GitHub&lt;/a> to store my
progress over the weeks with these learnings.&lt;/p>
&lt;p>Suddenly, one day beginning of June 2020, I saw a post in Reddit’s PHP official channel, with a message of someone
mentioning this “&lt;strong>Phel&lt;/strong>” project, claiming to be a &lt;strong>“functional programming language” written in PHP&lt;/strong>!&lt;/p>
&lt;p>I work with PHP for around 8 years so far, and I always try to combine OOP with FP as much as possible (because I
believe both paradigms are better combined; they are not necessarily exclusive), and a new dialect of Lisp fully written
in native &lt;strong>PHP 7.4&lt;/strong> sounded really exciting. I decided to take a look at it. I wanted to see the code.&lt;/p>
&lt;p>The fresh readings from &lt;a rel="external" href="https://x.com/matthiasnoback">Mathias NoBack&lt;/a> books such
as &lt;a href="/readings/object-design-style-guide">Object Design Style Guide&lt;/a>,
and &lt;a href="/readings/advance-web-application-architecture/">Advanced Web Application Architecture&lt;/a>, gave me the courage to try
out what I learned and put it for real in a project. This was (and still is) a beautiful challenge, which helps me to
test myself and grow professionally at the same time.&lt;/p>
&lt;p>My first commit was done on 6 June 2020, and since then I’ve been dedicating a little time each day during my free
hours to its development.
It helps me to learn more about FP, languages internal design, and best practices on testing and software design
architecture in general.&lt;/p>
&lt;p>I started applying minor changes until I ended refactoring the whole compiler structure (among other things) in order to
make the modules easier to read and understand. Psalm, strict types, good test coverage, unifying code style… These were
some of my favorite topics.&lt;/p>
&lt;h2 id="example-of-phel-code">Example of Phel code&lt;/h2>
&lt;p>The following example gives a short impression of how Phel looks like:&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="plain">&lt;span class="giallo-l">&lt;span># Define a namespace&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>(ns my\example)&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span># Define a variable with name &amp;quot;my-name&amp;quot; and value &amp;quot;world&amp;quot;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>(def my-name &amp;quot;world&amp;quot;)&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span># Define a func with name &amp;quot;print-name&amp;quot; and one argument&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>(defn print-name [your-name]&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> (print &amp;quot;hello&amp;quot; your-name))&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span># Call the function&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>(print-name my-name)&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;h2 id="current-status-of-phel">Current status of Phel&lt;/h2>
&lt;ul>
&lt;li>We prepared an easy &lt;a rel="external" href="https://phel-lang.org/documentation/getting-started/">Getting Started Guide&lt;/a>&lt;/li>
&lt;li>We prepared an easy GitHub Repository with a &lt;a rel="external" href="https://github.com/phel-lang/phel-scaffolding">Phel Scaffolding Template&lt;/a>&lt;/li>
&lt;li>We just released the first official version: &lt;a rel="external" href="https://github.com/phel-lang/phel-lang/tags">0.1.0&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Check out the official website with all documentation: &lt;a rel="external" href="https://phel-lang.org/">https://phel-lang.org/&lt;/a>&lt;/p>
&lt;hr />
&lt;h3 id="also-recommended">Also recommended&lt;/h3>
&lt;ul>
&lt;li>&lt;a rel="external" href="https://jesusvalera.dev/functional-programming-with-phel/">Functional Programming with Phel - JesusValera&lt;/a>&lt;/li>
&lt;/ul></content></entry><entry xml:lang="en"><title>Stock market investing</title><subtitle>25 Golden Stock Investing Lessons</subtitle><category term="economics" scheme="https://chemaclass.com/tags/economics/" label="Economics"/><published>2021-01-31T00:00:00+00:00</published><updated>2021-01-31T00:00:00+00:00</updated><author><name>
Mark Atwood</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/stock-market-for-beginners/"/><id>https://chemaclass.com/readings/stock-market-for-beginners/</id><summary type="html">Stock market basics &amp; essentials.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;ul>
&lt;li>Stock Market Basics &amp;amp; Essentials&lt;/li>
&lt;li>Fundamental, Industry and Company Research&lt;/li>
&lt;li>Investment Styles Such as Value, Growth and Income Investing&lt;/li>
&lt;li>Short Selling, Buying on Margin, Day Trading&lt;/li>
&lt;/ul></content></entry><entry xml:lang="en"><title>One up on wall street</title><subtitle>How To Use What You Already Know To Make Money In The Market</subtitle><category term="economics" scheme="https://chemaclass.com/tags/economics/" label="Economics"/><published>2021-01-22T00:00:00+00:00</published><updated>2021-01-22T00:00:00+00:00</updated><author><name>
Peter Lynch</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/one-up-on-wall-street/"/><id>https://chemaclass.com/readings/one-up-on-wall-street/</id><summary type="html">America's most successful money manager tells how average investors can beat the pros by using what they know. According to Lynch, investment opportunities are everywhere.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>America’s most successful money manager tells how average investors can beat the pros by using what they know. According to Lynch, investment opportunities are everywhere.&lt;/p></content></entry><entry xml:lang="en"><title>Who moved my cheese?</title><subtitle>An Amazing Way to Deal With Change In Your Work and In Your Life</subtitle><category term="psychology" scheme="https://chemaclass.com/tags/psychology/" label="Psychology"/><category term="career" scheme="https://chemaclass.com/tags/career/" label="Career"/><category term="productivity" scheme="https://chemaclass.com/tags/productivity/" label="Productivity"/><published>2021-01-16T00:00:00+00:00</published><updated>2021-01-16T00:00:00+00:00</updated><author><name>
Spencer Johnson</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/who-moved-my-cheese/"/><id>https://chemaclass.com/readings/who-moved-my-cheese/</id><summary type="html">This book presents a tale inside the main story that consists of 4 characters: two mice, Sniff and Scurry, and two little persons, Hem and Haw.</summary><content type="html">&lt;p>This book presents a tale inside the main story that consists of 4 characters: two mice, &lt;strong>Sniff&lt;/strong> and &lt;strong>Scurry&lt;/strong>, and two little persons, &lt;strong>Hem&lt;/strong> and &lt;strong>Haw&lt;/strong>.&lt;/p>
&lt;p>The tale is a beautiful metaphor of the different attitudes that people adopt as part of their identity in life when they have to confront any change.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h3 id="my-favorite-lessons-of-the-book">My favorite lessons of the book&lt;/h3>
&lt;ol>
&lt;li>Change happens.
They keep moving the cheese.&lt;/li>
&lt;li>Anticipate change.
Get ready for the cheese to move.&lt;/li>
&lt;li>Monitor change.
Smell the cheese often so you know when it’s getting old.&lt;/li>
&lt;li>Adapt to change quickly.
The quicker you let go of old cheese, the sooner you can enjoy new cheese.&lt;/li>
&lt;li>Change.
Move with the cheese.&lt;/li>
&lt;li>Enjoy change.
Enjoy the taste of new cheese&lt;/li>
&lt;li>Be ready to change quickly and enjoy it again.
They keep moving the cheese.&lt;/li>
&lt;/ol>
&lt;blockquote>
&lt;p>“Everyone knows that not all change is good or even necessary. But in a world that is constantly changing, it is to our advantage to learn how to adapt and enjoy something better. It is not what is in the story of “Who moved my cheese?” but how you interpret it and apply it to your own situation that gives it the value.“ - Ken Blanchard.&lt;/p>
&lt;/blockquote>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/OvYCLxqkfvY"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;p>I wrote a blog post about this book: &lt;a href="/blog/embrace-the-change/">Embrace the change&lt;/a>&lt;/p></content></entry><entry xml:lang="en"><title>Rich dad poor dad</title><subtitle>What the Rich Teach Their Kids about Money That the Poor and Middle Class Do Not!</subtitle><category term="economics" scheme="https://chemaclass.com/tags/economics/" label="Economics"/><published>2021-01-15T00:00:00+00:00</published><updated>2021-01-15T00:00:00+00:00</updated><author><name>
Robert T. Kiyosaki</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/rich-dad-poor-dad/"/><id>https://chemaclass.com/readings/rich-dad-poor-dad/</id><summary type="html">Explodes the myth that you need to earn a high income to become rich.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;ul>
&lt;li>Explodes the myth that you need to earn a high income to become rich&lt;/li>
&lt;li>Challenges the belief that your house is an asset&lt;/li>
&lt;li>Shows parents why they can’t rely on the school system to teach their kids about money&lt;/li>
&lt;li>Defines once and for all an asset and a liability&lt;/li>
&lt;li>Teaches you what to teach your kids about money for their future financial success&lt;/li>
&lt;/ul></content></entry><entry xml:lang="en"><title>To Mock or Not to Mock</title><subtitle>How to escape the mocking hell</subtitle><category term="testing" scheme="https://chemaclass.com/tags/testing/" label="Testing"/><category term="tdd" scheme="https://chemaclass.com/tags/tdd/" label="Tdd"/><category term="software-design" scheme="https://chemaclass.com/tags/software-design/" label="Software Design"/><category term="clean-code" scheme="https://chemaclass.com/tags/clean-code/" label="Clean Code"/><category term="php" scheme="https://chemaclass.com/tags/php/" label="Php"/><published>2021-01-11T00:00:00+00:00</published><updated>2021-01-11T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/to-mock-or-not-to-mock/"/><id>https://chemaclass.com/blog/to-mock-or-not-to-mock/</id><summary type="html">Mocking is useful, but 'what to mock' usually turns out to be a more complicated than expected if you don't treat this carefully.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2021-01-11/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>Mocking is useful, but “what to mock” usually turns out to be more complicated than expected if you don’t treat
this carefully.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h4 id="how-to-escape-the-mocking-hell">How to escape the mocking hell&lt;/h4>
&lt;p>What is actually happening when we create a mock? Which types of mocks are there? Is mocking good or bad? Well, as
always, everything depends on the context. And here we will consider some of the main situations about when to mock and
when not to mock, but especially why.&lt;/p>
&lt;h2 id="what-happens-when-you-mock-something">What happens when you mock something?&lt;/h2>
&lt;p>First, we should define what is a mock:&lt;/p>
&lt;blockquote>
&lt;p>In a unit test, mock objects can simulate the behavior of complex, real objects and are therefore useful when it is impractical or impossible to incorporate a real object into a unit test.&lt;/p>
&lt;/blockquote>
&lt;p>Mocking makes sense in a &lt;em>unit testing&lt;/em> context. An integration test should go through the real implementation checking
the integration between multiple units, which are even allowed to talk to the DB or File IO: infrastructure code.
Therefore we should agree that &lt;em>a unit test is a fast and deterministic test that doesn’t rely on external dependencies
and doesn’t require any special context to run&lt;/em>.&lt;/p>
&lt;p>Mock objects meet the &lt;em>interface&lt;/em> requirements. In consequence, they allow us to write and unit-test functionality
without calling complex underlying or collaborating classes.&lt;/p>
&lt;p>A mock is a test double that stands in for real implementation code during the unit testing process. It is also capable
of producing assertions about how it was manipulated by the test subject during the test run.&lt;/p>
&lt;blockquote>
&lt;p>I strongly recommend you to read this post if you want to get into the details of why &lt;a rel="external" href="https://medium.com/javascript-scene/mocking-is-a-code-smell-944a70c90a6a">Mocking is a code smell&lt;/a> (Topics like these: What is a mock? What is a unit test? What is test coverage? What is tight coupling? What causes tight coupling? What does composition have to do with mocking? How do we remove coupling? and more!)&lt;/p>
&lt;/blockquote>
&lt;h2 id="the-problem-with-mocking">The problem with mocking&lt;/h2>
&lt;p>When you mock you are overriding the logic of the mocked class. The real logic is getting hidden behind the scenes and
there is actually where bugs love to live. Consider that:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>The mock may have attributes, methods, or arguments that the real object doesn’t.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>The mock’s &lt;em>return values may differ from the real objects’ return values&lt;/em>. For example, it may return a different
type of object that has different attributes.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>The mock’s &lt;em>side effects and behavior may differ from the real objects’ ones&lt;/em>. For example, maybe the mock fails to
raise an exception when the real object would raise it.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h2 id="alternatives-to-mocking">Alternatives to mocking&lt;/h2>
&lt;p>“Are you saying that mocking is bad and we shouldn’t mock?!” No.&lt;/p>
&lt;p>It depends on what you are “overriding”.&lt;/p>
&lt;ul>
&lt;li>Is your business domain logic what you are mocking? Then it’s wrong.&lt;/li>
&lt;li>Is the connection to the DB what you are mocking? Then it’s right.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>It depends on the context of the logic and where that logic belongs.&lt;/p>
&lt;/blockquote>
&lt;p>Is it part of your business domain logic? Then you shouldn’t mock it but instantiate it.&lt;/p>
&lt;p>Is it part of any infrastructure dependency like DB connection, IO file system, Network, or any external service that
has nothing to do directly with your business domain? Then &lt;em>mock it using abstractions/interfaces&lt;/em>.&lt;/p>
&lt;p>The interface should be the &lt;em>contract between your business domain logic and its external infrastructure dependencies&lt;/em>.
Imagine how easy it would be to unit test your domain logic by instantiating it and calling their methods with different
arguments expecting different inputs under your entire control.&lt;/p>
&lt;h2 id="some-tricks">Some tricks&lt;/h2>
&lt;p>When you are writing a unit test:&lt;/p>
&lt;ul>
&lt;li>Try to instantiate your classes first.&lt;/li>
&lt;li>Avoid mocking concrete classes. I wrote an article exclusively about this exclusively:
encouraging &lt;a rel="external" href="https://medium.com/swlh/final-classes-in-php-9174e3e2747e">final classes&lt;/a> and interfaces.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>Mock interfaces. Instantiate concrete classes.&lt;/p>
&lt;/blockquote>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/RbSqXFUfRMU"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;p>“Excessive use of mocks leads to legacy code.” — Philippe Boargau&lt;/p>
&lt;h3 id="how-can-we-avoid-excessive-mocking">How can we avoid excessive mocking?&lt;/h3>
&lt;ul>
&lt;li>Favor immutable state over a mutable state.&lt;/li>
&lt;li>Make dependencies explicit.&lt;/li>
&lt;li>Program to an interface, not to an implementation.&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="/images/blog/2021-01-11/footer.jpg" alt="blog-img" />&lt;/p>
&lt;hr />
&lt;h4 id="references">References&lt;/h4>
&lt;ul>
&lt;li>&lt;a rel="external" href="https://medium.com/javascript-scene/mocking-is-a-code-smell-944a70c90a6a">Mocking is a code smell&lt;/a> — Eric Elliott&lt;/li>
&lt;li>&lt;a rel="external" href="https://blog.cleancoder.com/uncle-bob/2014/05/10/WhenToMock.html">When to mock&lt;/a> &amp;amp; &lt;a rel="external" href="https://blog.cleancoder.com/uncle-bob/2017/05/05/TestDefinitions.html">Test Definitions&lt;/a> — Uncle Bob&lt;/li>
&lt;li>&lt;a rel="external" href="https://matthiasnoback.nl/2018/09/final-classes-by-default-why/">Final classes by default&lt;/a> — Matthias Noback&lt;/li>
&lt;li>&lt;a rel="external" href="https://www.seanh.cc/2017/03/17/the-problem-with-mocks/">The problem with mocks&lt;/a> — Sean Hammond&lt;/li>
&lt;li>&lt;a rel="external" href="https://www.artima.com/weblogs/viewpost.jsp?thread=126923">A Set of Unit Testing Rules&lt;/a> — Michael Feathers&lt;/li>
&lt;/ul></content></entry><entry xml:lang="en"><title>Sharing Your Git Patches</title><subtitle>Another way of sharing quick suggestions with your team</subtitle><category term="git" scheme="https://chemaclass.com/tags/git/" label="Git"/><category term="code-review" scheme="https://chemaclass.com/tags/code-review/" label="Code Review"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><category term="pair-programming" scheme="https://chemaclass.com/tags/pair-programming/" label="Pair Programming"/><published>2020-12-01T00:00:00+00:00</published><updated>2020-12-01T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/sharing-git-patches/"/><id>https://chemaclass.com/blog/sharing-git-patches/</id><summary type="html">Discover another way of sharing suggestions with your development team.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2020-12-01/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>Discover another way of sharing suggestions with your development team.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h3 id="imagine-this-situation">Imagine this situation&lt;/h3>
&lt;p>You are reviewing a Pull Request (PR), and you see some minor improvements or suggestions that you would like to share with the author. You might write some comments, and usually, that would be sufficient.&lt;/p>
&lt;p>Imagine that in order to transmit your “whole idea” you would need to change some files because just communicating the full picture will end up in a huge comment which might be not as clear as it could be.&lt;/p>
&lt;h2 id="what-possibilities-are-there-apart-from-just-comments-in-a-pr">What possibilities are there apart from just comments in a PR?&lt;/h2>
&lt;p>Well, there are multiple options. The key is to be aware of them and use them wisely depending on the priority of the task and the changes themselves:&lt;/p>
&lt;ul>
&lt;li>As already mentioned, writing a comment as feedback is a good idea by default, but not the only one.&lt;/li>
&lt;li>We can always do some pair-thinking, talk at any time. Communication is always good in order to clarify the possible uncertainty.&lt;/li>
&lt;li>Sharing your git patches is another good option.&lt;/li>
&lt;/ul>
&lt;h1 id="git-diff-to-the-rescue">Git diff to the rescue!&lt;/h1>
&lt;p>What if you (as a reviewer) could share your idea without any single commit or comment in the PR, but sharing your changes directly with the author?&lt;/p>
&lt;p>Well, that’s actually possible and really easy. As you already know, the git diff command gives you the differences between any two branches.&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="shellscript">&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);">git&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> diff&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> origin&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> develop&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> &amp;gt;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> ../my-origin-develop.patch&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>What we are doing here is redirecting the output of the diff command into a file (aka: patch), so we can share that output with any other peer-team.&lt;/p>
&lt;h2 id="what-now">What now?&lt;/h2>
&lt;p>Well, having that patch file, it’s pretty easy to apply those changes in your local machine without doing any commit:&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="shellscript">&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);">git&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> apply&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> ../my-origin-develop.patch&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>Applying this patch will simply change your local system in the same way the patch was created.&lt;/p>
&lt;h2 id="how-to-by-steps">“How to” by steps&lt;/h2>
&lt;p>Let’s divide the responsibilities into two: the creator of the patch and its user:&lt;/p>
&lt;h3 id="the-patch-creator-the-person-who-will-create-the-patch">The patch creator: the person who will create the patch&lt;/h3>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="shellscript">&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);">#&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> Checkout that branch&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);">$&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> ~/myProject&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> git:&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">the-branch&lt;/span>&lt;span>)&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> ➜&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> git&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> pull&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> origin&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> the-branch&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);">#&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> Do your suggestions and changes in the targeted branch&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);">#&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> Generate the patch file using the diff command&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);">$&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> ~/myProject&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> git:&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">the-branch&lt;/span>&lt;span>)&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> ➜&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> git&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> diff&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> &amp;gt;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> ../your-diff.patch&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);">#&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> Share the patch file with the author of the PR&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;h3 id="the-patch-user-the-person-who-will-see-the-patch">The patch user: the person who will see the patch&lt;/h3>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="shellscript">&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);">#&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> Ensure you are in that branch&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);">$&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> ~/myProject&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> git:&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">the-branch&lt;/span>&lt;span>)&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> ➜&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> git&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> pull&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> origin&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> the-branch&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);">#&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> Apply the patch file&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);">$&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> ~/myProject&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> git:&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">the-branch&lt;/span>&lt;span>)&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> ➜&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> git&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> apply&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> ../your-diff.patch&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;hr />
&lt;h4 id="references">References&lt;/h4>
&lt;ul>
&lt;li>&lt;a rel="external" href="https://git-scm.com/docs/git-apply">Official documentation for “git apply”&lt;/a>&lt;/li>
&lt;/ul></content></entry><entry xml:lang="en"><title>Principles of package design</title><subtitle>Creating Reusable Software Components</subtitle><category term="software-design" scheme="https://chemaclass.com/tags/software-design/" label="Software Design"/><category term="architecture" scheme="https://chemaclass.com/tags/architecture/" label="Architecture"/><category term="clean-code" scheme="https://chemaclass.com/tags/clean-code/" label="Clean Code"/><published>2020-11-12T00:00:00+00:00</published><updated>2020-11-12T00:00:00+00:00</updated><author><name>
Matthias Noback</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/packaging-design/"/><id>https://chemaclass.com/readings/packaging-design/</id><summary type="html">Apply design principles to your classes, preparing them for reuse. You will use package design principles to create packages that are just right in terms of cohesion and coupling, and are user- and maintainer-friendly at the same time.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>Apply design principles to your classes, preparing them for reuse. You will use package design principles to create
packages that are just right in terms of cohesion and coupling, and are user- and maintainer-friendly at the same time.&lt;/p>
&lt;p>The first part of this book walks you through the five SOLID principles that will help you improve the design of your
classes. The second part introduces you to the best practices of package design, and covers both package cohesion
principles and package coupling principles. Cohesion principles show you which classes should be put together in a
package, when to split packages, and if a combination of classes may be considered a “package” in the first place.
Package coupling principles help you choose the right dependencies and prevent wrong directions in the dependency graph
of your packages.&lt;/p>
&lt;h3 id="what-you-ll-learn">What You’ll Learn&lt;/h3>
&lt;ul>
&lt;li>Apply the SOLID principles of class design&lt;/li>
&lt;li>Determine if classes belong in the same package&lt;/li>
&lt;li>Know whether it is safe for packages to depend on each other&lt;/li>
&lt;/ul></content></entry><entry xml:lang="en"><title>Never Use array_merge in a Loop</title><subtitle>The spread operator to the rescue</subtitle><category term="php" scheme="https://chemaclass.com/tags/php/" label="Php"/><category term="clean-code" scheme="https://chemaclass.com/tags/clean-code/" label="Clean Code"/><category term="refactoring" scheme="https://chemaclass.com/tags/refactoring/" label="Refactoring"/><published>2020-11-10T00:00:00+00:00</published><updated>2020-11-10T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/array-merge-in-loop/"/><id>https://chemaclass.com/blog/array-merge-in-loop/</id><summary type="html">Using array_merge inside a loop is a performance killer. The spread operator will help you to improve this by flatting the array.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2020-11-10/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>Using array_merge inside a loop is a performance killer.
The spread operator will help you to improve this by flatting the array.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h2 id="flattening-a-one-level-array">Flattening a one-level array&lt;/h2>
&lt;p>I have seen people using the array_merge function in a loop like:&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="php">&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;lt;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">?&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">php&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>$&lt;/span>&lt;span>lists&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&lt;/span>&lt;span> [&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> [&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">1&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> 2&lt;/span>&lt;span>]&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> [&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">3&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> 4&lt;/span>&lt;span>]&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> [&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">5&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> 6&lt;/span>&lt;span>]&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>]&lt;/span>&lt;span>;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>$&lt;/span>&lt;span>merged&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&lt;/span>&lt;span> [&lt;/span>&lt;span>]&lt;/span>&lt;span>;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">foreach&lt;/span>&lt;span>(&lt;/span>&lt;span>$&lt;/span>&lt;span>lists&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> as&lt;/span>&lt;span> $&lt;/span>&lt;span>list&lt;/span>&lt;span>)&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> $&lt;/span>&lt;span>merged&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> array_merge&lt;/span>&lt;span>(&lt;/span>&lt;span>$&lt;/span>&lt;span>merged&lt;/span>&lt;span>,&lt;/span>&lt;span> $&lt;/span>&lt;span>list&lt;/span>&lt;span>)&lt;/span>&lt;span>;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>}&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);">//&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> $merged === [1, 2, 3, 4, 5, 6];&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>This is a very bad practice because it’s a (memory) performance killer!
Instead, you should use the spread operator (in PHP since 5.6!):&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="php">&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;lt;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">?&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">php&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>$&lt;/span>&lt;span>lists&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&lt;/span>&lt;span> [&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> [&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">1&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> 2&lt;/span>&lt;span>]&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> [&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">3&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> 4&lt;/span>&lt;span>]&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> [&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">5&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> 6&lt;/span>&lt;span>]&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>]&lt;/span>&lt;span>;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>$&lt;/span>&lt;span>merged&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> array_merge&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">...&lt;/span>&lt;span>$&lt;/span>&lt;span>lists&lt;/span>&lt;span>)&lt;/span>&lt;span>;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);">//&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> === [1, 2, 3, 4, 5, 6];&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;h2 id="unpacking-an-assoc-array">Unpacking an assoc-array&lt;/h2>
&lt;p>What if you had an assoc-array instead like this one?&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="php">&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;lt;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">?&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">php&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>$&lt;/span>&lt;span>lists&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&lt;/span>&lt;span> [&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;#39;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">key-1&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;#39;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&amp;gt;&lt;/span>&lt;span> [&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">1&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> 2&lt;/span>&lt;span>]&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;#39;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">key-2&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;#39;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&amp;gt;&lt;/span>&lt;span> [&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">3&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> 4&lt;/span>&lt;span>]&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;#39;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">key-3&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;#39;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&amp;gt;&lt;/span>&lt;span> [&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">5&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> 6&lt;/span>&lt;span>]&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>]&lt;/span>&lt;span>;&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>In that case, you will need to unpack its values:&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="php">&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;lt;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">?&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">php&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>$&lt;/span>&lt;span>merged&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> array_merge&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">...&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">array_values&lt;/span>&lt;span>(&lt;/span>&lt;span>$&lt;/span>&lt;span>lists&lt;/span>&lt;span>)&lt;/span>&lt;span>)&lt;/span>&lt;span>;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);">//&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> === [1, 2, 3, 4, 5, 6];&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>In Functional Programming, this is known as flatting a list.
No loops &amp;amp; no more performance problem.&lt;/p>
&lt;h2 id="flatting-a-multilevel-array">Flatting a multilevel array&lt;/h2>
&lt;p>What if you wanted to flat a multilevel array like this one?&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="php">&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;lt;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">?&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">php&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>$&lt;/span>&lt;span>lists&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&lt;/span>&lt;span> [&lt;/span>&lt;span>[&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">1&lt;/span>&lt;span>]&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> 2&lt;/span>&lt;span>,&lt;/span>&lt;span> [&lt;/span>&lt;span>[&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">3&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> 4&lt;/span>&lt;span>]&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> 5&lt;/span>&lt;span>]&lt;/span>&lt;span>,&lt;/span>&lt;span> [&lt;/span>&lt;span>[&lt;/span>&lt;span>[&lt;/span>&lt;span>]&lt;/span>&lt;span>]&lt;/span>&lt;span>]&lt;/span>&lt;span>,&lt;/span>&lt;span> [&lt;/span>&lt;span>[&lt;/span>&lt;span>[&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">6&lt;/span>&lt;span>]&lt;/span>&lt;span>]&lt;/span>&lt;span>]&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> 7&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> 8&lt;/span>&lt;span>,&lt;/span>&lt;span> [&lt;/span>&lt;span>]&lt;/span>&lt;span>]&lt;/span>&lt;span>;&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>Or like this one, even with key-values?&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="php">&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;lt;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">?&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">php&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>$&lt;/span>&lt;span>lists&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&lt;/span>&lt;span> [&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;#39;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">key-1&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;#39;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&amp;gt;&lt;/span>&lt;span> [&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> 1&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> [&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">2&lt;/span>&lt;span>]&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;#39;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">key-2&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;#39;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&amp;gt;&lt;/span>&lt;span> [&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> 3&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> [&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;#39;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">key-3&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;#39;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&amp;gt;&lt;/span>&lt;span> [&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">4&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> 5&lt;/span>&lt;span>]&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> ]&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> ]&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> ]&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> 6&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;#39;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">key-4&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;#39;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&amp;gt;&lt;/span>&lt;span> [&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">7&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> 8&lt;/span>&lt;span>]&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>]&lt;/span>&lt;span>;&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>In these cases, you might want to use the internal standard library:&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="php">&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;lt;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">?&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">php&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>$&lt;/span>&lt;span>merged&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> iterator_to_array&lt;/span>&lt;span>(&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> new&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> RecursiveIteratorIterator&lt;/span>&lt;span>(&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> new&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> RecursiveArrayIterator&lt;/span>&lt;span>(&lt;/span>&lt;span>$&lt;/span>&lt;span>lists&lt;/span>&lt;span>)&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> )&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> $&lt;/span>&lt;span>use_keys&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> false&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>)&lt;/span>&lt;span>;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);">//&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> $merged === [1, 2, 3, 4, 5, 6, 7, 8];&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;h2 id="conclusion">Conclusion&lt;/h2>
&lt;p>Usually, being aware of how to flat a “2 level” array might be sufficient:&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="php">&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;lt;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">?&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">php&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>$&lt;/span>&lt;span>flattenList&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> array_merge&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">...&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">array_values&lt;/span>&lt;span>(&lt;/span>&lt;span>$&lt;/span>&lt;span>lists&lt;/span>&lt;span>)&lt;/span>&lt;span>)&lt;/span>&lt;span>;&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>Otherwise, the internal standard library will help you deal with it.&lt;/p>
&lt;hr />
&lt;h3 id="references">References&lt;/h3>
&lt;ul>
&lt;li>&lt;a rel="external" href="https://wiki.php.net/rfc/spread_operator_for_array">Spread_operator_for_array - Wikipedia&lt;/a>&lt;/li>
&lt;li>&lt;a rel="external" href="https://rosettacode.org/wiki/Flatten_a_list">Flatten_a_list - Rosettacode&lt;/a>&lt;/li>
&lt;/ul></content></entry><entry xml:lang="en"><title>Animal Farm</title><subtitle>All animals are equal. But some animals are more equal than others.</subtitle><category term="fiction" scheme="https://chemaclass.com/tags/fiction/" label="Fiction"/><category term="dystopia" scheme="https://chemaclass.com/tags/dystopia/" label="Dystopia"/><category term="philosophy" scheme="https://chemaclass.com/tags/philosophy/" label="Philosophy"/><category term="psychology" scheme="https://chemaclass.com/tags/psychology/" label="Psychology"/><published>2020-11-02T00:00:00+00:00</published><updated>2020-11-02T00:00:00+00:00</updated><author><name>
George Orwell</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/animal-farm/"/><id>https://chemaclass.com/readings/animal-farm/</id><summary type="html">Orwell's political allegory about a farmyard rebellion that descends into tyranny, exposing how power corrupts even the most idealistic revolutions.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>Mr Jones of Manor Farm is so lazy and drunken that one day he forgets to feed his livestock. The ensuing rebellion under
the leadership of the pigs Napoleon and Snowball leads to the animals taking over the farm. Vowing to eliminate the
terrible inequities of the farmyard, the renamed Animal Farm is organised to benefit all who walk on four legs. But as
time passes, the ideals of the rebellion are corrupted, then forgotten. And something new and unexpected emerges.&lt;/p></content></entry><entry xml:lang="en"><title>Typed Arrays in PHP</title><subtitle>An alternative to the missing feature in PHP: Generics</subtitle><category term="php" scheme="https://chemaclass.com/tags/php/" label="Php"/><category term="software-design" scheme="https://chemaclass.com/tags/software-design/" label="Software Design"/><category term="clean-code" scheme="https://chemaclass.com/tags/clean-code/" label="Clean Code"/><published>2020-10-13T00:00:00+00:00</published><updated>2020-10-13T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/typed-arrays-php/"/><id>https://chemaclass.com/blog/typed-arrays-php/</id><summary type="html">Argument unpacking, function variable argument list, and variadics function.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2020-10-13/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>Argument unpacking, function variable argument list, and variadics function.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h3 id="the-perfect-combination">The perfect combination&lt;/h3>
&lt;ul>
&lt;li>Argument unpacking: Instead of passing the argument itself to the function, the elements it contains will be passed (as individual arguments).&lt;/li>
&lt;li>Function variable argument list: The arguments will be passed into the given variable as an array.&lt;/li>
&lt;li>Variadics function: Types can be checked with a type-hint.&lt;/li>
&lt;/ul>
&lt;p>We will use this snipped for our examples
Having a class, &lt;code>Customer&lt;/code>:&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="php">&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;lt;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">?&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">php&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);">/**&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> &lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);"> * @psalm-immutable &lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);"> */&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">final&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> class&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> Customer&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>{&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);"> //&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> Using PHP 8 constructor property promotion&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);"> //&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> https://wiki.php.net/rfc/constructor_promotion&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> public&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> function&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> __construct&lt;/span>&lt;span>(&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> public&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> string&lt;/span>&lt;span> $&lt;/span>&lt;span>name&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> )&lt;/span>&lt;span> {&lt;/span>&lt;span>}&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>}&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);">//&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> We create a list of 6 customers&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>$&lt;/span>&lt;span>customers&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> array_map&lt;/span>&lt;span>(&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> fn&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">int&lt;/span>&lt;span> $&lt;/span>&lt;span>i&lt;/span>&lt;span>)&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">:&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> Customer&lt;/span>&lt;span> =&amp;gt;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> new&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> Customer&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">name-&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">{&lt;/span>&lt;span>$&lt;/span>&lt;span>i&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">}&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;quot;&lt;/span>&lt;span>)&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> range&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">1&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> 6&lt;/span>&lt;span>)&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>)&lt;/span>&lt;span>;&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>Whenever we want to manipulate a list of Customers, we can pass as an argument: &lt;code>…$customers&lt;/code>.&lt;/p>
&lt;h2 id="how-we-used-to-do-it">How we used to do it&lt;/h2>
&lt;p>We define the array type using the PHPDoc param comment block above. But we cannot define the real type of the item. The code will still run without any problem passing any type on that argument &lt;code>array $customers&lt;/code>:&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="php">&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;lt;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">?&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">php&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);">/**&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> &lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);"> * &lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">@param&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> Customer&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">[]&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> &lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);"> */&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">function&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> createInvoiceForCustomers&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">array&lt;/span>&lt;span> $&lt;/span>&lt;span>customers&lt;/span>&lt;span>)&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">:&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> void&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>{&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> foreach&lt;/span>&lt;span> (&lt;/span>&lt;span>$&lt;/span>&lt;span>customers&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> as&lt;/span>&lt;span> $&lt;/span>&lt;span>customer&lt;/span>&lt;span>)&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);"> //&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> ... some irrelevant logic for this example&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>}&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>The code below would work at “compile-time”. But it might fail at “runtime”.&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="php">&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;lt;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">?&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">php&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);">createInvoiceForCustomers&lt;/span>&lt;span>(&lt;/span>&lt;span>$&lt;/span>&lt;span>customers&lt;/span>&lt;span>)&lt;/span>&lt;span>;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);">createInvoiceForCustomers&lt;/span>&lt;span>(&lt;/span>&lt;span>[&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">new&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> Customer&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;#39;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">any name&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;#39;&lt;/span>&lt;span>)&lt;/span>&lt;span>]&lt;/span>&lt;span>)&lt;/span>&lt;span>;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);">createInvoiceForCustomers&lt;/span>&lt;span>(&lt;/span>&lt;span>[&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">new&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> AnyOtherType&lt;/span>&lt;span>(&lt;/span>&lt;span>)&lt;/span>&lt;span>]&lt;/span>&lt;span>)&lt;/span>&lt;span>;&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>An alternative (recommended!) might be to extract that logic and ask for the particular type in order to “check it” at runtime in that particular moment, failing if one of the items wasn’t really a Customer:&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="php">&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;lt;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">?&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">php&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);">/**&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> &lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);"> * &lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">@param&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> Customer&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">[]&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> &lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);"> */&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">function&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> createInvoiceForCustomers&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">array&lt;/span>&lt;span> $&lt;/span>&lt;span>customers&lt;/span>&lt;span>)&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">:&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> void&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>{&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> foreach&lt;/span>&lt;span> (&lt;/span>&lt;span>$&lt;/span>&lt;span>customers&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> as&lt;/span>&lt;span> $&lt;/span>&lt;span>customer&lt;/span>&lt;span>)&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);"> createInvoice&lt;/span>&lt;span>(&lt;/span>&lt;span>$&lt;/span>&lt;span>customer&lt;/span>&lt;span>)&lt;/span>&lt;span>;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>}&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">function&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> createInvoice&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">Customer&lt;/span>&lt;span> $&lt;/span>&lt;span>customer&lt;/span>&lt;span>)&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">:&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> void&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>{&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);"> //&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> ... some irrelevant logic for this example&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>}&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>Everything here below would work at “compile-time”. It will for sure break during “runtime” if the &lt;code>createInvoice(Customer $customer)&lt;/code> receives something different than a Customer.&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="php">&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;lt;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">?&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">php&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);">createInvoiceForCustomers&lt;/span>&lt;span>(&lt;/span>&lt;span>$&lt;/span>&lt;span>customers&lt;/span>&lt;span>)&lt;/span>&lt;span>;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);">createInvoiceForCustomers&lt;/span>&lt;span>(&lt;/span>&lt;span>[&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">new&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> Customer&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;#39;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">any name&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;#39;&lt;/span>&lt;span>)&lt;/span>&lt;span>]&lt;/span>&lt;span>)&lt;/span>&lt;span>;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);">createInvoiceForCustomers&lt;/span>&lt;span>(&lt;/span>&lt;span>[&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">new&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> AnyOtherType&lt;/span>&lt;span>(&lt;/span>&lt;span>)&lt;/span>&lt;span>]&lt;/span>&lt;span>)&lt;/span>&lt;span>;&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> //&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> won&amp;#39;t work&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>By doing that &lt;code>createInvoice(Customer $customer)&lt;/code> we are ensuring the type of the argument, which is good! But, what about going one step further. Could we check the types of the elements when calling the function &lt;code>createInvoiceForCustomers(array $customers)&lt;/code>, even making the IDE complain when the types are not right?&lt;/p>
&lt;p>Well, that’s actually what Generics are for, but sadly, they are not yet in PHP. Not even in the upcoming PHP 8. Hopefully in a near future, but we cannot predict that for now.
Luckily, we have currently an alternative nowadays, but it’s not that popular. It has its own “pros” and “cons”, so let’s take a look at an example first:&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="php">&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;lt;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">?&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">php&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">function&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> createInvoiceForCustomers&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">Customer&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> ...&lt;/span>&lt;span>$&lt;/span>&lt;span>customers&lt;/span>&lt;span>)&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">:&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> void&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>{&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> foreach&lt;/span>&lt;span> (&lt;/span>&lt;span>$&lt;/span>&lt;span>customers&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> as&lt;/span>&lt;span> $&lt;/span>&lt;span>customer&lt;/span>&lt;span>)&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);"> createInvoice&lt;/span>&lt;span>(&lt;/span>&lt;span>$&lt;/span>&lt;span>customer&lt;/span>&lt;span>)&lt;/span>&lt;span>;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>}&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>Everything here below would work at “compile-time”. It will for sure break during “runtime” if the &lt;code>createInvoice()&lt;/code> receives something different than a Customer.&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="php">&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">&amp;lt;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">?&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">php&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);">createInvoiceForCustomers&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">...&lt;/span>&lt;span>$&lt;/span>&lt;span>customers&lt;/span>&lt;span>)&lt;/span>&lt;span>;&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> //&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> OK&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);">createInvoiceForCustomers&lt;/span>&lt;span>(&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> new&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> Customer&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;#39;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">any name&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;#39;&lt;/span>&lt;span>)&lt;/span>&lt;span>,&lt;/span>&lt;span> &lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> new&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> Customer&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;#39;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">any name&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;#39;&lt;/span>&lt;span>)&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>)&lt;/span>&lt;span>;&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> //&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> OK&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);">//&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> This is not even possible to write. The IDE will yeld at you. &lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);">//&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> It&amp;#39;s expecting a `Customer`, but `AnyOtherType` is given:&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);">createInvoiceForCustomers&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">new&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> AnyOtherType&lt;/span>&lt;span>(&lt;/span>&lt;span>)&lt;/span>&lt;span>)&lt;/span>&lt;span>;&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;h3 id="pros">PROS&lt;/h3>
&lt;ul>
&lt;li>We can easily type a list of any concrete type.&lt;/li>
&lt;/ul>
&lt;h3 id="cons">CONS&lt;/h3>
&lt;ul>
&lt;li>We better define our functions with one or two arguments max. Otherwise, it would be too complicated to read.&lt;/li>
&lt;/ul>
&lt;h3 id="important-remarks">Important remarks&lt;/h3>
&lt;ul>
&lt;li>It needs to be the last taken argument of a function.&lt;/li>
&lt;li>It helps to minimize the number of arguments that we use in a function.&lt;/li>
&lt;/ul>
&lt;h2 id="conclusions">Conclusions&lt;/h2>
&lt;p>Argument unpacking is a great feature that, in combination with variadic functions, can help us to simulate typed arrays. With great power comes great responsibility, and this is no exception.
We need to learn about our toolbox in order to use it wisely.&lt;/p>
&lt;p>&lt;img src="/images/blog/2020-10-13/footer.jpg" alt="blog-cover" />&lt;/p>
&lt;hr />
&lt;h3 id="references">References&lt;/h3>
&lt;ul>
&lt;li>&lt;a rel="external" href="https://wiki.php.net/rfc/argument_unpacking">Argument unpacking&lt;/a>&lt;/li>
&lt;li>&lt;a rel="external" href="https://www.php.net/manual/en/functions.arguments.php#functions.variable-arg-list">Function variable argument list&lt;/a>&lt;/li>
&lt;li>&lt;a rel="external" href="https://wiki.php.net/rfc/variadics">Variadics function&lt;/a>&lt;/li>
&lt;/ul></content></entry><entry xml:lang="en"><title>Object design style guide</title><subtitle>Powerful Techniques for Creating Flexible, Readable, and Maintainable Object-Oriented Code in Any OO Language</subtitle><category term="software-design" scheme="https://chemaclass.com/tags/software-design/" label="Software Design"/><category term="clean-code" scheme="https://chemaclass.com/tags/clean-code/" label="Clean Code"/><category term="php" scheme="https://chemaclass.com/tags/php/" label="Php"/><published>2020-10-10T00:00:00+00:00</published><updated>2020-10-10T00:00:00+00:00</updated><author><name>
Matthias Noback</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/object-design-style-guide/"/><id>https://chemaclass.com/readings/object-design-style-guide/</id><summary type="html">Matthias Noback's practical guide to writing flexible, readable, and maintainable object-oriented code, with techniques applicable to any OO language from Python to PHP.</summary><content type="html">&lt;p>Objects are the central concept of languages like Java, Python, C#. Applying best practices for object design means that
your code will be easy to read, write, and maintain.&lt;/p>
&lt;p>This book captures dozens of techniques for creating pro-quality OO code that can stand the
test of time.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>Examples are in an instantly-familiar pseudocode, teaching techniques you can apply to any OO language, from C++ to PHP.&lt;/p></content></entry><entry xml:lang="en"><title>Domain-Driven Design Distilled</title><category term="ddd" scheme="https://chemaclass.com/tags/ddd/" label="Ddd"/><category term="architecture" scheme="https://chemaclass.com/tags/architecture/" label="Architecture"/><category term="software-design" scheme="https://chemaclass.com/tags/software-design/" label="Software Design"/><published>2020-09-10T00:00:00+00:00</published><updated>2020-09-10T00:00:00+00:00</updated><author><name>
Vaughn Vernon</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/domain-driven-design-distilled/"/><id>https://chemaclass.com/readings/domain-driven-design-distilled/</id><summary type="html">Domain-Driven Design Distilled brings DDD to life. Whether you're a developer, consultant, or customer, it will help you understand it, so you can benefit from its power.</summary><content type="html">&lt;p>Domain-Driven Design Distilled brings DDD to life. Whether you’re a developer, consultant, or customer, it will help
you understand it, so you can benefit from its power.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;hr />
&lt;p>This book delivers powerful results in practice, which is why developers worldwide are rapidly moving to adopt it.
This is an accessible guide to the basics:&lt;/p>
&lt;ul>
&lt;li>What is DDD?&lt;/li>
&lt;li>What problems does it solve?&lt;/li>
&lt;li>How does it work?&lt;/li>
&lt;li>How to quickly gain value from it?&lt;/li>
&lt;/ul>
&lt;p>You’ll learn how to segregate domain models using the powerful &lt;strong>Bounded Contexts&lt;/strong> pattern, to develop a &lt;strong>Ubiquitous
Language&lt;/strong> within an explicitly bounded context and help &lt;strong>domain experts&lt;/strong> and &lt;strong>developers work together&lt;/strong> to create
that language.&lt;/p>
&lt;p>How to use Subdomains to handle legacy systems and integrate multiple Bounded Contexts to define team relationships and
technical mechanisms.&lt;/p>
&lt;blockquote>
&lt;p>Domain-Driven Design Distilled brings &lt;strong>DDD&lt;/strong> to life.&lt;/p>
&lt;/blockquote></content></entry><entry xml:lang="en"><title>The Process Itself Is the Goal</title><subtitle>How to focus and have self-discipline</subtitle><category term="productivity" scheme="https://chemaclass.com/tags/productivity/" label="Productivity"/><category term="psychology" scheme="https://chemaclass.com/tags/psychology/" label="Psychology"/><category term="career" scheme="https://chemaclass.com/tags/career/" label="Career"/><category term="philosophy" scheme="https://chemaclass.com/tags/philosophy/" label="Philosophy"/><published>2020-09-08T00:00:00+00:00</published><updated>2020-09-08T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/the-process-itself-is-the-goal/"/><id>https://chemaclass.com/blog/the-process-itself-is-the-goal/</id><summary type="html">No goal should be an achievement on its own, but the process itself that helps us to go in the direction of these goals.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2020-09-08/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>No goal should be an achievement on its own, but the process itself that helps us to go in the direction of these goals.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>Goals, in business and in life in general, should be conceived as directions, where their real intention is to help us accomplish more in the way we planned or want.&lt;/p>
&lt;blockquote>
&lt;p>If we get rewarded only for results and not for processes, we will become pretty miserable.&lt;/p>
&lt;/blockquote>
&lt;p>Society doesn’t reward the journey, but the results, and that’s exactly part of the problem when you are too focused on how society acts on you. Of course, it’s important to listen to society, but it’s more important to listen to ourselves in order to improve constantly. Continuous improvement doesn’t apply to software only but to everything in life.&lt;/p>
&lt;h2 id="how-do-i-keep-myself-focused">How do I keep myself focused?&lt;/h2>
&lt;p>This is a totally subjective topic that might be different from person to person. That said, I think it might be useful to share my thoughts with you, so I’ll do it.&lt;/p>
&lt;h3 id="self-reflection">Self-reflection&lt;/h3>
&lt;p>I used to write my thoughts in a “diary” for some years. Back then, in 2015, when I moved to Germany, I didn’t know many people here, and the environment was completely new.
I decided to write my thoughts to myself in order to read them the day after and do some retrospection about it. Finally, after around 3 years, in December 2017, I published a book named &lt;a rel="external" href="http://ojosenunrecuerdo.es/">“Ojos en un recuerdo”&lt;/a>. That book is the compilation of those thoughts. No story behind it. They are as they came. You can see the evolution of the topics and about what and how they were written.&lt;/p>
&lt;p>&lt;img src="/images/blog/2020-09-08/oeur-books.jpg" alt="blog-img" />&lt;/p>
&lt;p>The exercise of self-reflection itself was more important than the book! The goal here wasn’t writing a book at all. The goal was the self-projection to understand what was going on inside myself. Publishing those thoughts in a book was an accident. A beautiful accident, though.
This habit of thinking about my actions and decisions (what do I do and why) helped me to develop who am I nowadays.&lt;/p>
&lt;h3 id="sports">Sports&lt;/h3>
&lt;p>Exercise helps my mind to disconnect from the tech area. It keeps my body active using some energy in a different environment. But most importantly, it helps to get fully tired before going to bed. I feel myself resting much better if I’ve done some sport during the day: contact sports, fitness studio, or simply running.&lt;/p>
&lt;blockquote>
&lt;p>The specific sport itself is an irrelevant detail as far as you feel comfortable. The act of doing sport is the key here.&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="/images/blog/2020-09-08/bjj-berlin-2020.jpg" alt="blog-img" />&lt;/p>
&lt;h3 id="books">Books&lt;/h3>
&lt;p>I try to read tech throughout the day and non-tech during the night. For example, some days before going to work or after working time I might read a tech book. And some days before going to sleep I like to read a non-tech one. This way, I feed my brain with knowledge and I also provide it with non-tech space, so it can rest from code and enjoy other “universes” as well.
Some suggestions that helped me to understand how we behave, why we do what we do, and therefore build some habits that I didn’t know how to:&lt;/p>
&lt;ul>
&lt;li>The power of Habits, by Charles Duhigg.&lt;/li>
&lt;li>Atomic Habits, by James Clear.&lt;/li>
&lt;li>Scrum: Doing Twice the Work in Half the Time, by Jeff Sutherland.&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="/images/blog/2020-09-08/atomic-habits.jpg" alt="blog-img" />&lt;/p>
&lt;h2 id="personal-tricks">Personal tricks&lt;/h2>
&lt;p>I wish I would have read much more. Nowadays, with the number of distractions that we have, keeping yourself focused is pretty hard. Some tricks that help me a lot when I want to focus:&lt;/p>
&lt;ul>
&lt;li>I keep my personal phone always in silence and vibration mode.&lt;/li>
&lt;li>I used to spend hours on social media; a lot of time wasted. Not anymore. I reduced the social media noise to the minimum by removing the apps that prevent me from being as productive as I want. Some of them from my phone, others the account itself.&lt;/li>
&lt;li>I used to play video games. Not anymore. Instead, I go to GitHub to work on my pet projects, contribute to an open-source project, or simply read a book.&lt;/li>
&lt;li>When I go for a run, I enjoy it twice by listening to a 45-min podcast that I want to listen to since the very morning. The reward of listening to the podcast is linked with the act of going out and run. I conscientiously created that habit.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>It’s not about removing your old habits but replacing them with new ones.&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="/images/blog/2020-09-08/chema-jumping.jpg" alt="blog-img" />&lt;/p>
&lt;h3 id="how-to-improve-your-habits">How to improve your habits&lt;/h3>
&lt;p>Habits emerge without our consent. To save energy, the brain creates a habit loop that looks for a trigger to cue a behavior.&lt;/p>
&lt;ul>
&lt;li>Willpower can be learned. It needs exercise, like a muscle.&lt;/li>
&lt;li>Small successes are the building blocks of bigger wins.&lt;/li>
&lt;li>Focus less on goals and more on systems and processes.&lt;/li>
&lt;li>To change habits, change how you identify yourself.&lt;/li>
&lt;li>To build good habits, the environment is more important than being motivated.&lt;/li>
&lt;li>To break a bad habit, reduce exposure to the cues that cause it.&lt;/li>
&lt;li>Bundle an action you want to do with an action you need to do.&lt;/li>
&lt;li>Don’t try to make a habit perfect, just repeat it.&lt;/li>
&lt;li>Reduce friction for good habits and increase friction for bad habits.&lt;/li>
&lt;li>Like in Scrum, removing waste is fundamental to get better.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>Repetition is the key. Make it easier to do what you want to do. Make it harder to do what you want to stop doing. Enjoy the process: that’s the goal.&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="/images/blog/2020-09-08/chema-next-turm.jpg" alt="blog-img" />&lt;/p>
&lt;h2 id="interesting-links">Interesting links&lt;/h2>
&lt;ul>
&lt;li>&lt;a rel="external" href="https://heleo.com/charles-duhigg-13-key-insights-charles-duhiggs-power-habit/2026/">13 key insights from The Power of Habit&lt;/a>&lt;/li>
&lt;li>&lt;a rel="external" href="https://medium.com/@saurinparikh/the-most-interesting-useful-takeaways-from-atomic-habits-9acc20bdc858">The most interesting takeaways from Atomic Habits&lt;/a>&lt;/li>
&lt;li>&lt;a href="/readings/atomic-habits/">Atomic Habits in my readings&lt;/a>&lt;/li>
&lt;/ul></content></entry><entry xml:lang="en"><title>Testing Effectively Legacy Code</title><subtitle>How to write proper tests to already written code</subtitle><category term="testing" scheme="https://chemaclass.com/tags/testing/" label="Testing"/><category term="refactoring" scheme="https://chemaclass.com/tags/refactoring/" label="Refactoring"/><category term="clean-code" scheme="https://chemaclass.com/tags/clean-code/" label="Clean Code"/><category term="tdd" scheme="https://chemaclass.com/tags/tdd/" label="Tdd"/><published>2020-08-17T00:00:00+00:00</published><updated>2020-08-17T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/testing-effectively-legacy-code/"/><id>https://chemaclass.com/blog/testing-effectively-legacy-code/</id><summary type="html">How to write characterization tests for legacy code to safely refactor without breaking existing behavior.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2020-08-17/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>These tests are also known as Characterization tests.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;blockquote>
&lt;p>A characterization test describes the actual behavior of an existing piece of software, and therefore protects existing
behavior of legacy code against unintended changes via automated testing. This term was coined by &lt;a href="/readings/working-effectively-with-legacy-code/">Michael Feathers&lt;/a>.&lt;/p>
&lt;/blockquote>
&lt;p>They enable and provide a safety net for extending and refactoring code that does not have adequate tests. A test can be
written that asserts that the output of the legacy code matches the observed result for the given inputs.&lt;/p>
&lt;h2 id="how-to-start">How to start?&lt;/h2>
&lt;p>These are my learnings one year after
reading &lt;a href="/readings/working-effectively-with-legacy-code/">Working Effectively with Legacy Code&lt;/a> and applying it to the
different projects I’ve been working on since then.&lt;/p>
&lt;h3 id="1-what-do-you-want-to-test">1. What do you want to test?&lt;/h3>
&lt;p>Find out the assertions. Create a test file for your class, and a testing method for the function that you want to test.
Hint:&lt;/p>
&lt;ul>
&lt;li>If you have the following method &lt;code>applySomeLogic(): ReturnType&lt;/code>,&lt;/li>
&lt;li>the test you could write is &lt;code>test_apply_some_logic(): void&lt;/code>.&lt;/li>
&lt;/ul>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="php">&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">final&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> class&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> MyBusinessLogic&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>{&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> private&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> DependencyInterface&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> dependencyInterface&lt;/span>&lt;span>;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> private&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> ConcreteDependency&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> concrete&lt;/span>&lt;span>;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> public&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> function&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> __construct&lt;/span>&lt;span>(&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> DependencyInterface dependencyInterface&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> ConcreteDependency concrete&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> )&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> this&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">.&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">dependencyInterface&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> dependencyInterface&lt;/span>&lt;span>;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> this&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">.&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">concrete&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> concrete&lt;/span>&lt;span>;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> public&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> function&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> applySomeLogic&lt;/span>&lt;span>(&lt;/span>&lt;span>Input input&lt;/span>&lt;span>)&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">:&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> ReturnType&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);"> //&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> black box responsible to create a ReturnType&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);"> //&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> based on the given Input&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> return&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> returnType&lt;/span>&lt;span>;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>}&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">final&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> class&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> MyBusinessLogicTest&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> extends&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> TestCase&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>{&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> public&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> function&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> test_apply_some_logic&lt;/span>&lt;span>(&lt;/span>&lt;span>)&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">:&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> void&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);"> //&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> I want to assert that &amp;quot;applying some logic&amp;quot;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);"> //&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> from MyBusinessLogic with the given Input&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);"> //&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> I will receive a concrete ReturnType with a &lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);"> //&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> certain value as its property. Something like:&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> &lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> returnType&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> myBusinessLogic&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">.&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">applySomeLogic&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">input&lt;/span>&lt;span>)&lt;/span>&lt;span>;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);"> assertEquals&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;#39;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">expected&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;#39;&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> returnType&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">.&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">getProperty&lt;/span>&lt;span>(&lt;/span>&lt;span>)&lt;/span>&lt;span>)&lt;/span>&lt;span>;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>}&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;h3 id="2-instantiate-the-concrete-final-class-that-you-want-to-test">2. Instantiate the concrete/final class that you want to test.&lt;/h3>
&lt;p>Do not mock your concrete classes. Especially your business domain. Mock only interfaces. Otherwise, you can be hiding
bugs unintentionally (with green/passing tests!). Treat your &lt;a href="/blog/final-classes">business domain classes as final&lt;/a>.&lt;/p>
&lt;p>Either mock the interface or instantiate an anonymous class if you want to create a Stub:&lt;/p>
&lt;blockquote>
&lt;p>Stubs provide answers to calls made during the test, usually not responding to anything outside what’s programmed in for the test.&lt;/p>
&lt;/blockquote>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="php">&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">final&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> class&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> MyBusinessLogicTest&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> extends&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> TestCase&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>{&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> public&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> function&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> test_apply_some_logic&lt;/span>&lt;span>(&lt;/span>&lt;span>)&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">:&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> void&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> myBusinessLogic&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> new&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> MyBusinessLogic&lt;/span>&lt;span>(&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> this&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">.&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">createMock&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">DependencyInterface&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">.&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">class&lt;/span>&lt;span>)&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> new&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> ConcreteDependency&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);">/*&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> ... &lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);">*/&lt;/span>&lt;span>)&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> )&lt;/span>&lt;span>;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);"> //&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> OR&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> myBusinessLogic&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> new&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> MyBusinessLogic&lt;/span>&lt;span>(&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> new&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> FakeDependency&lt;/span>&lt;span>(&lt;/span>&lt;span>)&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> new&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> ConcreteDependency&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);">/*&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> ... &lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);">*/&lt;/span>&lt;span>)&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> )&lt;/span>&lt;span>;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);"> //&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> ...&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>}&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;blockquote>
&lt;p>Where &lt;code>FakeDependency&lt;/code> is a concrete implementation of &lt;code>DependencyInterface&lt;/code> with already “fake data/implementation” that it’s useful only for testing purposes.&lt;/p>
&lt;/blockquote>
&lt;h3 id="3-call-the-method-from-that-class-providing-the-desired-input">3. Call the method from that class providing the desired input.&lt;/h3>
&lt;p>The output will be determined by the initial state of the business logic class that we want to test PLUS the input
arguments that we are using.&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="php">&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);">input&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> new&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> Input&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);">/*&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> ... &lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);">*/&lt;/span>&lt;span>)&lt;/span>&lt;span>;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);">returnType&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> myBusinessLogic&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">.&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">applySomeLogic&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">input&lt;/span>&lt;span>)&lt;/span>&lt;span>;&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;h3 id="4-assert-the-output-with-the-expected-value">4. Assert the output with the expected value.&lt;/h3>
&lt;p>From step-1 you need to know what you want. Apply the assertion(s) now.&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="php">&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">final&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> class&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> MyBusinessLogicTest&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> extends&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> TestCase&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>{&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> public&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> function&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> test_apply_some_logic&lt;/span>&lt;span>(&lt;/span>&lt;span>)&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">:&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> void&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> myBusinessLogic&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> new&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> MyBusinessLogic&lt;/span>&lt;span>(&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> this&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">.&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">createMock&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">DependencyInterface&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">::&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">class&lt;/span>&lt;span>)&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> new&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> ConcreteDependency&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);">/*&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> ... &lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);">*/&lt;/span>&lt;span>)&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> )&lt;/span>&lt;span>;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> input&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> new&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> Input&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);">/*&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> ... &lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);">*/&lt;/span>&lt;span>)&lt;/span>&lt;span>;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> returnType&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> myBusinessLogic&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">.&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">applySomeLogic&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">input&lt;/span>&lt;span>)&lt;/span>&lt;span>;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);"> assertEquals&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;#39;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">expected&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;#39;&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> returnType&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">.&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">getProperty&lt;/span>&lt;span>(&lt;/span>&lt;span>)&lt;/span>&lt;span>)&lt;/span>&lt;span>;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>}&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;h3 id="5-you-might-want-to-assert-different-expected-values">5. You might want to assert different expected values.&lt;/h3>
&lt;p>You can easily provide different arguments to your business logic either via the logic construction or different given
arguments. To do so, use the @dataProvider annotation. The “dataProvider” method must be public and return any iterable.&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="php">&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);">final&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> class&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> MyBusinessLogicTest&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> extends&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> TestCase&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>{&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);"> /**&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> @dataProvider providerApplySomeLogic &lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);">*/&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> public&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> function&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> test_apply_some_logic&lt;/span>&lt;span>(&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> array concreteMapping&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> string argInput&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> string expectedValue&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> )&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">:&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> void&lt;/span>&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> myBusinessLogic&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> new&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> MyBusinessLogic&lt;/span>&lt;span>(&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> this&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">.&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">createMock&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">DependencyInterface&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">.&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">class&lt;/span>&lt;span>)&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> new&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> ConcreteDependency&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">concreteMapping&lt;/span>&lt;span>)&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);"> /*&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> ... &lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);">*/&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> )&lt;/span>&lt;span>;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> input&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> new&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> Input&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">argInput&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> /*&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> ... &lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);">*/&lt;/span>&lt;span>)&lt;/span>&lt;span>;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);"> actual&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> myBusinessLogic&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">.&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">applySomeLogic&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">input&lt;/span>&lt;span>)&lt;/span>&lt;span>;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);"> assertEquals&lt;/span>&lt;span>(&lt;/span>&lt;span>$&lt;/span>&lt;span>expectedValue&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> actual&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">.&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">getProperty&lt;/span>&lt;span>(&lt;/span>&lt;span>)&lt;/span>&lt;span>)&lt;/span>&lt;span>;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> public&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> function&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);"> providerApplySomeLogic&lt;/span>&lt;span>(&lt;/span>&lt;span>)&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">:&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> Generator&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> {&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> yield&lt;/span>&lt;span> [&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;#39;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">concreteMapping&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;#39;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&amp;gt;&lt;/span>&lt;span> [&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;#39;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">key&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;#39;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&amp;gt;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;#39;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">value&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;#39;&lt;/span>&lt;span>]&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;#39;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">argInput&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;#39;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&amp;gt;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;#39;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">something&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;#39;&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;#39;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">expectedValue&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;#39;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&amp;gt;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;#39;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">expected-value-A&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;#39;&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> ]&lt;/span>&lt;span>;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#D73A49, #F97583);"> yield&lt;/span>&lt;span> [&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;#39;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">concreteMapping&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;#39;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&amp;gt;&lt;/span>&lt;span> [&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;#39;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">key2&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;#39;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&amp;gt;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;#39;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">value2&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;#39;&lt;/span>&lt;span>]&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;#39;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">argInput&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;#39;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&amp;gt;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;#39;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">something-else&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;#39;&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;#39;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">expectedValue&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;#39;&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&amp;gt;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> &amp;#39;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">expected-value-B&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);">&amp;#39;&lt;/span>&lt;span>,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> ]&lt;/span>&lt;span>;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span> }&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>}&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;h3 id="lastly-clean-what-you-did">Lastly: clean what you did.&lt;/h3>
&lt;p>Yes, clean the tests. They deserve to be as clean as your production code. Otherwise, they will rot as time pass by and
remain dirty for your colleagues and your future self!&lt;/p>
&lt;p>For example, you can apply extract method refactoring to move out the implementation details (of the creation of the
different objects) and keep the same abstraction level while reading the test code.&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="php">&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);">myBusinessLogic&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> this&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">.&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">createBusinessLogic&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">concreteMapping&lt;/span>&lt;span>)&lt;/span>&lt;span>;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);">input&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> this&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">.&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">createInput&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">argInput&lt;/span>&lt;span>)&lt;/span>&lt;span>;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#005CC5, #79B8FF);">actual&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> =&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> myBusinessLogic&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">.&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">applySomeLogic&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">input&lt;/span>&lt;span>)&lt;/span>&lt;span>;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);">assertEquals&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);">expectedValue&lt;/span>&lt;span>,&lt;/span>&lt;span style="color: light-dark(#005CC5, #79B8FF);"> actual&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);">.&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">getProperty&lt;/span>&lt;span>(&lt;/span>&lt;span>)&lt;/span>&lt;span>)&lt;/span>&lt;span>;&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>Of course, everything depends on the context. Does it really make sense to extract into a private method the
createBusinessLogic() or even createInput()? Well, that’s up to you. It depends on the number of lines and, most
importantly, the abstraction level that belongs to that context.&lt;/p>
&lt;blockquote>
&lt;p>Just remember: keep your methods small.&lt;/p>
&lt;/blockquote>
&lt;p>Now you can refactor the production code that you covered with tests without that fear of breaking it.&lt;/p>
&lt;hr />
&lt;h3 id="all-together">All together&lt;/h3>
&lt;script src="https://gist.github.com/Chemaclass&amp;#x2F;07704606fcb337dbb0881c94197c329e.js">&lt;/script>
&lt;script src="https://gist.github.com/Chemaclass&amp;#x2F;9f7f96242153b696b3f8da5c7fa80461.js">&lt;/script>
&lt;hr />
&lt;h2 id="legacy-code-is-code-without-tests">Legacy Code is code without tests&lt;/h2>
&lt;p>&lt;img src="/images/blog/2020-08-17/footer.jpg" alt="blog-cover" />&lt;/p>
&lt;p>Of course, there is way more to learn
about &lt;a href="/readings/working-effectively-with-legacy-code/">testing and working with legacy code&lt;/a>. In fact, especially when
dealing with legacy code, you will encounter situations where the code is coupled somehow that you might want to mock
your concrete classes because there is no interface (yet) for it.&lt;/p>
&lt;p>This book presents to you a lot of techniques about when, why, where, and how you can apply these changes.&lt;/p>
&lt;blockquote>
&lt;p>When working with code you need &lt;strong>feedback&lt;/strong>. Automated feedback is the best. Thus, this is the first thing you need to do: write the tests.&lt;/p>
&lt;/blockquote>
&lt;h3 id="first-add-tests-then-do-your-changes">First, add tests, then do your changes.&lt;/h3>
&lt;h4 id="change-as-little-code-as-possible-to-get-tests-in-place-with-the-recipe">Change as little code as possible to get tests in place with the recipe:&lt;/h4>
&lt;ol>
&lt;li>Identify “change points” to break your code dependencies.&lt;/li>
&lt;li>Break dependencies.&lt;/li>
&lt;li>Write the tests.&lt;/li>
&lt;li>Make your changes.&lt;/li>
&lt;li>Refactor.&lt;/li>
&lt;/ol>
&lt;hr />
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/wRtJRkRIa2s"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>Advanced Web Application Architecture</title><subtitle>The best guide that brings your coding skills a level up.</subtitle><category term="architecture" scheme="https://chemaclass.com/tags/architecture/" label="Architecture"/><category term="php" scheme="https://chemaclass.com/tags/php/" label="Php"/><category term="software-design" scheme="https://chemaclass.com/tags/software-design/" label="Software Design"/><category term="refactoring" scheme="https://chemaclass.com/tags/refactoring/" label="Refactoring"/><published>2020-08-16T00:00:00+00:00</published><updated>2020-08-16T00:00:00+00:00</updated><author><name>
Matthias Noback</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/advance-web-application-architecture/"/><id>https://chemaclass.com/readings/advance-web-application-architecture/</id><summary type="html">The best guide that brings your coding and architecture skills a level up. All the modern PHP features combined with the elegance of a well designed modular design.</summary><content type="html">&lt;p>This book helps you get your web applications back in shape. It contains many techniques for decoupling from
infrastructure (like the framework or the database).&lt;/p>
&lt;p>“The best guide that brings your coding and architecture skills a level up. All the modern PHP features combined with the elegance of a well-designed modular design.”&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>In Part 1 we unlock a collection of design patterns which help you establish a clean separation between core and
infrastructure code. Part 2 shows how these design patterns resonate at a higher level with architectural concepts like
layers, ports and adapters (a.k.a. Hexagonal architecture). The book finishes with a discussion of testing strategies and design trade-offs.&lt;/p>
&lt;h3 id="what-you-ll-learn">What you’ll learn&lt;/h3>
&lt;ul>
&lt;li>Separating mixed code into core and infrastructure code by refactoring into patterns.&lt;/li>
&lt;li>Dividing your code into layers, and making a clear distinction between an application’s ports and adapters.&lt;/li>
&lt;li>Testing decoupled applications.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>Buy the book: &lt;a rel="external" href="https://leanpub.com/web-application-architecture">https://leanpub.com/web-application-architecture&lt;/a>&lt;/p>
&lt;/blockquote>
&lt;hr />
&lt;h3 id="design-patterns-for-modernizing-legacy-code-bases">Design patterns for modernizing legacy code bases&lt;/h3>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/WI1QY6OMglE"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>Strict Types in PHP</title><subtitle>declare(strict_types=1);</subtitle><category term="php" scheme="https://chemaclass.com/tags/php/" label="Php"/><category term="clean-code" scheme="https://chemaclass.com/tags/clean-code/" label="Clean Code"/><category term="software-design" scheme="https://chemaclass.com/tags/software-design/" label="Software Design"/><published>2020-08-09T00:00:00+00:00</published><updated>2020-08-09T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/strict-types/"/><id>https://chemaclass.com/blog/strict-types/</id><summary type="html">Why declaring strict_types in PHP improves code readability and prevents silent type coercion bugs.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2020-08-09/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>In December 2015, PHP 7 introduced scalar type declarations and with it the strict types flag. What is this new feature?&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>The good thing about declaring a PHP file as strict is that it actually applies to &lt;strong>ONLY the current file&lt;/strong>. It ensures that this file has strict types, but it doesn’t apply to any other file in the whole project. It allows you to do, step by step, this migration from non-strict code to strict code, especially for new files or projects.&lt;/p>
&lt;blockquote>
&lt;p>To enable the strict mode, a single declare directive must be placed at the top of the file. This means that the strictness of typing for scalars is configured on a per-file basis. This directive not only affects the type declarations of parameters, but also a function’s return type.&lt;/p>
&lt;/blockquote>
&lt;h2 id="strict-types-affect-coercion-types">Strict types affect coercion types&lt;/h2>
&lt;p>Using hint type without &lt;code>strict_types&lt;/code> may lead to subtle bugs.&lt;/p>
&lt;p>Without this, &lt;code>int $x&lt;/code> meant &lt;code>$x must have a value coercible to an int&lt;/code>. Any value that could be coerced to an int would pass the hint type, including:&lt;/p>
&lt;ul>
&lt;li>a proper &lt;code>int&lt;/code> (example: 42 -&amp;gt; 42)&lt;/li>
&lt;li>a &lt;code>float&lt;/code> (example: 13.1459 -&amp;gt; 13)&lt;/li>
&lt;li>a &lt;code>bool&lt;/code> (example: true -&amp;gt; 1)&lt;/li>
&lt;li>a &lt;code>null&lt;/code> (example: null -&amp;gt; 0)&lt;/li>
&lt;li>a &lt;code>string&lt;/code> with leading digits (example: “15 Trees” -&amp;gt; 15)&lt;/li>
&lt;/ul>
&lt;p>By setting &lt;code>strict_types=1&lt;/code>, you tell the engine that int $x means $x must only be an int proper, no type coercion allowed. You have the great assurance you’re getting exactly and only what was given, without any conversion or potential loss.&lt;/p>
&lt;h2 id="who-should-care-about-this-strict-type-line">Who should care about this “strict type” line?&lt;/h2>
&lt;p>Actually, declare(strict_types=1); is more for the reader than for the writer. Why? Because it will explicitly tell the reader:&lt;/p>
&lt;ul>
&lt;li>The types in this current scope (file/class) are treated strictly.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>‘strict_types=1’ is more for the reader than for the writer&lt;/p>
&lt;/blockquote>
&lt;p>The writer just needs to maintain such strictness while writing the expected behavior. That said, as a writer, you should care about your readers, which also includes your future self. Because you are going to be one of them.&lt;/p>
&lt;p>&lt;img src="/images/blog/2020-08-09/footer.jpg" alt="blog-img" />&lt;/p>
&lt;hr />
&lt;h2 id="references">References&lt;/h2>
&lt;ul>
&lt;li>&lt;a rel="external" href="https://www.php.net/manual/en/migration70.new-features.php#migration70.new-features.scalar-type-declarations">Scalar type declarations&lt;/a>&lt;/li>
&lt;li>&lt;a rel="external" href="https://stackoverflow.com/questions/48723637/what-do-strict-types-do-in-php/48723830#48723830">What do strict types do in PHP&lt;/a>&lt;/li>
&lt;/ul></content></entry><entry xml:lang="en"><title>The Art of Refactoring</title><subtitle>When, how, and why</subtitle><category term="refactoring" scheme="https://chemaclass.com/tags/refactoring/" label="Refactoring"/><category term="clean-code" scheme="https://chemaclass.com/tags/clean-code/" label="Clean Code"/><category term="testing" scheme="https://chemaclass.com/tags/testing/" label="Testing"/><category term="software-design" scheme="https://chemaclass.com/tags/software-design/" label="Software Design"/><published>2020-06-28T00:00:00+00:00</published><updated>2020-06-28T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/the-art-of-refactoring/"/><id>https://chemaclass.com/blog/the-art-of-refactoring/</id><summary type="html">If you see something, in the scope of your current task, that can be easily improved, improve it. And if you have any questions about it, ask.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2020-06-28/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>If you see something, in the scope of your current task, that can be easily improved, improve it. And if you have any questions about it, ask.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h2 id="what-is-refactoring">What is refactoring?&lt;/h2>
&lt;p>Refactoring means improving your code. It can go from making a variable name more readable, extract some lines of code into a private method, or separate the responsibilities of a class into subclasses, for example.&lt;/p>
&lt;p>Refactoring is the action of showing that you care about what you do as a professional. It can be a controversial topic; it is indeed one of the major controversial topics since a long time ago. But we shouldn’t stop trying our best in order to improve the quality of the system just because of that controversiality.&lt;/p>
&lt;h2 id="when-and-how-should-we-refactor">When and how should we refactor?&lt;/h2>
&lt;p>Always. In the scope of your current task unless it is an already planned task, something like “architecture refactoring” or similar, where the scope of the task is actually to do refactoring.&lt;/p>
&lt;blockquote>
&lt;p>Refactoring should be part of our daily job, not a separate task by default.&lt;/p>
&lt;/blockquote>
&lt;p>We do not need to ask permission to refactor. Or do we ask our managers for permission to do our best job?&lt;/p>
&lt;p>In order to do proper refactoring, the intention of such refactoring needs to be clear. What is intended to achieve and how? Pair programming (or even pair thinking!) certainly helps in this topic because it syncs two brains on the same topic and that encourages team building and a better understanding of them.&lt;/p>
&lt;p>Applying refactoring in a collaborative way, in a “bidirectional channel”, is fundamental when working within a team. Refactoring shouldn’t be a tabu topic, on the contrary: it will be helpful in order to unify the goals and the direction of the team code quality.&lt;/p>
&lt;h3 id="some-personal-advice-about-the-how">Some personal advice about the “how”&lt;/h3>
&lt;p>Continuous improvement is what we’re looking for within this topic, but…&lt;/p>
&lt;ul>
&lt;li>If you realize your changes are generating more noise than help, stop immediately and think again if your changes are worth in the current system status.&lt;/li>
&lt;/ul>
&lt;p>Maybe it’s not the right moment for that refactoring.&lt;/p>
&lt;p>Maybe you are polluting your current diff with out-scoped changes.&lt;/p>
&lt;p>Or, maybe, your refactoring idea is too big to be applied in your current task. In such a case, a follow-up task (in order to apply the refactoring) would be a better idea.&lt;/p>
&lt;ul>
&lt;li>If you see that refactoring is perhaps needed even before starting your current task, do the refactoring first.&lt;/li>
&lt;/ul>
&lt;p>We usually refactor in order to increase our productivity, making the code more readable and therefore easier to understand.&lt;/p>
&lt;h3 id="testing">Testing&lt;/h3>
&lt;p>Be aware that you should have a pretty well suite of tests covering the logic that you might have changed. Without tests, refactoring can be really risky. Usually, the easier something is to be tested, the easier it is to be replaced or removed.&lt;/p>
&lt;p>You can read more about how testing is related to quality here.&lt;/p>
&lt;h2 id="why-should-we-do-it">Why should we do it?&lt;/h2>
&lt;p>Wouldn’t you want to have a better system as time goes by?&lt;/p>
&lt;p>Software isn’t like wine: it doesn’t get better as time passes by. Therefore, if you want to have a better system you must work for it.&lt;/p>
&lt;p>&lt;img src="/images/blog/2020-06-28/footer.jpg" alt="blog-img" />&lt;/p></content></entry><entry xml:lang="en"><title>Never split the difference</title><subtitle>Negotiating as if your life depended on it</subtitle><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><category term="psychology" scheme="https://chemaclass.com/tags/psychology/" label="Psychology"/><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><published>2020-06-12T00:00:00+00:00</published><updated>2020-06-12T00:00:00+00:00</updated><author><name>
Chris Voss</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/never-split-the-difference/"/><id>https://chemaclass.com/readings/never-split-the-difference/</id><summary type="html">From policing the rough streets of Kansas City, Missouri, to becoming the FBI's lead international kidnapping negotiator to teaching negotiation at leading universities, Chris Voss has tested the techniques in 'Never Split the Difference' across the full spectrum of human endeavor and proved their effectiveness.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>From policing the rough streets of Kansas City, Missouri, to becoming the FBI’s lead international kidnapping negotiator
to teaching negotiation at leading universities, Chris Voss has tested the techniques in &lt;em>Never Split the Difference&lt;/em>
across the full spectrum of human endeavor and proved their effectiveness.&lt;/p>
&lt;hr />
&lt;h2 id="takeaways">Takeaways&lt;/h2>
&lt;ol>
&lt;li>Negotiation begins with listening, making it about the other people, validating their emotions, and creating enough
trust and safety for a real conversation to begin.&lt;/li>
&lt;li>Use mirrors to encourage the other side to empathize and bond with you, keep people talking, buy your side time to
regroup, and encourage your counterparts to reveal their strategy.&lt;/li>
&lt;li>Tactical empathy brings our attention to both the emotional obstacles and the potential pathways to getting an
agreement done.&lt;/li>
&lt;li>Giving someone’s emotion a name, otherwise known as labeling, gets you close to someone without asking about external
factors you know nothing about.&lt;/li>
&lt;li>“No” provides a great opportunity for you, and the other party to clarify what you really want by eliminating what you
don’t want.&lt;/li>
&lt;/ol>
&lt;h3 id="summary-video">Summary video&lt;/h3>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/QIRk382yJm4"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>Scrum</title><subtitle>The Art of Doing Twice the Work in Half the Time</subtitle><category term="scrum" scheme="https://chemaclass.com/tags/scrum/" label="Scrum"/><category term="agile" scheme="https://chemaclass.com/tags/agile/" label="Agile"/><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><category term="productivity" scheme="https://chemaclass.com/tags/productivity/" label="Productivity"/><published>2020-06-10T00:00:00+00:00</published><updated>2020-06-10T00:00:00+00:00</updated><author><name>
Jeff Sutherland</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/scrum-the-art-of-doing-twice/"/><id>https://chemaclass.com/readings/scrum-the-art-of-doing-twice/</id><summary type="html">Every organisation, whatever its size, constantly has to come to grips with delivering a product or service on time and on budget. Scrum shows you how. It explains how to define precisely what it is that you are seeking to achieve, how to set up the team to achieve it, and how to monitor progress until the project is successfully completed.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>Every organisation, whatever its size, constantly has to come to grips with delivering a product or service on time and
on budget. Scrum shows you how. It explains how to define precisely what it is that you are seeking to achieve, how to
set up the team to achieve it, and how to monitor progress until the project is successfully completed.&lt;/p></content></entry><entry xml:lang="en"><title>Final Classes in PHP | Java | Any</title><subtitle>Final, or not final, that's the question</subtitle><category term="php" scheme="https://chemaclass.com/tags/php/" label="Php"/><category term="software-design" scheme="https://chemaclass.com/tags/software-design/" label="Software Design"/><category term="clean-code" scheme="https://chemaclass.com/tags/clean-code/" label="Clean Code"/><category term="testing" scheme="https://chemaclass.com/tags/testing/" label="Testing"/><published>2020-06-06T00:00:00+00:00</published><updated>2020-06-06T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/final-classes/"/><id>https://chemaclass.com/blog/final-classes/</id><summary type="html">Clear contracts, isolated side effects, testability, low complexity and cognitive load, code fluidity, and confidence in yourself.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2020-06-06/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>Clear contracts, isolated side effects, testability, low complexity and cognitive load, code fluidity, and confidence in yourself.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h2 id="motivation">Motivation&lt;/h2>
&lt;h3 id="reduce-the-scope-visibility-to-the-minimum">Reduce the scope visibility to the minimum&lt;/h3>
&lt;p>When you see a class prefix with final you will prevent a particular class to be extended by any other, which not only makes it more readable but also makes you be sure that the scope of the logic where you are is limited to that particular class.&lt;/p>
&lt;h3 id="encourage-composition-over-inheritance-mentality">Encourage “composition over inheritance” mentality&lt;/h3>
&lt;p>The Open-Close Principle states: open for extension but close for modification.&lt;/p>
&lt;p>If for any reason, a good one you should be completely aware of, you decide to create an inheritance there, well, then just drop the final keyword and you are good to go.&lt;/p>
&lt;p>When you “by default” can’t extends from a class (because it’s final), you will help yourself by thinking about using composition instead of inheritance.&lt;/p>
&lt;h2 id="why-isn-t-this-class-final">Why isn’t this class final?&lt;/h2>
&lt;p>If we aim for composition over inheritance, then we should try to avoid inheritance as much as possible, and use it only when it’s really necessary. Inheritance is often misused in OOP.&lt;/p>
&lt;h3 id="misconception">Misconception&lt;/h3>
&lt;p>When we first taught OOP, we usually introduced the classic inheritance example.&lt;/p>
&lt;p>Nonetheless, when Alan Kay created Smalltalk, the inheritance was never the main concept of it. The main concept was messaging, which is that you can send messages to objects and they encapsulate the data and logic in it, and you can change their behavior by using different objects, which is actually composition. But the concept of inheritance is too popular that eventually overshadows composition.&lt;/p>
&lt;h3 id="benefits">Benefits&lt;/h3>
&lt;ul>
&lt;li>Clear contracts. Using interfaces will force you to think in terms of communication between objects.&lt;/li>
&lt;li>Isolated, side effect free code units. Injecting interfaces only as dependencies will remove every nasty side effect around the code you are working on.&lt;/li>
&lt;li>Testability. Mocking dependencies is extremely easy when they are interfaces.&lt;/li>
&lt;li>Low, manageable complexity. Since everything is isolated, you won’t need to worry about rippling changes. This dramatically decreases the complexity of your code.&lt;/li>
&lt;li>Low cognitive load. With decreased complexity, your brain will be free to focus on what matters.&lt;/li>
&lt;li>Code fluidity. By removing any unnecessary coupling, you will be able to move things around way more easily than before.&lt;/li>
&lt;li>Confidence in yourself. Being able to test your code in isolation so well will give you a wonderful sense of confidence in changing it.&lt;/li>
&lt;/ul>
&lt;h2 id="composition-over-inheritance">Composition over inheritance&lt;/h2>
&lt;p>If you feel the need to reconfigure an object, to change parts of an algorithm, or to rewrite part of the implementation, consider creating a new class instead of overriding an existing class.
If you need to represent a hierarchy of classes, where subclasses are proper substitutes for their parent classes. This would be the classic situation where you may still consider inheritance. However, the result may even be better if you don’t inherit from concrete parent classes but from abstract interfaces.&lt;/p>
&lt;h3 id="what-you-should-start-doing-instead">What you should start doing instead&lt;/h3>
&lt;ul>
&lt;li>Use interfaces to define the contracts between your classes.&lt;/li>
&lt;li>Use final classes to implement behavior for those interfaces.&lt;/li>
&lt;li>Use composition (using dependency injection through constructor) to put things together and prevent complexity.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>Interfaces -&amp;gt; Final classes -&amp;gt; Composition&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="/images/blog/2020-06-06/footer.jpg" alt="blog-cover" />&lt;/p></content></entry><entry xml:lang="en"><title>7 languages in 7 weeks</title><subtitle>Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages</subtitle><category term="software-design" scheme="https://chemaclass.com/tags/software-design/" label="Software Design"/><category term="software" scheme="https://chemaclass.com/tags/software/" label="Software"/><category term="career" scheme="https://chemaclass.com/tags/career/" label="Career"/><published>2020-05-21T00:00:00+00:00</published><updated>2020-05-21T00:00:00+00:00</updated><author><name>
Bruce Tate</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/7-languages-in-7-weeks/"/><id>https://chemaclass.com/readings/7-languages-in-7-weeks/</id><summary type="html">A hands-on tour of Clojure, Haskell, Io, Prolog, Scala, Erlang, and Ruby. Learn how each language thinks differently and broaden your perspective on programming.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>You should learn a programming language every year, as recommended by The Pragmatic Programmer. But if one per year is
good, how about Seven Languages in Seven Weeks? In this book you’ll get a hands-on tour of Clojure, Haskell, Io, Prolog,
Scala, Erlang, and Ruby. Whether your favorite language is on that list, you’ll broaden your perspective of
programming by examining these languages side-by-side. You’ll learn something new from each, and best of all, you’ll
learn how to learn a language quickly.&lt;/p>
&lt;hr />
&lt;p>I created this repository with all my learnings while I was reading and playing aroung with the languages from this book
&lt;a rel="external" href="https://github.com/Chemaclass/7LangIn7Weeks">https://github.com/Chemaclass/7LangIn7Weeks&lt;/a>&lt;/p></content></entry><entry xml:lang="en"><title>The call of Cthulhu</title><subtitle>The Call of Cthulu, the tale of a horrifying underwater monster coming to life and threatening mankind, spawning an entire mythology, with the power to strike terror into the hearts of even the Great Old Ones.</subtitle><category term="fiction" scheme="https://chemaclass.com/tags/fiction/" label="Fiction"/><category term="horror" scheme="https://chemaclass.com/tags/horror/" label="Horror"/><published>2020-05-18T00:00:00+00:00</published><updated>2020-05-18T00:00:00+00:00</updated><author><name>
H. P. Lovecraft</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/call-of-cthulhu/"/><id>https://chemaclass.com/readings/call-of-cthulhu/</id><summary type="html">Lovecraft's foundational cosmic horror tale about the discovery of an ancient underwater entity whose awakening threatens all of humanity and sanity itself.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>The Call of Cthulu, the tale of a horrifying underwater monster coming to life and threatening mankind, spawning an
entire mythology, with the power to strike terror into the hearts of even the Great Old Ones.&lt;/p></content></entry><entry xml:lang="en"><title>The metamorphosis</title><subtitle>A novella about alienation, identity, and transformation</subtitle><category term="fiction" scheme="https://chemaclass.com/tags/fiction/" label="Fiction"/><category term="philosophy" scheme="https://chemaclass.com/tags/philosophy/" label="Philosophy"/><category term="psychology" scheme="https://chemaclass.com/tags/psychology/" label="Psychology"/><published>2020-05-16T00:00:00+00:00</published><updated>2020-05-16T00:00:00+00:00</updated><author><name>
Franz Kafka</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/metamorphosis/"/><id>https://chemaclass.com/readings/metamorphosis/</id><summary type="html">Kafka's iconic novella about alienation and identity. Gregor Samsa wakes as a monstrous insect and must confront his family's revulsion and his own fading humanity.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>The Metamorphosis (German: Die Verwandlung, also sometimes translated as The Transformation) is a novella by Franz Kafka, first published in 1915. It has been cited as one of the seminal works of fiction of the 20th century and is studied in colleges and universities across the Western world. The story begins with a traveling salesman, Gregor Samsa, waking to find himself transformed (metamorphosed) into a large, monstrous insect-like creature. The cause of Samsa’s transformation is never revealed, and Kafka never did give an explanation. The rest of Kafka’s novella deals with Gregor’s attempts to adjust to his new condition as he deals with being burdensome to his parents and sister, who are repulsed by the horrible, verminous creature Gregor has become.&lt;/p></content></entry><entry xml:lang="en"><title>1984</title><subtitle>A society terrorised by a totalitarian ideology</subtitle><category term="fiction" scheme="https://chemaclass.com/tags/fiction/" label="Fiction"/><category term="dystopia" scheme="https://chemaclass.com/tags/dystopia/" label="Dystopia"/><category term="philosophy" scheme="https://chemaclass.com/tags/philosophy/" label="Philosophy"/><category term="psychology" scheme="https://chemaclass.com/tags/psychology/" label="Psychology"/><published>2020-05-13T00:00:00+00:00</published><updated>2020-05-13T00:00:00+00:00</updated><author><name>
George Orwell</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/1984/"/><id>https://chemaclass.com/readings/1984/</id><summary type="html">One of Britain's most popular novels, George Orwell's Nineteen Eighty-Four is set in a society terrorised by a totalitarian ideology propagated by The Party.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>One of Britain’s most popular novels, George Orwell’s Nineteen Eighty-Four is set in a society terrorised by a totalitarian ideology propagated by The Party.&lt;/p>
&lt;p>Winston Smith works for the Ministry of Truth in London, chief city of Airstrip One. Big Brother stares out from every poster, the Thought Police uncover every act of betrayal. When Winston finds love with Julia, he discovers that life does not have to be dull and deadening, and awakens to new possibilities. Despite the police helicopters that hover and circle overhead, Winston and Julia begin to question the Party; they are drawn towards conspiracy. Yet Big Brother will not tolerate dissent - even in the mind. For those with original thoughts they invented Room 101. . .&lt;/p>
&lt;p>Nineteen Eighty-Four is George Orwell’s terrifying vision of a totalitarian future in which everything and everyone is slave to a tyrannical regime. The novel also coined many new words and phrases which regular appear in popular culture, such as ‘Big Brother’, ‘thoughtcrime’, ‘doublethink’ and ‘Newspeak’.&lt;/p>
&lt;hr />
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/T8BA7adK6XA"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>The Art of Testing: Where Design Meets Quality</title><subtitle>From a software developer's point of view</subtitle><category term="testing" scheme="https://chemaclass.com/tags/testing/" label="Testing"/><category term="software-design" scheme="https://chemaclass.com/tags/software-design/" label="Software Design"/><category term="clean-code" scheme="https://chemaclass.com/tags/clean-code/" label="Clean Code"/><category term="tdd" scheme="https://chemaclass.com/tags/tdd/" label="Tdd"/><published>2020-04-07T00:00:00+00:00</published><updated>2020-04-07T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/the-art-of-testing/"/><id>https://chemaclass.com/blog/the-art-of-testing/</id><summary type="html">Why you should consider testing as part of your daily development habit and how it's directly linked to the software quality.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2020-04-07/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>Why you should consider testing as part of your daily development habit and how it’s directly linked to the software
quality.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>This post intends not to explain the different testing techniques that we can use. I’m not going to tell you the differences between unit, integration, feature, or end-to-end testing.&lt;/p>
&lt;p>I’m still amazed by the lack of experience with testing in software in general. Common ignorance in this world about
best testing practices for us as developers. Inexperience that you can easily see if you have already worked on
different projects and teams.&lt;/p>
&lt;h3 id="software-testing">Software testing&lt;/h3>
&lt;p>Some horrible patterns I’ve seen (and done):&lt;/p>
&lt;ul>
&lt;li>Testing for the sake of testing: testing every single file, sometimes wrongly considered a unit.&lt;/li>
&lt;li>Mocking every class we intend to test, overriding the actual implementation, and creating a fake behavior,
providing a false coverage perception.&lt;/li>
&lt;li>Coupling production code with tests everywhere, so it’s impossible to change anything without breaking some tests,
even if the feature itself it’s working as intended.&lt;/li>
&lt;li>Not testing at all because “why should we even test anything if the feature is done, and it works? Why should we
spend more time on this if it’s done?.”&lt;/li>
&lt;/ul>
&lt;p>One of the main reasons for software testing is actually verifying a suite of proofs for the expected behavior of the
final software piece. However, testing can (and should) be more than that.&lt;/p>
&lt;h3 id="software-design">Software design&lt;/h3>
&lt;p>Software design goes from algorithm to architecture design. Even when I believe these two levels of components have
different needs and requirements, they still share some common patterns. For example, testing, and this is what we are
going to talk about right now:&lt;/p>
&lt;blockquote>
&lt;p>If it’s easy to test, it will likely be because of good design.&lt;/p>
&lt;/blockquote>
&lt;h3 id="software-quality">Software quality&lt;/h3>
&lt;p>Is quality hard to measure out? Indeed. There are different measurement keys that we should take while considering
quality for any piece of software. Still, I’m sure we could agree on this:&lt;/p>
&lt;blockquote>
&lt;p>If you aim for quality in your software, you better seek a good design.&lt;/p>
&lt;/blockquote>
&lt;p>Testing by itself means “proving,” as we all know. That said… how difficult it sometimes turns to prove some logic
that we finally give up because of its complexity itself?&lt;/p>
&lt;p>The art of testing is about using testing itself to help and contribute to the final result. To encourage good design,
suppose we’re able to use testing (of any kind) in our favor, depending on the context of what we want to prove. In that
case, it will undoubtedly help us increase the product’s end quality.&lt;/p>
&lt;p>Therefore, testing should be used not only to prove the behavior of our software but also to guide our software to a better design.&lt;/p>
&lt;p>Should we test everything? Well, that’s the million-dollar question. In my opinion, everything depends on the context. We
might encounter situations where tests might not be beneficial. Even in those situations, we should write our code as if
it could be tested anyway.&lt;/p>
&lt;p>&lt;img src="/images/blog/2020-04-07/footer.jpg" alt="blog-cover" />&lt;/p>
&lt;blockquote>
&lt;p>Testable code tends to better design and, therefore, better quality.&lt;/p>
&lt;/blockquote></content></entry><entry xml:lang="en"><title>High Output Management</title><subtitle>The art of the entrepreneur can be summed up in a single word: managing</subtitle><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><category term="productivity" scheme="https://chemaclass.com/tags/productivity/" label="Productivity"/><published>2020-04-03T00:00:00+00:00</published><updated>2020-04-03T00:00:00+00:00</updated><author><name>
Andrew S. Grove</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/high-output-management/"/><id>https://chemaclass.com/readings/high-output-management/</id><summary type="html">Andy Grove's management classic from Intel, covering managerial leverage, meetings, decision-making, motivation, and how to maximize team output in technology organizations.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>In this legendary business book and Silicon Valley staple, the former chairman and CEO of Intel shares his perspective
on how to build and run a company. A practical handbook for navigating real-life business scenarios and a powerful
management manifesto with the ability to revolutionize the way we work.&lt;/p>
&lt;h3 id="sections">Sections&lt;/h3>
&lt;ul>
&lt;li>Managerial Leverage&lt;/li>
&lt;li>Training&lt;/li>
&lt;li>Motivation&lt;/li>
&lt;li>Meetings and Decisions&lt;/li>
&lt;li>One-on-One Meetings&lt;/li>
&lt;li>Delegation and Task-Relevant Maturity&lt;/li>
&lt;li>KPIs&lt;/li>
&lt;li>Performance Reviews&lt;/li>
&lt;li>Interviews&lt;/li>
&lt;li>Promotions and Recycling&lt;/li>
&lt;/ul>
&lt;hr />
&lt;p>A pretty nice overview from the takeaways by Marc Koenig:&lt;/p>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/Yi1PSs_bpQ0"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>The Manager Path</title><subtitle>A Guide for Tech Leaders Navigating Growth and Change</subtitle><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><category term="mentoring" scheme="https://chemaclass.com/tags/mentoring/" label="Mentoring"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><published>2020-03-26T00:00:00+00:00</published><updated>2020-03-26T00:00:00+00:00</updated><author><name>
Camille Fournier</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/the-manager-path/"/><id>https://chemaclass.com/readings/the-manager-path/</id><summary type="html">Camille Fournier maps the career path from engineer to CTO, covering 1:1s, mentoring, team management, and the evolving responsibilities at each level of technical leadership.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>&lt;h2 id="key-lessons">Key lessons&lt;/h2>
&lt;ol>
&lt;li>One-on-one meetings with your manager are an essential feature of a good working relationship.&lt;/li>
&lt;li>A manager’s job involves making it easy for her employees to get things done by creating fertile environments in
which work can happen.&lt;/li>
&lt;li>Mentoring new hires is critical.&lt;/li>
&lt;li>Feedback works best when you, as a manager, pair that feedback with coaching.&lt;/li>
&lt;li>It’s unrealistic to think you can or should shield your team from everything.&lt;/li>
&lt;/ol>
&lt;hr />
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/oxgfehnJ7GE"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>Clean Agile</title><subtitle>Back to Basics</subtitle><category term="agile" scheme="https://chemaclass.com/tags/agile/" label="Agile"/><category term="tdd" scheme="https://chemaclass.com/tags/tdd/" label="Tdd"/><category term="software-design" scheme="https://chemaclass.com/tags/software-design/" label="Software Design"/><published>2020-03-12T00:00:00+00:00</published><updated>2020-03-12T00:00:00+00:00</updated><author><name>
Robert C. Martin</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/clean-agile/"/><id>https://chemaclass.com/readings/clean-agile/</id><summary type="html">This book is about Agile. What it was, what it is, and what it will be. This is a back-to-basics talk that covers the history of Agile, what motivated it, and what has happened to it since.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>Clean Agile comes from Uncle Bob, one of the founding fathers of Agile, one of the seventeen people who authored the
&lt;a rel="external" href="https://agilemanifesto.org/">Agile Manifesto&lt;/a> back in 2001.&lt;/p>
&lt;hr />
&lt;p>This talk is about Agile. What it was, what it is, and what it will be. This is a back-to-basics talk that covers the
history of Agile, what motivated it, and what has happened to it since. The talk covers the basic practices of Agile,
and compares and contrasts those practices with the current menagerie of Agile processes.&lt;/p>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/FedQ2NlgxMI"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>Extreme Programming Explained</title><subtitle>Embrace Change</subtitle><category term="xp" scheme="https://chemaclass.com/tags/xp/" label="Xp"/><category term="agile" scheme="https://chemaclass.com/tags/agile/" label="Agile"/><category term="tdd" scheme="https://chemaclass.com/tags/tdd/" label="Tdd"/><category term="pair-programming" scheme="https://chemaclass.com/tags/pair-programming/" label="Pair Programming"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><published>2020-03-05T00:00:00+00:00</published><updated>2020-03-05T00:00:00+00:00</updated><author><name>
Kent Beck</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/extreme-programming-explained/"/><id>https://chemaclass.com/readings/extreme-programming-explained/</id><summary type="html">Extreme Programming (XP) is an agile software development framework that aims to produce higher quality software, and higher quality of life for the development team. XP is the most specific of the agile frameworks regarding appropriate engineering practices for software development.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>&lt;h2 id="definition">Definition&lt;/h2>
&lt;p>Extreme Programming (XP) is an agile software development framework that aims to produce higher quality software, and
higher quality of life for the development team. XP is the most specific of the agile frameworks regarding appropriate
engineering practices for software development.&lt;/p>
&lt;hr />
&lt;h2 id="values">Values&lt;/h2>
&lt;p>The five values of XP are communication, simplicity, feedback, courage, and respect and are described in more detail
below.&lt;/p>
&lt;h3 id="communication">Communication&lt;/h3>
&lt;p>Software development is inherently a team sport that relies on communication to transfer knowledge from one team member
to everyone else on the team. XP stresses the importance of the appropriate kind of communication. – face to face
discussion with the aid of a white board or other drawing mechanism.&lt;/p>
&lt;h3 id="simplicity">Simplicity&lt;/h3>
&lt;p>Simplicity means “what is the simplest thing that will work?” The purpose of this is to avoid waste and do only
absolutely necessary things such as keep the design of the system as simple as possible so that it is easier to
maintain, support, and revise. Simplicity also means address only the requirements that you know about; don’t try to
predict the future.&lt;/p>
&lt;h3 id="feedback">Feedback&lt;/h3>
&lt;p>Through constant feedback about their previous efforts, teams can identify areas for improvement and revise their
practices. Feedback also supports simple design. Your team builds something, gathers feedback on your design and
implementation, and then adjust your product going forward.&lt;/p>
&lt;h3 id="courage">Courage&lt;/h3>
&lt;p>Kent Beck defined courage as “effective action in the face of fear”. This definition shows a preference for action based
on other principles so that the results aren’t harmful to the team. You need courage…&lt;/p>
&lt;ul>
&lt;li>to raise organizational issues that reduce your team’s effectiveness.&lt;/li>
&lt;li>to stop doing something that doesn’t work and try something else.&lt;/li>
&lt;li>to accept and act on feedback, even when it’s difficult to accept.&lt;/li>
&lt;/ul>
&lt;h3 id="respect">Respect&lt;/h3>
&lt;p>The members of your team need to respect each other in order to communicate with each other, provide and accept feedback
that honors your relationship, and to work together to identify simple designs and solutions.&lt;/p>
&lt;hr />
&lt;h2 id="principles">Principles&lt;/h2>
&lt;h3 id="humanity">Humanity&lt;/h3>
&lt;p>Human beings are the ones developing software. It is a fact. The book mentions 5 points that are needed for developers
to become good: basic safety, accomplishment, belonging, growth, and intimacy.&lt;/p>
&lt;p>The magic of great teams is that after the team members develop trust they find that they are free to be more themselves
as a result of their work together.&lt;/p>
&lt;h3 id="economics">Economics&lt;/h3>
&lt;p>Software costs. Someone or multiple people paid or invested in it.&lt;/p>
&lt;p>Make sure what you are doing has business value, meets business goals, and serves business needs. For example, solving
the highest priority business need first maximizes the value of the project.&lt;/p>
&lt;p>The earlier software makes money, the sooner the development is valuable.&lt;/p>
&lt;h3 id="mutual-benefit">Mutual Benefit&lt;/h3>
&lt;p>Mutual benefit in XP is about activities benefitting all concerned. This principle is about finding practices that
benefit me now, me later, and the customers as well.&lt;/p>
&lt;p>The book brings up 3 points how XP mutually deals with communication-with-the-future problems:&lt;/p>
&lt;ul>
&lt;li>I write automated tests that help me design and implement better today. I leave these tests for future programmers to
use as well. This practice benefits me now and maintainers down the road.&lt;/li>
&lt;li>I carefully refactor to remove accidental complexity, giving me both satisfaction and fewer defects and making the
code easier to understand for those who encounter it later.&lt;/li>
&lt;li>I choose names from a coherent and explicit set of metaphors which speeds my development and makes the code clearer to
new programmers.&lt;/li>
&lt;/ul>
&lt;h3 id="self-similarity">Self-Similarity&lt;/h3>
&lt;p>This principle is about copying the structure of one solution into a new context.&lt;/p>
&lt;p>For example, the basic structure of development is that you write a failing test and then make it work. This structure
operates at all different scales. Take into account, this principle is a good start, but it may not always work.&lt;/p>
&lt;h3 id="improvement">Improvement&lt;/h3>
&lt;p>Do your best today but strive to do better tomorrow, strive to have a deeper understanding tomorrow. XP shines in this
aspect, it is about always improving.&lt;/p>
&lt;blockquote>
&lt;p>Put improvement to work by not waiting for perfection. Find a starting place, get started, and improve from there.&lt;/p>
&lt;/blockquote>
&lt;h3 id="diversity">Diversity&lt;/h3>
&lt;p>Teams need to bring in people from different backgrounds, with different experiences, attitudes, etc. In order for the
team to have different ways of thinking and solving a problem.&lt;/p>
&lt;p>The principle of diversity suggests that the programmers should work together on the problem and both opinions should be valued.&lt;/p>
&lt;h3 id="reflection">Reflection&lt;/h3>
&lt;p>Good teams reflect after action, regularly. They think about why and how they are working.&lt;/p>
&lt;ul>
&lt;li>Why did we succeed? What should we continue doing?&lt;/li>
&lt;li>Why did we fail? What can we do better or differently?&lt;/li>
&lt;/ul>
&lt;p>Reflect and strive to improve. Even if everything seems perfect, know that there is always room for improvement and
throw in the question:&lt;/p>
&lt;ul>
&lt;li>Why do things seem perfect? What are we doing well? What can we do better in order to succeed even more?&lt;/li>
&lt;/ul>
&lt;h3 id="flow">Flow&lt;/h3>
&lt;p>Flow in software development is delivering a steady flow of valuable software by engaging in all the activities of
development simultaneously. Don’t deliver software in big portions. Deploy smaller increments of value more frequently.&lt;/p>
&lt;h3 id="opportunity">Opportunity&lt;/h3>
&lt;p>Learn to see problems as opportunities for learning and improving.&lt;/p>
&lt;blockquote>
&lt;p>Part of being extreme is consciously choosing to transform each problem into an opportunity:
an opportunity for personal growth, deepening relationships, and improved software.&lt;/p>
&lt;/blockquote>
&lt;h3 id="redundancy">Redundancy&lt;/h3>
&lt;p>The difficult problems in software development should be solved in multiple ways.&lt;/p>
&lt;blockquote>
&lt;p>The cost of the redundancy is more than paid for by the savings from not having a disaster.&lt;/p>
&lt;/blockquote>
&lt;h3 id="failure">Failure&lt;/h3>
&lt;p>Sometimes it is extremely difficult to implement something, we don’t know which way or approach to take, try the ideas
you have, even if they fail! Failure isn’t a waste, rather a learning experience.&lt;/p>
&lt;p>Be aware of falling into the trap of discussing or thinking forever and not getting things done.&lt;/p>
&lt;blockquote>
&lt;p>When you don’t know what to do though, risking failure can be the shortest, surest road to success.&lt;/p>
&lt;/blockquote>
&lt;h3 id="quality">Quality&lt;/h3>
&lt;p>Projects don’t go faster by lowering the quality. Actually it’s often the other way around (if not always). It results
in later and less predictable delivery, especially due to the amount of time spent on fixing bugs for example.&lt;/p>
&lt;p>Pushing quality higher often results in faster delivery.&lt;/p>
&lt;blockquote>
&lt;p>A concern for quality is no excuse for inaction. If you don’t know a clean way to do a job that has to be done,
do it the best way you can. If you know a clean way but it would take too long, do the job as well as you have time
for now. Resolve to finish doing it the clean way later.&lt;/p>
&lt;/blockquote>
&lt;h3 id="baby-steps">Baby Steps&lt;/h3>
&lt;p>Take baby steps. Making big changes in big steps is dangerous. People and teams can take many small steps so they appear
to be moving forward rapidly.&lt;/p>
&lt;blockquote>
&lt;p>Baby steps acknowledge that the overhead of small steps is much less than when a team wastefully recoils from aborted big changes.&lt;/p>
&lt;/blockquote>
&lt;h3 id="accepted-responsibility">Accepted Responsibility&lt;/h3>
&lt;blockquote>
&lt;p>Responsibility cannot be assigned; it can only be accepted. If someone tries to give you responsibility, only you can decide if you are responsible or if you aren’t.&lt;/p>
&lt;/blockquote>
&lt;hr />
&lt;h2 id="practices">Practices&lt;/h2>
&lt;p>While it is possible to do these practices in isolation, many teams have found some practices reinforce the others and
should be done in conjunction to fully eliminate the risks you often face in software development.&lt;/p>
&lt;h3 id="sit-together">Sit Together&lt;/h3>
&lt;p>Since communication is one of the five values of XP, have your team sit together in the same space without barriers to
communication, such as cubicle walls.&lt;/p>
&lt;h3 id="whole-team">Whole Team&lt;/h3>
&lt;p>Include on the team people with all the skills and perspectives necessary for the project to succeed.&lt;/p>
&lt;h3 id="informative-workspace">Informative Workspace&lt;/h3>
&lt;p>Set up your team space to facilitate face to face communication, allow people to have some privacy when they need it,
and make the work of the team transparent to each other and to interested parties outside the team.&lt;/p>
&lt;h3 id="energized-work">Energized Work&lt;/h3>
&lt;p>You are most effective at software development and all knowledge work when you are focused and free from distractions.&lt;/p>
&lt;h3 id="pair-programming">Pair Programming&lt;/h3>
&lt;p>Pair Programming means all production software is developed by two people sitting at the same machine. The idea behind
this practice is that two brains and four eyes are better than one brain and two eyes. You effectively get a continuous
code review and quicker response to nagging problems that may stop one person dead in their tracks.&lt;/p>
&lt;p>Teams that have used pair programming have found that it improves quality and does not actually take twice as long
because they are able to work through problems quicker, and they stay more focused on the task at hand, thereby creating
less code to accomplish the same thing.&lt;/p>
&lt;p>Pair programmers:&lt;/p>
&lt;ul>
&lt;li>Keep each other on task.&lt;/li>
&lt;li>Brainstorm refinements to the system.&lt;/li>
&lt;li>Clarify ideas.&lt;/li>
&lt;li>Take initiative when their partner is stuck, thus lowering frustration.&lt;/li>
&lt;li>Hold each other accountable to the team’s practices.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>Pair programming is a dialog between two people simultaneously programming (and analyzing and designing and testing)
and trying to program better.&lt;/p>
&lt;/blockquote>
&lt;p>Though, if you need privacy and time to work on an idea, go ahead and do it. We need both companionship and privacy.
Make sure to rotate pairs frequently and take frequent breaks, pairing can be tiring, but surely is rewarding.&lt;/p>
&lt;h3 id="stories">Stories&lt;/h3>
&lt;p>Describe what the product should do in terms meaningful to customers and users. These stories are intended to be short
descriptions of things users want to be able to do with the product that can be used for planning and serve as reminders
for more detailed conversations when the team gets around to realizing that particular story.&lt;/p>
&lt;p>Give the stories a short title and a description. Write them on cards and put them on a wall that is often being passed.&lt;/p>
&lt;p>In XP stories are estimated extremely early, which gets the team thinking about how to get the largest return from the
tiny investment.&lt;/p>
&lt;h3 id="weekly-cycle">Weekly Cycle&lt;/h3>
&lt;p>The Weekly Cycle is synonymous to an iteration. In the case of XP, the team meets on the first day of the week to
reflect on progress to date, the customer picks the stories they would like delivered in that week, and the team
determines how they will approach those stories.&lt;/p>
&lt;p>The intent behind the time boxed delivery period is to produce something to show to the customer for feedback.&lt;/p>
&lt;h3 id="ten-minute-build">Ten-Minute Build&lt;/h3>
&lt;p>The goal with the Ten-Minute Build is to automatically build the whole system and run all of the tests in ten minutes.&lt;/p>
&lt;h3 id="continuous-integration">Continuous Integration&lt;/h3>
&lt;p>Continuous Integration is a practice where code changes are immediately tested when they are added to a larger code
base. The benefit of this practice is you can catch and fix integration issues sooner.&lt;/p>
&lt;p>This practice requires some extra discipline and is highly dependent on Ten Minute Build and Test First Development.&lt;/p>
&lt;h3 id="test-first-programming">Test-First Programming&lt;/h3>
&lt;blockquote>
&lt;p>Write a failing automated test before changing any code.&lt;/p>
&lt;/blockquote>
&lt;p>The book mentions 4 problem Test-First Programming addresses at once:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>Scope creep: It’s easy to get carried away programming and put in code “just in case.” By stating explicitly and
objectively what the program is supposed to do, you give yourself a focus for your coding. If you really want to put
that other code in, write another test after you’ve made this one work.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Coupling and cohesion: If it’s hard to write a test, it’s a signal that you have a design problem, not a testing
problem. Loosely coupled, highly cohesive code is easy to test.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Trust: It’s hard to trust the author of code that doesn’t work. By writing clean code that works and demonstrating
your intentions with automated tests, you give your teammates a reason to trust you.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Rhythm: It’s easy to get lost for hours when you are coding. When programming test-first, it’s clearer what to do
next: either write another test or make the broken test work. Soon this develops into a natural and efficient rhythm:
test, code, refactor, test, code, refactor.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h3 id="incremental-design">Incremental Design&lt;/h3>
&lt;blockquote>
&lt;p>Invest in the design of the system every day.&lt;/p>
&lt;/blockquote>
&lt;p>You do a little bit of work up front to understand the proper breadth-wise perspective of the system design, and then
dive into the details of a particular aspect of that design when you deliver specific features.&lt;/p>
&lt;p>This approach reduces the cost of changes and allows you to make design decisions when necessary based on the most
current information available.&lt;/p>
&lt;hr />
&lt;h2 id="roles">Roles&lt;/h2>
&lt;p>Although XP specifies particular practices for your team to follow, it doesn’t really establish specific roles for the
people on your team.&lt;/p>
&lt;p>Depending on which source you read, there is either no guidance, or there is a description of how roles typically found
in more traditional projects behave on XP projects.&lt;/p>
&lt;h3 id="the-customer">The Customer&lt;/h3>
&lt;p>The Customer role is responsible for making all of the business decisions regarding the project including:&lt;/p>
&lt;p>The XP Customer is assumed to be a single person, however experience has shown that one person cannot adequately provide
all of the business related information about a project.&lt;/p>
&lt;h3 id="the-developer">The Developer&lt;/h3>
&lt;p>Because XP does not have much need for role definition, everyone on the team (with the exception of the customer and a
couple of secondary roles listed below) is labeled a developer. Developers are responsible for realizing the stories
identified by the Customer.&lt;/p>
&lt;h3 id="the-tracker">The Tracker&lt;/h3>
&lt;p>The main purpose of this role is to keep track of relevant metrics that the team feels necessary to track their progress
and to identify areas for improvement.&lt;/p>
&lt;h3 id="the-coach">The Coach&lt;/h3>
&lt;p>This is usually an outside consultant (or someone from elsewhere in your organization) who has used XP before and is
included in your team to help mentor the other team members on the XP Practices and to help your team maintain your
self-discipline.&lt;/p>
&lt;hr />
&lt;h4 id="what-is-xp-in-2-min">What is XP? (in 2 min)&lt;/h4>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/hbFOwqYIOcU"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;h4 id="tech-talk-by-kent-beck-xp-20-years-later">Tech Talk by kent Beck: XP 20 years later&lt;/h4>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/cGuTmOUdFbo"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>Symfony 5</title><subtitle>Symfony 5: The Fast Track</subtitle><category term="php" scheme="https://chemaclass.com/tags/php/" label="Php"/><category term="symfony" scheme="https://chemaclass.com/tags/symfony/" label="Symfony"/><category term="architecture" scheme="https://chemaclass.com/tags/architecture/" label="Architecture"/><published>2020-02-20T00:00:00+00:00</published><updated>2020-02-20T00:00:00+00:00</updated><author><name>
Fabien Potencier</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/symfony-5/"/><id>https://chemaclass.com/readings/symfony-5/</id><summary type="html">Fabien Potencier's official guide to building web applications with Symfony 5, covering the framework from scratch to production deployment.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>This book, written by Symfony’s creator, lays out a pragmatic approach to developing web applications with Symfony 5:
from scratch to production. Whether you are discovering Symfony for the first time or refreshing your knowledge, this
practical guide provides the definitive introduction to modern Symfony applications.&lt;/p></content></entry><entry xml:lang="en"><title>Making headway</title><category term="music" scheme="https://chemaclass.com/tags/music/" label="Music"/><published>2020-02-06T00:00:00+00:00</published><updated>2020-02-06T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/music/making-headway/"/><id>https://chemaclass.com/music/making-headway/</id><summary type="html">Adrian (guitar, drums) &amp; Chema (bass).</summary><content type="html">&lt;p>Adrian (guitar, drums) &amp;amp; Chema (bass).&lt;/p>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/XExy7psQT7Y"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;span id="continue-reading">&lt;/span></content></entry><entry xml:lang="en"><title>How to Improve Your Tech-Talk (or Any Other Presentation)</title><subtitle>Some tips to improve your communication skills</subtitle><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><category term="productivity" scheme="https://chemaclass.com/tags/productivity/" label="Productivity"/><category term="career" scheme="https://chemaclass.com/tags/career/" label="Career"/><published>2019-11-18T00:00:00+00:00</published><updated>2019-11-18T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/improve-your-tech-talk/"/><id>https://chemaclass.com/blog/improve-your-tech-talk/</id><summary type="html">We have found ourselves attending a meeting that felt like we were wasting our time with a monologue that is either hard to follow or doesn't seem so interesting as it could. Let's fix this.</summary><content type="html">&lt;p>&lt;img src="/images/blog/2019-11-18/cover.jpg" alt="blog-cover" />&lt;/p>
&lt;p>We have found ourselves attending a meeting that felt like we were wasting our time with a “monologue” that is either hard to follow or doesn’t seem so interesting as it could.
Let’s fix this.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>Therefore, I was thinking about it, and I tried to get some keys to improving their general quality. It applies to all presentations but also tech-talks and other tech presentations in which engineers are usually involved.&lt;/p>
&lt;h2 id="structure-of-the-talk">Structure of the talk&lt;/h2>
&lt;p>To explain how I think a good presentation should look like I will address three main topics that are relevant to structure and design your presentation.&lt;/p>
&lt;ol>
&lt;li>Content of the presentation: what message do you want to convey to whom and how?&lt;/li>
&lt;li>Design and Layout: how you can design an easy-to-follow presentation that supports your talk instead of taking away the attention from what you are actually trying to say.&lt;/li>
&lt;li>Lastly, I think also the audience is responsible for making a tech talk successful, so I will also add a reminder about the role and responsibilities of the listeners.&lt;/li>
&lt;/ol>
&lt;p>&lt;img src="/images/blog/2019-11-18/talking.jpg" alt="blog-img" />&lt;/p>
&lt;h3 id="consider-your-audience">Consider your audience&lt;/h3>
&lt;p>When you prepare your presentation, ask yourself:&lt;/p>
&lt;ul>
&lt;li>Who is attending the talk?&lt;/li>
&lt;li>Which backgrounds do they have?&lt;/li>
&lt;li>Which position do they have?&lt;/li>
&lt;li>Which information is relevant to them?&lt;/li>
&lt;li>Do they have to know all the keywords that you would like to use?&lt;/li>
&lt;/ul>
&lt;h3 id="introduce-the-topic">Introduce the topic&lt;/h3>
&lt;p>Create some atmosphere. Try to answer these questions:&lt;/p>
&lt;ul>
&lt;li>Why should they listen to you?&lt;/li>
&lt;li>Why should they spend their time in another meeting?&lt;/li>
&lt;li>What will they have learned by the end of the talk?&lt;/li>
&lt;li>What is your main message?&lt;/li>
&lt;/ul>
&lt;p>Every meeting should have an output and an outcome. Keep it in mind.&lt;/p>
&lt;h3 id="create-a-storyline">Create a Storyline&lt;/h3>
&lt;ul>
&lt;li>When preparing the main content of your talk, think about a storyline that connects your arguments. This makes it easier for the audience to follow.&lt;/li>
&lt;li>Stick to the messages that are necessary to explain your idea or concept.&lt;/li>
&lt;li>Leave out any unnecessary information that is not relevant to the core of your message.&lt;/li>
&lt;/ul>
&lt;h3 id="build-a-conclusion">Build a conclusion&lt;/h3>
&lt;p>Summarize the main conclusion(s) in a concise way:&lt;/p>
&lt;ul>
&lt;li>What is the conclusion of this meeting?&lt;/li>
&lt;li>What are the learnings from this meeting?&lt;/li>
&lt;li>What are the open questions or next steps?&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="/images/blog/2019-11-18/books.jpg" alt="blog-img" />&lt;/p>
&lt;h2 id="design-and-layout">Design and Layout&lt;/h2>
&lt;h3 id="write-less-talk-more">Write less, talk more&lt;/h3>
&lt;ul>
&lt;li>A tech-talk is about learning new ideas and concepts.&lt;/li>
&lt;li>A presentation should support your talk, not replace or replicate what you have said.&lt;/li>
&lt;li>The more words on the slide, the fewer they will be remembered.&lt;/li>
&lt;li>Use visuals/graphics that support your talk instead of additional text.&lt;/li>
&lt;/ul>
&lt;h3 id="large-fonts">Large fonts&lt;/h3>
&lt;p>If you have some code to present, consider:&lt;/p>
&lt;ul>
&lt;li>If it is a picture: use large fonts inside. I recommend using https://carbon.now.sh/ for simple snippets. Or just screenshots from your favorite IDE.&lt;/li>
&lt;li>If you code in live: prepare your editor in advance. Use the Presentation Mode of your IDE.&lt;/li>
&lt;/ul>
&lt;h2 id="role-of-the-audience">Role of the Audience&lt;/h2>
&lt;h3 id="responsibilities-of-the-attendee">Responsibilities of the attendee&lt;/h3>
&lt;ul>
&lt;li>No unnecessary phone usage, like Twitter, Instagram, Facebook, WhatsApp, Telegram, etc.&lt;/li>
&lt;li>Keep your questions for the questions time, unless the presenter mentions at the very beginning that you can ask at any moment. Usually, it’s better not to interrupt the topic, so we can ask the questions at the end.&lt;/li>
&lt;li>Show interest in the topic. The presenter should have spent some time preparing the slides for you.&lt;/li>
&lt;li>Pair with the presenter the interest of the topic. This is also the responsibility of the presenter. You both should be eager to learn more about the topic.&lt;/li>
&lt;/ul>
&lt;h3 id="inner-questions">Inner questions&lt;/h3>
&lt;ul>
&lt;li>Was it worth the time that we all spent in this room?&lt;/li>
&lt;li>Do we regret the attendance of this meeting?&lt;/li>
&lt;/ul>
&lt;p>At the end of the meeting, we should ask these questions in order to improve. Ask other people for their feedback, so we can grow further and together.&lt;/p>
&lt;p>&lt;img src="/images/blog/2019-11-18/footer.jpg" alt="blog-img" />&lt;/p></content></entry><entry xml:lang="en"><title>Atomic Habits</title><subtitle>An Easy &amp; Proven Way to Build Good Habits &amp; Break Bad Ones</subtitle><category term="psychology" scheme="https://chemaclass.com/tags/psychology/" label="Psychology"/><category term="productivity" scheme="https://chemaclass.com/tags/productivity/" label="Productivity"/><category term="career" scheme="https://chemaclass.com/tags/career/" label="Career"/><published>2019-11-12T00:00:00+00:00</published><updated>2019-11-12T00:00:00+00:00</updated><author><name>
James Clear</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/atomic-habits/"/><id>https://chemaclass.com/readings/atomic-habits/</id><summary type="html">People think that when you want to change your life, you need to think big. James Clear has discovered another way. He knows that real change comes from the compound effect of hundreds of small decisions. He calls them atomic habits.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>People think that when you want to change your life, you need to think big. James Clear has discovered another way. He
knows that real change comes from the compound effect of hundreds of small decisions. He calls them atomic habits.&lt;/p>
&lt;h3 id="takeaways">Takeaways&lt;/h3>
&lt;ul>
&lt;li>Focus more on systems and processes and less on goals&lt;/li>
&lt;li>Change how you identify yourself&lt;/li>
&lt;li>The environment is more important than being motivated&lt;/li>
&lt;li>To break a bad habit, reduce exposure to the cues that cause it&lt;/li>
&lt;li>Bundle an action you want to do with an action you need to do&lt;/li>
&lt;li>Instead of saying “I have to,” say “I get to”&lt;/li>
&lt;li>Don’t try to make a habit perfect, just repeat it&lt;/li>
&lt;li>Reduce friction for good habits and increase friction for bad habits&lt;/li>
&lt;li>To make something not seem like a chore, do it for short periods of time&lt;/li>
&lt;li>To achieve long-term goals, make small habits rewarding&lt;/li>
&lt;li>Never miss more than once of a habit&lt;/li>
&lt;/ul>
&lt;p>I wrote a blog post about this topic: &lt;a href="/blog/the-process-itself-is-the-goal/">The process itself is the goal&lt;/a>&lt;/p>
&lt;hr />
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/YT7tQzmGRLA"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>Working Effectively with Legacy Code</title><subtitle>Start-to-finish strategies for working with large, untested legacy code bases</subtitle><category term="refactoring" scheme="https://chemaclass.com/tags/refactoring/" label="Refactoring"/><category term="testing" scheme="https://chemaclass.com/tags/testing/" label="Testing"/><category term="tdd" scheme="https://chemaclass.com/tags/tdd/" label="Tdd"/><category term="software-design" scheme="https://chemaclass.com/tags/software-design/" label="Software Design"/><published>2019-07-01T00:00:00+00:00</published><updated>2019-07-01T00:00:00+00:00</updated><author><name>
Michael Feathers</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/working-effectively-with-legacy-code/"/><id>https://chemaclass.com/readings/working-effectively-with-legacy-code/</id><summary type="html">Michael Feathers presents practical techniques for adding tests to untested code, breaking dependencies, and safely refactoring large legacy systems without introducing bugs.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>&lt;h2 id="what-is-legacy-code">What is legacy code?&lt;/h2>
&lt;blockquote>
&lt;p>Legacy code is simply code without tests.&lt;/p>
&lt;/blockquote>
&lt;h3 id="benefits-of-tests">Benefits of tests&lt;/h3>
&lt;p>Behavior is central to understanding the benefits of testing:&lt;/p>
&lt;blockquote>
&lt;p>Behavior is the most important thing about software. It is what users depend on. Users like it when we add behavior (provided it is what they really wanted), but if we change or remove behavior they depend on (introduce bugs), they stop trusting us.&lt;/p>
&lt;/blockquote>
&lt;h3 id="how-to-get-tests-in-place-in-legacy-codebases">How to get tests in place in legacy codebases&lt;/h3>
&lt;p>When we change code, we should have tests in place. To put the tests in place, we often have to change code.&lt;/p>
&lt;p>The suggested approach:&lt;/p>
&lt;ol>
&lt;li>Identify change points.&lt;/li>
&lt;li>Find test points.&lt;/li>
&lt;li>Break dependencies.&lt;/li>
&lt;li>Write tests.&lt;/li>
&lt;li>Make changes and refactor.&lt;/li>
&lt;/ol>
&lt;p>Another useful term is a “&lt;strong>seam&lt;/strong>.” A seam, in this context, is “&lt;strong>a place where you can alter behavior in your program
without editing in that place&lt;/strong>”. The analogy is to a seam in clothing, the place where two parts are stitched together.
In software, &lt;strong>these places are generally places where there are well-defined interfaces&lt;/strong>. This can be leveraged to change
the implementation using techniques such as dependency injection or mocking interfaces in the case of writing tests.&lt;/p>
&lt;hr />
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/wRtJRkRIa2s"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>Silver lining</title><category term="music" scheme="https://chemaclass.com/tags/music/" label="Music"/><published>2019-04-25T00:00:00+00:00</published><updated>2019-04-25T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/music/silver-lining/"/><id>https://chemaclass.com/music/silver-lining/</id><summary type="html">Adrian (guitar) &amp; Chema (bass).</summary><content type="html">&lt;p>Adrian (guitar) &amp;amp; Chema (bass).&lt;/p>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/031gxCvEVTo"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;span id="continue-reading">&lt;/span></content></entry><entry xml:lang="en"><title>Silver lining (solo bass)</title><category term="music" scheme="https://chemaclass.com/tags/music/" label="Music"/><published>2018-12-28T00:00:00+00:00</published><updated>2018-12-28T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/music/silver-lining-solo/"/><id>https://chemaclass.com/music/silver-lining-solo/</id><summary type="html">&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/nuCFPTkDE90"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></summary><content type="html">&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/nuCFPTkDE90"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;span id="continue-reading">&lt;/span></content></entry><entry xml:lang="en"><title>The Art of War</title><subtitle>How should we behave in a battle?</subtitle><category term="philosophy" scheme="https://chemaclass.com/tags/philosophy/" label="Philosophy"/><category term="psychology" scheme="https://chemaclass.com/tags/psychology/" label="Psychology"/><category term="leadership" scheme="https://chemaclass.com/tags/leadership/" label="Leadership"/><published>2018-08-10T00:00:00+00:00</published><updated>2018-08-10T00:00:00+00:00</updated><author><name>
Sun Tzu</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/the-art-of-war/"/><id>https://chemaclass.com/readings/the-art-of-war/</id><summary type="html">The Art of War is an ancient Chinese military treatise attributed to Sun Tzu, a high-ranking military general, strategist and tactician, and kindred to the Realpolitik of his time, termed in China as Legalism.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>The text is composed of 13 chapters, each of which is devoted to one aspect of warfare. It is commonly thought of as a
definitive work on military strategy and tactics.&lt;/p>
&lt;p>It has been the most famous and influential of China’s Seven Military Classics, and “for the last two thousand years it remained the most important military treatise in Asia, where even the
common people knew it by name.”&lt;/p>
&lt;p>It has had an influence on Eastern and Western military thinking, business tactics, legal strategy and beyond.&lt;/p>
&lt;h3 id="quotes">Quotes&lt;/h3>
&lt;ul>
&lt;li>Appear weak when you are strong, and strong when you are weak.&lt;/li>
&lt;li>If he is superior in strength, evade him.&lt;/li>
&lt;li>Attack him where he is unprepared. Appear where you are not expected.&lt;/li>
&lt;li>The general who loses a battle makes but few calculations beforehand.&lt;/li>
&lt;li>There is no instance of a country having benefitted from prolonged warfare.&lt;/li>
&lt;li>Supreme excellence consists in breaking the enemy’s resistance without fighting.&lt;/li>
&lt;li>If you know the enemy and know yourself, you need not fear the result of a hundred battles. If you know yourself, but not the enemy, for every victory gained you will also suffer a defeat. If you know neither the enemy nor yourself, you will succumb in every battle.&lt;/li>
&lt;li>One may know how to conquer without being able to do it.&lt;/li>
&lt;li>In war, the victorious strategist only seeks battle after the victory has been won.&lt;/li>
&lt;li>In battle, there are not more than two methods of attack: the direct and indirect.&lt;/li>
&lt;li>An army may march great distances without distress if it marches through country where the enemy is not.&lt;/li>
&lt;li>You can be sure in succeeding in your attacks if you only attack places which are undefended.&lt;/li>
&lt;li>Military tactics are like water. For water, in its natural course, runs away from high places and hastens downwards. So, in war, the way is to avoid what is strong and strike at what is weak.&lt;/li>
&lt;li>Let your plans be dark and impenetrable as night, and when you move fall like a thunderbolt.&lt;/li>
&lt;li>Ponder and deliberate before you make a move.&lt;/li>
&lt;li>A clever general, therefore, avoids an army when its spirit is keen, but attacks it when it is sluggish and inclined to return.&lt;/li>
&lt;li>It is a military axiom not to advance uphill against the enemy nor to oppose him when he comes downhill.&lt;/li>
&lt;li>The art of war teaches us to rely not on the likelihood of the enemy not coming, but on our readiness to receive him.&lt;/li>
&lt;li>Make your way by unexpected routes and attack unguarded spots.&lt;/li>
&lt;li>If they will face death, there is nothing they will not achieve.&lt;/li>
&lt;li>The principle on which to manage an army is to set up one standard of courage which all must reach.&lt;/li>
&lt;li>If it is to your advantage, make a forward move. If not, stay where you are.&lt;/li>
&lt;/ul>
&lt;hr />
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/aF2pCff3ocg"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>Clean Architecture</title><subtitle>A Craftsman's Guide to Software Structure and Design</subtitle><category term="architecture" scheme="https://chemaclass.com/tags/architecture/" label="Architecture"/><category term="software-design" scheme="https://chemaclass.com/tags/software-design/" label="Software Design"/><category term="clean-code" scheme="https://chemaclass.com/tags/clean-code/" label="Clean Code"/><category term="ddd" scheme="https://chemaclass.com/tags/ddd/" label="Ddd"/><published>2018-06-04T00:00:00+00:00</published><updated>2018-06-04T00:00:00+00:00</updated><author><name>
Robert C. Martin</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/clean-architecture/"/><id>https://chemaclass.com/readings/clean-architecture/</id><summary type="html">Robert C. Martin's guide to SOLID principles, component design, and architectural boundaries that keep software systems flexible, testable, and maintainable over time.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>&lt;h3 id="code-design-principles-solid">Code design principles (SOLID)&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Single Responsibility&lt;/strong>: a class should have one, and only one, reason to change. Or the new version: a module
should be responsible to one, and only one, actor.&lt;/li>
&lt;li>&lt;strong>Open-closed&lt;/strong>: a class should be open for extension but closed for modification.&lt;/li>
&lt;li>&lt;strong>Liskov’s Substitution&lt;/strong>: objects in a program should be replaceable with instances of their subtypes without
altering the correctness of that program.&lt;/li>
&lt;li>&lt;strong>Interface Segregation&lt;/strong>: many client-specific interfaces are better than one general-purpose interface.&lt;/li>
&lt;li>&lt;strong>Dependency Inversion&lt;/strong> : one should depend upon abstractions, not concretions.&lt;/li>
&lt;/ul>
&lt;h3 id="component-principles">Component principles&lt;/h3>
&lt;h4 id="component-cohesion">Component cohesion&lt;/h4>
&lt;ul>
&lt;li>&lt;strong>Reuse/Release Equivalence&lt;/strong> Principle: classes and modules (i.e. a component) reused together should be released
together. They should have the same version number and there should be proper documentation such as changelogs.&lt;/li>
&lt;li>&lt;strong>Common Closure&lt;/strong> Principle: classes that change together should be grouped together, and vice versa. The single
responsibility principle at component-level.&lt;/li>
&lt;li>&lt;strong>Common Reuse&lt;/strong> Principle: don’t force users of a component to depend on things they don’t need. The Interface
Segregation Principle at component-level.&lt;/li>
&lt;/ul>
&lt;h4 id="component-coupling">Component coupling&lt;/h4>
&lt;ul>
&lt;li>&lt;strong>Acyclic Dependencies&lt;/strong> Principle: no cycle in the dependency graph. Cycles couple components and, among other
things, force them to be to released together. Use the dependency inversion principle to break cycles.&lt;/li>
&lt;li>&lt;strong>The Stable Dependency&lt;/strong> Principle: less stable components should depend on more stable components. Depend on the
direction of stability.&lt;/li>
&lt;li>&lt;strong>Stable Abstractions&lt;/strong> Principle: stable components should be abstract, and vice versa. An example of an abstract
stable component is a high-level policy which is changed by extension following the open-closed principle.&lt;/li>
&lt;/ul>
&lt;h3 id="architecture-principles">Architecture principles&lt;/h3>
&lt;h4 id="setting-boundaries">Setting boundaries&lt;/h4>
&lt;p>Boundaries are lines that separate software elements. They separate things that matter from things that don’t, i.e.
high-level components from low-level components. If a high-level component depends on a low-level component at the
source level, changes in the low-level components will spread to the high-level component. Therefore, we place a
boundary between the two, using polymorphism to invert the logic flow. This is the Dependency Inversion Principle in the
SOLID principles.&lt;/p>
&lt;h4 id="separating-layers">Separating layers&lt;/h4>
&lt;p>We can identify four main layers, although the number may vary:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Entities&lt;/strong>: objects containing critical business logic. For example, a bank could establish that no loans are
granted to customers not satisfying some credit score requirements. Entities may be shared across apps in the same
enterprise.&lt;/li>
&lt;li>&lt;strong>Use-cases&lt;/strong>: app-specific business rules. For example, the sequence of screens to execute a bank transfer.&lt;/li>
&lt;li>&lt;strong>Interface adapters&lt;/strong>: Gateways, presenters and controllers. For example, this layer will contain the MVC
architecture of the GUI and also objects that transform data between the format of the database and the use-cases.&lt;/li>
&lt;li>&lt;strong>Frameworks and drivers&lt;/strong>: web frameworks, database, the view of MVC.&lt;/li>
&lt;/ul></content></entry><entry xml:lang="en"><title>Chapter 29: July 2017</title><published>2017-07-01T00:00:00+00:00</published><updated>2017-07-01T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/books/oeur/2017-julio/"/><id>https://chemaclass.com/books/oeur/2017-julio/</id><content type="html">&lt;p>&lt;img src="/images/books/oeur/29.jpg" alt="book-chapter" />&lt;/p>
&lt;h2 id="i-m-not-talking-about-self-help">I’m Not Talking About Self-Help&lt;/h2>
&lt;p>I didn’t intend to write a self-help book; instead, I aimed to make writing one of my most popular tools to help organize reason and senses.&lt;/p>
&lt;p>I’m not talking about self-help but finding a balance between sanity and madness. The prudence we must consider, regardless of our different contexts, cannot falter in the face of the emotional imbalance that may be present.&lt;/p>
&lt;p>Adaptation to transparency, to the rawness that disorients us without crumbling words. I’m referring to the emotional instability that needs repair.&lt;/p>
&lt;p>Forgotten memory: a dream where time seemed to breathe down our necks, accompanied by a constant fear of death. A lonely older brother, a displaced migrant. Clear ideas, feelings of daily overcoming, and not wanting to be normal out of necessity. Above good and evil with forgotten memories. The most important thing will be to leave a mark and adapt—or we will have died.&lt;/p>
&lt;p>Ambitious memory of renunciation and denunciation of the opposite idea of “us.” Ironies of life, like tireless thoughts that say a lot about you. Youth, unforgiving religion. It became more noticeable in the mountains when savoring hatred for God was insufficient. It’s time to speak again. There are so many constants and ignorance, and we end up unaware of what we are losing. Who will remember us? It’s just a matter of time. The most challenging part will be understanding ourselves with different eyes. You only live once. The future will become part of our sweet memories alongside our innocent youth.&lt;/p>
&lt;p>I don’t want to talk about self-help but our false freedom if we aren’t occupied with our lives. Good habits that indicate the value of truth, like our tendency to unmask mediocrity.&lt;/p>
&lt;p>This book concludes not without thanking your company. Not without hoping to reread us many years from now to see who we have become. And to draw the smile we deserve.&lt;/p>
&lt;p>Work. Love. Dream. Smile.&lt;/p>
&lt;p>I’m not talking about self-help, but about ending to begin everything with eyes on a memory.&lt;/p>
&lt;hr />
&lt;p>&lt;img src="/images/books/oeur/familia.jpg" alt="book-chapter" />&lt;/p></content></entry><entry xml:lang="en"><title>Chapter 28: June 2017</title><published>2017-06-01T00:00:00+00:00</published><updated>2017-06-01T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/books/oeur/2017-junio/"/><id>https://chemaclass.com/books/oeur/2017-junio/</id><content type="html">&lt;p>&lt;img src="/images/books/oeur/28.jpg" alt="book-chapter" />&lt;/p>
&lt;h2 id="perceptions">Perceptions&lt;/h2>
&lt;p>It’s not about waiting for the moment when our life is all figured out; instead, it’s about actively resolving our life, day by day, so that we’ve created a routine for our excellence.&lt;/p>
&lt;p>“We are what we repeatedly do. Excellence, then, is not an act but a habit,” said Aristotle.&lt;/p>
&lt;p>It’s our perception that blurs reality in front of our senses. Our efforts to strengthen our subtle thoughts should not be undervalued, as society, from times past, seems to suggest.&lt;/p>
&lt;p>The development of our reasoning, subjective success, invaluable achievements, the attainment of our performances, and personal fulfillment… We are a combination of intrinsic parts, highlighting the importance of our understanding!&lt;/p>
&lt;p>Our rejection of accidental excellence is crucial because it will perish shortly due to our tendency toward mediocrity. In the face of daily challenges, our efforts will define our apprehension of the vain and unjust reality to which we sometimes mistakenly look with sympathy.&lt;/p>
&lt;p>Our attachment to our being can only be linked to our idea of who we are, where we come from, and where we are going. We are abstract sensations that likely have a purely biological explanation stemming from our survival instinct. Our ideas are mere emotions that evolve surreptitiously as our various experiences unfold.&lt;/p>
&lt;p>Our impression (of what we believe to understand as reality) will evolve, driven by our perceptions of the actual events we can discern, resulting from categorical and possibly flawed criticism. It will be conditioned by every event that we rarely consciously perceive.&lt;/p>
&lt;p>Our unconsciousness plays a decisive and demanding role in our lives. We should judge our sense of truth with sharpness using our cognitive ability. We should not allow (let alone believe!) that every sprout is the result of chance without any guiding force but some illusion.&lt;/p>
&lt;p>That’s why I must once again emphasize the importance of projecting our consciousness so that we unconsciously end up exactly where we had meticulously projected.&lt;/p></content></entry><entry xml:lang="en"><title>Chapter 27: May 2017</title><published>2017-05-01T00:00:00+00:00</published><updated>2017-05-01T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/books/oeur/2017-mayo/"/><id>https://chemaclass.com/books/oeur/2017-mayo/</id><content type="html">&lt;p>&lt;img src="/images/books/oeur/27.jpg" alt="book-chapter" />&lt;/p>
&lt;h2 id="masked-mediocrity">Masked Mediocrity&lt;/h2>
&lt;p>Religion is a package of pre-established habits, where the will to power is reduced to the absurdity of mere conformity to mediocrity, masked by a complacency towards the consent of lack of perseverance.&lt;/p>
&lt;p>Where the lack of persistence in what we should strive for will not incur a mandatory cost…, for we will be “forgiven,” and “all will enter the kingdom of heaven.” Is it not, perhaps, infinite kindness?&lt;/p>
&lt;p>Habits chained in an uncultured past where mediocrity was rewarded with apparent consistent promises for all those inconsistent in will.&lt;/p>
&lt;p>Hope from those without confidence who needed stable habits within the bounds of their meager possibilities!&lt;/p>
&lt;p>Let’s not mask who we are. Let’s not want to be mediocre!&lt;/p>
&lt;hr />
&lt;h2 id="tendency">Tendency&lt;/h2>
&lt;p>Life is nothing more than habits. That’s why when we focus on positive things when our minds aspire to the best version of ourselves, we create a routine that pushes us toward success. Conversely, the opposite happens when our thoughts are encapsulated in negative and destructive thoughts, turning our lives into a habit of mediocrity.&lt;/p>
&lt;p>It won’t be the first time we hear statements like “If you had been in my situation, you would have done the same,” trying to excuse oneself when becoming aware of the gravity of an act done without wisdom. Could we invent any excuse cruder and more vulgar than guilt for the lack of responsibility in our context? That’s what it’s about! Working on our environment! Make an effort with it!&lt;/p>
&lt;p>The design of our journey should be above all external ideas. We will be as strong as we educate our tendency to be so.&lt;/p>
&lt;p>We will not have more opportunities to embrace what once became impossible.&lt;/p></content></entry><entry xml:lang="en"><title>Chapter 26: April 2017</title><published>2017-04-01T00:00:00+00:00</published><updated>2017-04-01T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/books/oeur/2017-abril/"/><id>https://chemaclass.com/books/oeur/2017-abril/</id><content type="html">&lt;p>&lt;img src="/images/books/oeur/26.jpg" alt="book-chapter" />&lt;/p>
&lt;h2 id="the-value">The Value&lt;/h2>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="plain">&lt;span class="giallo-l">&lt;span>&amp;quot;How much are we worth?&amp;quot; I wondered.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>&amp;quot;How much are you worth?&amp;quot; it answered.&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>What will truly define the value of values?&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="plain">&lt;span class="giallo-l">&lt;span>Courage,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>effort,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>effectiveness,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>courage,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>esteem,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>merit,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>boldness,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>interest,&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>As well as the importance of each of our moments.&lt;/p>
&lt;p>Experiences, habits, excursions, journeys…, the small achievements that contribute to helping us thrive in our short, medium, and long-term goals. Verify, try, study, and examine reality firsthand!&lt;/p>
&lt;p>What can be more valuable than the very habit of our conquest, from and towards ourselves? Nothing!&lt;/p>
&lt;p>The habit of our conquest should be focused—with maximum priority—on ourselves!&lt;/p></content></entry><entry xml:lang="en"><title>The Power of Habit</title><subtitle>Why We Do What We Do, and How to Change</subtitle><category term="psychology" scheme="https://chemaclass.com/tags/psychology/" label="Psychology"/><category term="productivity" scheme="https://chemaclass.com/tags/productivity/" label="Productivity"/><category term="career" scheme="https://chemaclass.com/tags/career/" label="Career"/><published>2017-03-20T00:00:00+00:00</published><updated>2017-03-20T00:00:00+00:00</updated><author><name>
Charles Duhigg</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/the-power-of-habits/"/><id>https://chemaclass.com/readings/the-power-of-habits/</id><summary type="html">Charles Duhigg explores the science behind habit formation, showing how habits work, why they exist, and practical strategies to transform them for personal and professional growth.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>&lt;h2 id="takeaways">Takeaways&lt;/h2>
&lt;ol>
&lt;li>All habits operate the same way&lt;/li>
&lt;li>Changing a habit means changing one key aspect…&lt;/li>
&lt;li>…and changing one habit can change a lot of things&lt;/li>
&lt;li>Willpower is a muscle&lt;/li>
&lt;li>Practice, practice, practice&lt;/li>
&lt;/ol>
&lt;hr />
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/Zq2LVa36ukk"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>Chapter 25: March 2017</title><published>2017-03-01T00:00:00+00:00</published><updated>2017-03-01T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/books/oeur/2017-marzo/"/><id>https://chemaclass.com/books/oeur/2017-marzo/</id><content type="html">&lt;p>&lt;img src="/images/books/oeur/25.jpg" alt="book-chapter" />&lt;/p>
&lt;h2 id="truth">Truth&lt;/h2>
&lt;p>Truth resides in knowledge. And knowledge will always depend on the context. Knowing the truth is basically establishing a connection between the context and the knowledge one intends to assert as truth.&lt;/p>
&lt;p>In a context where knowledge can only be acquired empirically, what is truth if not the subjective assertion? In this non-theoretical context, what is truth, if not a partial manifestation of understanding?&lt;/p>
&lt;p>Our ability to accurately discern the truth of subjective evidence is so individual and personal that it is hard to believe we can truly reach an ideal truth globally.&lt;/p>
&lt;p>We could say that truth represents our contextual state in our minds, our knowledge.&lt;/p>
&lt;p>As we grow, our truths take shape; assertions seem (and should) be questioned, evidence needs stronger foundations, and our confidence in what we defend as truth must be certified. Otherwise, the pillars will fall in no time because there are not many claims we can assure as absolute, like our time and death.&lt;/p>
&lt;p>Growing up should teach us the meaning of truth, starting with the sense of life, the importance of our moments, and our reflection toward others and ourselves. This means that maturity is only a matter of what we are doing with our knowledge to understand better our context and what we are doing in our environment to expand our wisdom.&lt;/p>
&lt;p>Everything in this life depends on us. Even the truth, especially considering that it could change over time. And by “us,” I mean our entity in its isolated context.&lt;/p>
&lt;p>Therefore, it will be our unique projection that will delineate our truths.&lt;/p>
&lt;hr />
&lt;h2 id="without-an-end">Without an End&lt;/h2>
&lt;p>Stories that accompany. Years of recorded discourse. A book born from ideas and sketches without a near end that, nevertheless, must end, as everything that begins must.&lt;/p>
&lt;p>Endings don’t necessarily have to be sad, although our feelings may sometimes think otherwise. Time is the only responsible party, just as memory is the one that fights against forgetting.&lt;/p>
&lt;p>Memories bring us closer to knowledge in the form of experience. Energetic virtuosity is a daily activity, not satisfied with mere subsistence.&lt;/p>
&lt;p>Externalizing internal communication with apparent ease. It was well said: “All that glitters is not gold.” I was trying to be consistent.&lt;/p>
&lt;p>It was an exercise in logical and personal cleansing, emphasizing everything where I could express myself openly, with, why not say it, specific fears at the beginning for not knowing how to start. Stop fearing being wrong by thinking too much before and after acting.&lt;/p>
&lt;p>Embark on a journey not to finish it, but for the journey and all that, it entails the birth of a beginning without necessarily knowing an end, without having to expire if care was taken.&lt;/p>
&lt;p>Let’s learn to be like the person we truly wish to meet tomorrow. And all endings will evolve into beginnings.&lt;/p></content></entry><entry xml:lang="en"><title>Chapter 24: February 2017</title><published>2017-02-01T00:00:00+00:00</published><updated>2017-02-01T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/books/oeur/2017-febrero/"/><id>https://chemaclass.com/books/oeur/2017-febrero/</id><content type="html">&lt;p>&lt;img src="/images/books/oeur/24.jpg" alt="book-chapter" />&lt;/p>
&lt;h2 id="our-life">Our Life&lt;/h2>
&lt;p>The sensation of losing everything can naturally mislead us when we fully understand our reality. What does it mean to have lost everything?&lt;/p>
&lt;p>It is our context that determines the perception of what we are judging. Playing, in turn, a role that is more than important, though not definitively explicit.&lt;/p>
&lt;p>Consider not expressing ourselves, not revealing ourselves to ourselves, for an excessive period. Weigh the idea of not considering our observation of what we cannot stop looking at: our life and our time, our moments and our being: ourselves.&lt;/p>
&lt;p>Not reflecting on our actions in the wake of our leaving —even if involuntarily— sentences our opinion and appreciation of everything that borders our surroundings. Everything we do, therefore, will leave a trace: our immortal past, which is inevitably part of the cause, directly transforming us into the consequence we are becoming.&lt;/p>
&lt;p>For the estimation of our values, we will arbitrate their resolution. Encircling our sanity and specifying what our disposition dictates. If we do not value ourselves, our values will be diminished in the possible shyness of cowardice. We cannot be upright or free individuals if we do not value ourselves. Otherwise, at least we will have the opportunity to be so to the extent of our possible considerations.&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="plain">&lt;span class="giallo-l">&lt;span>I refer to forgetting ourselves:&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>to our forgetting in the mornings when we wake up,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>to our forgetting in every moment,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>to our forgetting at night when we go to bed.&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>What is it to have lost everything when we still have the confusion of uncertainty to discover? Or to enjoy.&lt;/p>
&lt;p>Reflecting is a way to address the daily dissatisfaction of emotional emptiness, not just as a random habit without responsibilities or expected outcomes, because who would ultimately care…?&lt;/p>
&lt;p>Let us not stop meditating, observing, diagnosing our impressions, enjoying reflecting, and resolving our sensations to better appreciate everything that deserves our attention and understanding and our commitment: our life.&lt;/p>
&lt;hr />
&lt;h2 id="habits">Habits&lt;/h2>
&lt;p>Reflecting as a method, as a solution to the daily dissatisfaction of lack of feelings. Routine for our being, skill for our experience.&lt;/p>
&lt;p>Habits that define us determine us and even limit us in our possible dissatisfaction, from our basic instincts through simple reflexes to the most complex ones that seem unwilling to be tamed.&lt;/p>
&lt;p>We are unconscious habits that we should consciously learn to understand and accept to overcome and improve because any habit that has never been questioned can never be overcome.&lt;/p>
&lt;p>Skill as desire, as the practice of our mastery: trial and error to later inevitably acquire wisdom.&lt;/p>
&lt;p>Where did our daily habits go? Knowledge is power. And power will allow us to choose what we truly want for ourselves. Being aware of our routines and their reasons will allow us to choose and be responsible for our actions.&lt;/p>
&lt;p>Exercise our custom, our praxis. Feel useful in our reconciled dream, prudent with our judgment, and consistent with our maturity in the face of what is truly serious.&lt;/p>
&lt;p>Study of our behavior, attempts, responses, observation, and empiricism beyond mere theory: pragmatism for and with us in our daily lives. Because words are superfluous when actions speak for themselves.&lt;/p></content></entry><entry xml:lang="en"><title>Chapter 23: January 2017</title><published>2017-01-01T00:00:00+00:00</published><updated>2017-01-01T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/books/oeur/2017-enero/"/><id>https://chemaclass.com/books/oeur/2017-enero/</id><content type="html">&lt;p>&lt;img src="/images/books/oeur/23.jpg" alt="book-chapter" />&lt;/p>
&lt;h2 id="false-freedom">False freedom&lt;/h2>
&lt;p>Life tends to chaos, partly because of its faults and lack of preparation. Not questioning being completely exposed momentarily makes us aware of the surrounding emptiness.&lt;/p>
&lt;p>“Sharing your true self” is simply being completely sincere with yourself. Genuine understanding is impossible for someone who is insincere for their gain.&lt;/p>
&lt;p>Doing something with one hand while hiding it from the other is the most impure action against our conscience. It condemns us until life, in its unfairness, judges us.&lt;/p>
&lt;p>An extraordinary person should aim for deep understanding, not be sidetracked by absurd excuses. Sometimes, clarity is obscured, especially on good days or in darkness.&lt;/p>
&lt;p>Hypocrisy is thinking foolishly, lying, and undermining our strength and confidence. It’s not leading by example, contradicting ourselves, and being afraid to be true to our beliefs. Before criticizing others, we should examine our actions. Examples of what?&lt;/p>
&lt;p>A clear conscience is crucial for reaching the fulfillment we dream of, even if it seems like an illusion. We’re accountable for our actions and inaction. One challenge is overlooking our responsibilities and limiting our freedom in a “just” world. Avoiding responsibilities removes our self-determination, leaving us with a false sense of freedom.&lt;/p>
&lt;p>Living in a false reality occurs when we think we’re someone without authority or justification. Without evidence to support our claims, our freedom is tied to our responsibilities. Demonstrations matter because we reflect our sincere intentions for the future, closely connected to our past.&lt;/p>
&lt;p>Acting as if we can live without responsibilities in a fair world is hypocritical and foolish. Ignoring the chaos around us daily is akin to avoiding going outside to see the sun, choosing shadows and darkness instead.&lt;/p>
&lt;p>I reject those who, upon hearing the allegory of the cave, believe that those who killed the one who saw the sun are cursed. Some just wanted to share the truth about light and the sun, but some preferred shadows and darkness, hindering sincerity and progress. I don’t respect those who express dissatisfaction after the allegory but repeat the same behavior daily with weak excuses and deceitful actions—hypocrisy filled with false testimonies and misleading seductions.&lt;/p>
&lt;p>Free for what? Are you free to lead a life full of cynicism as something natural? When truth is treated with pretenses, with subjective interests…, freedom is reduced to its minimum sense, for our freedom is not only our external range of motion but also internal.&lt;/p>
&lt;p>We will be freer the more we know ourselves and belong to ourselves. Our self-determination is crucial to understanding our will to power. Our confidence, daring, audacity, and intention will be the gauges of our degree of freedom.&lt;/p>
&lt;hr />
&lt;h2 id="living-occupied">Living occupied&lt;/h2>
&lt;p>We should not live worried but occupied and not neglectful of ourselves.&lt;/p>
&lt;p>Occupying ourselves with ourselves for as long as necessary with the primary goal of finding what we truly desire. What could we desire more than our dedication to what we truly want? For who in their right mind would not want to take care of themselves for themselves? I refer to the healthy selfishness of our duty.&lt;/p>
&lt;p>In search of our fullness, we move with fears and possible misgivings about everything we do not want to understand. Uncertain fears are born of bewilderment because no one was born knowing how to love.&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="plain">&lt;span class="giallo-l">&lt;span>To us, eager for life, I refer!&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>Let&amp;#39;s not let ourselves escape so easily!&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>It is enough to use our consciousness&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>to create our path with it.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span>It is much less when we still use reason,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>even if it sometimes seems only unconscious.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>I refer primarily to those with a blind attitude,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>for it is not true that we are bound hands.&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>Pity for those careless will, determined to stumble on the same stone repeatedly. Sorrow for the obstructed, those whose desire tends not to be, sharing their same feeling toward the rest, who have to endure them; however, they can infect anyone in their capacity as much as possible.&lt;/p>
&lt;p>Only disgust and sorrow for all those who reject their power, as well as their duty to be, but above all, to want to be. Loving our passions cannot be disconnected from the occupation of them: existing with a unique sense that identifies us to the rest, which we contemplate day by day, must be linked to the activity itself without falling into the attempt to escape, preventing our sincerity from being sincere with us.&lt;/p>
&lt;p>Truth be told: finding the balance of our occupation for ourselves, our first task, is the foundation where the pillars of our purpose are located. Therefore, our motivation toward our goals will notably mark a before and after to the extent of our seriousness for ourselves.&lt;/p>
&lt;p>Being true to ourselves in thought and deed to evolve every day more, aspiring one day to honestly want to take care of our lives to become who we want to be.&lt;/p>
&lt;hr />
&lt;h2 id="the-importance">The importance&lt;/h2>
&lt;p>The same disposition to the importance of everything, of moments, as well as their absences; consideration for what surrounds us and the nothingness that could approach us at any moment.&lt;/p>
&lt;p>Interest in what we should value above all in no measurable magnitude. I refer to what we should consider rising towards its fullness as a transcendent entity from nothing to everything. Our life and its proportions of sizes and trends are as diverse, abstract, and eloquent as it disposes itself.&lt;/p>
&lt;p>The rhetorical seduction of its abstraction and idealization is what we aspire to without reservations but, above all, without fears beyond those that situations themselves will present to us.&lt;/p>
&lt;p>There will be no need to fear spontaneous meditation with scents of truth because it will always be waiting for us.&lt;/p>
&lt;p>The magnitude of everything that tends towards insignificance, towards ignorance by desire, towards the emptiness of its meaning, towards the frivolity of its importance.&lt;/p>
&lt;p>The impact of our interest, the effectiveness of our reach, the magnitude of our desire, the seriousness of our commitment…&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="plain">&lt;span class="giallo-l">&lt;span>&amp;quot;How much are we worth?&amp;quot; is the question.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>&amp;quot;How much are you worth?&amp;quot; is the answer.&lt;/span>&lt;/span>&lt;/code>&lt;/pre></content></entry><entry xml:lang="en"><title>Chapter 22: December 2016</title><published>2016-12-01T00:00:00+00:00</published><updated>2016-12-01T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/books/oeur/2016-diciembre/"/><id>https://chemaclass.com/books/oeur/2016-diciembre/</id><content type="html">&lt;p>&lt;img src="/images/books/oeur/22.jpg" alt="book-chapter" />&lt;/p>
&lt;h2 id="slave-to-death">Slave to Death&lt;/h2>
&lt;p>Having death so present day after day, so recurrent, is something inevitable for us. Being aware that our time is not infinite should make us question what we want—or should want—to invest it in.&lt;/p>
&lt;p>My greatest fear is the sudden headache that sometimes assaults me when I try to fall asleep. I’m not talking about emotional pain but physical because, in addition to seeming random, they could be playing for the last time with no chance of a replay.&lt;/p>
&lt;p>This is what happened and what could happen again: headaches in the darkness leading to the ultimate uncertainty we all fear so much—death.&lt;/p>
&lt;p>Especially at a distance, where I would only have myself. If any tragedy were to occur, there would be no first ones to find out… only seconds and thirds, as these first ones could do nothing but suspect and deny what possibly happened until the truth becomes inevitable.&lt;/p>
&lt;p>The origin of the tragedy could arise at any moment, which, along with the beauty of its uncertainty, unveils me until it clouds the rest of my senses.&lt;/p>
&lt;p>Unveiled by death even during the day. Witnessing nothingness, as well as its apparent and absent presence.&lt;/p>
&lt;p>Hunger for a defined reason, logical and rational sense, for projection consented by our cause. Thirst for understanding, for comprehension, for impulse towards what fulfills us.&lt;/p>
&lt;p>Fear the slavery to the inevitable that will end any opportunity from happening.&lt;/p>
&lt;hr />
&lt;h2 id="singularities">Singularities&lt;/h2>
&lt;p>Complex singularities with consequent rational use. Temporal moments with projections are so unique.&lt;/p>
&lt;p>Abstract experiences that continue to orbit themselves, seeking evolutions in the measurements of their interests.&lt;/p>
&lt;p>Ideas explode and vanish like simple sparks when not disciplined and worked on to temper their flame.&lt;/p>
&lt;p>False lack of opportunity for not wanting to transform from the same form.&lt;/p>
&lt;p>Guidelines without an apparent direction, some more and less consistent with their responsibilities.&lt;/p>
&lt;p>Lack of principles that isolate us from our purpose and reason for being. There is a lack of arguments that invite us to believe in what would not hold.&lt;/p>
&lt;p>Belief in the boldest lack. Ignorance better internalizes prayer to the insult—dictator tales for those who dare not to question.&lt;/p>
&lt;p>Death is a real determining judge.&lt;/p>
&lt;hr />
&lt;h2 id="education">Education&lt;/h2>
&lt;p>The problem with education is that it does not teach the importance of responsibilities and the background that should be acquired over time. Education is linked to responsibility and, of course, united with our freedom.&lt;/p>
&lt;p>Our education comes from learning the consequences of our actions. The lack of education occurs when we are taught incorrectly about what we truly deserve, especially when we forget our responsibilities and push our obligations aside. Surprisingly, our reward ends up being the same as those with a proper education. So, the question is: What is the appropriate education then?&lt;/p>
&lt;p>The correct education is the one that teaches the greatness of our actions, starting from a perspective of personal improvement: wanting to be better than ourselves day after day.&lt;/p>
&lt;p>Our actions should react equally to what we do; we should act as we want the world to behave with us. We should thrive as we would like to see our loved ones thrive. We should be like that person we would like to know.&lt;/p></content></entry><entry xml:lang="en"><title>Chapter 21: November 2016</title><published>2016-11-01T00:00:00+00:00</published><updated>2016-11-01T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/books/oeur/2016-noviembre/"/><id>https://chemaclass.com/books/oeur/2016-noviembre/</id><content type="html">&lt;p>&lt;img src="/images/books/oeur/21.jpg" alt="book-chapter" />&lt;/p>
&lt;h2 id="sweet-memories">Sweet memories&lt;/h2>
&lt;p>Patience and tranquility.&lt;/p>
&lt;p>It is not difficult to realize that everything is constantly changing as long as we genuinely want to be a part of it.&lt;/p>
&lt;p>Feel that all these adventures throughout this time have been nothing more than the result of the circumstantial needs we have found ourselves surrounded by. And we, trying to overcome all adversity with no greater guidance than the hardness and spontaneity of that which surprises us so much day after day: life itself. Without a doubt, we will be the ones to have the final say about our being and its decisions for posterity.&lt;/p>
&lt;p>For those memories that still haunt us and travel wherever we go. We take care of them to the extent of their value, encouraging ourselves to improve alongside them. Still, above all, we understand that we are the product of them today but not necessarily tomorrow.&lt;/p>
&lt;p>Not neglecting our aspirations, those desires we long for, that reference we might miss so much… Looking at ourselves and recognizing ourselves without the need for mirrors. Reality sometimes seems so distant and different from how we believe it should be because observing ourselves without reason will inevitably distance us from our essence.&lt;/p>
&lt;p>Memories still awaiting their birth. Thirst for reflection, but above all, the desire to build the best version of ourselves. Until the end of our days. Wishing for a bitter farewell then, but inevitable and abundant sweet memories.&lt;/p>
&lt;hr />
&lt;h2 id="even">Even&lt;/h2>
&lt;p>When plans become so unrecognizable, accepting them becomes a challenge in their complexity.&lt;/p>
&lt;p>Admitting the uncertain future is so complicated that even the future itself would be frightened by its unforeseen events.&lt;/p>
&lt;p>Unpleasant surprises are so inevitable that even our own destiny would be alarmed by its so unnoticed and possibly commonplace tomorrow.&lt;/p>
&lt;p>Blind opportunities that, along with indiscreet verses, are surprised day after day by their adventures, some so uncontrollable and others so sudden that even sleeping without dreams, living without aspirations, tend toward dissatisfied normality. I am those blind opportunities. I am those indiscreet verses.&lt;/p>
&lt;p>Insecure and alarming suspicions until the moment comes and reality surprises us with firm harshness—and unbreakable certainty—regardless of our possible discontent.&lt;/p>
&lt;p>Inevitable discrepancy. Discontent with that situation that seems to surpass us by too much. Still shaken to assimilate.&lt;/p>
&lt;p>Adapt to everything that is yet to come. “He who stumbles and does not fall, advances.”&lt;/p>
&lt;hr />
&lt;h2 id="our-biggest-mistake">Our biggest mistake&lt;/h2>
&lt;p>The two most significant human errors are the religious and political denigration to which we have led ourselves. And I say two when I could say one; we could abstract these branches, as distant as they are linked, into a single fantasy that seeks the well-being of oneself.&lt;/p>
&lt;p>What is religion if not a spiritual utopia? It is not conclusive but adaptive, according to the time and cultural trends in which, as rational beings, we have been evolving. And what is politics if not the administrative ideal of the public with which it seems we are obliged to coexist?&lt;/p>
&lt;p>Both politics and religion have always gone hand in hand, to a greater or lesser extent. And I don’t mean that they are superficially linked, although historically they have been. Even if we try to unlink them today, this connection goes beyond an apparent simple connection.&lt;/p>
&lt;p>Religion, like politics, reflects our failure to understand ourselves as equals. It is the purest evidence of our impurity. It is the manifesto of our reality and our lack of understanding of what is not us.&lt;/p>
&lt;p>Both religion and politics are nothing more than unattainable utopias intertwined without an evident end. They are the problem without a solution, the paradox of their logic, as we will be forced to deal with these issues until the end.&lt;/p>
&lt;p>I am not asserting that both politics and religion are unnecessary and senseless. I declare that we will be wrong in claiming to be right in any utopia. Politics is necessary; hence, it reflects our lack of understanding, just as religion is evidence of our backwardness as rational beings.&lt;/p>
&lt;p>Ultimately, politics must — or should— ensure our well-being as collective beings. However, religion has abused ignorance, both of those who wanted it and those who had no other options.&lt;/p>
&lt;p>Therefore, our biggest mistake will be any belief disposed of— even predisposed— in any utopia.&lt;/p></content></entry><entry xml:lang="en"><title>Chapter 20: October 2016</title><published>2016-10-01T00:00:00+00:00</published><updated>2016-10-01T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/books/oeur/2016-octubre/"/><id>https://chemaclass.com/books/oeur/2016-octubre/</id><content type="html">&lt;p>&lt;img src="/images/books/oeur/20.jpg" alt="book-chapter" />&lt;/p>
&lt;h2 id="entropy">Entropy&lt;/h2>
&lt;p>A simple thought is enough to make us realize how fragile we can be.&lt;/p>
&lt;p>The entropy of our being tends toward disorder and chaos; just a few careless days, and we notice that life slips away in a constant struggle against the potential confusion of our every day, with its greater and lesser challenges, as well as involuntary pressures.&lt;/p>
&lt;p>In the end, everything will be a battle against entropy, which tends to confusion and entanglement in itself. Our eternal struggle should revolve around combating our disorder.&lt;/p>
&lt;p>All for our future, for when we remember ourselves again in a few years with affection and, why not, a bit of longing. Wishing to feel proud of who we were in the past days gone by. Above all, feeling proud of the trail we leave in the face of any adversity provoked by our concealed entropy.&lt;/p>
&lt;hr />
&lt;h2 id="the-future">The Future&lt;/h2>
&lt;p>The future is not for those who constantly plan or for those who dare not take a step forward and confront themselves, especially when overwhelmed and without reason to seek the motivation that seems elusive.&lt;/p>
&lt;p>On the contrary, the future belongs to those who develop their present. Because motivation comes and goes, but passion is born, progresses, and grows with us.&lt;/p>
&lt;p>The future is nothing more than our reward for our present. Of course, life’s surprises may sometimes leave much to be desired, but we are not referring to those in particular. It is our projection that matters for the development of our present. The influences and perspectives that make us progress as individuals will determine our growth.&lt;/p>
&lt;p>What can be more important than our fulfillment in our sincere development as individuals?&lt;/p>
&lt;p>Let’s not allow bad weather to prevent us from being ourselves. Let’s not stop thriving to the best of our abilities. Let’s project into the world what we would like to feel, for we are the world but, above all, the future.&lt;/p></content></entry><entry xml:lang="en"><title>The Pragmatic Programmer</title><subtitle>The journey to mastery</subtitle><category term="software-design" scheme="https://chemaclass.com/tags/software-design/" label="Software Design"/><category term="clean-code" scheme="https://chemaclass.com/tags/clean-code/" label="Clean Code"/><category term="refactoring" scheme="https://chemaclass.com/tags/refactoring/" label="Refactoring"/><category term="career" scheme="https://chemaclass.com/tags/career/" label="Career"/><published>2016-10-01T00:00:00+00:00</published><updated>2016-10-01T00:00:00+00:00</updated><author><name>
Andrew Hunt</name></author><author><name>
David Thomas</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/the-pragmatic-programmer/"/><id>https://chemaclass.com/readings/the-pragmatic-programmer/</id><summary type="html">Key takeaways from Hunt and Thomas's classic on pragmatic software development, including DRY principles, the right mindset, and how to choose and master your tools.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>&lt;h3 id="takeaways">Takeaways&lt;/h3>
&lt;ul>
&lt;li>Don’t Repeat Yourself.&lt;/li>
&lt;li>Mindset is as important as knowledge.&lt;/li>
&lt;li>Good code is easier to change than bad design.&lt;/li>
&lt;li>Choose great tools and become fluent with them.&lt;/li>
&lt;/ul>
&lt;hr />
&lt;h4 id="don-t-repeat-yourself-dry">Don’t Repeat Yourself (DRY)&lt;/h4>
&lt;ul>
&lt;li>Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.&lt;/li>
&lt;li>DRY is about the duplication of knowledge, of intent. It’s about expressing the same thing in two different places,
possibly in two totally different ways.&lt;/li>
&lt;/ul>
&lt;h4 id="mindset-is-as-important-as-knowledge">Mindset is as important as knowledge&lt;/h4>
&lt;p>Some important aspects of this mindset include:&lt;/p>
&lt;ul>
&lt;li>Taking responsibility for your work by not making excuses or passing blame when things go wrong.&lt;/li>
&lt;li>Writing software that’s good enough. This means not wasting time on things that are better than they need to be to
make the product successful.&lt;/li>
&lt;li>Not ignoring technical debt. The authors use the analogy of broken windows:&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>Don’t leave “broken windows” (bad designs, wrong decisions, or poor code) unrepaired.
Fix each one as soon as it is discovered. If there is insufficient time to fix it properly, then board it up.
Perhaps you can comment out the offending code, or display a “Not Implemented” message, or substitute dummy data instead.&lt;/p>
&lt;/blockquote></content></entry><entry xml:lang="en"><title>Chapter 19: September 2016</title><published>2016-09-01T00:00:00+00:00</published><updated>2016-09-01T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/books/oeur/2016-septiembre/"/><id>https://chemaclass.com/books/oeur/2016-septiembre/</id><content type="html">&lt;p>&lt;img src="/images/books/oeur/19.jpg" alt="book-chapter" />&lt;/p>
&lt;h2 id="you-only-live-once">You Only Live Once&lt;/h2>
&lt;p>You only live once, or at least that’s as far as we can comprehend. We all have problems, to a greater or lesser extent, of importance relative to the interests and intentions that may be hidden behind them.&lt;/p>
&lt;p>Lying to ourselves about our thoughts or what we believe to understand as reality will make it nothing more than a deception from and to ourselves.&lt;/p>
&lt;p>In simple terms, we might say that each person has their view of reality where we live together and share things. But when we ask, “What is reality if not how we see it?” we hesitate to say there’s one reality for everyone. Instead, we create a shared reality based on our perspectives.&lt;/p>
&lt;p>The most significant harm we could cause to the world, to tangible reality, and everything practical and pragmatic is and will be the lack of seriousness in our honesty towards ourselves. What diminishes us is the lack of the essential towards ourselves: our loyalty. What makes us great in the world is the overdose of sincerity that we should practice with ourselves daily.&lt;/p>
&lt;p>Life has been, is, and will undoubtedly be full of difficulties. But in contrast to them, attitudes play the role of our projections, our profound realization, and our perception of objectivity.&lt;/p>
&lt;p>What is our existential concern if not the ultimate taboo topic due to its already known absent answer? We should be the ones acting at all times. Our role was never written. Being the protagonist will be only a matter of predisposition to be so. Genuine predisposition, I insist!&lt;/p>
&lt;p>We should not beg our apparent reality or even trust it more than what our eyes can see, for in the doubt of its existence will reside, for anyone who seeks it, the answer.&lt;/p>
&lt;hr />
&lt;h2 id="young-and-innocent">Young and Innocent&lt;/h2>
&lt;p>How young and innocent we have been, simply believing that we could evade the maturity that actually surrounds us. Concern, justified in our commitment, will be linked to our seriousness in our profession. Understanding that learning is and will always be a continuous thing linked to our responsible prudence.&lt;/p>
&lt;p>So many mistakes we have made and will continue to make… that only with continuous improvement will we feel fulfilled, for there will always be so much to renew…&lt;/p>
&lt;p>We have such limited time that boredom should not have a place; to live disheartened will be, therefore, not to live.&lt;/p>
&lt;p>Learning that understanding ourselves is not easy; it will not be, either, and absolutely, something overnight. Only in the search for understanding can we learn from it.&lt;/p>
&lt;p>Today, we should read ourselves with different eyes. Eyes renewed today, aiming at the triumph of the uncertain tomorrow.&lt;/p>
&lt;p>This has truly been a path to our understanding where we have learned many things together, remembered many others, and dreamt a few. But undoubtedly, an experience that deserves not to be forgotten, at least for our memory.&lt;/p>
&lt;hr />
&lt;h2 id="ending-to-begin-again">Ending to Begin Again&lt;/h2>
&lt;p>Ending to begin again. I smile. I have tried to play with words in as many ways as possible. I have tried to reach the limit of their possible connections, and there are so many… I reread myself and enjoy it; it makes me feel alive.&lt;/p>
&lt;p>Do you know what it is to have goosebumps when thinking about your present? About everything you have ahead waiting for you?&lt;/p>
&lt;p>I am eager to see my family again, hug them, and feel them close. But I am not willing to let go of the opportunity for which I have been fighting all these years and the ones ahead.&lt;/p>
&lt;p>So many things motivate me to continue… Still, among all of them, I highlight seeing my siblings grow and enjoy a present full of surprises together, not allowing them to ever feel alone or lacking an older sibling.&lt;/p>
&lt;p>It has been two years in which maturity seems never to finish reaching us… even though it could pretend to be daily. The brevity of time is not the real problem, but the use we make of it. Ending without entire finishing, being able to start again and again; I refer to death, for we are still alive.&lt;/p>
&lt;p>Love our family. Enjoy, but above all, seize the opportunities. Fight for personal growth, understand ourselves, and not settle for being what we do not want to be.&lt;/p>
&lt;p>As if it were the last day of our lives. Let’s indeed be ourselves.&lt;/p>
&lt;hr />
&lt;h2 id="the-day-after">The Day After&lt;/h2>
&lt;p>Living is not breathing an air full of uncertainties and misfortunes.&lt;/p>
&lt;p>Wanting is not stomping or hiding behind the false refuge of right or reason.&lt;/p>
&lt;p>Growing is not waking up day after day without ambitions, both short and long-term.&lt;/p>
&lt;p>Waking up is not opening our eyes after the dream we might prefer over our present reality.&lt;/p>
&lt;p>Learning is not memorizing or repeating without understanding.&lt;/p>
&lt;p>Fighting is not puffing ourselves up in a simulated breath of superiority over someone other than ourselves.&lt;/p>
&lt;p>Allowing is not right when not truly deserved.&lt;/p>
&lt;p>Letting insecurity judge us is not balance or harmony.&lt;/p>
&lt;p>Missing is not the absence of pain.&lt;/p>
&lt;p>Living is taking seriously the before and after of our days. Wanting to grow by waking up to learn to fight will allow us to stop missing living because we will be truly alive.&lt;/p></content></entry><entry xml:lang="en"><title>Sprint</title><subtitle>How to Solve Big Problems and Test New Ideas in Just Five Days</subtitle><category term="agile" scheme="https://chemaclass.com/tags/agile/" label="Agile"/><category term="productivity" scheme="https://chemaclass.com/tags/productivity/" label="Productivity"/><category term="team-management" scheme="https://chemaclass.com/tags/team-management/" label="Team Management"/><published>2016-09-01T00:00:00+00:00</published><updated>2016-09-01T00:00:00+00:00</updated><author><name>
Jake Knapp</name></author><author><name>
John Zeratsky</name></author><author><name>
Braden Kowitz</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/sprint/"/><id>https://chemaclass.com/readings/sprint/</id><summary type="html">Sprint offers a transformative formula for testing ideas that works whether you’re at a startup or a large organization. Within five days, you’ll move from idea to prototype to decision, saving you and your team countless hours and countless dollars. A must read for entrepreneurs of all stripes.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>
&lt;p>“Sprint offers a transformative formula for testing ideas that works whether you’re at a startup or a large
organization. Within five days, you’ll move from idea to prototype to decision, saving you and your team countless hours
and countless dollars. A must read for entrepreneurs of all stripes.” - Eric Ries, author of The Lean Startup&lt;/p>
&lt;p>From three partners at Google Ventures, a unique five-day process for solving tough problems, proven at more than a
hundred companies.&lt;/p>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/AuktI4lBj6M"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>Chapter 18: August 2016</title><published>2016-08-01T00:00:00+00:00</published><updated>2016-08-01T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/books/oeur/2016-agosto/"/><id>https://chemaclass.com/books/oeur/2016-agosto/</id><content type="html">&lt;p>&lt;img src="/images/books/oeur/18.jpg" alt="book-chapter" />&lt;/p>
&lt;h2 id="i-m-back-to-being-myself">I’m back to being myself&lt;/h2>
&lt;p>I don’t want to end this adventure just yet. I’m sharing my experiences and thoughts from these years, trying to gather the ones I can, even though some thoughts chose not to be written for reasons unknown.&lt;/p>
&lt;p>I am back to being the one who writes to you, feels you, and thinks about you—the one who writes for himself and you who are reading me.&lt;/p>
&lt;p>I am back to eating healthy, feeling alive, and exercising regularly. Taking care of myself and genuinely caring about what I do. I am back to avoiding losing my head in tornadoes that lead to unnecessary confusion. I am back to feeling alive and, with that, happy with myself and what I do.&lt;/p>
&lt;p>I am aware that life consists and will consist of constant ups and downs. Sometimes seemingly arbitrary, where disorientation and concerns may cloud us on who knows how many consecutive occasions… but let that not take away our breath or our desire for self-improvement.&lt;/p>
&lt;p>It has been a journey filled with countless experiences, where responsibilities and duties arose from many different places and forms, sometimes even in such short intervals. Who could have been prepared or warned of such a situation? Simply astonishing.&lt;/p>
&lt;p>I want to improve as I wanted to do years ago… and I believe I have found the answer I was searching for. Continuous learning, with no more mystery, will lead us day by day toward our improvement. Learning about ourselves!&lt;/p>
&lt;p>What are we? What do we want to be? Where are we going? What are we doing here? What is our purpose or motive? All these questions have the same answer. An answer that can be as different as we want it to be. The briefest and most straightforward answer, as well as the most complex in itself: the answer is you.&lt;/p>
&lt;hr />
&lt;h2 id="with-different-eyes">With Different Eyes&lt;/h2>
&lt;p>Guided by mature responsibility, teaching us to become our authentic selves, as if we are still figuring out our desires. This perspective aids in cultivating our basic instincts, connected to our rational and compassionate side.&lt;/p>
&lt;p>What could our self-improvement be without the sincere evolution of maturity in our ideas? It will be nothing more than reconsidering our judgments and sensations, as well as our knowledge and perceptions. It will allow us to improve directly from the root of our projects and dreams, as well as convictions of all those concepts we believe we are not wrong about.&lt;/p>
&lt;p>Maturity can only be directly linked to the commitment to our responsibility and seriousness in our duty, with love and passion… always.&lt;/p>
&lt;p>It is true that with different eyes, we correct ourselves and speak to ourselves today. Most likely, we will continue to do so from now until one not-so-distant tomorrow, for we have learned so many things in these years…&lt;/p>
&lt;p>With different eyes, I look at myself. With different eyes, we grow and want to keep growing until we lose our breath.&lt;/p>
&lt;p>For you, for us.&lt;/p></content></entry><entry xml:lang="en"><title>The Clean Coder</title><subtitle>A Code of Conduct for Professional Programmers</subtitle><category term="clean-code" scheme="https://chemaclass.com/tags/clean-code/" label="Clean Code"/><category term="career" scheme="https://chemaclass.com/tags/career/" label="Career"/><category term="tdd" scheme="https://chemaclass.com/tags/tdd/" label="Tdd"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><published>2016-08-01T00:00:00+00:00</published><updated>2016-08-01T00:00:00+00:00</updated><author><name>
Robert C. Martin</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/the-clean-coder/"/><id>https://chemaclass.com/readings/the-clean-coder/</id><summary type="html">Robert C. Martin's guide to professional behavior in software development, covering time management, pressure handling, TDD practices, and what it truly means to be a software craftsman.</summary><content type="html">&lt;p>Programmers who endure and succeed amidst swirling uncertainty and nonstop pressure share a common attribute: They care
deeply about the practice of creating software. They treat it as a craft. They are professionals.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h3 id="readers-will-learn">Readers will learn&lt;/h3>
&lt;ul>
&lt;li>What it means to behave as a true software craftsman&lt;/li>
&lt;li>How to deal with conflict, tight schedules, and unreasonable managers&lt;/li>
&lt;li>How to get into the flow of coding, and get past writer’s block&lt;/li>
&lt;li>How to handle unrelenting pressure and avoid burnout&lt;/li>
&lt;li>How to combine enduring attitudes with new development paradigms&lt;/li>
&lt;li>How to manage your time, and avoid blind alleys, marshes, bogs, and swamps&lt;/li>
&lt;li>How to foster environments where programmers and teams can thrive&lt;/li>
&lt;li>When to say &lt;strong>No&lt;/strong> and how to say it&lt;/li>
&lt;li>When to say &lt;strong>Yes&lt;/strong> and what yes really means&lt;/li>
&lt;/ul>
&lt;hr />
&lt;h2 id="summary">Summary&lt;/h2>
&lt;h3 id="chapter-1-professionalism">Chapter 1: Professionalism&lt;/h3>
&lt;ul>
&lt;li>Being a professional means taking full responsibility for one’s actions.&lt;/li>
&lt;li>First rule is not doing harm to the function nor the structure of the software.&lt;/li>
&lt;li>You will always make occasional mistakes, but you must learn from each.&lt;/li>
&lt;li>You should be certain about all code you release and firmly expect QA to find nothing wrong with it.
&lt;ul>
&lt;li>Test it and test it again.&lt;/li>
&lt;li>Automate your tests.&lt;/li>
&lt;li>Design your code to be easy to test.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>You should follow the Boy Scout rule and always leave a module a little cleaner than you found it so that it becomes
easier to change over time, not harder.&lt;/li>
&lt;li>Your career is &lt;strong>your responsibility&lt;/strong>, not your boss nor your employers.
&lt;ul>
&lt;li>Spending 20 hours a week beyond your normal work to improve your knowledge and skills.&lt;/li>
&lt;li>Read, experiment, practice (kata), talk to other, collaborate, look over the fence, mentor.&lt;/li>
&lt;li>It should be fun.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Also, know your domain, identify with your customer (no “us vs. them”, ever).&lt;/li>
&lt;/ul>
&lt;h3 id="chapter-2-saying-no">Chapter 2: Saying No&lt;/h3>
&lt;ul>
&lt;li>Professionals have the courage to say no to their managers.&lt;/li>
&lt;li>Managers and developers have roles that are often adversarial, because on the short term, their goals tend to
conflict.&lt;/li>
&lt;li>The higher the stakes, the more valuable a “no” becomes, and the harder to say.&lt;/li>
&lt;li>Good teams will successfully work towards a yes, but only a right yes, that will later work out in practice.&lt;/li>
&lt;/ul>
&lt;h3 id="chapter-3-saying-yes">Chapter 3: Saying Yes&lt;/h3>
&lt;ul>
&lt;li>There are three parts to making a commitment:
&lt;ul>
&lt;li>You say you will do it&lt;/li>
&lt;li>You mean it&lt;/li>
&lt;li>You actually do it&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Your commitment must respect the limits of what you expect (based on your experience) you can and cannot do.
&lt;ul>
&lt;li>If you recognize you will probably not be able to meet a commitment, you need to raise a red flag immediately.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="chapter-4-coding">Chapter 4: Coding&lt;/h3>
&lt;ul>
&lt;li>Programming requires a level of focus that few other disciplines require.&lt;/li>
&lt;li>“The zone” (or “flow”) is not as good as people think: you will be locally productive, but will often lose the bigger
picture and possibly product not-so-good designs.&lt;/li>
&lt;li>Interruptions are bad distractions.
&lt;ul>
&lt;li>Pair programming is helpful to cope with them.&lt;/li>
&lt;li>TDD helps to make the pre-interruption context reproducible.
&lt;ul>
&lt;li>Minimize time spent debugging&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Coding is a &lt;strong>marathon&lt;/strong>, not a sprint, so conserve the energy and creativity.&lt;/li>
&lt;li>Leave when it’s time, even in the middle of something important.&lt;/li>
&lt;li>Continuously re-estimate your best/likely/worst completion time and speak up as soon as you recognize you will likely
be late.
&lt;ul>
&lt;li>Do not allow anyone to rush you.&lt;/li>
&lt;li>Use a proper definition of “done”, with sufficiently high quality requirements.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Programming is too hard for anyone, so get help and provide help to others, in particular (but not only) in mentoring
style.
&lt;ul>
&lt;li>Don’t be shy from asking.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="chapter-5-test-driven-development">Chapter 5: Test-Driven Development&lt;/h3>
&lt;ul>
&lt;li>&lt;a rel="external" href="https://en.wikipedia.org/wiki/Test-driven_development">TDD&lt;/a> is not a cure-all and is impractical or inappropriate in
some (rare) cases.&lt;/li>
&lt;li>TDD Cycle:
&lt;ol>
&lt;li>Add a test&lt;/li>
&lt;li>Run all tests. The new test should fail for expected reasons&lt;/li>
&lt;li>Write the simplest code that passes the new test&lt;/li>
&lt;li>All tests should now pass&lt;/li>
&lt;li>Refactor as needed&lt;/li>
&lt;li>Repeat&lt;/li>
&lt;/ol>
&lt;/li>
&lt;/ul>
&lt;h3 id="chapter-6-practicing">Chapter 6: Practicing&lt;/h3>
&lt;ul>
&lt;li>A programming Kata is a precise set of choreographed keystrokes and mouse movements that simulates the solving of some
programming problem.
&lt;ul>
&lt;li>A Kata is about the process, not the solution.&lt;/li>
&lt;li>You aren’t solving the problem because you already know the solution.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="chapter-7-acceptance-testings">Chapter 7: Acceptance Testings&lt;/h3>
&lt;ul>
&lt;li>Avoid garbage in, garbage out. Make sure you understand the requirements.
&lt;ul>
&lt;li>Creating this understanding means removing ambiguity.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>The best way to do this is defining acceptance tests:
&lt;ul>
&lt;li>All customer’s conditions need to be fulfilled by automated tests to prove the expected software behavior.&lt;/li>
&lt;li>Success of those tests constitutes the definition of “Done”.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Code implementation should start only when the tests are complete.&lt;/li>
&lt;li>Unlike unit tests (which are only for programmers), the audience of acceptance tests are both: business and
developers.&lt;/li>
&lt;li>Run all tests in a continuous integration and immediately fix any failures.&lt;/li>
&lt;/ul>
&lt;h3 id="chapter-8-test-strategies">Chapter 8: Test Strategies&lt;/h3>
&lt;ul>
&lt;li>Consider QA part of the team. They act as specifiers: writing acceptance tests, including the failure cases and corner
cases, and perform exploratory testing.&lt;/li>
&lt;li>Testing pyramid:
&lt;ul>
&lt;li>Most tests are unit tests. By developer and for developers.&lt;/li>
&lt;li>Many tests are component or integration tests. By QA or Business assisted by Developers. For Business and
Developers.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="chapter-9-time-management">Chapter 9: Time management&lt;/h3>
&lt;ul>
&lt;li>Management roles in software development requires good time management.&lt;/li>
&lt;li>Meeting are necessary but are also often huge time wasters, so avoid meeting that have no clear benefit &amp;lt;- this is a
professional obligation.&lt;/li>
&lt;li>Meeting must have an agenda and a clear goal.
&lt;ul>
&lt;li>Agile stand up meetings can be an efficient format.&lt;/li>
&lt;li>Iteration planning should take 5% of the iteration.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Concentration (focus) is a scarce resource.
&lt;ul>
&lt;li>Use it well when present and recharge with simpler tasks (meetings) and breaks in between.&lt;/li>
&lt;li>How to improve?
&lt;ul>
&lt;li>Sport.&lt;/li>
&lt;li>Creative input.&lt;/li>
&lt;li>Short breaks every 45 minutes.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="chapter-10-estimation">Chapter 10: Estimation&lt;/h3>
&lt;ul>
&lt;li>Estimation is the source of most distrust between business people and developers because the latter provide estimate
which the former treats like commitments.
&lt;ul>
&lt;li>Both are insufficiently aware that the estimate really is a probability distribution, not a fixed number.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="chapter-11-pressure">Chapter 11: Pressure&lt;/h3>
&lt;ul>
&lt;li>The professional developer is calm and decisive under pressure, adhering to his training and disciplines, knowing that
they are the best way to meet pressing deadlines and commitments.&lt;/li>
&lt;li>Avoid situations that cause pressure via:
&lt;ul>
&lt;li>make only commitments you can fulfill&lt;/li>
&lt;li>keep your code clean&lt;/li>
&lt;li>work in such a way that you need not change it when in crisis&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Don’t panic. Talk with your team. Don’t rush. Trust your disciplines.&lt;/li>
&lt;li>Offer to pair to others in crisis.&lt;/li>
&lt;/ul>
&lt;h3 id="chapter-12-collaboration">Chapter 12: Collaboration&lt;/h3>
&lt;ul>
&lt;li>Not all but most programmers like working alone. But we need to understand the goals of the surrounding people,
including business folks.
&lt;ul>
&lt;li>This requires &lt;strong>communication&lt;/strong>.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Likewise, within the development team: only collective code ownership and pairing produce a good level of
communication.
&lt;ul>
&lt;li>Programming is all about &lt;strong>communication&lt;/strong>.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="chapter-13-teams-and-projects">Chapter 13: Teams and Projects&lt;/h3>
&lt;ul>
&lt;li>Teams need time (months) to gel, to really get to know each other and learn to truly work together.
&lt;ul>
&lt;li>Assigning fractional people to different projects is a bad idea, as is breaking up a good team at the end of a
project.&lt;/li>
&lt;li>Instead, assigning several projects to one team can work well.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="chapter-14-mentoring-apprenticeship-and-craftsmanship">Chapter 14: Mentoring, Apprenticeship and Craftsmanship&lt;/h3>
&lt;ul>
&lt;li>Young programmers need mentoring.
&lt;ul>
&lt;li>Mentoring can be implicit or explicit.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Given that we entrust software with all aspects of our lives, a reasonable period of training and supervised practice
would be appropriate.&lt;/li>
&lt;/ul>
&lt;hr />
&lt;p>In this lesson, Uncle Bob demonstrates the need to write a clean code and establishes the bases to achieve it,
being these bases of a social and scientific nature. Making it clear that the future of programming is based on an
ethical and polite code.&lt;/p>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/7EmboKQH8lM"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;hr />
&lt;p>In this second lesson, Uncle Bob teaches us the purpose of comments in the code, breaking the paradigm that commenting
is something “I have to do” for the simple fact that we mistakenly consider that commenting is a good practice. For
Uncle Bob, writing a comment is a sign of failure, since a good code must be able explain by itself: Fewer Comments =
Better Code.&lt;/p>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/2a_ytyt9sf8"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;hr />
&lt;p>In this third lesson, Uncle Bob focuses on raising awareness, given the need to increase the level of criteria in code
production. Pointing to the lack of preparation in most programmers, as one of the main reasons for the inefficiency in
software development today.&lt;/p>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/Qjywrq2gM8o"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;hr />
&lt;p>In this fourth lesson, Uncle Bob introduces us to a software development methodology oriented through testing. This is
the Test-Driven Development (TDD), a practice with a long learning curve, but with significant results to generate a
more robust, safer, more maintainable code and with greater development efficiency.&lt;/p>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/58jGpV2Cg50"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>97 Things Every Programmer Should Know</title><subtitle>Collective whisdom from the experts</subtitle><category term="software-design" scheme="https://chemaclass.com/tags/software-design/" label="Software Design"/><category term="clean-code" scheme="https://chemaclass.com/tags/clean-code/" label="Clean Code"/><category term="career" scheme="https://chemaclass.com/tags/career/" label="Career"/><category term="productivity" scheme="https://chemaclass.com/tags/productivity/" label="Productivity"/><published>2016-07-15T00:00:00+00:00</published><updated>2016-07-15T00:00:00+00:00</updated><author><name>
Kevlin Henney</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/97-things-every-programmer-should-know/"/><id>https://chemaclass.com/readings/97-things-every-programmer-should-know/</id><summary type="html">Tap into the wisdom of experts to learn what every programmer should know, no matter what language you use. With the 97 short and extremely useful tips for programmers in this book, you'll expand your skills by adopting new approaches to old problems, learning appropriate best practices, and honing your craft through sound advice.</summary><content type="html">&lt;p>Tap into the wisdom of experts to learn what every programmer should know, no matter what language you use. With the 97
short and extremely useful tips for programmers in this book, you’ll expand your skills by adopting new approaches to
old problems, learning appropriate best practices, and honing your craft through sound advice.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h3 id="my-main-key-takeaways">My main key takeaways&lt;/h3>
&lt;p>01.- Pay off technical debt as soon as possible.&lt;/p>
&lt;p>02.- Learn and master &lt;strong>functional programming&lt;/strong>.&lt;/p>
&lt;ul>
&lt;li>It makes your code less prone to error and easier to debug.&lt;/li>
&lt;/ul>
&lt;p>03.- Don’t guess what a user would do; get users to do things and watch them.&lt;/p>
&lt;p>04.- &lt;strong>Automate&lt;/strong> coding standards.&lt;/p>
&lt;p>05.- Write &lt;strong>simple&lt;/strong> code, simple descriptive names, simple relationships.&lt;/p>
&lt;p>06.- Before you refactor: consider the existing tests and code.&lt;/p>
&lt;ul>
&lt;li>Work in increments, make sure the tests still pass after every change.&lt;/li>
&lt;/ul>
&lt;p>08.- Always leave code &lt;strong>cleaner&lt;/strong> than you found it, even if you didn’t write it.&lt;/p>
&lt;p>10.- Choose your libraries/frameworks carefully to avoid unnecessary complexity.&lt;/p>
&lt;p>11.- Make your code easy to understand using &lt;strong>domain&lt;/strong> terms.&lt;/p>
&lt;p>13.- The &lt;strong>layout&lt;/strong> of the code is also important.&lt;/p>
&lt;p>14.- Use code &lt;strong>reviews&lt;/strong> focusing on knowledge-sharing among team members.&lt;/p>
&lt;p>15.- Objects &lt;strong>immutable&lt;/strong> whenever relevant. Each variable should have the smallest possible scope. Never include more than four function arguments.&lt;/p>
&lt;p>18.- Take &lt;strong>responsibility&lt;/strong> for your own education and never stop learning.&lt;/p>
&lt;ul>
&lt;li>That can be done with just a bit of time each week and there are many ways to go about it (e.g. podcasts, lessons, books, etc.).&lt;/li>
&lt;/ul>
&lt;p>19.- When designing an API, aim to make it &lt;strong>easy to use&lt;/strong>, not convenient to code.&lt;/p>
&lt;p>20.- Deploy early and &lt;strong>often&lt;/strong> – do not leave it until the end of the project.&lt;/p>
&lt;p>22.- Improving your skills should be on your daily basis.&lt;/p>
&lt;p>23.- Adapt the technical level of your domain-specific language to your audience.&lt;/p>
&lt;p>24.- &lt;strong>Don’t be afraid&lt;/strong> to break things if that’s what’s necessary to fix things.&lt;/p>
&lt;p>25.- Careful with your test data because that might go public accidentally.&lt;/p>
&lt;p>26.- Handle your errors as they appear, don’t leave it for later.&lt;/p>
&lt;p>27.- Learn &lt;strong>different&lt;/strong> programming languages.&lt;/p>
&lt;ul>
&lt;li>Learn their own “culture” or way of doing things.&lt;/li>
&lt;li>It’ll make you definitely a better programmer.&lt;/li>
&lt;/ul>
&lt;p>28.- Don’t just catch your errors, really handle them.&lt;/p>
&lt;p>29.- Understand at least some complexities of your business, not just programming.&lt;/p>
&lt;p>30.- &lt;strong>DRY&lt;/strong> – Don’t Repeat Yourself.&lt;/p>
&lt;p>32.- Encapsulate behavior, not just state.&lt;/p>
&lt;p>33.- Floating point numbers inevitably can create errors in calculations.&lt;/p>
&lt;p>34.- &lt;strong>Open source&lt;/strong> is a great opportunity to do interesting work and develop programming skills.&lt;/p>
&lt;p>36.- Give proper &lt;strong>context&lt;/strong> when asking for help, because people can’t just guess what’s going on.&lt;/p>
&lt;p>37.- It’s not about the long hours – learn to &lt;strong>work effectively&lt;/strong>.&lt;/p>
&lt;ul>
&lt;li>Dedicate time to continuous learning and to think about what you’re doing.&lt;/li>
&lt;/ul>
&lt;p>38.- Write proper &lt;strong>bug reports&lt;/strong>:&lt;/p>
&lt;ul>
&lt;li>Precisely how to reproduce the bug,&lt;/li>
&lt;li>how often it appears,&lt;/li>
&lt;li>what should have happened,&lt;/li>
&lt;li>what actually happened.&lt;/li>
&lt;/ul>
&lt;p>39.- Don’t write unnecessary code.&lt;/p>
&lt;ul>
&lt;li>Only write code that adds value and is needed right now.&lt;/li>
&lt;li>&lt;strong>Remove dead code&lt;/strong>.&lt;/li>
&lt;/ul>
&lt;p>41.- The main cause of delays in application response time is a high number of remote &lt;strong>interprocess&lt;/strong> communications, not the algorithm.&lt;/p>
&lt;ul>
&lt;li>DB connections, for example.&lt;/li>
&lt;/ul>
&lt;p>42.- If a compiler warning shows up in your build, fix it.&lt;/p>
&lt;ul>
&lt;li>Don’t leave it for later. Even if it’s not going to be a problem in production.&lt;/li>
&lt;li>Compiler == any static code analysis for non compiled languages.&lt;/li>
&lt;/ul>
&lt;p>43.- Learning to use &lt;strong>command line&lt;/strong> tools is a valuable educational experience, and you might end up preferring them.&lt;/p>
&lt;p>44.- Learn (at least) two different languages and paradigms well.&lt;/p>
&lt;p>45.- Invest some time to &lt;strong>master&lt;/strong> the IDE you’re using.&lt;/p>
&lt;ul>
&lt;li>It’ll make your life easier and save you time in the long run.&lt;/li>
&lt;/ul>
&lt;p>46.- Know and work with your limitations: budget, resources, time, etc.&lt;/p>
&lt;p>47.- Work in &lt;strong>small tasks&lt;/strong>, don’t be afraid to throw away changes.&lt;/p>
&lt;ul>
&lt;li>You’ll still have the insight you gained from the experience.&lt;/li>
&lt;li>Know what you need to accomplish beforehand.&lt;/li>
&lt;/ul>
&lt;p>48.- Use a relational DB if your application is going to handle a large, persistent, interconnected set of data.&lt;/p>
&lt;p>49.- Learn to &lt;strong>communicate&lt;/strong> well in many “languages”: not just to your machine, but also to business partners – and maybe even pick up a foreign language too.&lt;/p>
&lt;ul>
&lt;li>It’s good for connections and for life.&lt;/li>
&lt;/ul>
&lt;p>54.- Think twice before implementing “temporary solutions”.&lt;/p>
&lt;p>55.- Make &lt;strong>GUI&lt;/strong> easy to use correctly and hard to use incorrectly.&lt;/p>
&lt;ul>
&lt;li>Anticipate errors and find ways to prevent them.&lt;/li>
&lt;li>It’s about the user’s experience, not your own.&lt;/li>
&lt;/ul>
&lt;p>56.- In projects, find ways to make &lt;strong>the invisible visible&lt;/strong>.&lt;/p>
&lt;p>57.- Message passing leads to better &lt;strong>scalability&lt;/strong> in parallel systems.&lt;/p>
&lt;p>58.- Write code that other people can easily &lt;strong>understand&lt;/strong>.&lt;/p>
&lt;p>59.- Using &lt;strong>polymorphism&lt;/strong> in your classes and objects reduces the need for if/else statements, which results in smaller, safer code.&lt;/p>
&lt;p>60.- QA is your friend, not your enemy.&lt;/p>
&lt;p>61.- Version your releases.&lt;/p>
&lt;p>62.- Make sure your source code clearly states what the program is doing.&lt;/p>
&lt;p>63.- Learn about the build process. It’s an important part of development.&lt;/p>
&lt;p>64.- Practice &lt;strong>pair programming&lt;/strong>.&lt;/p>
&lt;p>65.- Prefer &lt;strong>domain-specific types&lt;/strong> over primitive types.&lt;/p>
&lt;ul>
&lt;li>They make the code more readable and less prone to errors in development.&lt;/li>
&lt;/ul>
&lt;p>67.- A professional takes &lt;strong>personal responsibility&lt;/strong> for their career and their code.&lt;/p>
&lt;p>68.- Use version control.&lt;/p>
&lt;p>69.- Sometimes the best way to solve a problem is to step away from the computer and let the solution magically appear in your mind.&lt;/p>
&lt;p>70.- Reading code is a good way to &lt;strong>learn&lt;/strong>. Other people’s or your old code.&lt;/p>
&lt;p>72.- Reinventing the wheel is a great way to develop your skills.&lt;/p>
&lt;p>75.- If the code you wrote is truly horrifying, don’t try to fix. &lt;strong>Delete it&lt;/strong> and start again.&lt;/p>
&lt;p>76.- Apply the Single Responsibility Principle (&lt;strong>SRP&lt;/strong>).&lt;/p>
&lt;p>77.- If a client or team member requests a product change, don’t dismiss it outright even if you don’t agree. Ask why instead.&lt;/p>
&lt;ul>
&lt;li>That will lead to a more productive conversation and better results.&lt;/li>
&lt;/ul>
&lt;p>78.- If you’re doing the same thing over and over, try to find a way to &lt;strong>automate it&lt;/strong>.&lt;/p>
&lt;p>79.- Take advantage of code analysis tools.&lt;/p>
&lt;p>80.- Write tests based on the &lt;strong>desired functionality&lt;/strong> of your program, not incidental behavior.&lt;/p>
&lt;p>83.- Testing takes time, but it ensures the &lt;strong>quality&lt;/strong> of the end product. Do it.&lt;/p>
&lt;p>85.- There are many benefits to collaborative work and pair programming.&lt;/p>
&lt;p>86.- Sometimes fixing a mistake in the code leads to uncovering a hidden error.&lt;/p>
&lt;p>87.- Write code &lt;strong>with other programmers in mind&lt;/strong>.&lt;/p>
&lt;p>88.- Learn to use Unix tools. Learn how to use the &lt;strong>terminal&lt;/strong>.&lt;/p>
&lt;p>89.- Use the right algorithm and data structure for the job.&lt;/p>
&lt;ul>
&lt;li>To do that, you need to understand them well.&lt;/li>
&lt;/ul>
&lt;p>90.- Have a good logging policy.&lt;/p>
&lt;p>91.- Using the DRY principle helps you identify and repair performance bottlenecks.&lt;/p>
&lt;p>92.- Testers and programmers should &lt;strong>collaborate&lt;/strong>.&lt;/p>
&lt;p>93.- Write code as if you had to support it for the &lt;strong>rest of your life&lt;/strong>.&lt;/p>
&lt;p>94.- Try to write &lt;strong>“small” functions&lt;/strong>.&lt;/p>
&lt;ol start="95">
&lt;li>Good tests act as &lt;strong>documentation&lt;/strong> for the code they’re testing.&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>They describe how the code works.&lt;/li>
&lt;/ul>
&lt;ol start="96">
&lt;li>
&lt;p>To be a good programmer, you have to care about the &lt;strong>quality&lt;/strong> of the code.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Really, really &lt;strong>discuss things&lt;/strong> with your customers before assuming you understand what they want.&lt;/p>
&lt;/li>
&lt;/ol></content></entry><entry xml:lang="en"><title>Chapter 17: July 2016</title><published>2016-07-01T00:00:00+00:00</published><updated>2016-07-01T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/books/oeur/2016-julio/"/><id>https://chemaclass.com/books/oeur/2016-julio/</id><content type="html">&lt;p>&lt;img src="/images/books/oeur/17.jpg" alt="book-chapter" />&lt;/p>
&lt;h2 id="understanding">Understanding&lt;/h2>
&lt;p>Realizing the delicacy of the whole, the daily and necessary effort to remain consistent in our eagerly sought satisfaction. In this yearning for emotions, sometimes so disparate that like a tide could be reflected on the same ocean.&lt;/p>
&lt;p>We would like to resemble calm waters, but only to the extent necessary. Because needing what we desire is not the same as desiring what we might need. So much prudence is needed to keep ourselves coherent in this reality full of unforeseen events.&lt;/p>
&lt;p>Because, in the end, everything will be a matter of comprehension and understanding the world: its responsiveness to our restlessness, its daily novels and lost stories, its desolate uncertainties forgotten in possible infinite chaos… It will be an illusion beyond understanding anything that escapes our comprehension.&lt;/p>
&lt;p>This confusion is without an apparent beginning or answer. Decisions that could have annihilated us. Readings of life that we failed to understand. Arguments that didn’t even know how to find a place in our understanding.&lt;/p>
&lt;p>Comprehensive understanding of reading our lives daily: that will be the majority of our deepest and most sincere unanswered questions.&lt;/p>
&lt;hr />
&lt;h2 id="eternal-return">Eternal Return&lt;/h2>
&lt;p>We will refer to an eternal return only if the sincere pursuit of our improvement is being carried out. We will make mistakes again and surely fail in many of our attempts, but in the end, we will return to our path, where our profound personal improvement will be the goal.&lt;/p>
&lt;p>Realizing this return not by reading it but by living it. Experience will be our most outstanding teacher if we let it teach us. Open doors will be offered to us, or maybe we have opened them ourselves, but with the real importance of our word, it will be up to us to decide and act accordingly; we refer to the duty of whether to enter them or not.&lt;/p>
&lt;p>Returning not to another possible life—uncertain as it may be—but in this one. Feeling overwhelmed to warn ourselves, another day, of our long-awaited desire, flooding us again without prior notice.&lt;/p>
&lt;p>As paradoxical as answers, we might find the meaning of what we genuinely want to discover. And possibly, part of our journey lies there: in the attempt to maintain our course with more or less clarity depending on the occasions we encounter, but above all, on how we face them.&lt;/p>
&lt;p>Stages that close. Beginnings that end. Endings that approach. We, as eternal temporaries.&lt;/p>
&lt;hr />
&lt;h2 id="disposition">Disposition&lt;/h2>
&lt;p>Thinking that we cannot or are incapable of more is simply a fallacy. What we understand as our actual capacity, or rather what we believe we know, is a mere and abstract perception of what we estimate. Estimating will be nothing but considering what is necessary to reach a settled goal.&lt;/p>
&lt;p>The proximity of our perception to what we expect from the reality around us will be directly proportional to our predisposition and our preparation for it.&lt;/p>
&lt;p>The simple denial of our possible predisposition to what we want to achieve will imply, without the need for words or other arguments, a disconcerting brake. A brake guilty of our lack of breath, whose mysteries will grow as the days pass, using our doubts to step stronger and stronger.&lt;/p>
&lt;p>The question of the question. Let’s prepare our disposition towards and for ourselves. Improve our skills without stopping to educate ourselves, but above all, never stop wanting to improve.&lt;/p>
&lt;p>It is time to pay more attention to ourselves, especially when we need it most. Who said there was a hurry in this game where the will does not necessarily always have to go along with our final decisions? This is what we mean when we talk about perseverance in our training: we will never know with certainty if this will be, fortunately, or unfortunately, the last day of our lives.&lt;/p>
&lt;p>As valuable and unique as we have wanted to work on them. As invaluable and extraordinary as we have wanted to consider them. As brave and accurate as we have tried to shape them throughout this journey.&lt;/p>
&lt;hr />
&lt;h2 id="while-time-passes">While Time Passes&lt;/h2>
&lt;p>As the years go by, our existence is forced to wither. The longevity of our life will be as limited as it could unexpectedly be surprised at so many accidental points.&lt;/p>
&lt;p>Over time, everything happens except time itself, which, with cold blood, seems to remain static and, simultaneously, the center and root of any topic.&lt;/p>
&lt;p>Maybe we are only returning again and again to that moment so longed for by us. What is casual in this life? If not, what could escape our time?&lt;/p>
&lt;p>As time passes, nothing can stop; everything is conditioned by it. Everyone, without exception, is concerned. Time does not exist, but we do, and we cannot control it.&lt;/p>
&lt;p>With its transition, it is the only one that does not elapse. Every second, every moment… it is not it that happens, but us.&lt;/p>
&lt;p>We are not referring to what is nothing more than an invention that helps us count, measure, and calculate in the end. We talk about those moments that pass not only when we look up but also when we lower or turn our glance. The time that passes when we think we are letting time pass, what we are letting pass is not time but ourselves.&lt;/p>
&lt;hr />
&lt;h2 id="some">Some&lt;/h2>
&lt;p>We will not realize what is truly important to us until we feel desperately that sensation that empirically demonstrates, from its maximum complexity to its timid simplicity, the fruits of the path we are pursuing.&lt;/p>
&lt;p>Some will never be ready, not because they cannot, but because they will not want to be more than what they could believe within their already conditioned comfort.&lt;/p>
&lt;p>Because it is not about what we are now but where we are being directed at this precise moment by our attitude and will and how we pay attention to them within the limits of our possibilities. Because beyond the mere fact of the decisions we may make, we will have to assume their risks and act accordingly: that will be the main difference between some and others.&lt;/p>
&lt;p>Not everyone will dare to be part of it. Not everyone will want to be, as not everyone will be willing to pay a price that could exceed us. Nothing could be further from the truth because what will indeed overwhelm us is, for the most part, the neglect of our deep and sincere listening to what we desire.&lt;/p>
&lt;p>Fear of responsibilities, excess freedom, enriching experience, and well-spent time. The fear of ceasing to be what barely required effort to maintain due to its constantly changing evolution that every day requires time and attention. The Superman will not be possible overnight.&lt;/p>
&lt;hr />
&lt;h2 id="the-most-difficult">The Most Difficult&lt;/h2>
&lt;p>The most challenging aspect of life is understanding the coexistence that exists and will exist with ourselves. I learned that not every day will be perfect in our eyes, and there will be even more than one where we feel genuinely overwhelmed, even by ourselves.&lt;/p>
&lt;p>The day will come when we realize how wrong we can be; in that realization, we are fortunate in our learning, especially when it concerns ourselves. We will become who we want to be if we are honest with ourselves.&lt;/p>
&lt;p>Living in a lie or a simply unconscious reality will subtract from us the life that belongs to us and everything we could experience. We can assert, therefore, without any fear, that the truth lies in sincerity towards ourselves.&lt;/p>
&lt;p>The most challenging thing in this life is to learn from and for ourselves. There will not necessarily be two identical days, but each one will be different in the degree to which we choose to invest and move forward. Undoubtedly, the most difficult will be to achieve an understanding of variety in every sense.&lt;/p>
&lt;p>The most challenging part will be to renounce conformity, especially when everything seems to be heading in the direction we expected. We must take each step carefully because the most difficult will come then: surprises from life that we will have to face with no possibility of evasion.&lt;/p>
&lt;p>The most difficult will be recognizing that perspectives can change our perceptions of an apparent same and unique reality.&lt;/p></content></entry><entry xml:lang="en"><title>Chapter 16: June 2016</title><published>2016-06-01T00:00:00+00:00</published><updated>2016-06-01T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/books/oeur/2016-junio/"/><id>https://chemaclass.com/books/oeur/2016-junio/</id><content type="html">&lt;p>&lt;img src="/images/books/oeur/16.jpg" alt="book-chapter" />&lt;/p>
&lt;h2 id="what-if">What if…?&lt;/h2>
&lt;p>What if we stopped referring to ourselves in the third person and looked at ourselves with different eyes? What if we tried calling ourselves by another name? What if we stopped worrying or thinking about setting aside our rational thoughts for a day?&lt;/p>
&lt;p>Who could assure us that our objective feeling exists and is not just a variation of our unconscious belief in what is impartial? What if we called everything by its name? What names would exist? And more importantly, what name would we have?&lt;/p>
&lt;p>What if we learned not to let go of the reins of our lives? How could they slip away without us realizing it overnight? What if everything didn’t have to be necessarily so challenging or complex, especially in some situations where everything seems disproportionately arranged?&lt;/p>
&lt;p>What if we threw in the towel, saying ‘enough’ to everything? What if we decided to end it all once and for all? What could worry us so much to the point of leading us to such an irrational but necessarily human thought?&lt;/p>
&lt;p>What if we didn’t feel with a force that could even provide pain? A force is born from the same feeling of joy or sadness because if we were not passionate beings and rational, what would we be then?&lt;/p>
&lt;p>What if our time was not directly linked to our understanding of it? Wouldn’t this be chaos? What if everything wasn’t as we might believe it to be from its complexity tied to apparent confusion with no way out?&lt;/p>
&lt;p>What if everything were simpler? What if we were wrong? What if everything turned out well, returning to normalcy and its deserved tranquility?&lt;/p>
&lt;p>The abundance of disorder in harmony with its idea of normality and desire is astonishing. ‘What if…?’ We might ask ourselves.&lt;/p>
&lt;hr />
&lt;h2 id="who-will-remember-us">Who will remember us?&lt;/h2>
&lt;p>Who will remind us of how much we’re worth when we forget? When harsh reality shows its face, we are scandalized to see ourselves completely naked in our consumed sensation born out of our ignorance.&lt;/p>
&lt;p>Who will remind us how much we’re worth and how wrong we can be? Especially when our thoughts or value judgments might be about us, lacking consensus and not at all constructive.&lt;/p>
&lt;p>Who could remind us, if not you, of the legacy of our interest? Even if it may not be widely shared, we are sure there is much more in common than we could initially see with our own eyes.&lt;/p>
&lt;p>Who but you could remind us of who we are!? Extend a helping hand and help us get up when we stumble. And I’m not talking about us, but about you, who has a name and a surname. You, who are reading this. You, who knows who you are, even though sometimes, like us, you might forget. You, who, in your doubts and uncertainties, wanted to hide, as was typical.&lt;/p>
&lt;p>As if anyone had done it, and we didn’t care. But not you. You do matter to us. And that’s why we write with you in mind. We know we’ll rely on each other, so they won’t be alone when we face challenges. Together, we can navigate through tough times, making the journey as bright as possible despite the occasional darkness.&lt;/p>
&lt;p>Not you. You are here to remind us how much we’re worth, just as we will be here to remind you how much you will be worth.&lt;/p>
&lt;hr />
&lt;h2 id="a-matter-of-time">A matter of time&lt;/h2>
&lt;p>Growing up is not just a matter of time; it’s about learning from mistakes. Observing life pass by without motivation is a significant error, yet it’s an unavoidable symptom.&lt;/p>
&lt;p>Things don’t happen simply because they were destined to; it’s nonsensical to believe in a predetermined destiny, especially when we could attribute events to convenience.&lt;/p>
&lt;p>The idea that everything is preordained or written, even in the most absurd or random ways, is unfounded. Pretending that time has a life of its own is a self-deception. Time doesn’t exist independently; it’s a construct of our perception.&lt;/p>
&lt;p>Growing up in a questionable environment, we may have been influenced by arbitrary choices and exposed to controversial places without even realizing it.&lt;/p>
&lt;p>Our perception of truth is essentially what our subconscious uses to grasp our apparent reality. Time, another tool we’ve created, helps us make sense of our journey and circumstances. After all, who else but us can thoroughly analyze the aspects directly tied to our senses?&lt;/p>
&lt;p>The wilting of flowers isn’t about time passing but the absence of support in the face of life’s challenges, leaving us all equally confined with no recourse. What does time matter when our time has run out?&lt;/p>
&lt;p>Growing up isn’t just a matter of time; it’s about experiencing and learning from suffering without prior warning. It involves thriving in our concept of good and evil, progressing within our limits, and developing into what we desire or could have desired.&lt;/p>
&lt;p>Treating our understanding with sincere perseverance is never a matter of time; it’s a constant effort.&lt;/p>
&lt;hr />
&lt;h2 id="starting-at-23">Starting at 23&lt;/h2>
&lt;p>Let’s take a moment to look back, but not too much. Just over two years ago, we began our professional journey, dreaming about what we have achieved with great effort. We started in our hometown and turned the place where we went into our own.&lt;/p>
&lt;p>An exemplary effort with a smile that bloomed every day from the most absolute sincerity. Where we became aware that we had the opportunity within our reach. Starting from the bottom to gradually climb the mountain of what was to come, what we could distinguish as our learning.&lt;/p>
&lt;p>So many diverse thoughts have passed through our minds, so much time in such a short space… that if we had to emphasize one in particular, we would have it clear right now: the stress we may experience at times, the result of the overwhelming feeling of not being able to handle everything that might come our way. Perhaps because it is the last sensation suffered with greater intensity. When putting everything on the line, half-measures will only leave arbitrary stains that we must deal with regardless of our possible dissatisfaction. Let’s hope we learn to overcome all this more easily, a product of an unconscious world where concerns sometimes seem to limit us and not let us see possible solutions.&lt;/p>
&lt;p>It is worth noting how much we have learned about everything in general, but especially about ourselves. Those moments undoubtedly help us to converse with ourselves, more or less restless depending on the day and time. There have been so many unwritten dialogues that only our unconscious will remind them when necessary.&lt;/p>
&lt;p>We will start at 23 as we never dreamed of in our childhood, but as we have been striving for these brief but intense years.“&lt;/p></content></entry><entry xml:lang="en"><title>Chapter 15: May 2016</title><published>2016-05-01T00:00:00+00:00</published><updated>2016-05-01T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/books/oeur/2016-mayo/"/><id>https://chemaclass.com/books/oeur/2016-mayo/</id><content type="html">&lt;p>&lt;img src="/images/books/oeur/15.jpg" alt="book-chapter" />&lt;/p>
&lt;h2 id="in-the-end">In the end&lt;/h2>
&lt;p>One step away from everything and one step away from absolute nothingness. Unlike everyone and no one. Where the true reason for being hides behind the vain intentions of perishable purposes that fade over time. In the end, only the memory of what truly interested us will remain.&lt;/p>
&lt;p>We tend to mix so many different concepts that we end up combining them all, making it something admirable if we could differentiate and classify what we mix. We are talking about our value judgments; there is often so much distance between our personal understanding and the real objectivity that each situation might deserve…&lt;/p>
&lt;p>We should learn to discern, at least as much as possible and always make an effort, what truly arises from our feelings and what arises from our reason argued empirically. For we are so human… letting ourselves be carried away by the same emotions betrays us time and time again. And we are so human… that our pride will blind us again and again without necessarily warning us first.&lt;/p>
&lt;p>We will all end up being right about so many things and not so much about others, none even. We would be scared if we became aware that such statements coexist in the same shared space. In the end, only we will remain, and no one will be right because everyone will have been. That’s why the important thing here shouldn’t be about a “And in the end?”&lt;/p>
&lt;p>As if they were necessary contradictions, with which this life is filled. Tonight we write without the intention of inventing anything new. We’ll discover only as much about ourselves as if we were strangers, tuning in to listen and read carefully to what truly matters to us, finding clarity in it, and getting ready for any potential outcome.&lt;/p>
&lt;hr />
&lt;h2 id="having-lost">Having lost&lt;/h2>
&lt;p>Feeling that we have lost some part of that essence that made us, in that sincere way, feel. Noticing that the same notes sound different than they did not so long ago in an altruistic way.&lt;/p>
&lt;p>Furrowing the brow in doubt about oneself. Realizing a slight psychological confusion in our foundations, which were once fundamental pillars, will cause us fear and apprehension accordingly.&lt;/p>
&lt;p>Finding and solving problems was our greatest reward, for now, like those cowards we used to criticize so much, we see ourselves reflected: scared in our confusion. Problems need to be solved, not just with patches that simulate their correction or hide the root of those discomforts.&lt;/p>
&lt;p>How far do we still have to go? How great can the abyss in which this life, with its disparate emotions, become? How little can we know about knowledge itself in our attempt?&lt;/p>
&lt;p>Perhaps it has been an unnecessary concern. Perhaps it has been in small accumulated doses like a snowball that grows as it rolls down the hill.&lt;/p>
&lt;p>Conformity, lack of motivation, the absence of a smile without reason. The excessive absence of unselfish affection. Fear is not the culprit of anything, but the symptom of motivation’s lack in the face of the reality we have to confront day after day.&lt;/p>
&lt;p>Perhaps it has been nothing. Perhaps we still have so much to fight for without fear, to achieve what we truly desire. For what could we long for more than to have that motivation to reach those altruistically predisposed dreams?&lt;/p>
&lt;p>Perhaps there is less simply from this daily reflection that has lately tormented us, a reflection that some days seems to have lost control.&lt;/p>
&lt;p>What is it to have lost something, after all?&lt;/p>
&lt;hr />
&lt;h2 id="are-we-really">Are we really?&lt;/h2>
&lt;p>What are we really? What could we consider as our true selves? What is that identity that could differentiate us from the rest? Are we the same person in essence as we were some years ago? What if we change the time of the previous question?&lt;/p>
&lt;p>Are we different people every day? What is it that identifies us as individual beings to the rest? What is it that distinguishes us from our surroundings and by which it recognizes us? What is that essence that sets us apart in this paradox full of random questions and apparently dictated laws from the most absolute senselessness?&lt;/p>
&lt;p>What will identify us, that will truly make us, that will represent us to the outside world? That which defines and characterizes us but, above all, individualizes us and sets us apart from the rest of the vast ensemble: it is our past directly linked to what we have learned from it.&lt;/p>
&lt;p>The importance of our experience and perspective, of our projection and confidence, of the investment we wanted to make of our time.&lt;/p>
&lt;p>The difference between wanting to be and truly being is not as vast as it might seem or as some wanted to paint us. The same is found in the projection of success.&lt;/p>
&lt;p>Our past is our purest self: when we die, there will be no more identity of ours than the one we wanted to reflect.&lt;/p>
&lt;p>Therefore, our present representation will be the result of our past understanding linked to our unbreakable and true understanding that will not stop testing us again and again until our breath rests without permission and without return.&lt;/p>
&lt;hr />
&lt;h2 id="the-history">The history&lt;/h2>
&lt;p>History is the open book of our lives, recorded for remembrance and learning that only a few dare to read. Destined to repeat the same situations, the same mistakes that others may have already made, it seems that committing them was in our nature.&lt;/p>
&lt;p>What mistakes are more than purposes that make us feel wrong in the end, conveying that unmistakable disinterested anguish? Anger… towards those fools who did not know or did not want to read the signs in time to learn when to hit the brakes.&lt;/p>
&lt;p>Like a book complete with mistakes and successes where the battle between them seems balanced no matter how many days pass. As if there were no tendency towards the existence of an ending with a clear winner. It is as if our disposition leaned towards repetition to the absurd because sometimes it’s not that we are blind, but that we do not want to appreciate. And that’s when the value of history scares because there is no blinder than the one who does not want to see.&lt;/p>
&lt;p>We could keep writing about this, but we are tired, furious, and perhaps even disgusted to think that there might be people who don’t want to think.&lt;/p>
&lt;p>Let’s reflect then on our history, especially the one we already lived, projecting it onto what we want for our future.&lt;/p>
&lt;hr />
&lt;h2 id="numbers">Numbers&lt;/h2>
&lt;p>Forty-nine, as the number representing this day: May 25.&lt;/p>
&lt;p>Thirty-seven, as the ephemeral memory, inconsolable by excellence.&lt;/p>
&lt;p>Eleven, like the one who, without seeking it, addresses himself in the third person today.&lt;/p>
&lt;p>Nine, like those who remained and were forced, with no other options, to learn however they could from that situation, unexpected for everyone.&lt;/p>
&lt;p>2004 was the most human and heartless year.&lt;/p>
&lt;p>Zero, like opportunities for possible farewells after his departure. I don’t even remember how the day before looked, but his curly hair and her kind smile… And only reaching in our memory his reflection behind the door frame in the dark hours of the night, with no time even to say goodbye. Because no one could have guessed what was about to happen a few weeks after his departure, his impossible involuntary return.&lt;/p>
&lt;p>Hundreds of nights have passed since then, and we can hardly find moments of intimacy in these letters that we both know you will never be able to read. We won’t get to know each other, but I am sure we could recognize each other… and let’s be clear that there will never be a greater desire than a smile from you back towards our gaze as you search for us.&lt;/p>
&lt;p>I don’t remember when I last said “mom,” and I think that’s something my first person will never forget.&lt;/p>
&lt;p>It’s pretty challenging and complex. It was the most expensive price we could ever experience. It is one of the most painful experiences we could have, and undoubtedly, all, without exception, will end up having sooner or later. And we will understand, perhaps with different eyes, the one who writes about himself in the third person today.&lt;/p>
&lt;hr />
&lt;h2 id="trying-to-understand-ourselves">Trying to understand ourselves&lt;/h2>
&lt;p>This final stretch is just a few days away from the internal time change, with boiling tea as a supplement to those sad thoughts that could unintentionally invade our minds at these hours.&lt;/p>
&lt;p>And we realize the lack of genuine interest we sometimes desperately need. Because what seemed evident in its normality not so long ago took a bit more effort to practice today. We are changeable for better or for worse.&lt;/p>
&lt;p>The theory could never be easier than being written in itself. However, putting any theory into practice requires greater effort than its simple understanding: it means making that theory a reality, for there is no greater theoretical truth than the one that can be demonstrated.&lt;/p>
&lt;p>With boiling tea, we realize we are in the final stretch, just a few weeks away from who knows what. And by this, we are not referring to living carelessly, but quite the opposite, to living in love until we consume ourselves in it! We are in love with what we do, with what we feel, with what we truly desire, and with ourselves. Beyond mere vain ideas or unknown concepts, let’s get to know each other in-depth! Let’s feel as we genuinely want to feel! Let’s wake up with those devouring eagerness to sweep through the day that we dreamed so much about! What the hell are we waiting for?&lt;/p>
&lt;p>We did it once, evidence enough to realize that it is possible, that the word “impossible” is mistaken when it could refer to us.&lt;/p>
&lt;p>We are nothing but possibilities, still waiting to be awakened without fear, eager to see the rising sun until we lay down in our well-deserved rest. Accompanied, at least, by our idea and global vision of the conquered day, and conquered it will be, for we will be the ones who have won. We should, therefore, perceive the days as achieved and not as past or lost.&lt;/p>
&lt;p>Contemplate and learn to discern what we would like to change. What is it that we would really like to improve? What is it that we would honestly want for ourselves? Let’s dream about these questions. Whether they remain in a theoretical or practical dream will solely be a matter of our reward.&lt;/p></content></entry><entry xml:lang="en"><title>Clean Code</title><subtitle>A Handbook of Agile Software Craftsmanship</subtitle><category term="clean-code" scheme="https://chemaclass.com/tags/clean-code/" label="Clean Code"/><category term="software-design" scheme="https://chemaclass.com/tags/software-design/" label="Software Design"/><category term="testing" scheme="https://chemaclass.com/tags/testing/" label="Testing"/><category term="tdd" scheme="https://chemaclass.com/tags/tdd/" label="Tdd"/><category term="refactoring" scheme="https://chemaclass.com/tags/refactoring/" label="Refactoring"/><published>2016-05-01T00:00:00+00:00</published><updated>2016-05-01T00:00:00+00:00</updated><author><name>
Robert C. Martin</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/clean-code/"/><id>https://chemaclass.com/readings/clean-code/</id><summary type="html">Even bad code can function. But if code isn't clean, it can bring a development organization to its knees. Every year, countless hours and significant resources are lost because of poorly written code. But it doesn't have to be that way.</summary><content type="html">&lt;p>Even bad code can function. But if code isn’t clean, it can bring a development organization to its knees. Every year,
countless hours and significant resources are lost because of poorly written code. But it doesn’t have to be that way.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;hr />
&lt;h2 id="summary">Summary&lt;/h2>
&lt;h3 id="chapter-1-what-is-clean-code">Chapter 1: What Is Clean Code?&lt;/h3>
&lt;ul>
&lt;li>The code can be measured with either “good” or “bad” in the code review or by how many minutes it takes you to talk
about it.&lt;/li>
&lt;li>A clean code should be elegant, efficient, readable, simple, without duplications, and well-written.&lt;/li>
&lt;li>You should add value to the business with your code.&lt;/li>
&lt;li>Clean code offers quality and understanding when we open the source file.&lt;/li>
&lt;li>It is necessary that your code is clean and readable for anyone to find and easily understand. Avoid wasting others’
time.&lt;/li>
&lt;/ul>
&lt;h3 id="chapter-2-meaningful-names">Chapter 2: Meaningful Names&lt;/h3>
&lt;ul>
&lt;li>Names of the classes, variables, and methods must be meaningful and clearly indicate what a method does or what an
attribute is.&lt;/li>
&lt;li>Create pronounceable names to facilitate communication.&lt;/li>
&lt;li>Avoid acronyms and avoid confusing names, which may bring anyone who reads the code to the wrong conclusions.&lt;/li>
&lt;li>Use names that reflect the system domain, the context, and the problems that must be solved.&lt;/li>
&lt;/ul>
&lt;h3 id="chapter-3-functions">Chapter 3: Functions&lt;/h3>
&lt;ul>
&lt;li>Methods should be easy to read and understand.&lt;/li>
&lt;li>Methods should convey its intention.&lt;/li>
&lt;li>Methods should be small.&lt;/li>
&lt;li>They must have up to 20 lines.&lt;/li>
&lt;li>Methods should only do one thing.&lt;/li>
&lt;li>You should use names with words that say what it really does.&lt;/li>
&lt;li>The optimal number of parameters of a method is zero, after one and two.&lt;/li>
&lt;li>Three should be avoided, but if you think it should be used, have a justification.&lt;/li>
&lt;li>&lt;code>Boolean&lt;/code> type as a parameter already states that it does more than one thing.&lt;/li>
&lt;li>Avoid duplication.&lt;/li>
&lt;/ul>
&lt;h3 id="chapter-4-comments">Chapter 4: Comments&lt;/h3>
&lt;ul>
&lt;li>One of the common reasons for comments is because the code is bad.&lt;/li>
&lt;li>If you’re thinking about writing a comment, then the code should be refactored.&lt;/li>
&lt;li>Comments do not save a bad code.&lt;/li>
&lt;li>Try to explain what the code causes happening.&lt;/li>
&lt;li>Comments can be useful when placed in certain places.&lt;/li>
&lt;li>Don’t explain your code with comments. Use informative vars/method names.&lt;/li>
&lt;li>Comments can be used to express the importance of certain points.&lt;/li>
&lt;li>Do not write comments with redundant, useless, or false information.&lt;/li>
&lt;li>They shouldn’t be used to indicate who changed or why, use versioning.&lt;/li>
&lt;li>Don’t comment code that will not be used. Remove it instead.&lt;/li>
&lt;/ul>
&lt;h3 id="chapter-5-formatting">Chapter 5: Formatting&lt;/h3>
&lt;ul>
&lt;li>Formatting should indicate things of importance since it is a developer of communication form.&lt;/li>
&lt;li>A messy code is hard to read.&lt;/li>
&lt;li>The readability of the code will take effect on all the changes that will be made.&lt;/li>
&lt;li>Smaller classes are easier to understand.&lt;/li>
&lt;li>Set a limit of characters per line of code. For example 120.&lt;/li>
&lt;li>Try to keep more next related concepts vertically to create a code stream.&lt;/li>
&lt;li>Use spaces between operators, parameters, and commas.&lt;/li>
&lt;/ul>
&lt;h3 id="chapter-6-objects-and-data-structure">Chapter 6: Objects and Data Structure&lt;/h3>
&lt;ul>
&lt;li>Follow the &lt;a rel="external" href="https://en.wikipedia.org/wiki/Law_of_Demeter">Law of Demeter&lt;/a>:
&lt;ul>
&lt;li>Each unit should have only limited knowledge about other units: only units “closely” related to the current unit.&lt;/li>
&lt;li>Each unit should only talk to its friends; don’t talk to strangers.&lt;/li>
&lt;li>Only talk to your immediate friends.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Do not make dumb objects.&lt;/li>
&lt;li>Objects hide the data abstraction and expose methods that operate the data.&lt;/li>
&lt;li>Data structures expose your data and do not have significant methods.&lt;/li>
&lt;/ul>
&lt;h3 id="chapter-7-error-handling">Chapter 7: Error Handling&lt;/h3>
&lt;ul>
&lt;li>Error handling should be planned carefully by all programmers.&lt;/li>
&lt;li>When wrong things occur, we have to get it to do the right things.&lt;/li>
&lt;li>Give preference to launching an exception than treating it just to hide.&lt;/li>
&lt;li>Create messages with information about the error.&lt;/li>
&lt;li>Mention that it failed. Where was this failure? If possible, mention why it failed.&lt;/li>
&lt;li>Look at separate business rules for errors and error handling.&lt;/li>
&lt;li>Avoid returning a &lt;code>NULL&lt;/code> in methods, preferably to return an empty object.&lt;/li>
&lt;li>Avoid passing &lt;code>NULL&lt;/code> to the methods; this can generate &lt;code>NullPointerExceptions&lt;/code>.&lt;/li>
&lt;/ul>
&lt;h3 id="chapter-8-boundary">Chapter 8: Boundary&lt;/h3>
&lt;ul>
&lt;li>In third-party code, to avoid passing objects, APIs look forward in order to keep things in the same class.&lt;/li>
&lt;li>Perform tests on the API’s third party.&lt;/li>
&lt;li>Study the documentation and test the third API before you start using it.&lt;/li>
&lt;li>Check well the features you will use.&lt;/li>
&lt;/ul>
&lt;h3 id="chapter-9-unit-tests">Chapter 9: Unit Tests&lt;/h3>
&lt;ul>
&lt;li>Make sure each piece of code is doing what you expect it to do.&lt;/li>
&lt;li>Follow the &lt;a rel="external" href="https://en.wikipedia.org/wiki/Test-driven_development">TDDs law&lt;/a>:
&lt;ul>
&lt;li>Don’t create code before you have a failing test.&lt;/li>
&lt;li>Don’t create more tests than necessary to fail.&lt;/li>
&lt;li>You cannot write more code than enough to pass the test that is failing.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Keep your test clean.&lt;/li>
&lt;li>The tests must undergo changes in the same way that the code.&lt;/li>
&lt;li>The dirtier the code, the more difficult test will be to maintain.&lt;/li>
&lt;li>Use the F.I.R.S.T rule for testing:
&lt;ul>
&lt;li>The test is fast-running.&lt;/li>
&lt;li>The tests are independent of others.&lt;/li>
&lt;li>The test is repeatable in various environments.&lt;/li>
&lt;li>The test is self-validating.&lt;/li>
&lt;li>The test is timely.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>The test is as important as the production code.&lt;/li>
&lt;/ul>
&lt;h3 id="chapter-10-classes">Chapter 10: Classes&lt;/h3>
&lt;ul>
&lt;li>By default, classes should start with the variables:
&lt;ul>
&lt;li>Static and constants public.&lt;/li>
&lt;li>Static and variable private.&lt;/li>
&lt;li>Instances and variables privates.&lt;/li>
&lt;li>Soon after comes the functions.&lt;/li>
&lt;li>The class name should represent its responsibility.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>The class must have only &lt;a rel="external" href="https://en.wikipedia.org/wiki/Single-responsibility_principle">one responsibility&lt;/a>: one reason to change.&lt;/li>
&lt;li>You should try to make a brief description of the class.&lt;/li>
&lt;li>The methods should be small and one responsibility.&lt;/li>
&lt;/ul>
&lt;hr />
&lt;p>This interview is based on Uncle Bob’s book “Clean Code”. They cover some existing guides that can help you become a
better programmer and explore how books and current trends are shaping the software landscape.&lt;/p>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/QnmRpHFoYLk"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry><entry xml:lang="en"><title>Chapter 14: April 2016</title><published>2016-04-01T00:00:00+00:00</published><updated>2016-04-01T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/books/oeur/2016-abril/"/><id>https://chemaclass.com/books/oeur/2016-abril/</id><content type="html">&lt;p>&lt;img src="/images/books/oeur/14.jpg" alt="book-chapter" />&lt;/p>
&lt;h2 id="to-appear-or-to-be">To Appear or to Be&lt;/h2>
&lt;p>We can appear as many things and act in so many possible ways… to the point, perhaps, of clouding the true self. What is this self really if not the sea of its continuous appearances? We can appear at all times, but could we truly be what we appear to be?&lt;/p>
&lt;p>The problem of identity arises when our appearance confronts our sense of being. That’s when our main inner conflict arises. Are we more than constantly evolving appearances where adaptation is linked to survival? What are we really if not the simple feeling that distinguishes us from our surroundings, referring to other beings?&lt;/p>
&lt;p>Do we have a greater right to consider ourselves special or something more than simple living beings? Who can assure us every morning when we wake up that we are not just a product of some experiment, where in reality and memory, we have nothing more than some pre-programmed memory ready to observe our behavior?&lt;/p>
&lt;p>Sometimes we will doubt even who we are, what we are seeking, or simply what we hope to find. Could doubt themselves be their own answers?&lt;/p>
&lt;hr />
&lt;h2 id="so-many">So Many&lt;/h2>
&lt;p>There are so many things to do and so many wishes to fulfill. So many sighs still waiting for their moment as we take turns with our restlessness, letting it guide us to the paths we will eventually shape.&lt;/p>
&lt;p>So much haste, so much unused joy, so many undeserved tears, and other forgotten stories.&lt;/p>
&lt;p>Our perception of reality is so different and so dependent on ourselves that we couldn’t even be aware of the countless varieties and their different qualities so distinct from each other.&lt;/p>
&lt;p>A scorching sensation that confuses us when we let our guard down. An alarming emotion that accompanies us in its unveiled conformity. Intuition that leaves no trace of its passage. Longed-for relief, as well as missed, in complicated times.&lt;/p>
&lt;p>So many goals, so much future, so many stories… that we might even end up forgetting where we come from and where we are going. Feeling the desire for a pause. Feel the confusion of not knowing what we need to know now, lost in these moments of entangled reality.&lt;/p>
&lt;p>There is still so much to tell and to live, so much to know and to desire, so much… that we hope everything will turn out well when the time comes.&lt;/p>
&lt;hr />
&lt;h2 id="constants">Constants&lt;/h2>
&lt;p>We are a silent constant of ideas. Constantly dependent, to a greater extent, on what we do not desire but have somehow suffered. Not desiring is not the same as not having desired, just as not wanting to have suffered does not imply not having done so.&lt;/p>
&lt;p>Time is undoubtedly the greatest unknown in its truth: extreme relativism, the change of stages… Finding ourselves to lose ourselves moments later. Having ourselves and fearing what we might miss again.&lt;/p>
&lt;p>Feeling how the whole and its preference tend toward the purest and most arbitrary abstraction. Experiencing how our thoughts are nothing more than immature fruits and that, come the day, any unexpected storm could tear them away without any remorse.&lt;/p>
&lt;p>Remembering that stage where hope directed and guided us like a mother concerned for her children, but what do we really know about this after all?&lt;/p>
&lt;p>Remembering nothing more than the longed-for illusion, perhaps its mere nostalgia, perhaps years and years naked like the time that did nothing but accompany us without real intentions. Jet-black purposes rest on the purest longing for sincerity towards and with ourselves. For us, eternal constants are destined for continuous transformation alongside our change.&lt;/p>
&lt;hr />
&lt;h2 id="let-s-talk-again">Let’s Talk Again&lt;/h2>
&lt;p>Realizing what prevented us from feeling beyond suffering, in the continuous doubt of not knowing which direction to take. Faltering again and again until possible fatigue is long forgotten. I sincerely wish to end this uncomfortable feeling of anonymous confusion.&lt;/p>
&lt;p>Caressing the farewell, unable to foresee the chaos and its impending disturbance towards our person. Foolish helplessness.&lt;/p>
&lt;p>Teaching ourselves over and over again, so many times even the same things. Stumbling and falling with and without shame, as if we were searching for our own limits that we once thought were nonexistent; oh, how wrong we were.&lt;/p>
&lt;p>There are so many things certain and so many not so clear… But what I think we learned was to discern, at least, what truly overwhelmed us: the loss of control over the situation, not knowing what to do or how to react after faltering in all our failed attempts to achieve what was entrusted to us.&lt;/p>
&lt;p>The simple idea of doubt about our doubts will be decisive if we let it sprout. Could everything return to what it once was? It will, of course, it will. Let’s be again.&lt;/p>
&lt;hr />
&lt;h2 id="it-s-time-to">It’s Time to&lt;/h2>
&lt;p>It’s time to say “goodbye” to so many things. Feel like nomads in our lives searching for that feeling of fulfillment where the senses desire beyond themselves and feel part of the whole with their fellow beings.&lt;/p>
&lt;p>It’s time to start saying “goodbye” to so many things. In our overcoming, we grew and did not want and do not want to allow that loss of control that could make us lose our heads, finding ourselves in continuous dissatisfaction for more time than we could desire.&lt;/p>
&lt;p>It’s time to be aware that we should start saying “goodbye” to many things. Not in vain; everything learned will remain, as it will be written from now until the day we decide and grow by choosing to be.&lt;/p>
&lt;p>It’s time to decide on changes for and with ourselves, with the purpose of their creation being the reason for it. Feeling unable to endure so much makes us ultimately capable of tolerating to a greater extent, but that was not our original intention. The feeling towards the external should not be greater than the internal, as our trace and appearance will depend, directly conditioned, on our most intimate self.&lt;/p>
&lt;p>The time will come when the decisions made will carry such a high degree of importance, possibly even changing the course of what we established in the past months for the coming ones. And there is still so much for us to be wrong about and to change…&lt;/p>
&lt;p>It is indeed true, as it should already be well known, that in the pure abstraction of errors, as well as successes, decisions we make are in common to the best of our abilities. There will be no better attitude than what we see with our eyes.&lt;/p>
&lt;p>We shouldn’t do many things and do many others that we should. It is time to decide what responsibilities we want to be accountable for and at what cost, but above all, what level and what goals we can achieve.&lt;/p>
&lt;p>It’s time to welcome so many others and to become aware of the changes at these levels that could initially exceed any youthful perspective.&lt;/p>
&lt;hr />
&lt;h2 id="what-could-it-be">What Could It Be?&lt;/h2>
&lt;p>What could it be that hasn’t yet occurred? Letting ourselves be carried away by emotions, allowing ourselves to act without greater intentions… Experiencing that tingling sensation, those eager butterflies seeking protagonism. Eight months have passed since we last saw each other in person. That’s the reality of living abroad.&lt;/p>
&lt;p>Tomorrow we will wake up again in Berlin, but we will sleep in our warm homeland where we were born. Where the family awaits what will be the long-awaited moment of a new shared reunion after so much time.&lt;/p>
&lt;p>What could it be that hasn’t yet occurred? After truly experiencing everything, I would even dare to say “reborn,” having been in any manner. I wouldn’t want to think too much at these moments but rather release the words that come to mind moments before falling asleep before this brief return journey. And I feel the urgent need to write just a few hours before departing on this flight. It will be a week loaded with so many emotions that I hope nerves don’t betray us and that we can channel them gradually.&lt;/p>
&lt;p>Knowing myself, and in the little that I still know about myself, I am sure it will be an unforgettable week. One of many weeks that we still have to travel and tell…&lt;/p>
&lt;p>I’m looking forward to seeing my uncles, my father, my cousins, all of them: my family in general. But especially, I’m eager to see and embrace my brothers and sisters, whom I miss so much every day. I just hope that they can understand someday the meaning of all this, that they comprehend this motivation and apply it not only in theory.&lt;/p>
&lt;p>I don’t want to go into more detail today. It’s time to rest because tomorrow will be a great day: the beginning of an unforgettable week.&lt;/p></content></entry><entry xml:lang="en"><title>Chapter 13: March 2016</title><published>2016-03-01T00:00:00+00:00</published><updated>2016-03-01T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/books/oeur/2016-marzo/"/><id>https://chemaclass.com/books/oeur/2016-marzo/</id><content type="html">&lt;p>&lt;img src="/images/books/oeur/13.jpg" alt="book-chapter" />&lt;/p>
&lt;h2 id="it-becomes-more-noticeable">It Becomes More Noticeable&lt;/h2>
&lt;p>The value of our time becomes more noticeable, along with the memory of death, evoking that constant nostalgia, wishing to make its way on this path full of uncertainties and, at times, disheartening.&lt;/p>
&lt;p>The scent becomes more noticeable when the winged souls of the roses are absent. When that essence is missing, allowing us to relive with enthusiasm, that’s precisely when it becomes more noticeable—remembering what? What were we supposed to remember?&lt;/p>
&lt;p>I felt how the training wheels were taken away, like when we learned to ride a bike, the ones that gave us confidence. However, above all, I felt it today with the same reality regarding how the pressure of different situations can be, at times, an honest and unpleasant enigma.&lt;/p>
&lt;p>We soak ourselves in experiences that we didn’t expect to find initially, yet they end up finding us, not knowing how to respond.&lt;/p>
&lt;p>Time drags us without mercy and fear. It obliges us with serenity, becoming more noticeable when it reminds us of who we are, but above all, who it is.&lt;/p>
&lt;p>We are newcomers in this game with no rules beyond the ones we invent or want to conceive. Beyond our sincere understanding, where for reason and truth, we despise those who use different prisms to observe.&lt;/p>
&lt;p>Wanting to exist as an eternal beginner is like water flowing down the stream, destined for the ocean’s vastness and its abandoned forgetfulness. The carelessness linked to the disinterest in everything is our most significant risk. Living with the excuse of the uncertain tomorrow and the same indifference towards ourselves can only end in an infinite void devoid of all possibility and opportunity.&lt;/p>
&lt;p>Slowly withering away, we see the value of our time pass before our eyes.&lt;/p>
&lt;hr />
&lt;h2 id="it-s-when">It’s When&lt;/h2>
&lt;p>It is more challenging to believe it’s possible when the blank canvases are still white when that mature thought feels somewhat withered because of who knows what and how…&lt;/p>
&lt;p>Interweaving of ideas no further than our mere and subjective thoughts, and perhaps, they no longer deserve much more… “Clarity” is the word with which, in its absence, everything darkens.&lt;/p>
&lt;p>Both in a simple and complex way, our ideas can coexist with this practice we understand as life, where the purpose, beyond learning, escapes our knowledge because we couldn’t conceive another idea. Our experience is motor and bold comprehension; the more reflected, the deeper we decide to delve. The cause of the cause and its consequence sometimes prevent us from smiling.&lt;/p>
&lt;p>Movement without return is destined for doubt and the continuity of its absence. Because not everything will be science, and much less some unnecessary belief.&lt;/p>
&lt;p>Time and its relentless non-stop pursuit… No one was born prepared. In diapers, in front of every question that one day we will have to face, it will be then that we realize what we are worth.&lt;/p>
&lt;p>In our sincerity, we should admit that, at the very least, we should be; otherwise, we wouldn’t be fulfilling our purpose because if there’s anything we’re responsible for, it’s being sure of what we would like to have lived.&lt;/p>
&lt;p>We tend to confuse and mix between causes and consequences, where questions pretend to be answered before they are formulated. What, then, is our task if not the one that should already be more than evident?&lt;/p>
&lt;p>And I don’t write for you who hear us but for you who listen to us.&lt;/p>
&lt;hr />
&lt;h2 id="on-the-mountain">On the Mountain&lt;/h2>
&lt;p>Tremor. Fear. Failure. Suffering. Disheartening…&lt;/p>
&lt;p>Fearing failure and its horror, suffering with tremors in our despair for not seeing ourselves capable of achieving more remarkable feats in the coming days.&lt;/p>
&lt;p>Where did we end up? When will be the perfect moment to conclude once and for all? An overdose of meaning’s lack guarantees helplessness in an abyss. A rusty clock is about to make its last turn. Betrayal betrayed… Perhaps forgiven for being ourselves? Who could live without their forgiveness, after all?&lt;/p>
&lt;p>Rocky Mountain, years ago, accompanied by sips of discouragement that sought less confusion in that chaos without a name but with surnames.&lt;/p>
&lt;p>Lurking admission, the ambiguous purpose in a disillusion that turned out to be out of control. Accompanied by deception and loneliness, but above all by our constant lack of belonging to a false reality, especially behind closed doors.&lt;/p>
&lt;p>Pity for the one who was almost… Our treachery to our betrayal saved us from that mountain and its disguised nighttime cold that attacks at night.&lt;/p>
&lt;p>Eyes from back then were cruelly blinded due to the lack of understanding and the pressure in all possible directions. Remembering with each sip at the top of the mountain while the music played and tears were born to succumb a few seconds later, during the wait…&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="plain">&lt;span class="giallo-l">&lt;span>Memories that felt their fading,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>real, and deep sadness without breath.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>Confusion served in every feeling.&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>We could have flown on that mountain, ashamed also by the unnecessary complication we introduced to many third parties. But it’s not shame we feel now, but sadness that it could have been possible and the many probabilities of different endings that, fortunately, more than unfortunately, we never came to know.&lt;/p>
&lt;p>It seems that that mountain had a surprise in store for us. Or, instead, we were the ones who invented that uncontrolled surprise with an entirely different — as well as rewarding — ending from what we, on that misguided day, set out to achieve. Reason enough for joy from that day to now.&lt;/p>
&lt;hr />
&lt;h2 id="savor">Savor&lt;/h2>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="plain">&lt;span class="giallo-l">&lt;span>Savor the sweetness of that moment&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>when we wrote with goosebumps.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>Feel alive, protagonists of this tale;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>it seems like we chose it in its day.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span>Not seeing ourselves as something fully defined,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>feeling how there&amp;#39;s still so much left.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>Dressing alongside the not-so-quiet storm&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>that day and night reproaches us for how much.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span>Let the moon dawn clear,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>with a strange fear of having lived.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>Be born again adventurous,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>stay awake until its oblivion.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span>Abundant joy perseveres, graced,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>sometimes distressed by the wind.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>In its simplicity, along with its gaze,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>she enjoyed and waited in her seat.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span>Tasting the bitterness along with pleasure;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>Let it serve us once as a lesson.&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>Having as our only fear the reality that, at times, we can behave as if there were no simple rules of conduct. Reality where colors, with their grays, lose even all the sense they might have had in their day.&lt;/p>
&lt;p>To those hands that drew and now write with so much pleasure. To those who remind us how it’s possible to express, reflect, and bring mere ideas into reality even before they exist. To those with whom we grew up and who made us grow. To that idea that timidly arose and wanted to train and trained to stop being cowardly. To that whose purpose was, is, and will be in itself.&lt;/p>
&lt;p>To the depth of confusion, the sea and its oceans, and the infinite abyss and inner chaos. Fear? Whom should we fear more than ourselves? We want to speak from another perspective, but at this point, it’s challenging to turn our heads and look the other way, not as others did to us more than once, where we still remember names and surnames.&lt;/p>
&lt;p>Should we perhaps write with some predefined order? Who could expect more from us than ourselves? Here, no one has written anything.&lt;/p>
&lt;p>The taste of lack is undoubtedly the dish par excellence that will teach us so much and leave us so little. A dish where prudence and disorder seem to try the same, disputing among themselves the helm of suspicion.&lt;/p>
&lt;p>Sometimes savoring reasonable moments, appearing like authentic nonsense… but above all, relishing the uncertainty of the lines yet to be written, finding them pleasant and not so sweet. Sensible moments where emotions shoot without fear of who they might hurt, reviving us in our eagerness for resolutions.&lt;/p>
&lt;hr />
&lt;h2 id="hatred-for-god">Hatred for God&lt;/h2>
&lt;p>Our most sincere rejection to the figure of that almighty and omnipresent God that so many people try to persuade us. To that figure superior to us who watches over or protects us to the extent of who knows what possibilities.&lt;/p>
&lt;p>Our most profound hatred and rejection of the idea of that benevolent, as well as annihilating God, where contradictions are constant, constant, and interested in those who try to sell it to us.&lt;/p>
&lt;p>Our most sincere repudiation, hatred, and rejection of that superior figure’s putrid idea. To that God and prophet who claimed to come in the name of who knows who. To the one who claimed to be cowardly today, many still trust in his foolishness.&lt;/p>
&lt;p>Our greatest disgust, repudiation, hatred, and rejection towards the very idea of God’s existence as something superior to us. To that who claims to love us and yet is permissive with everything that is not love. To that which hides the egocentric interests of an idea devoid of everything, especially humanity.&lt;/p>
&lt;p>Our greatest and most sincere contempt, disgust, repudiation, hatred, and rejection towards God and everything that his idea represents in itself as long as we are not ourselves. There will be no greater fallacy than denying that we were born to be our gods.&lt;/p>
&lt;p>Our most sincere pity for those cowards who hide behind their lack of interest. To those who today blindly believe in some of the words born from some tale, either out of tradition or simply due to a lack of logic or intellect.&lt;/p>
&lt;p>Our most significant intolerance is for anyone who claims to preach the truth through their mouth and contradicts it through their actions, excusing themselves by saying “the flesh is weak” or “the devil deceived us.” Damn you, too, fools and hypocrites. You are the evil ones!&lt;/p>
&lt;p>Even having more logic than the idea of God itself, which they try to instill through religions in our youth, is not at all complicated. Who can hate us more than the idea of God itself? An idea full of human gains, lies, and deceit. An idea rich in falsehoods and disdain, but above all in uncertainties within the abyss that all this can become if we cannot say “enough.”&lt;/p>
&lt;hr />
&lt;h2 id="and-it-won-t-be-enough">And It Won’t Be Enough&lt;/h2>
&lt;p>And it won’t be enough to wish for everything to end, for all this concern to dissipate once and for all.&lt;/p>
&lt;p>To turn a possible grain of rice into a mountain full of uncertainties and terrors. To wish to end all this pressure that abducted us by surprise. The fear of uncertainty and its confusion is what overwhelms us the most.&lt;/p>
&lt;p>And it won’t be enough to believe to be, even being at times within the limits of our possibilities. Talking about intention is not always the correct thing, and it won’t be enough to avoid specific fears or help us clear simple doubts.&lt;/p>
&lt;p>And it won’t be enough to be without being, for being is and will be forever our main mission, where the very idea of emptiness and its absurdity may visit us on so many occasions without permission.&lt;/p>
&lt;p>And we cannot allow ourselves not to feel! Although missing each other may be, at times, also something inevitable. What are we doing now? And with our life? “It won’t be enough, therefore,” we tell you! We have survived pity and falls: enough once and for all this poor and senseless idea, for surviving is not living.&lt;/p>
&lt;p>And it won’t be enough for them to tell us! We will be the ones to say to ourselves…! I hope that everything will be fine and will continue to be so.&lt;/p>
&lt;hr />
&lt;h2 id="the-complexity-of-obligation">The Complexity of Obligation&lt;/h2>
&lt;p>When we forget who we are, it is when we tend, to a greater extent, to the anguish born of confusion. That enigma that scares us and makes us feel uncomfortable. Something that might seem unnecessary initially but surely should lead to a compulsory conclusion: educating ourselves on the matter.&lt;/p>
&lt;p>When we forget who we are, we should remember ourselves the most. Hurriedly… In a race where time is forced not to stop for a second. Decisions with a clear mind become complicated, especially when the identity that should belong to us feels overwhelmed and lacking in essence.&lt;/p>
&lt;p>Everything revolves around an aura of conjectures, dizziness, and linked fears. Forgetting our beginning, our personality is unequivocally in the wrong direction of what we want.&lt;/p>
&lt;p>How would we avoid those situations or knowledge that we would like to evade and do, learn, or know in advance many others that we could forget or not interpret correctly in time?&lt;/p>
&lt;p>To what extent are we willing to go? To what extent are we ready to give up certain things for others? What is this, if not an exchange of decisions and priorities?&lt;/p>
&lt;p>That’s why anxiety pursues us when we err, with more or less guilt, in our commitment because it is about the feeling of proximity from us to ourselves. Our fulfillment should be nothing more than our understanding of ourselves.&lt;/p>
&lt;p>The complexity of obligation lies in its responsibility, which is proportional to the burden we are willing to carry, which should never be imposed but desired.&lt;/p>
&lt;hr />
&lt;h2 id="longing">Longing&lt;/h2>
&lt;p>When everything passes, and nothing remains, we will remember with possible nostalgia those moments that happened, especially those that made us feel. We will miss the desire to write, as everything will end up like a fire consumed by a lack of oxygen.&lt;/p>
&lt;p>We will miss those desires for madness for learning, perhaps even for that same self-improvement or identity… Who knows how much we will miss? We already miss it, and it is not strange a little every day. Growing up makes us more aware of our pulse, breath, and chained purpose.&lt;/p>
&lt;p>We will miss the water flowing, the sun waking us up in the mornings, and spending hours reflecting on what we will miss…&lt;/p>
&lt;p>But it won’t be today.&lt;/p></content></entry><entry xml:lang="en"><title>Chapter 12: February 2016</title><published>2016-02-01T00:00:00+00:00</published><updated>2016-02-01T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/books/oeur/2016-febrero/"/><id>https://chemaclass.com/books/oeur/2016-febrero/</id><content type="html">&lt;p>&lt;img src="/images/books/oeur/12.jpg" alt="book-chapter" />&lt;/p>
&lt;h2 id="traveling-to-our-encounter">Traveling to Our Encounter&lt;/h2>
&lt;p>A continuous and changing void. Full of everything and nothing, of convergences as well as deficiencies, and occasionally, of ordered essences.&lt;/p>
&lt;p>Traveling has taught us, among other things, to better understand that life is so different from how we used to conceive it… Opening new doors day after day with barely any breaks in between, where tranquility was already counted.&lt;/p>
&lt;p>Minimum requirements evolve, and maximum possibilities disappear. There is no trace of the limits imposed in our youth on what we are capable or incapable of achieving. Limits? What expression is that…&lt;/p>
&lt;p>Borders that did nothing but confuse our vision, prevent us from seeing beyond, and not allow us to feel what, otherwise, we might never have accessed.&lt;/p>
&lt;p>Traveling has opened our minds more than we could have ever thought. Studying has given us the key to opening the doors we dream of and will dream of. Being ourselves has allowed us to be with those we truly wanted and will want. Dreaming has granted us to live, and living is allowing us to dream.&lt;/p>
&lt;hr />
&lt;h2 id="unforgivable-youth">Unforgivable Youth&lt;/h2>
&lt;p>An unforgivable youth that consumes us along with our time in an apparent subjective sense that we decide to create ourselves.&lt;/p>
&lt;p>The passage of days, of years…, of time in general. Careful! Let’s not oversleep more than planned, or we’ll be too clever, making a mistake once again.&lt;/p>
&lt;p>When is the moment? When should it be? The problem is not that this moment has not arrived or seems not to arrive; the problem is not being awake and not going out to seek what we want to find. That means not being asleep but attentive in these waters that can swallow us at any moment. Not being asleep means learning to rest when we are exhausted. It means learning to swim, not letting ourselves be carried away by the current without apparent reason. It means learning to breathe even beneath the same sea. It means walking with and against the wind, learning from it and its freedom of movement.&lt;/p>
&lt;p>Unforgiving youth is the one that, cowardly, hides, delegating its responsibilities to time, letting it carry them out without much intention in its understanding of its own unanimity. Devoid of meaning, our youth does not forgive. Confronting our adolescence with real linked suffering, as everything we have not yet overcome for our future will remain in our conscience. Who decided to be older? Did youth itself escape despondently? Who decided to be this or that?&lt;/p>
&lt;p>When did we grow up? When did we stop being what we don’t remember? We should be satisfied with our decisions, especially if there were no other intentions than just being; breathing accordingly, and, as a future result, pardoning our past, an irreversible effect of our present in our consequent reality.&lt;/p>
&lt;hr />
&lt;h2 id="religion">Religion&lt;/h2>
&lt;p>We must understand religion as something natural, inherent to a fragile race prone to mediocrity, where lies and deceptions stroll without our permission, being, therefore, intrinsic to our humanity. We could think with every right: “Poor those who want to be of this world,” but poorer will be those who do not.&lt;/p>
&lt;p>Religion was born out of our cowardice, our lack of understanding, and our lack of commitment, but above all, our lack of sense and feeling as a divine species.&lt;/p>
&lt;p>Is religion an error in itself? I don’t think so. I believe that religion is simply the result of another reflection, a symptom that we still have much to evolve.&lt;/p>
&lt;p>The belief in something superior to us is nothing more than a reflection’s lack of strength in our world: our life. Religion is nothing more than the consequence of a significant lack that existed years ago. The fact that it still exists and is practiced with even a bit of enthusiasm says it all: a picture is worth a thousand words.&lt;/p>
&lt;p>Faith in one religion or another, without distinction, reveals a lack of trust, as well as personal and individual meaning. We are not here seeking or pointing fingers. We are all part of our ecosystem; we are all part of the same in the end.&lt;/p>
&lt;p>Religion is nothing more than a false and unnecessary self-suggestion of the existence of a higher authority. We speak here of “unnecessary” from a perspective above the norm: as a species that doesn’t understand that there is nothing superior to itself.&lt;/p>
&lt;p>Is it possible to understand religion differently? Of course, look at the people who, though backward and cowardly, understand this topic. We say “backward and cowardly” referring to those who do not dare to be above themselves. Therefore, they lag behind in their potential compared to those who dare to live in their deserved greatness. Many simply excuse themselves by saying that religion is good and helpful; damn religion! It wasn’t her, but us!&lt;/p>
&lt;p>Religion is the belief that we were neither nor are. What nonsense! We were, are, and will be. It was us who annihilated in the name of religion. It was us who helped in its name. We do everything, not God or any of his children or prophets!&lt;/p>
&lt;p>Don’t be fearful! The world can be as wonderful as we decide with our attitude toward life, for there is no greater secret than knowing ourselves and being aware of our power and wisdom. The use we give it will be decisive in defining our successes and failures and, thus, the quality and meaning of our existence.&lt;/p>
&lt;p>What is the difference between believing in a God and believing ourselves to be the gods of our lives? It is straightforward: self-determination, as well as the responsibility it entails. We are not here trying to dismantle any falsehood or certainty. Everything is in our minds; the direction we decide on will reflect our maturity.&lt;/p>
&lt;p>There will be no God or destiny that can guide us toward correct conduct or absolute truth. Within our logical limitations, we are unlimited beings. Above any belief will always be our freedom, which will steer the course of our path, above any inevitability, where the transience of our goals becomes evident. Above any divinity or belief, we will be ourselves as we were, eventually ceasing to be and resting from so much turmoil.&lt;/p>
&lt;hr />
&lt;h2 id="definitely">Definitely&lt;/h2>
&lt;p>Definitely, we are not supermen, but that shouldn’t be any problem, but rather our sincere feeling toward its tendency. Definitely, we are not, but believing it at times could bring us closer to it.&lt;/p>
&lt;p>Destined for life to live until death. Destined until our last days to a tireless life of weariness. Destined for an immature and senseless destiny where it wouldn’t even recognize itself.&lt;/p>
&lt;p>Definitely, we should learn that tiredness can sometimes be inevitable and that our reading comprehension of life can and should evolve. We can be as much as we can imagine but, above all, we will be as much as we demonstrate.&lt;/p>
&lt;p>Definitely, the wind will carry words away so far and so far… until they remain in their warm forgetfulness, thus nullifying any memory and abundant absence of them.&lt;/p>
&lt;p>We should decide to write a book, our book. Write it slowly, savor each of its words as we have never been able to enjoy, imagine each paragraph as the last one we could write, and carry it out as if our life depended on it.&lt;/p>
&lt;p>We are not supermen, and definitely, believing so wouldn’t make us one. It is, therefore, from where this simple, logical, and absurd obvious sentence arises: believing that something is or exists is not even a minimally conclusive proof of its truth. Believing it would be ridiculously foolish.&lt;/p>
&lt;p>It’s a matter of a sincere feeling toward what we really say or think, that is, what we are. Not saying or thinking inevitably leads to not being.&lt;/p>
&lt;hr />
&lt;h2 id="turns-and-more-turns">Turns and More Turns&lt;/h2>
&lt;p>Ideas that flood us and accompany us without notice, without even warning us of their arrival. The same ideas that will linger in our minds without a date announced for their final instance.&lt;/p>
&lt;p>An immeasurable sensation of questions without answers. A cautious and distrustful restlessness, wrapped in paper. In love with itself, but, in the same way, with its opposite, as nothing will remain in the end.&lt;/p>
&lt;p>Warm emotions without warning interfere with our minds without permission, alarming our most prudent beings and invading the course and everything we carry in our minds.&lt;/p>
&lt;p>Distrustful of external ideas that pierce and reveal in a spring of mysteries that don’t stop turning among themselves or playing tricks, inviting us to madness. A world where the sensible people seem to be those who do not know or love not knowing.&lt;/p>
&lt;p>Where ideas play without rules, disordered and arranged, governed by what we still do not know. A world of possibilities that surprises us every day. It floods us with its wisdom and brings us closer to our idea of being. It transforms us and shapes us with the mold we began to carve in the past.&lt;/p>
&lt;p>Accurate suspicions that point to more. Outlined opinions that only wish to be born to shine as they deserve and die as they should.&lt;/p>
&lt;p>Warning us of what is happening. So many nerves without an apparent name that, of course, deliberately hide it. We must appear and warn ourselves, as it is a simple alarm where the cause hides behind a possible discouragement.&lt;/p>
&lt;p>Repairing our breathing again… Imagining that all these turns were born from somewhere.&lt;/p>
&lt;p>Everything is in its place, each in its orderly measure. Apparent concerns don’t have to be evident or even exist beyond our minds. Let’s stop believing in this or that without alarming reason, as the only urgency is to know that in our power everything ultimately resides.&lt;/p>
&lt;p>But it is true that clarity may take time to manifest, and until then, it is more than understandable to feel misunderstood, disturbed, and even scared. Let’s feel free to feel it, to feel like ourselves. But let’s not forget who we are, please; write if necessary.&lt;/p>
&lt;hr />
&lt;h2 id="so-easy">So Easy&lt;/h2>
&lt;p>It’s so easy to get lost when everything seems to be achieved… When everything appears to have assured stability, and we believe it, that’s when everything tends to become unstable. Where did our desire to thrive and improve go when everything wasn’t won yet? I think we simply fell asleep or, in other words, let ourselves be lulled to sleep.&lt;/p>
&lt;p>We shouldn’t believe that this is something negative at all. Our primary task is to learn, especially from those situations or moments that we wouldn’t want to experience again. Learn that appearances tend to deceive at first glance, but above all, learn that we must be bolder with our reality.&lt;/p>
&lt;p>It seems that we tend to neglect when we fall asleep or even leave the autopilot on because we think everything is already done. We couldn’t be more wrong. Inactivity is what will ultimately destroy us and shape us into something far removed from the idea of Superman.&lt;/p>
&lt;p>The lack of action on our part as individuals crumble us and rob us of meaning with all our rights. And it’s so easy to end up asleep without ambitions that awaken us… Because we tend towards mediocrity.&lt;/p>
&lt;p>It’s so challenging, apparently, to stay awake in this reality where sleepwalking predominates, where the main issues seem to lack clarity in their perspective. Where normalcy suggests having found a place to stay without being obliged to pay for its stay.&lt;/p>
&lt;p>The difficulties we encounter in our reality could not be more interesting from the point of view of those who observe or suffer them, automatically becoming achievements to attain and overcome. It is true that there are obstacles and inconveniences that make life, at times, a continuous torture where we can’t help but desire to escape until it all passes.&lt;/p>
&lt;p>The real problem is not the problems themselves. Life is full of tragedies, riddles, and mysteries to discover… The real problem is not confronting what causes these uncomfortable feelings, not facing our difficulties for fear of unleashing another possibly internal conflict against ourselves because who could contradict themselves?&lt;/p>
&lt;p>It’s so easy to fall asleep wishing to escape from everything…, especially when life doesn’t seem to have intentions of extending a helping hand. Staying alive is, at times, so difficult to believe, as wherever we look, we commonly see extinguished souls, aimless, not knowing even where they are going or where they are headed.&lt;/p>
&lt;p>I believe, therefore, that these should always be our main concerns. Sleeping is healthy, but “sleeping through life” will cost us the same. In this context, we should stay awake, but it’s not easy. Who said it would be, after all?&lt;/p></content></entry><entry xml:lang="en"><title>Chapter 11: January 2016</title><published>2016-01-01T00:00:00+00:00</published><updated>2016-01-01T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/books/oeur/2016-enero/"/><id>https://chemaclass.com/books/oeur/2016-enero/</id><content type="html">&lt;p>&lt;img src="/images/books/oeur/11.jpg" alt="book-chapter" />&lt;/p>
&lt;h2 id="ambition-in-a-dream">Ambition in a Dream&lt;/h2>
&lt;p>Ambition is wanting more and better; it’s not giving up, especially not for just anything.&lt;/p>
&lt;p>Ambition to change, learn, and enjoy growth, breaking continuous patterns of half-truths. Even whole mirages of truths. Truths… which ones? Are we a truth, after all? How much truth is there in us?&lt;/p>
&lt;p>Ambition to laugh and smile every day. For everything… for anything. Learning to enjoy every moment, whether salty or sweet, bitter or spicy; all have a place. After all, it’s just a matter of taste and understanding. Understanding and reason, where ambition becomes more apparent. Where verses can converge without as much fear as we might sometimes fear life itself.&lt;/p>
&lt;p>Ambition for life, our most precious gift, and for our dream. Our logical capacity allows us to discern illusion from truth, life from a dream, and dreams from true reality.&lt;/p>
&lt;p>Ambition to live, to grow, to laugh, to dream, to do, to unite, to create… This should be our true reality, our project as mortals because, in the end, only what we have been will remain.&lt;/p>
&lt;hr />
&lt;h2 id="i-renounce-god">I Renounce God&lt;/h2>
&lt;p>Does God exist? How dare you affirm the existence of a God? I know the illusion of ignorance. The illusion of ignorance and sentiment above reason.&lt;/p>
&lt;p>Without any real proof beyond individual illusions, there is a need to create a God “for our own good” to accentuate the limits of good and evil, as cowards dare not define them themselves. They need to lean on a divine idea superior to them. They would fall otherwise because they are weak, as well as fearful of their reality.&lt;/p>
&lt;p>Show me real proof! Show the world where your blessed God is; prove it to me. I’ve seen nothing but empty words on the subject. I’ve heard nothing but vain beliefs and personally valueless experiences, especially those without the possibility of being proven. Beyond those who want to believe in something nonexistent.&lt;/p>
&lt;p>Having faith is wanting to remain ignorant. Not daring to think with cause and knowledge. Not daring to be God is what leads them to failure in their belief and fear of responsibility and freedom.&lt;/p>
&lt;p>I denounce the false single God and all those who feed it in their cowardice because we are the gods of our lives. The proof is quite simple: open your eyes and look around you. What can you see? Look at your hands. Dare to be aware of your power, your wisdom, your past…&lt;/p>
&lt;p>Think about your future, what’s to come, everything you have ahead. Dream these seconds with your time, breathe slowly, and enjoy it because you are truly being God. The greatest thing in your life is simply you.&lt;/p>
&lt;hr />
&lt;h2 id="my-purposes">My Purposes&lt;/h2>
&lt;p>It is widely generalized that at the beginning of each year, certain proposals are made for the upcoming year. Today is the eighth day of this new year, and for several weeks, one of the main topics of conversation has been the “resolutions” for this new year.&lt;/p>
&lt;p>Of course, it’s an important topic, where encouraging ourselves to set short and medium-term goals becomes more noticeable. But I think we should do something different. I think we could do it differently: look from another angle to highlight the true purpose of our sincere intentions.&lt;/p>
&lt;p>Our main resolutions tend to be unoriginal and repetitive, year after year. Imagination gets boring if it doesn’t play and create, especially if it doesn’t have fun. Why are our resolutions so short-lived? Do we really achieve our set goals in these early days of the year?&lt;/p>
&lt;p>Let’s visualize this situation from another perspective and play with our reality. It’s great to set new goals to achieve in the coming year, but I prefer to think about where we will be the next year. Set long-term goals. Think about where we really want to be in two, three, or even four years. The resolutions for this just-started year are too simple: simply enjoy it while striving to become our best version.&lt;/p>
&lt;p>We refer to projecting our future, making each awakening a purpose in itself, focusing and realizing what we really yearn for.&lt;/p>
&lt;p>Change the fleeting days to incredible experiences. Full of vitality, strength, and energy in the search for our true selves. Enjoying our journey and finding ways to feel fulfilled, especially with ourselves.&lt;/p>
&lt;hr />
&lt;h2 id="sometimes">Sometimes&lt;/h2>
&lt;p>Sometimes life can seem strange, especially when everything happens differently than we planned or thought.&lt;/p>
&lt;p>Sometimes we may feel that we won’t be strong enough, as if we’ve lost all our strength, or that we simply don’t want to continue playing this game, which seems to have no meaning.&lt;/p>
&lt;p>Sometimes we may feel terrible. Everything we did was not what we really wanted to do, and the future awaiting us seemed to have no better options.&lt;/p>
&lt;p>Sometimes we might wonder, “But… why? Every day is the same and gets worse. I can’t do anything. This doesn’t work, this is wrong… I don’t belong here. No one could understand me.” It’s normal. We’ve all thought about these things at least once, especially in our childhood.&lt;/p>
&lt;p>Sometimes we can be wrong. I said to be wrong, of course! Wake up! We are human, what did you think? We can become incredible, especially because we can prove it. And it’s certainly not complicated: all we need is patience with ourselves. The rest will come on its own. We simply need time.&lt;/p>
&lt;p>Enjoy your life by making it unique!&lt;/p>
&lt;hr />
&lt;h2 id="eyes-in-a-memory">Eyes in a Memory&lt;/h2>
&lt;p>Feeling how our ideas grow and mature, eager for reading and learning. Feeling the fatigue born of an active life full of vitality and energy as it deserves. Feeling ourselves as a vital part of a whole, as well as an individual part of the entirety.&lt;/p>
&lt;p>Full of emotions and wild ideas that yearn to be born. Sleepless nights where not dreaming is forbidden are the protagonists of our story. If at any moment we find ourselves without them, that’s when we should be scared and correct ourselves quickly.&lt;/p>
&lt;p>Missing a fleeting and dreamy young person, but lacking in courage. Regretting not being there to tell him how wrong he was and how much he was worth. That he was important and that he would be even more so at times. That each day of his life would be a before and an after in itself.&lt;/p>
&lt;p>Longing for a land warmer than cold, but not too much, and not for the land itself, but for what was in it. Wishing to see our memories, our family, our past, our home, ourselves in that rude time with different eyes… to be able to affirm today that we are so satisfied…&lt;/p>
&lt;p>Traveling. Living away from everything we always had around us has made us more aware of everything that we have today, of how ephemeral everything is in general, and how valuable little things can become in particular. And I’m not just referring to mere details: great friendships from a distance, younger siblings who still need help not to get lost, where laughter is still achievable, and hope in every success flourishes in every comfort and experience.&lt;/p>
&lt;p>Memories in an uncertain but certain future. Dreams in the vastness of desires, where each passage can shine without any fear until its full transformation, forever leaving fiction behind to become full reality.&lt;/p>
&lt;p>Starting to materialize, to create where there was nothing before. Reusing, reinventing our ideas and thoughts, improvising with everything that doesn’t let itself be defined. Breaking the vain ideas of inferiority and, above all, with the “you can’t.”&lt;/p>
&lt;p>Beautiful detail they had, and we had with us a few years ago, learning to adjust the sail of our ship to the wind so that it doesn’t end up breaking, no matter how hard it blows… No matter how difficult something may seem, nothing will be impossible to be stored in our eyes as a memory.&lt;/p>
&lt;hr />
&lt;h2 id="where-success-begins">Where Success Begins&lt;/h2>
&lt;p>Success begins in oneself, in believing to have achieved it even before actually doing so. Not because of false hopes, but because everything should point to that being the case.&lt;/p>
&lt;p>Of course, there are chances that what is set may not be fully achieved, but it shouldn’t be our fault. We should have bet and worked hard and fully on it.&lt;/p>
&lt;p>Success is, in part, mathematical: a matter of probability. Like grades on a test when we were young: the scores didn’t measure actual abilities compared to other classmates. What they measured were the probabilities of our success: the more we studied, the more chances we had of achieving a higher grade.&lt;/p>
&lt;p>With success in life, it’s the same: the more we fight to obtain a higher grade, to get what we desire the most, or to achieve our goals, it doesn’t certainly mean guarantee completely that we will achieve it, but it does increase the chances of it happening. It’s even possible to learn to control certain probabilities, making them tend to the maximum.&lt;/p>
&lt;p>Life is too complex to play its game. It’s too complicated to listen to it. Seeking happiness in its difficulties without making an effort is excessively challenging. That’s why we must create and apply our rules, in their simplicity, to achieve success and, therefore, our happiness.&lt;/p>
&lt;hr />
&lt;h2 id="fed-up">Fed Up&lt;/h2>
&lt;p>Undoubtedly, I think if you asked people close to me, they would all agree on at least one common adjective to describe me: patient. I consider myself a person with significant patience. In fact, it is undoubtedly one of my main virtues: knowing that time does not stand still and that everything ends up being caught by it.&lt;/p>
&lt;p>Why am I like this? Simple. I’m fed up with hearing how little we are worth or how little we are. Years and years listening to the same nonsense. These words and situations that seem too obvious to me now, which I believed as ignorant and deceiving when we weren’t even aware of who we were or where we were.&lt;/p>
&lt;p>First in a church, in abnormal beliefs more than paranormal, typical of the sick and devoid of meaning. Fearful, but above all, self-deceived. Where hypocrisy, jealousy, and all those things these cowards complain about end up being the first traits to be contradicted. “By their deeds, you will know them,” said a character that will be familiar to many, and he was not wrong there, as no faith is needed to be happy. Not at all. What is needed is a good education where good values of coexistence and mutual respect, as well as personal growth, are present, and not stupid confessions where everything bad and wrong—according to the book we are reading—is previously established, as if it were a role-playing game.&lt;/p>
&lt;p>And second in a “castle,” where the previous point stands out so much, shines, and glows… that it ends up burning more than ten suns together. Where learning to survive became everyday bread. Where memories want to disappear. Where I began to discover the value of my true family, as well as my neighbors and the people who, day by day, surrounded me.&lt;/p>
&lt;p>I got fed up with hearing so many senseless things together… that I had to learn to be patient by the obligation imposed on myself, as a necessity. I got fed up with not valuing what really deserved it.&lt;/p>
&lt;p>—“And who or what is it that really deserves to be valued? Everyone, perhaps? But above all, to what extent?”&lt;/p>
&lt;p>Sure. Everyone deserves to be valued, but not everyone equally. Some are worth more than others. We are not the same. We are all different, that’s the charm and part of our meaning. It’s part of our history and our future. Monotony was never our final or even initial purpose.&lt;/p>
&lt;p>I’m fed up with not valuing what deserves to be valued as it really deserves. And measuring that valuation is quite simple, as well as personal. We can easily obtain the answer to the previous question, in addition to being suitable for all audiences. All we need is time, effort, and sincere self-criticism. The rest is simply patience.&lt;/p>
&lt;hr />
&lt;h2 id="ironies-of-life">Ironies of Life&lt;/h2>
&lt;p>Biting the hand that feeds us.&lt;/p>
&lt;p>Ironies of life include that, thanks to “hear, see, and be silent,” one learns to desire to shout to the four winds and to think more clearly. Wishing that everything was a dream from which to wake up, only to end up yearning for a childhood that will never return.&lt;/p>
&lt;p>Ironies of life are learning to work, leaving home, and wanting to start anew. Wishing to start from scratch, seeking another opportunity while missing a time that will never come back.&lt;/p>
&lt;p>Belonging unintentionally.&lt;/p>
&lt;p>Ironies of life are forcing oneself to be older, to strip away a childhood that never existed; at times, wishing not to have been born, only to end up loving what was once hated; ending up loving life, proving to the world how wrongly one lived.&lt;/p>
&lt;p>Ironies of life are ending up fighting to the death, facing without fear everything that one could fear, wishing for everything to end once and for all, swimming against the current and against all odds, poorly predisposed by misguided authorities, unable to question without prior permission.&lt;/p>
&lt;p>Ironies of life are climbing forbidden stairs under the most wicked, mistaken, and vile authorities ever encountered. A wicked, miserable, and spiteful serpent; its irony will be its punishment during its wait. Let it enjoy as much as it can; indifference is all that remains on my part.&lt;/p>
&lt;p>Ironies of life are our art, as ephemeral in a moment as temporal in a memory. In my reserve will remain everything I don’t write. Interpret as you wish. Nothing will be for you but my forgetfulness.&lt;/p>
&lt;p>Ironies, it was you and everything that came with you. Thanks, I say now, for having been a witness and participant in the most beautiful creation we could ever achieve: us, of course, I mean, both me and myself. Because there will be no greater irony in this life than the mere fact of feeling minimally grateful for someone as undeserving as you once may have been.&lt;/p>
&lt;p>Thank you. To your irony, I say.&lt;/p>
&lt;hr />
&lt;h2 id="to-not-die">To Not Die&lt;/h2>
&lt;p>Playing with death, to not die. We are the embodiment of our experience, of what they tried to teach us, and of what we truly learned.&lt;/p>
&lt;p>It’s not our fear of creating, but of seeing what we create destroyed, whether by the simple passage of time, the course of the season, or our existential end as individuals.&lt;/p>
&lt;p>Playing at being ourselves, not to die. Escaping from the boring, whether simple or complex. Tempting fate in the right measure. In our nature, it is written: “Our time will not return. Never.”&lt;/p>
&lt;p>We are perfect abstractions of our unique reality. From our most sincere complexity to our most absurd simplicity. A reality where nothing and everything could converge without reservations. Where no one is nothing and we are all everything at the same time.&lt;/p>
&lt;p>It would be so boring to always talk about the same things, do the same things, or not think about anything new… We must evolve, improve our thoughts, and never stop believing in ourselves; as Gods of our only reality that we are.&lt;/p>
&lt;p>Playing with death, not to die. Confronting life without fear of our evolution, our power, our true being: our Self.&lt;/p>
&lt;p>We won’t be fit for the world if we are not predisposed to be. We are both so much and so little at the same time as we decide. In our courage hides our true power: the power to change the world, our world. Cowardice is nothing more than a symptom of a lack of confidence. A symptom that reveals the absence of the will to power when it is necessary and possessed, and the lack of knowledge of it itself.&lt;/p>
&lt;p>We refer to personal and individual cowardice. Cowardice in not daring to be, in not telling ourselves the truth for fear of having to face it. Sometimes it is our fear of the fear itself that does not let us live. We couldn’t be more wrong in our fear!&lt;/p>
&lt;p>Fear of dying without having lived, not fear of dying!&lt;/p>
&lt;hr />
&lt;h2 id="tired">Tired&lt;/h2>
&lt;p>Sometimes we are tired. It’s not normal for us, but we have to understand ourselves. It’s not something bad, not at all. It’s simply a symptom of the need for a break, of tranquility, accompanied by reflection like the one we are having now.&lt;/p>
&lt;p>Let’s go to bed. Let’s read for a couple of hours until we can’t anymore and sleep in deep sleep. This way, we will help our body, as well as our will, to replenish all the strength we need so that when we wake up, we smile as usual.&lt;/p>
&lt;hr />
&lt;h2 id="my-skin-crawls">My Skin Crawls&lt;/h2>
&lt;p>My skin crawls when I think about us. In the vastness within our restlessness. In that unique moment that seems immortal every second we let pass before our eyes.&lt;/p>
&lt;p>My skin crawls when I think about our future. In our life ahead, in every second, in every moment that, along with our mischievous self, we let rest. Enjoying that shared moment that is born only to be lived in our eyes.&lt;/p>
&lt;p>My skin crawls when I dream of us. In our lived and still expected moments. In the shared moments, as well as the ones left behind, they are never divided even if they can be longed for.&lt;/p>
&lt;p>My skin crawls when I write for us. With poetic tendencies is what I mean. Seeking rhymes out of nothing until I generate, and the result in my mind sometimes I conceive.&lt;/p>
&lt;p>My skin crawls when I play with our past. Sometimes in our language, I try, but I am no one if I do not mature, even venturing with fire.&lt;/p>
&lt;p>My skin crawls when I pretend with our dreams. Without envying certainly being no one, for I will be the only one who radiates until I finally fall asleep.&lt;/p>
&lt;p>My skin crawls when I finish, when I start, or when I guess in every moment of this time, which I try not to ruin. What is truly exciting is that, in these early morning hours, we are still here in front of us.&lt;/p>
&lt;p>My skin crawls when I think about us, when I dream with you when I write for you, or simply when I play by your side.&lt;/p>
&lt;hr />
&lt;h2 id="necessary-insecurity">Necessary Insecurity&lt;/h2>
&lt;p>We refer to unnecessary insecurity, the fruit of a poorly nourished tree. Where the land has been fertilized with continuous disorder in an area of scarce life and abundant ironies.&lt;/p>
&lt;p>Where metaphors flourished by themselves without anything or anyone seeming to water them, alongside a continuous rain of despair and bewilderment. Where the notion of identity faded away day by day, and our roots wished to be pulled out in any way to migrate elsewhere.&lt;/p>
&lt;p>Regardless of the method or date, as the notion of time was lost between hours and even days, waiting for something to change implies some improvement because worse irrigation and fertilization than what we took would be quite a challenge in its difficulty.&lt;/p>
&lt;p>The harvest obtained from poor irrigation tends to be poor fruit.&lt;/p>
&lt;p>But the funny thing in this play on words is precisely that we could learn to water ourselves. We learned, at least, to change fertilizer. Watering ourselves with different water every day, experimenting and trying; removing the blindfolds from our eyes that hindered us so much from seeing.&lt;/p>
&lt;p>We learned to learn.&lt;/p>
&lt;hr />
&lt;h2 id="not-enough">Not Enough&lt;/h2>
&lt;p>Life is not enough to just be lived. We must face it and not let it slip away. Every moment of our breathing is not that it won’t come back; it will disappear like a speck of dust in the cosmos, never to return.&lt;/p>
&lt;p>Swimming against the current, against ourselves because, believe me, it will be necessary. This should be a battle. The greatest personal encounter of our lives, for there will be no more important conflict for ourselves than the one we wage against ourselves.&lt;/p>
&lt;p>With tact and understanding, as well as with fury and passion. Let’s rise with all our courage, overcome our smallness once and for all; let’s learn to fight against our inferiority as individuals! It’s not enough to simply exist, let alone survive!&lt;/p>
&lt;p>No star will shine on its own; even less if it has nothing to illuminate. The light we radiate would be useless if it did not inspire or ignite those who are still extinguished.&lt;/p>
&lt;p>It will not be enough with a “could…” or a “maybe someday…”. We must not allow ourselves to fall into the simplicity of a dim life where routine dominates us and does not allow us to create. Invent a superhuman, push ourselves towards continuous success, choose what we really want, and never cease in our purpose.&lt;/p>
&lt;p>Because life is not enough to just live it! It will be synonymous with not living if we do not shape ourselves because to live, it will take more than just breathing…, and that is to feel and never stop pursuing until we become who we truly desire. And if we have never dreamed of our future before, it is because we have not yet been born.&lt;/p>
&lt;p>What I am completely convinced of is that withering away without even having blossomed will undoubtedly be the greatest mistake to which we will have led ourselves.&lt;/p>
&lt;p>Therefore, it will not be enough to be without being! Let’s be!&lt;/p>
&lt;hr />
&lt;h2 id="i-am-not">I Am Not&lt;/h2>
&lt;p>I am not a writer, and that is one of the reasons why I love to write. I do not consider myself a musician either, even though I can make an instrument sound pleasant. Many years have passed communicating with music, especially because it has always made me feel all kinds of emotions. I remember that I also had several periods in which I composed songs, but that did not make me a composer.&lt;/p>
&lt;p>Precisely not being a writer is one of the things I like the most: I don’t depend on anyone, and no one depends on me. There is no reason to fear words, letting them play freely, both together and apart. Where the only responsible one is the one who reads and enjoys them in their own measure, not the one who might think or write them. It’s true that the author of them is guilty, as it was their own harvest, but I am not afraid of anything they write. Perhaps in the future, when I look back and realize that I was not a writer. Then, surely, I will understand myself.&lt;/p>
&lt;p>I love to write simply because I am not a writer, to find a place where I can express, without fear of what might happen, what I have wanted to express for so long. In the past, I experienced a life that no one in their right mind would choose: so much craziness in so little time…, so many disparate and unhealthy emotions…, and I found myself on the brink of chaos. I was simply learning to read and write at the same time. Where forgiveness and mercy seemed to play hide and seek every day. Where games and their memories portrayed nothing but a non-existent childhood.&lt;/p>
&lt;p>It’s challenging for me to speak in the past using the first-person singular, for I was never anything or at least believed so; sometimes perhaps too much. It is possible that not being a writer, I can tremble without fear when writing. Or perhaps, not being a writer, I can write without fear of trembling.&lt;/p>
&lt;p>I am not a writer. Moreover, it is precisely not being one that gives me more strength to prove to myself how wrong I still am, but above all, to prove to myself that I still have much to discover about myself.&lt;/p>
&lt;hr />
&lt;h2 id="to-another-level">To Another Level&lt;/h2>
&lt;p>To another level we play, where gazes revolve around a clear understanding. Where sadness remains a mere illusion that fails to cast a shadow on our confidence. We entered this world without permission, where clarity does not stand out for its presence. Everything is rather lacking in essence, and a bit more warning wouldn’t hurt either.&lt;/p>
&lt;p>Born of memory, of remembrance and forgetting. The fruit of our third person and that introverted event. Unexpectedly, we could see each other on another level, at a price that became impossible not to pay. Apparently predestined, we might think, but destiny is slow and, at times, truly grotesque. It’s not even close, but still, we will be obligated to go through life with it always hand in hand.&lt;/p>
&lt;p>On another level against destiny, against the world, against the path that some blindly choose in their daring ignorance. On another level against life itself, which, in our humble understanding, we learned to discern from its own paradox.&lt;/p>
&lt;p>What is our breathing if not a sway of unasked sensations and a mixture of everything and nothing? At what level will each knowledge be if not the one we, in our judgment, grant it? On another level, we will understand but never be grateful for an unspecified ending but unequivocally destined.&lt;/p>
&lt;p>To another level, simply. Where people and minds wander in search of comfort. It ceased to be a secret long ago thanks to our real and courageous suspicion while many, locked in their harvest, preferred not to realize the obsolescence. More of their mistakes than their successes, where memories with preferences are scarce. And the qualities of their stays were counted in brief moments.&lt;/p>
&lt;p>As if our goal were to become, above all, passionate professionals of passionate life, as well as rational; each in its due measure. We must now say without any fear: “To another level we play,” for we are the fruit of memory against destiny in our breathing with other minds.&lt;/p>
&lt;hr />
&lt;h2 id="precisely">Precisely&lt;/h2>
&lt;p>There are certain things that are still frowned upon. Especially taboo topics in a close environment; even family. Delicate topics that we are forced to handle with care if we do not want to burst a bubble that continues to grow day by day in its own stupidity and meaninglessness.&lt;/p>
&lt;p>Topics that were born seemingly unnoticed, and that, in the end, will be precisely those that make us question: “How the hell have we come to this?” It is already too late to undo the absurdity, the nonsense, and the chaos into which it has degenerated.&lt;/p>
&lt;p>Precisely because it is a taboo subject, it affects our inner self. Precisely because we are not and will not be until we free ourselves from everything we want to be freed from. Precisely because we are our true gods and should love our lives, as well as their continuous improvement. We learned not to be silent when people normally remain silent and to try not to limit ourselves by taboos, especially the most delicate ones.&lt;/p>
&lt;p>And it is in our passion that we tend to be creative, to push the limits of our creations, and, of course, to be ourselves. It is precisely for this reason that we write not only about our thoughts but with them, leaving our minds free to roam.&lt;/p>
&lt;p>We might be more or less correct on some issues and, of course, wrong on others. As we should already know, our mind is not a box of absolute truths. Instead, it should be filled with true and sincere realities where knowledge overflows in a restless sea and is supported by the pillars of wind and tide. Where objectivity does not have to detach from the mood, nor our existence from desire. Where our arguments are so broad that they are hard to believe, not for lack of arguments but for their incredible connection among themselves.&lt;/p>
&lt;p>It is precisely for all this: because we can and should be wrong. We were born without warning and without permission. Let us live exactly what we really wanted and want. Let us die without fear of having lived.&lt;/p>
&lt;hr />
&lt;h2 id="it-says-a-lot-about-you">It Says a Lot About You&lt;/h2>
&lt;p>Perhaps you are right, perhaps you are wrong. Maybe everything you believe is accurate, or maybe everything is false at all with no distinction between tales. What will always be evident is that everything you practice with blind faith will say a lot about you.&lt;/p>
&lt;p>Beyond being pragmatic, being realistic, and conceiving our reality as something tangible where enjoyment and success in knowing ourselves are linked together. Beyond being ourselves, being thinkers and savoring our senses are the most important things in our lives, where pleasure resides mainly in actions and the decisions we make.&lt;/p>
&lt;p>It will say a lot about you, those who, scared by fear of your own self, hide. Fear of the unknown: I mean yourselves.&lt;/p>
&lt;p>What good does it do you to hide, hoping to be right about something that is not evident? What good does it do you to believe blindly in something that does not lift you up as superhuman but rather diminishes you and insults you in your greatness?&lt;/p>
&lt;p>Wake up, I tell you! Those who are still asleep or who will sleep will not enter the greatness of wisdom, will not deserve their sense, and will not be blessed. To those who slept but woke up, I congratulate you because you will know your true sense and will enjoy it, being really yourselves, everything you deserve.&lt;/p>
&lt;p>Perhaps it is true, perhaps not. Perhaps we are wrong, perhaps not. The rules of our game should be dictated only by us and our experience.&lt;/p>
&lt;p>To those who are awake, I write to you. Never forget that you will be what you say, and you will say everything you are. Be without fear!&lt;/p>
&lt;hr />
&lt;h2 id="capricious-destiny">Capricious Destiny&lt;/h2>
&lt;p>I love dressing virgin pages with different garments, where there is no room for fear, and courage becomes even bolder. Playing at being ourselves, feeling alive, and aware of our own being and our ego, as well as our smile.&lt;/p>
&lt;p>Enjoying each morning as if it were the last. Growing every minute imagining our insistent evolution, clinging to our person, and where moments become ephemeral experiences to end up transforming into a whole full of sensations.&lt;/p>
&lt;p>Intuiting at every moment, still and in motion, what chance sometimes finds it difficult to recognize: its moments in time. Chance is nothing more than the probability that something possible happens, making us participants in it to the extent that we have fixed it.&lt;/p>
&lt;p>I love diversity, as well as the courage that the nonexistent destiny has to make itself present when we least expect it. In our immensity as in our person. Nothing more than fleeting experiences in time that will wither sooner or later.&lt;/p>
&lt;p>In our smallness lies our greatness: the power of our evolution and our own change, as well as adaptation. That is what should truly excite us about all this: our constant in life next to a capricious and nonexistent destiny.&lt;/p>
&lt;p>The trajectory of our luck will be, in itself, a paradox where time will be the only judge that equalizes us all, without distinction.&lt;/p>
&lt;p>Let’s not live aspiring to dream that someday we will reach the life that belongs to us; let’s live the life that we once dreamed of, without fear of the absent, witty, and nonexistent destiny.&lt;/p></content></entry><entry xml:lang="en"><title>Chapter 10: December 2015</title><published>2015-12-01T00:00:00+00:00</published><updated>2015-12-01T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/books/oeur/2015-diciembre/"/><id>https://chemaclass.com/books/oeur/2015-diciembre/</id><content type="html">&lt;p>&lt;img src="/images/books/oeur/10.jpg" alt="book-chapter" />&lt;/p>
&lt;h2 id="the-art-of-adaptation">The Art of Adaptation&lt;/h2>
&lt;p>To fear routine and repetition.&lt;/p>
&lt;p>Sitting on the subway, longing to get home to think calmly and enjoy it with good background music. I fear not being able to finish what I started, leaving unfinished all that I would like to complete, or at least, relegate it to a stable version.&lt;/p>
&lt;p>What is philosophy if not questions about questions or ideas about ideas? How apparent are things that seem evident? Who could regulate or decide their degree?&lt;/p>
&lt;p>If I had to choose one word to define myself, it would be “improvisation,” like the art of adaptation.&lt;/p>
&lt;p>Who can assure us that we will wake up tomorrow? Tomorrow does not exist without us. Only today and where we are heading without a decided ultimate goal.&lt;/p>
&lt;p>Thinking that tomorrow is uncertain should compel us to live truly as ourselves, not to exhaust ourselves doing nothing, as if nothing mattered. I think about it every day, so making today the best day of our life shouldn’t be an option. Let’s make today the best day of our life.&lt;/p>
&lt;p>I feel sad with the bleeding news, as well as happy in the company of those who make me enjoy feeling truly alive. Everything is so complex… Sometimes so beautiful, sometimes simply nostalgic and melancholic. Overnight, everything can turn cold or warm in an instant.&lt;/p>
&lt;p>We are bound to our past and destined to be to our future: hence the importance of our decisions and their consequences. Feel, reflect, learn, improvise… Simply, little by little, with great patience. We will amaze the world, especially ourselves.&lt;/p>
&lt;p>We don’t know when the last time will be, when we will dream, breathe, or desire. Let’s make each moment ours without excuses, without possible tomorrows that never come, without “there will be other moments” or “I’m not sure.” Self-assurance is our main key to happiness and our confidence, as well as its continuous pursuit.&lt;/p>
&lt;p>It’s not about seeking unattainable and endless happiness. Instead, it’s about shaping ourselves to become what we genuinely want in this place that no one chose, where we all exist, amidst the mix of challenging yet sweet moments.&lt;/p>
&lt;p>I couldn’t smile until I decided to improvise with myself. And now, everything is possible.&lt;/p>
&lt;hr />
&lt;h2 id="we-will-die">We Will Die&lt;/h2>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="plain">&lt;span class="giallo-l">&lt;span>I will die. We will all die.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>Cries, memories, and longing,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>like ephemeral feelings&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>in a forgotten comfort.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span>You will die. It will be without return.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>Nothing will remain after your wake&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>if you decide it that way.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>Your past reveals it.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span>We must be more patient&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>because soon, we won&amp;#39;t be...&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>It won&amp;#39;t matter if you don&amp;#39;t feel it.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>Together and alone, we will cry.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span>At what cost does all this come?&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>What is the cost of this game?&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>No rules were set, that&amp;#39;s true...&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>There will never be another &amp;quot;see you later.&amp;quot;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span>Memory may fail us,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>the memory will be forgotten.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>And every person as an individual,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>everything will stay by their side.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span>Next to their oblivion, alongside their death;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>in our future, to our fate.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>We won&amp;#39;t see you again&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>or have you to read you.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span>Death as an absolute truth.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>Time as a divine equalizer.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>We... as mere mortals.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>And then I. That is, you.&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;hr />
&lt;h2 id="sudden-emotions">Sudden Emotions&lt;/h2>
&lt;p>Like a game that never ends. Like a cycle in which we find ourselves immersed without realizing it. Like a continuous loss and gain with no return.&lt;/p>
&lt;p>Like a swing of emotions. Like a cold summer and a hot winter at the same time. Like a never-ending series of impressions.&lt;/p>
&lt;p>Like none of us could imagine. Like we all suspected… and as happens at the end of all chapters of life.&lt;/p>
&lt;p>Simply waiting for something to happen, as nothing has to be where we, in principle, believed it should be. It’s not foolish to think about it: about nothing in particular and everything in general.&lt;/p>
&lt;p>So much to do and to desire, so much… that sometimes we simply don’t have the strength due to the great surprise that some days can bring us. And it’s not necessary to reject the unknown simply because it is unknown. Especially concerning emotions, without referring to any specific one. Because there are so many and so different from each other… that to avoid forgetting any, let’s speak from this abstract perspective where we all understand each other.&lt;/p>
&lt;p>Without any apparent reason, and indeed, it doesn’t have one. Because everything is in our ideas and expectations, in an expectation that no one promised, submerged here and there.&lt;/p>
&lt;p>Like a dream we could aspire to, a dream where an image is worth more than a thousand words, where passion and reason go hand in hand, where we are the true protagonists beyond unnecessary suspicions.&lt;/p>
&lt;p>Feeling shivers in who knows how many thoughts that, like birds, simply want to leave their cage to fly freely where their instinct guides them and the wind allows them.&lt;/p>
&lt;p>Like a game that will end someday. Like a continuous cycle of decision-making in which we will be involved unwillingly. Like we all imagined someday and only a few suspected. And, as with chapters, all stages eventually end. But not all in the same way. Herein lies the main difference between some and others.&lt;/p>
&lt;p>Each of us will exude different emotions. It will make those around vibrate in one way or another. Emotions that will depend on everything, on the day and the time, on the who and the how.&lt;/p>
&lt;p>We are so unique and valuable, especially in our diversity of sudden emotions.&lt;/p>
&lt;hr />
&lt;h2 id="not-life">Not Life&lt;/h2>
&lt;p>Not everything has to be decided now. It’s not about that, but it is about having a rewarding goal where we would really like to be. Something we would really like to achieve after an effort made. Something to think about that motivates us to work in our daily lives, to get up and study with more enthusiasm. To think beyond a routine, where things simply happen without apparently anyone needing to change them because, in the end, they seem to have always been that way.&lt;/p>
&lt;p>It’s about motivating ourselves, incentivizing ourselves, cultivating ourselves, and not letting ourselves be carried away by life without answers or questions, without real learnings or new experiences beyond the monotony of the boring.&lt;/p>
&lt;p>And it’s in our hands, in our power, and in our will to change for better or worse all of this. We are our own God, our guide. We are our last word.&lt;/p>
&lt;p>A life is useless if there is no passion for living it.&lt;/p>
&lt;hr />
&lt;h2 id="the-problem-with-christmas">The Problem with Christmas&lt;/h2>
&lt;p>The problem with Christmas lies behind its false values of forgiveness, love, and sincere family gatherings. I am looking forward to the day when I can see this from another perspective, really, but nowadays, it is something impossible for me, at least in my case, and it’s not precisely something that depends on me.&lt;/p>
&lt;p>The problem with religion is, again, all the simulated values hidden behind it. Illusions in beautiful words that humanly end up being conveniently forgotten.&lt;/p>
&lt;p>Masks that constantly play without permission. Uninvited double standards. And you, unwilling to know exactly what’s happening despite trying so hard without reward. “Hear, see, and be silent.”&lt;/p>
&lt;p>Everything comes from much further back: years and years of error without correction and without hope for the future beyond an excess of confidence in responsibility, in a non-existent and foolish God. Miserable.&lt;/p>
&lt;p>But more guilty than God and His non-existence is the deficiency that some have due to their excessive belief. More culpable than God are the humans who abuse Him and use Him: they modify His meaning at their whim and try to instill it as an absolute truth to their peers. Incompetent and foolish, locked in their damn hypocritical and disloyal “faith.” The context of our words can so much vary our real intention…&lt;/p>
&lt;p>The problem is not Christmas itself, much less its celebration or the idea of a special family gathering. It is the one who deceives and the one who allows himself to be deceived. The problem is not the tools or what we have, but the use we make of them, especially with regard to those who matter to us.&lt;/p></content></entry><entry xml:lang="en"><title>Chapter 09: November 2015</title><published>2015-11-01T00:00:00+00:00</published><updated>2015-11-01T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/books/oeur/2015-noviembre/"/><id>https://chemaclass.com/books/oeur/2015-noviembre/</id><content type="html">&lt;p>&lt;img src="/images/books/oeur/09.jpg" alt="book-chapter" />&lt;/p>
&lt;h2 id="to-the-motive">To the Motive&lt;/h2>
&lt;p>There has always been a purpose. There always will be. Something to keep in mind. Cause and motivation for our writings. Our actions, as well as decisions, are governed and inspired by a motive.&lt;/p>
&lt;p>Motivation as a fundamental basis. Vital, I would even dare to say, because without motivation, one could not live, and I’m not talking about simple breathing. It is what inspires us to create, to smile, and to fight against the current if necessary. Our motivation is our inspiration, our muse, the one who gives us courage, who reminds us of the value of what we are carrying out, and who dreams alongside us.&lt;/p>
&lt;p>Ideas, illusions, sorrows, aspirations… All are born from our most emotional selves, wanting to feel fulfilled always within the limits of our possibilities. For the motive and by itself. Cause and cause of its existence. For its elegance, I write to it: to motivation.&lt;/p>
&lt;p>Who else but she inspires me to write to you? I write to you, who suggest and give me more than enough reasons to express all this that I so eagerly want to convey. For my motivation, for herself. For knowing more than anyone what to desire and to what extent. For being mine. For questioning and helping me. For being me.&lt;/p>
&lt;p>To my motive, my motivation.&lt;/p>
&lt;hr />
&lt;h2 id="my-project-our-project">My Project, Our Project&lt;/h2>
&lt;p>Our project doesn’t have to be common or even shared, but I’m sure both of us would like the same goal: to achieve it. And there is nothing more satisfying than achieving our goals, from those we set in the past to those born just a few seconds ago. Time doesn’t matter when it comes to creating oneself.&lt;/p>
&lt;p>Let’s change, breathe, and evolve without losing our essence, being the ones who decide. There will be no prayer or creed to guide us. Let’s enjoy ourselves and our decisions, as well as our mistakes; but above all, let’s learn from them— from our decisions! Let’s not stop, let’s keep moving forward. We will manage to surprise ourselves, without a doubt.&lt;/p>
&lt;p>Maturity is not achieved with age but with experience.&lt;/p>
&lt;hr />
&lt;h2 id="to-necessary-mediocrity">To Necessary Mediocrity&lt;/h2>
&lt;p>To necessary mediocrity. The before and after.&lt;/p>
&lt;p>To what extent and with what certainty can we play at refuting ourselves? Thinking in reverse, believing that we are really deceiving ourselves.&lt;/p>
&lt;p>How can we not be sad or depressed with our entire past? It is our focus that will have the final say about our attitude and person. How could we smile today? Thinking about everything we have learned and are doing now.&lt;/p>
&lt;p>Learning as anticipation. Anticipating the mistake but without fear that it will happen, and if it does, let’s face it without fear because it will be nothing more than an emotion and illusion; and there will be none that we cannot control.&lt;/p>
&lt;hr />
&lt;h2 id="your-last-day">Your Last Day&lt;/h2>
&lt;p>Who can assure us that we will wake up the next day? With what certainty can we confirm that tomorrow we will wake up to continue our routine? Who would dare to be so unconscious as to ignore these questions?&lt;/p>
&lt;p>How would you like to end your last day? Whom would you like to have in mind?&lt;/p>
&lt;p>Let’s think about that day for a moment. Let’s look back. What can we see? How satisfied are we really? What would we like to have changed? What would we like to have improved? What would we have really liked to do instead of what we did?&lt;/p>
&lt;p>Words are unnecessary due to the great obviousness of what I will write next, but I’m afraid I must reflect it: we should ask ourselves these questions every night before going to sleep. Talk to ourselves, laugh, express ourselves, and listen to ourselves, but above all, understand ourselves. We are who we are, but above all, we have to be who we really want to be.&lt;/p>
&lt;p>No one can assure us that we will wake up the next day. No one can assure us of a tomorrow, except us, our effort, and our willpower. Our last breath will be determined by our actions.&lt;/p>
&lt;p>Everyone can have ideas. More or less brilliant. Even brilliant. But only the few who dare to turn those ideas into reality will be the ones who make a difference.&lt;/p>
&lt;p>Know our duties, perform them, and understand them to feel fulfilled.&lt;/p>
&lt;p>Let’s transcend!&lt;/p>
&lt;hr />
&lt;h2 id="leave-a-mark">Leave a Mark&lt;/h2>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="plain">&lt;span class="giallo-l">&lt;span>It won&amp;#39;t be enough to wish&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>and leave in past days.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>It will only remain if we want,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>even if we continue very tired.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span>Without a posthumous date and waiting,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>without delay... we remain.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>Everything will always come in its time.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>Calm, for we will be.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span>A little more, don&amp;#39;t retire,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>remember those sunny days.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>It is enough just to look:&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>no more erased memories.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span>Look for new challenges to do.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>At late hours, without delay.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>You must seek to be born again;&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>let that moment be now.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span>Feel, grow, die of laughter.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>Live each day dreaming.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>Please, don&amp;#39;t be in a hurry,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>with time everything will change.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span>It is time that keeps us&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>a countdown that endures&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>until our day comes.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>And our word matures.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span>I will conclude as a master said:&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>&amp;quot;The future is something inevitable.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>The sooner we make it ours,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>the sooner it will become kind.&amp;quot;&lt;/span>&lt;/span>&lt;/code>&lt;/pre></content></entry><entry xml:lang="en"><title>Chapter 08: October 2015</title><published>2015-10-01T00:00:00+00:00</published><updated>2015-10-01T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/books/oeur/2015-octubre/"/><id>https://chemaclass.com/books/oeur/2015-octubre/</id><content type="html">&lt;p>&lt;img src="/images/books/oeur/08.jpg" alt="book-chapter" />&lt;/p>
&lt;h2 id="above-good-and-evil">Above Good and Evil&lt;/h2>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="plain">&lt;span class="giallo-l">&lt;span>Above everything possible and impossible.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>Above the real and the fantastic.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>Above dreams, life, and death.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>Above ourselves.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>Above your frustrations and suspicions.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>Above everything you once dreamed and will dream.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>Above your dreams and goals to achieve.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>Above Good and Evil.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span>Above emotions, success, and failure.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>Above sadness and joy.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>Above tears and smiles.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>Above fatigue and euphoria.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>Above time, which consumes us all equally.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>Above learning, which, linked to overcoming,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>drives us to keep growing.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>Above Good and Evil.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;/span>
&lt;span class="giallo-l">&lt;span>Above any forecast.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>Above any thought, whether similar or different.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>Above any difference.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>Above ourselves, Good, and Evil.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>There I will be, and you, if you want, with me.&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;hr />
&lt;h2 id="what-are-we">What are we?&lt;/h2>
&lt;p>Let me take this moment to remember… What do we want to be? A mere illusion of a forgotten memory, or do we want to become a transcendental reality?&lt;/p>
&lt;p>What is our life but a memory of lived moments, of our experiences that, along with our expectations, lead us to a constant illusion of desire: to desire and to be desired? What good is our memory if we cannot remember? What would our mind be for if it couldn’t process? Let’s teach ourselves to think. Let’s create memories!&lt;/p>
&lt;p>A life is useless if not lived; no one will live for us. We must learn, therefore, to use our common sense and to live using the mind and reason.&lt;/p>
&lt;p>Let’s make mistakes! Let’s make a lot of mistakes, but not the same thing. Let’s stumble with as many stones as we want, but let’s not repeat, and if we repeat, let’s do it with a clear head because, otherwise, we will be in an illusion. An illusion that once existed but never again. And there will be no longing or desire for what once was without being; in fact, no one will miss it.&lt;/p>
&lt;p>We are decisions, responsibilities, as well as final results. Everything matters even if there are always different situations, each with its different degree of importance; our obligation will be to conclude with an average above itself. Our commitment will be linked to our experience; our duty, only to us. It is also true that we owe everything to everyone, but especially to ourselves, for our decisions, for being who we are and who we want to be.&lt;/p>
&lt;p>We are the final result without end… until there is one. And then, what will we have been?&lt;/p>
&lt;hr />
&lt;h2 id="memories-of-a-forgotten-memory">Memories of a Forgotten Memory&lt;/h2>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="plain">&lt;span class="giallo-l">&lt;span>I barely have memories of my childhood.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>Memories that faded with time.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>Mention specific moments with nostalgia.&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>Desire to overcome that thing called ego.&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>Let’s start with the end: I am better than ever.&lt;/p>
&lt;p>I wouldn’t want us to feel pity for those days of an unforgiving past, but that doesn’t mean I don’t feel remorse, sorrow for a lost youth, and, above all, for the number of desires that perished along the way.&lt;/p>
&lt;p>In those days, I learned a lot. I learned like no one should learn. I learned how things shouldn’t be done. I learned that there are always different versions of the same situation. I wouldn’t call them points of view but rather realities.&lt;/p>
&lt;p>What is reality if not our illusion of understanding? Why should one situation be more real than another equally true? Reality is nothing more than our perception. Our truth, yes, the one we believe is unique and real, is just another conception of the world.&lt;/p>
&lt;p>And those were years that, luckily, disappeared. They vanished as much as possible, giving way to a new today where I now settle because my mind is wiser than I am and learned to forget all that without my permission. It’s funny because, in part, I feel cared for by myself, and that makes me happy and relieved.&lt;/p>
&lt;p>After my eleventh, a tragedy I couldn’t understand but also couldn’t foresee coming. And by the time I wanted to realize it, I was already thirteen in a basement where everything was too late: latches that prevented our movement and stairs that only went down… toward despair. Day after day filled with uncertainties, sorrow, and longing. Longing for a reality beyond promises and wasted time. Nothing seemed real. Appearances were deceptive.&lt;/p>
&lt;p>A constant and daily emptiness. Waiting for everything to change, to see some green sprout, it didn’t matter where… Everything was insignificant, and that’s how it made me feel.&lt;/p>
&lt;p>“People don’t change,” as well as other unpleasant sentences that I still, “fortunately,” remember.&lt;/p>
&lt;p>The world is full of people of all kinds. At that moment, I couldn’t smile because with so much pressure on my back, sometimes it’s difficult to discern. Let’s keep in mind that we are talking about the period between fourteen and seventeen years old, approximately. I hardly remember anything. As I said before, my mind is wiser than I am. Hopefully, we never have to read this again.&lt;/p>
&lt;p>Let’s finish with the beginning: today, I am better than ever.&lt;/p>
&lt;hr />
&lt;h2 id="i-think-too-much">I Think Too Much&lt;/h2>
&lt;p>I think all the time. I even believe I sometimes think too much. I understand so many obvious things as natural that I am surprised when I perceive that not everyone has the same understanding of what is natural.&lt;/p>
&lt;p>I think so much that I believe I haven’t thought of anything. At least not enough to say that I’ve thought of something because I still have a lot to think about. Exemplify, reason, demonstrate, teach. Everything in a little can be a lot.&lt;/p>
&lt;p>You won’t be the last to read me or the first, but you will have had the luck to have done so, and that is what truly matters. Who am I to write to you, and who are you to read me?&lt;/p>
&lt;p>Nothing is eternal, especially when it is nothing more than a fruit of our illusion, like our dreams or hopes, as well as longings in our desires.&lt;/p>
&lt;p>From an early age, I wanted to know a truth that could not be denied or dismantled. Fed up with so much talk… Now, I simply smile with my happiness for having found one of the most beautiful truths.&lt;/p>
&lt;p>I plan to enjoy this absolute truth: the non-existence of the eternal. Just as I plan to enjoy everything that exists because there is nothing more pleasant than learning to enjoy everything, as well as nothing.&lt;/p>
&lt;p>I don’t believe in anything above man, I don’t believe in anything or anyone above us. Let no one be afraid of their freedom. We are individuals and, at the same time, collective. We can be everything and, even more easily, be nothing. Everything is left to our final choice, and I am clear about mine.&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="plain">&lt;span class="giallo-l">&lt;span>I love early nights&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>and late dawns,&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>exalted in a dream without memory&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span>like an empty memory.&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>I would really like to be read, why else would I write? Perhaps for the simple enjoyment of thinking. Perhaps for the joy in oneself.&lt;/p>
&lt;p>With our dreams and in a dream. A thinker like no other, mortal like everyone.&lt;/p></content></entry><entry xml:lang="en"><title>Chapter 07: September 2015</title><published>2015-09-01T00:00:00+00:00</published><updated>2015-09-01T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/books/oeur/2015-septiembre/"/><id>https://chemaclass.com/books/oeur/2015-septiembre/</id><content type="html">&lt;p>&lt;img src="/images/books/oeur/07.jpg" alt="book-chapter" />&lt;/p>
&lt;h2 id="god-exists-it-s-me-and-so-are-you">God exists: it’s me, and so are you&lt;/h2>
&lt;p>I am an undead. I am alive—more alive than ever! I am a person who likes to have things clear. Character, fair.&lt;/p>
&lt;p>I am a life-loving person, embracing the moment and time, as well as my circumstances. I would never want to be a person idolized by the masses who cannot see beyond their reality.&lt;/p>
&lt;p>I won’t go into details about whether it’s more or less correct to be faithful to one belief or another. Everyone can do what they want—that’s our freedom—but freedom is linked to responsibility. Each becomes responsible for themselves; each one, guard your beliefs, and I will guard mine. Guarding mine means not staying silent when something bothers me, when something is not right in my eyes, or when I believe something doesn’t make sense. Then, I will speak up to try to correct it.&lt;/p>
&lt;p>No malice here; no one has come to discuss good and evil. That’s something everyone can handle on their own. I am against any religion that does not uphold individual human value above all, above any divine entity.&lt;/p>
&lt;p>I argue that we are the greatest. But, beware! This is not valid for anyone who denies their power, their will, and their greatness as a human: their freedom. To all such, I simply wish an enjoyable stay, but nothing more.&lt;/p>
&lt;p>However, to every person who knows or wants to discover their true greatness, to all without exception, my encouragement. Because it is the attitude we choose towards life that truly plays at our forefront, and this is precisely where I wanted to get: the attitude of any God is that of following mediocrity, rejecting our real value and human potential.&lt;/p>
&lt;p>To achieve success, we must have an attitude of personal improvement, not a rise in life to, after death, have an encounter with a supposed God.&lt;/p>
&lt;p>God exists: it’s me, and you will be too if your attitude predisposes it. Because God is nothing more than an idea, a philosophy, an attitude towards life. Believing in a God says a lot about you, says a lot to the world, and says a lot about your attitude.&lt;/p>
&lt;p>My encouragement to anyone who wants to surpass themselves. To every soul that wants to surpass itself one day because it will all be yours, you will be God, and life will truly belong to you.&lt;/p>
&lt;hr />
&lt;h2 id="i-needed-to-dream">I needed to dream&lt;/h2>
&lt;p>I needed to dream because nothing is forever, except what we set out to make so. It won’t be a question then of being right or not; it doesn’t matter here. It’s about setting goals beyond our possibilities. The capacity for self-improvement that we can seemingly demonstrate out of nowhere is impressive. Just as working on another attitude, the more we exercise our will, the greater and more precise it becomes.&lt;/p>
&lt;p>What is normality if not what is previously established by our environment and accepted by the majority as the norm? What is normality? If not, what predisposes us to what has not yet happened? What is normality? If not, what pigeonholes and limits us as beings free of will?&lt;/p>
&lt;p>I needed to dream… and I dreamed, just as I continue to dream every day, hoping to keep doing so until my last breath. I had a dream: to be myself.&lt;/p>
&lt;p>We will make a before and an after. Who knows who this might reach? The best thing about the meaning of life is that it will have the meaning you choose.&lt;/p>
&lt;hr />
&lt;h2 id="the-art-of-thought">The art of thought&lt;/h2>
&lt;p>We could understand philosophy as the purest and most abstract science based on subjectivism, which, instead of providing answers, seeks to find the right questions. To philosophize is to question.&lt;/p>
&lt;p>The purpose of this art should not end with being read. Philosophy should strive to be skeptical and pragmatic. Reading philosophy is healthy. Studying it, if we like or are passionate about it, can provide us with a rich cultural level, but that should never have been its ultimate purpose. The art of thinking did not arise to be read or written. Writing philosophy is useless if we do not contribute any questions. Reading philosophy is useless if we have not equipped ourselves—with new or existing tools—to continue building ourselves because philosophy is useless in itself: we are the ones who will give it the value we consider.&lt;/p>
&lt;p>There is no absolute truth that regulates its importance and value, because something so abstract, how could we quantify it? The value of doubt. There lies its true value: it is doubt itself!&lt;/p>
&lt;p>I dare say that, just as other branches were conceived with the ultimate goal of being read, written, and studied, such as engineering, philosophy did not arise for this same purpose. Philosophy was born, above all, to learn and put into practice questions, to learn to question whether we are really asking the right questions.&lt;/p>
&lt;p>Philosophy did not arise to be engraved on paper or read by others. It arose from the basic needs of our most rational being, from our need for knowledge. Philosophy did not specifically arise to be told but to be lived. Be the one who lives it and then tells it!&lt;/p>
&lt;hr />
&lt;h2 id="being-right">Being right&lt;/h2>
&lt;p>Being right is having arguments that defend and prove our convictions and thoughts. Being right is being able to silence, to leave pride speechless no matter how much it insists by raising its voice. Having solid arguments is synonymous with a clear mind, a mind organized in its firm and solid ideas.&lt;/p>
&lt;p>Because unreason has its days numbered. A house without good foundations is destined to be destroyed by itself. Being right must go beyond simple words or beliefs, as they are useless if our actions are different.&lt;/p>
&lt;p>The complexity of everything must be understood from simplicity to gradually learn to understand everything.&lt;/p>
&lt;p>There are so many possible variants and parameters… that no matter how much we know, it will never be enough. Hence, the importance of demonstration, of reason beyond mere conjectures.&lt;/p>
&lt;p>Defend your interests, but always with arguments, and the day these are not true foundations, I propose to you: destroy them and start again. For building on something rotten…, that’s how it will be established.&lt;/p>
&lt;p>A closed mind where ideas cannot converge is synonymous with failure. A closed place where ideas cannot converge is destined to be forgotten.&lt;/p></content></entry><entry xml:lang="en"><title>Chapter 06: August 2015</title><published>2015-08-01T00:00:00+00:00</published><updated>2015-08-01T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/books/oeur/2015-agosto/"/><id>https://chemaclass.com/books/oeur/2015-agosto/</id><content type="html">&lt;p>&lt;img src="/images/books/oeur/06.jpg" alt="book-chapter" />&lt;/p>
&lt;h2 id="everything-is-stages">Everything is stages&lt;/h2>
&lt;p>We are stages and moments, with their highs and lows, like everything in this life. We are stages and moments. It will depend on our context to understand if we should step firmly or delicately.&lt;/p>
&lt;p>We are moments. Without them, we couldn’t be, directly. We are our personified description. How we face our stages, each different from the other will define us not only for today but for tomorrow, engraved in yesterday.&lt;/p>
&lt;p>We are in stages of constant evolution whose main duty is to define our own direction. We must choose our favorable direction in this journey full of surprises. This journey gives me so much to think about. In this journey that, in the end, constantly gives us so much.&lt;/p>
&lt;p>Moments and stages are so different. Experiences that would deserve to be captured in a song, a drawing, or an image for remembrance. We are on a continuous journey in a sea where the arbitrary tide neither forgives nor has preferences. Being creative, flexible, passionate, and rational will be our duties.&lt;/p>
&lt;p>We cannot guarantee with total certainty which stages we may encounter, but we can define our way of understanding them, starting with ourselves.&lt;/p>
&lt;p>New friendships to discover, new places to visit, new experiences to live…, new moments to tell.&lt;/p>
&lt;hr />
&lt;h2 id="whose-world-is-it">Whose world is it?&lt;/h2>
&lt;p>To whom does the world belong? The world should belong only to those who claim it, to those who fight for it, to those who truly want it. There are those who are just passing through. They don’t expect a better future because they think they don’t need it. They don’t know what to do with their lives or don’t want to know. They are not interested in the world; they just exist. There has to be everything, but the world is not theirs, not as long as they think this way.&lt;/p>
&lt;p>The world should be for the fighters, for those who don’t give up, for those who dream and don’t stop until they achieve their goals, and for those who, even tired, continue in the arena for their improvement. It should be for them to better themselves, as well as their surroundings.&lt;/p>
&lt;p>Whose world is it? For those who aim to find new goals. For restless souls. For those who manage to find a reason for success in their lives. For those who, in the face of all adversities, manage to move forward. For those who, despite all difficulties, manage to seize any moment to learn something new. For those who, instead of spending the whole day complaining, spend it looking for solutions. For those who don’t give up.&lt;/p>
&lt;p>For those who seek to change the world. It belongs to them. The world is theirs.&lt;/p>
&lt;hr />
&lt;h2 id="your-purpose">Your purpose&lt;/h2>
&lt;p>“Let’s be honest: we are nothing. We are the most insignificant thing that has ever existed. We are mediocre by nature. Simple humans. Sometimes even cruel, sometimes unnatural.&lt;/p>
&lt;p>Let’s be honest, we are nothing. We waste time constantly. We are not productive and don’t want to be. We do nothing to solve our problems or to avoid the future that may come.&lt;/p>
&lt;p>Watching time pass, being consumed by it, and we let it pass. Losing day after day without doing anything truly productive, throwing away a whole life, and we are so calm. We have everything within our reach. We really have everything. And we, foolish and stupid, don’t want to change. We don’t dare to act, think, or truly improve as a species.&lt;/p>
&lt;p>We are cowards, and as such, we won’t get anywhere tomorrow. No one will remember our existence, our passage, or our name. We will be what we have decided: nothing. Because that’s what we wanted. It was in our hands to change our destiny day by day, progressively, and now we have what we deserve.&lt;/p>
&lt;p>We are nothing, and in nothing, we will remain.“&lt;/p>
&lt;p>If you identify with any of the previous statements, please reconsider the meaning, as well as the reason and purpose, of your life, for there is nothing sadder than a lack of purpose and nothing more urgent than finding it.&lt;/p>
&lt;hr />
&lt;h2 id="to-the-attempt-i-say">To the attempt, I say&lt;/h2>
&lt;p>Coward, liar, mediocre.&lt;/p>
&lt;p>How do you expect to get different results if you always use the same patterns? Who do you intend to deceive with your intention? You deceive no one but yourself. Stop running away from yourself and face it, stop being just another mediocre.&lt;/p>
&lt;p>Stop deceiving yourself into believing that you tried and couldn’t do more, for it is false, and you are the first to know it. You could always, just as you can do more until your last day. Stop lamenting in the shadows. Go out and face it once and for all! Stop blaming the world for your problems. Go out and solve them!&lt;/p>
&lt;p>Stop hiding among complaints, and stop living in mediocrity. Come out of your hiding place, where you entered a long time ago, and now you don’t dare to leave. “Dare!” I tell you. Because you are the only one who can. My words will remain written; your life will be forgotten.&lt;/p>
&lt;p>Go out! Now! Stand up and stop lamenting. You know alternatives, use them and stop being a fool! I insist!&lt;/p>
&lt;p>To you, I am talking to you. Stand up and learn to live for once! I don’t want more intentions. I want actions and demonstrations!&lt;/p>
&lt;p>To you, who are reading me. I say to you. To you, who come with intentions.&lt;/p></content></entry><entry xml:lang="en"><title>Chapter 05: July 2015</title><published>2015-07-01T00:00:00+00:00</published><updated>2015-07-01T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/books/oeur/2015-julio/"/><id>https://chemaclass.com/books/oeur/2015-julio/</id><content type="html">&lt;p>&lt;img src="/images/books/oeur/05.jpg" alt="book-chapter" />&lt;/p>
&lt;h2 id="actions-and-words">Actions and words&lt;/h2>
&lt;p>I’d dare to think that there is no more significant order than to act according to one’s thoughts as if they were about a young utopia for society. All that we wish for, but only a few make it.&lt;/p>
&lt;p>We are what we do, and we’ll be who we wish to be in the end. Is there anything more beautiful than living the life we dream of? Yes. Following it.&lt;/p>
&lt;p>You agree with yourself on the way, on this adventure called life, in this path, in the end, of phases that are so different. Let’s be wind, water, or fire because when we’re on earth, there will be nothing left but dust and all that we have marked on our way, and that’s when the how and when will resound more than ever. That how and when will be all that will be left of us.&lt;/p>
&lt;p>Let’s be wind: let’s learn to fly and not limit our imagination.
Let’s be water: let’s know to fit in, mold ourselves to our surroundings, and study our ecosystem and its behavior.
Let’s be fire: no obstacle can stop us from reaching our goals. Let’s be because we’ll be only earth and memories when we stop being.&lt;/p>
&lt;p>Life should be measured in instants. Let’s make those part of the memories of those with whom we share those moments.&lt;/p>
&lt;hr />
&lt;h2 id="to-listen-unnoticed">To listen unnoticed&lt;/h2>
&lt;p>Sometimes all we need to do is to listen. To stop, meditate, and observe. In the same way, we need to be heard; we need to listen to the world to comprehend it and show it that we’re with it and the world with us.&lt;/p>
&lt;p>In the same way, I like going unnoticed, but only for the world, not myself. I’m not too fond of the idea of being famous or popular. I prefer anonymous heroes, like those considered crazy in their epoch, mainly because they were different, just because they took other roads.
I like peace and tranquility. I want to enjoy my moments of solitude, reflection, of inner order.&lt;/p>
&lt;p>I like to express myself, mainly when alone, as I have to listen to myself.&lt;/p>
&lt;hr />
&lt;h2 id="what-is-clear">What is clear&lt;/h2>
&lt;p>We all have moments of clarity now and then. I want to record this moment so that, when I forget it, I can remember it or at least read it, never to lose sight of it.&lt;/p>
&lt;p>Many things are still unclear, such as what I have to grow or what needs time to evolve, but there is one that I have clear enough: I would never want to work if forced.&lt;/p>
&lt;p>I’m not a fan of “forced work,” referring to working on something I don’t want. The type of work where I’d have to get up day after day to do something I don’t want to do, do something that doesn’t motivate me or thrill me, that doesn’t complete me or add anything, something that will be left obsolete in the short future, something that I did not choose nor will want to select.&lt;/p>
&lt;p>I don’t want to work. I don’t want a job; I enjoy challenges and continue with non-stop growth. I want to develop myself as an architect and artist in my profession. I want each morning to be a new challenge. I want each sentence I write to be flawless, just as I want to improve it the following day. Because if there is one true thing that needs to be learned with time, no matter how well you do something, it can continuously be enhanced. And it is not at all something negative. On the contrary, that’s the real improvement!&lt;/p>
&lt;p>I don’t like monotony, conformism, or much less. I am in love with time. I try to be with it whenever I can. I try to take a moment to enjoy and innovate with it: to create projects, complete them, improve, turn them completely around, not stop thinking about them, and to use a side thought that sometimes will take them to achieve success.&lt;/p>
&lt;p>It’s all about proposals. To learn three new things each day will make it twenty a week and around ninety a month. Don’t you think it’s worth trying?&lt;/p>
&lt;p>The question is straightforward: if someone before you made it possible, couldn’t you? No doubt it. I will raise the stakes if no one before you has done it. Does that mean that you can’t be the first?
Is everything invented already? We are still working on that. What do you think we do each day other than creating ourselves? Reinvent ourselves, clarify ideas, and order our thoughts. If nothing else, what is clear is what I want to be. And I will be.&lt;/p></content></entry><entry xml:lang="en"><title>Chapter 04: June 2015</title><published>2015-06-01T00:00:00+00:00</published><updated>2015-06-01T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/books/oeur/2015-junio/"/><id>https://chemaclass.com/books/oeur/2015-junio/</id><content type="html">&lt;p>&lt;img src="/images/books/oeur/04.jpg" alt="book-chapter" />&lt;/p>
&lt;h2 id="older-brother">Older brother&lt;/h2>
&lt;p>We must want to be the older brother we would have liked to have. We have to be everything we wanted yesterday so that we can be that tomorrow. We need references, more so when it’s about making way. I wish I had an older brother to look up to, learn from him, and help myself with him by my side.&lt;/p>
&lt;p>It was complicated, but it was no use to live to hide, day after day. I saw myself forced to go out, observe, grow, and fight. I would have liked to have one, especially at those moments that got so complex and complicated. My main reason is to be a role model to my siblings so that they do not have to throw the same things I had to throw.&lt;/p>
&lt;p>I want to be that older brother I would have liked to have. That role model I would have wanted to follow. That one I would have liked to admire. Especially at hard times, helping to avoid any of my brothers and sisters feeling that way, as it is not only about us but about what they make of us. To help us make our way, help us, and give a hand.&lt;/p>
&lt;hr />
&lt;h2 id="the-22-s-end">The 22’s end&lt;/h2>
&lt;p>Today is my last day as a twenty-two-year-old; tomorrow, I’ll be starting to be twenty-three. And it is today that I am completing my twenty-two twenty-two complete years. Starting tomorrow, I’ll start living my twenty-three. People celebrate on the day of their birthdays that they have completed the phase that just ended. In standard terms, I should “celebrate” that I reached twenty-two. However, I prefer the idea of celebrating that I got to the next phase and still have all this time to enjoy. Not my twenty-twos; my twenty-three. My twenty-twos have already been lived. Now I want more.&lt;/p>
&lt;p>It is true that now I will live for twenty-two years, reason enough for joy, but I am more motivated by the idea that I still am, which is essential.&lt;/p>
&lt;p>I have never felt as alive and young as now, and I hope to aim for more with time. Younger and more active. I feel like having birthdays is rejuvenating. Having birthdays is more than the idea; everything comes with them.&lt;/p>
&lt;p>Today is the day I will complete my twenty-two years; tomorrow, I will begin my twenty-third. If you’re reading this, I appreciate it in advance, and with a smile, congratulations. The only thing I ask in exchange is for you to smile back. So do it because it’s never too late to smile.&lt;/p>
&lt;hr />
&lt;h2 id="solitude">Solitude&lt;/h2>
&lt;p>I enjoy having company at its most, but I also appreciate its absence. I love being surrounded by people, but I also need moments alone. When I am always busy with others, I even miss myself. Those moments of solitude in which I talk to myself without giving anyone excuses other than myself—those moments of putting in order, reflection, listening, and silence. Usually, music accompanied me in the background—smiling music, like me.&lt;/p>
&lt;p>Notes and ideas that shout endlessly to the rhythm of memories, ambitions, desires, and the future. Those moments of analysis, recreation, uncertainties, and inspiration. Of wanting to do everything and eagerness to do so.&lt;/p>
&lt;p>Dreams and emotions that still must wait. Enjoying a song, as well as its meaning. Without lyrics, the lyrics will be created by all those thoughts that she will make us remember. All while losing track of time, forgetting everything, and remembering nothing—focusing all our attention on the music’s rhythm, evading everything that could worry us.&lt;/p>
&lt;p>To play to write, disconnect, and connect again. To worry and stop worrying. It’s our minute. Let’s give ourselves a breath. Nothing will happen independently, but it’s also not a mystery from another world. You have to make it happen. Waiting with our arms crossed is of no use. It has never been helpful. That’s why it’s not about wanting to dream but about doing. Here we are to do everything we can and always a little more.&lt;/p>
&lt;p>It’s solitary sometimes, but not alone.&lt;/p>
&lt;hr />
&lt;h2 id="there-are">There are&lt;/h2>
&lt;p>Some lament themselves, and others live.&lt;/p>
&lt;p>Some live in constant fear of life, and others dare to confront it.&lt;/p>
&lt;p>Some only consume their time, and others fight in their realities.&lt;/p>
&lt;p>Some don’t realize the real value they’re throwing away, and others enjoy small details.&lt;/p>
&lt;p>Some don’t dare to dream, and others desire.&lt;/p>
&lt;p>Some have nothing, and others are courageous, uncomplicated, and full of life.&lt;/p>
&lt;p>Some lack sense, and not precisely because of those who have it.&lt;/p>
&lt;p>Some waste their potential on excuses that not even they can believe. And others who take advantage of all their potential to change themselves and, in that way, change the world.&lt;/p>
&lt;p>There are, and there will be, as there always should be a bit of everything: that’s how it is in our nature. The only difference will be: who will we be? Who do we want to be?&lt;/p>
&lt;p>Some find it impossible to smile when they wake up, while others sleep with a smile.&lt;/p>
&lt;p>There are those we wish not to see all day long and those we constantly need by our side.&lt;/p>
&lt;p>Some emit negative energy just through their stare, and those that, when you see them, you can’t avoid smiling innocently due to the joy they share.&lt;/p>
&lt;p>There are, and there will be because it’s in our nature. There will always be a bit of everything, but the question will be: who will you be?&lt;/p>
&lt;hr />
&lt;h2 id="to-create">To create&lt;/h2>
&lt;p>One of the reasons why I love my job is because of the simple fact that I can create something out of nothing, and I think that it is a feeling that is shared in many other professions.&lt;/p>
&lt;p>I like what I do, to feel free within it. To feel accomplished is fundamental in our routine. Creating solutions, solving problems, creating new challenges, and reaching our goals should be our main job.&lt;/p>
&lt;p>I get up each day excited to create and write down each idea, madness, possible solution, and each try in the end. To progress creating and daydreaming. To make all those ideas that were once born from an illusion.&lt;/p>
&lt;p>To establish new challenges, to create more and more. To demonstrate to ourselves the responsibility boundaries of our imagination, proving our enormous power and responsibility. To give something to the world, innovate, show, and not just talk.&lt;/p>
&lt;p>To reveal all that we can create. To prosper in the world, making. These are the reasons why we should love our work.&lt;/p></content></entry><entry xml:lang="en"><title>Chapter 03: May 2015</title><published>2015-05-01T00:00:00+00:00</published><updated>2015-05-01T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/books/oeur/2015-mayo/"/><id>https://chemaclass.com/books/oeur/2015-mayo/</id><content type="html">&lt;p>&lt;img src="/images/books/oeur/03.jpg" alt="book-chapter" />&lt;/p>
&lt;h2 id="on-time">On-time&lt;/h2>
&lt;p>Is there anything more relative than time? A second, a minute, an hour, a day, a pause.&lt;/p>
&lt;p>Like the first time we dreamed of, that moment was like an encounter after that much time. Like that result that we see with satisfaction after our efforts.&lt;/p>
&lt;p>What is time? I see time as our tester — the one that teaches and corrects, the one that involves us directly in life. We could see it frequently as our enemy, like a liar with its absence, but I prefer to see it as a gift and outcome of our patient. We shouldn’t have a reason to have it, yet, there it is, waiting for us.&lt;/p>
&lt;p>Sometimes we wish it would pass. Let’s be us who face time against it and in its favor. Let’s learn; let’s adapt our sail to its wind.&lt;/p>
&lt;p>How much time will it take us to learn to live? The answer is straightforward: an entire life. Therefore, let’s not be afraid to make mistakes. Enjoy each pause, every moment, any instant, all words, every second in which we are genuinely ourselves, to fight against our time.&lt;/p>
&lt;hr />
&lt;h2 id="about-being-worried">About being worried&lt;/h2>
&lt;p>A new day, a further reflection. For her, my days, but above all, my nights.&lt;/p>
&lt;p>Again, tired, shouldn’t we? Of course, we should. Sometimes storms are coming, or at least that’s what we think. We get used to anticipating problems, thinking they are already here, and without noticing, we find them before they start being. That’s when the game begins when it should not.&lt;/p>
&lt;p>Anticipating life is okay, but exaggerating these expectations can lead to mistakes because we can never be sure of our assumptions. We must prepare ourselves for the future but never focus too much on “possible” scenarios that didn’t happen yet. What a stupid idea, though. Thousands of things can happen until then!&lt;/p>
&lt;p>The turns that life gave and will give. The number of variables that govern our surroundings. The number of parameters, possibilities, and opportunities. Those amounts are uncountable!&lt;/p>
&lt;p>There are and should be preoccupations, of course. We must learn to have responsibilities and to worry about them. That’s why I say: “Let’s not allow non-existent ideas to ruin even a second for us!” Let’s anticipate some future, but be careful carrying too much uncertainty. Don’t waste time with unnecessary distractions.&lt;/p>
&lt;p>We already have enough worries with the work-life requirements to be worrying about situations or possible results.&lt;/p>
&lt;p>Get up and face yourself; you can go for it all. Don’t let a false and sad illusion damage a day. Don’t hurry when it’s not necessary. Patience is one of the most tasteful virtues. We need to give ourselves a little time to reflect. Everything will be okay.&lt;/p>
&lt;hr />
&lt;h2 id="each-different-path">Each different path&lt;/h2>
&lt;p>Create, enjoy, imagine, think, dream, and cry for happiness if necessary. Express and be yourself; that’s the most beautiful thing: improvise on each path in life.&lt;/p>
&lt;p>What is our passion? What are we waiting for to make our day-to-day real? Is there anything more natural than ourselves? I don’t think so.&lt;/p>
&lt;p>How many alternatives do we have? How many choices? How many possible paths? Which path will we choose for today? For what will you be remembered today? Today, you can choose. Would you please go out and breathe everything you deserve? Breathe as if there was no tomorrow; enjoy each breath, each sigh.&lt;/p>
&lt;p>Each different path is there as if it were the last. It’s one of the biggest things in our life: the ability to choose. We create our way and enjoy doing it, walking towards everything, without stopping on our journey. Don’t miss out on anything!&lt;/p>
&lt;p>Dream and fight for it. Let’s think that time is in our imagination as an illusion; this is the most beautiful thing. Write for yourself. We are going to a safe port, I am sure.&lt;/p>
&lt;p>We are here to show ourselves what we are worth. That is our most significant duty: beating ourselves. Let’s create our path, something unique that no one could have ever imagined. Can you feel it? It’s you!&lt;/p>
&lt;hr />
&lt;h2 id="on-the-death">On the death&lt;/h2>
&lt;p>If you knew that you would die tomorrow, what would you do today? Would you go to someone? Who would you go somewhere? What would you do on the last day of your life? Do you think you could do something significant? Write? Go out? Think? Sleep until everything happens?&lt;/p>
&lt;p>What if tomorrow you find you have cancer? Would it change your life completely? What if you lost your mother tomorrow? Wouldn’t it change anyway?&lt;/p>
&lt;p>I am only afraid of what can slip through our fingers, of what doesn’t depend on us. We shouldn’t fear death itself, but the fact of not living the life we would have wanted to live. Let’s worry about what is necessary. Please do not live in fear, but don’t forget that she will always lurk.&lt;/p>
&lt;p>What have we done in our life? For what things will we be remembered? Will we be recognized? Do you think you could do something significant today if you died tomorrow? Stupid and fool if you did nothing in your life. Stop feeling sorry for yourself due to your lack of will. Go out and seek your determination to do so! Let’s fight death if necessary.&lt;/p>
&lt;p>Let’s leave foolishness once and for all. Stop not believing in yourself! You are the only one that can fight against yourself!&lt;/p>
&lt;p>You will win. That’s why you’re here. Everything will be fine, as it cannot be any other way. You will make an extraordinary life so that your last day is the least of your problems. And when that day comes – and be sure it will come – it will be the least of your problems. That day should not matter at all compared to all the other ones.&lt;/p>
&lt;p>That day will be the end of your immense phase as Superman of all that you have been. Beyond simple mortality. Beyond an idea or concept. You will be yourself. And then it shall be the day when you will be happiest because you will have lived.&lt;/p>
&lt;p>Be proud when the day comes and you look back and see everything you have created, as not everyone can say the same. Let’s be part of your grandeur, of yourself. Fight against all odds to someday become a &lt;a rel="external" href="https://en.wikipedia.org/wiki/%C3%9Cbermensch">superman&lt;/a>.&lt;/p></content></entry><entry xml:lang="en"><title>Chapter 02: April 2015</title><published>2015-04-01T00:00:00+00:00</published><updated>2015-04-01T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/books/oeur/2015-abril/"/><id>https://chemaclass.com/books/oeur/2015-abril/</id><content type="html">&lt;p>&lt;img src="/images/books/oeur/02.jpg" alt="book-chapter" />&lt;/p>
&lt;h2 id="the-art-of-writing">The art of writing&lt;/h2>
&lt;p>I like to write without thinking about anything. I want to reread myself someday: maybe it’ll help me to understand myself better.&lt;/p>
&lt;p>I am writing to reread it. Could there be something more exciting than being able to talk to yourself and agree?&lt;/p>
&lt;p>Writing is an art where the language itself is the only limit. And what about the beauty of being able to write in other languages? I hope to be able to do that soon. All these years were spent learning languages for machines, and I never thought of learning other languages for people. It was never my strong suit, I always thought. However, now in another country, I can ensure that it’s one of the most beautiful experiences a person can have.&lt;/p>
&lt;p>Starting from the beginning to learn a new language: understanding it from its root, enjoying it, tasting each new word, each new expression.&lt;/p>
&lt;p>Exciting, as if it was a children’s game. Writing is part of a language. I want to read myself. I want to be able to read myself with my eyes closed, the same way I can dream with my eyes open.&lt;/p>
&lt;hr />
&lt;h2 id="of-a-dream">Of a dream&lt;/h2>
&lt;p>I miss my family. Even though I’ll see them in less than 30 days, I consider seeing them twice yearly. And, to be honest, it isn’t easy. Being the oldest of our group makes one, without wanting to, have to be responsible. I need to be a role model.&lt;/p>
&lt;p>After such a dark past, I am happy not to have fallen on any other path that wasn’t this one: my own. It’s not that it would have been easier. Nothing matters here but what there is: a young, happy dreamer, nostalgic and passionate.&lt;/p>
&lt;p>I still wait eagerly to see more rain. Here, in the north of Germany, it is easier for me. I want to see more water falling.&lt;/p>
&lt;p>I wake up each day wanting to continue dreaming. I want to live with passion and smile with my nostalgia, hoping someday to come back and hug my family without setting aside the dream I am fighting.&lt;/p>
&lt;p>I hope to fulfill my goals: I want to move forward. “We are going to make it” is the phrase I repeat to myself the most, making me smile daily. Dreaming isn’t everything but the beginning of an entire life. Holding on to our dreams is the key to success.&lt;/p>
&lt;p>We must learn to move, ask for help when necessary, and try not to stop until we make it. Life must teach us to educate ourselves. We must be our teachers: let’s focus only on the good examples.&lt;/p>
&lt;hr />
&lt;h2 id="doubts">Doubts&lt;/h2>
&lt;p>We must create doubts, questions, and uncertainties because that’s the only way we will find answers. We want to know more and discover new horizons, challenges, adventures, goals, and dreams. The name doesn’t matter. With or without help, but let’s do it. Let’s ask ourselves each day. Never stop doing that!&lt;/p>
&lt;p>Let’s not have faith in anything other than ourselves. Above a possible God and any other life form, this is our own. By luck or disgrace and until proven otherwise, our life is only one, this one. Let’s not waste it living in constant uncertainty or a life in which we can’t find enough joy.&lt;/p>
&lt;p>Each doubt is there to be resolved. From doubt comes actual knowledge and confidence. From doubts, we will be born.&lt;/p>
&lt;p>Let’s doubt everything but not live in constant doubt. Doubt is a philosophy that we must learn to question before affirming. Doubt as a method: not flawless, but productive. Doubt, to clarify, enjoying our decisions.&lt;/p>
&lt;p>Let’s make mistakes. Let’s choose! Let’s ask the world, our family, whomever we want, but above all, ourselves.&lt;/p>
&lt;p>Let’s question ourselves each day as if our life depends on it because it will. And, following the question, let’s give ourselves answers. Let’s contemplate different alternatives as well as their reasons. All the parameters are essential. Let’s study each one’s origin.&lt;/p>
&lt;p>Enjoy because you’ll be learning to live. Make mistakes, learn, live!&lt;/p>
&lt;hr />
&lt;h2 id="on-the-forefront">On the forefront&lt;/h2>
&lt;p>We should live more on the forefront and not so much on the back. Let’s reinvent ourselves and imagine yourself being what you think.&lt;/p>
&lt;p>Who said fear? We should only be afraid of death, not life. Fear of death because it’s something that will come to all of us, luckily or not. It will be something we will all have to face once, twice, and more until it’s our time. Until then, who said fear?&lt;/p>
&lt;p>“We are nothing” or “we are insignificant”: how wrong those phrases are. We are the greatest. We must be so. Live on the forefront, on the first line, discovering ourselves, as well as our surroundings, which are so different from us. As if we lived in other realities.&lt;/p>
&lt;p>We are the most authentic and natural thing that ever existed. Each unit, as its match, makes oneself a piece of art, a unique reality. We are, and that is what matters.&lt;/p>
&lt;p>We understand the reality of making progress each day and learning to fight at the forefront; this is our goal: to shine. It’s enough to listen to a song, read a book, study something that makes us passionate, go out for a run, and think about what motivates us, but let’s not live so much in the rearguard.&lt;/p>
&lt;p>Let’s laugh and grow. We can give so much more of ourselves, and each day is a new chance to demonstrate it. Let’s live at the forefront!&lt;/p>
&lt;p>Let’s show ourselves just how wrong we were not too many years ago, and let’s fight in our reality to shine each day even more. Shine for the world. Shine for us.&lt;/p>
&lt;hr />
&lt;h2 id="on-the-unexpected-and-necessary">On the unexpected and necessary&lt;/h2>
&lt;p>It doesn’t seem very easy. And it might be that way until it ends to notice that it was simply something unexpected —a beautiful journey of experiences and emotions of every kind.&lt;/p>
&lt;p>In the beginning, everything can seem so chaotic, strange, and confusing, but it’s nothing more than something unexpected. It has been a rich experience. Let’s not stay alone at home. The isolation won’t help us; let’s go out for a walk, the fresh air will clear our minds.&lt;/p>
&lt;p>The world is full of unexpected opportunities. We should count life by moments, by those sudden occasions that end up being significant. Our life’s worth is made of the expected moments, as well as the unexpected ones. Both remain so necessary.&lt;/p>
&lt;p>Just thinking of it gives me a sensation of sweetness, as if it were a gift for no reason. Let’s deserve this gift, then. Let’s fight to earn this unexpected and necessary thing in life. Let’s make ourselves deserving of each facility. Let’s take our time, always. But don’t forget that these unexpected will never stop being there.&lt;/p></content></entry><entry xml:lang="en"><title>Chapter 01: March 2015</title><published>2015-03-01T00:00:00+00:00</published><updated>2015-03-01T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/books/oeur/2015-marzo/"/><id>https://chemaclass.com/books/oeur/2015-marzo/</id><content type="html">&lt;p>&lt;img src="/images/books/oeur/01.jpg" alt="book-chapter" />&lt;/p>
&lt;h2 id="in-one-drink">In one drink&lt;/h2>
&lt;p>It is funny to go hand in hand with time, first feeling so many things, so many emotions concentrated instantly, and second, without meaning the same emotions.&lt;/p>
&lt;p>I try not to fall, but it’s impossible: sooner or later, you rush yourself; one way or another, we all must drop. And I will not talk about getting up, not this time. I will talk about understanding reason and understanding ourselves.&lt;/p>
&lt;p>Beyond overcoming things, there is the understanding of the reason. What failed? Why did it fail? It is not a matter of finding someone to blame but to find solutions. Even before doing that, one has to search for the actual reason. Do you think there is none?&lt;/p>
&lt;p>I do not believe in destiny. I do not believe in anything other than the value of each person.&lt;/p>
&lt;p>It is impossible to know everything, and we should not want to. We need to learn how to delegate responsibilities without ever forgetting our own.
We must comprehend and understand ourselves. To be realistic and never lose focus.&lt;/p>
&lt;p>“Don’t miss out on anything. Enjoy, but don’t drink life in a single sip.”
That was one of the most valuable advice my uncles gave me before I parted on this journey.&lt;/p>
&lt;p>Understanding and pursuit. It is never useless to talk to yourself to organize your thoughts and stop them from bringing you down.&lt;/p>
&lt;p>Everything should be born from passion and sanity. Because all love has a minimum sincerity, and sanity is what allows passion to remain alive.&lt;/p>
&lt;p>Everything should be born from sincerity and the desire for passion.&lt;/p>
&lt;hr />
&lt;h2 id="for-the-music">For the music&lt;/h2>
&lt;p>Cold… a bit, but not enough to stop thinking.&lt;/p>
&lt;p>Constantly agitated reforms, but fun. As if it was a game, the most authentic we could play. I raise the volume, breathe, and direct my stare to myself. I don’t see myself. I look for myself, but it’s not me who finds me. I raise the volume.&lt;/p>
&lt;p>I can’t recognize myself. How long has it been? When was the last time we played blithely on the streets? I can’t remember anymore…&lt;/p>
&lt;p>For the music that accompanied me on the rainy days, the sunny ones, the ones filled with tears, and the ones with joy. The soundtrack of the life, of our lives. When was the last time we thanked it for its company?&lt;/p>
&lt;p>That company that listens to us and tucks us in, even on the coldest nights. Naked or dressed, In bed or on a walk. Listen, and you will not be able to escape its charm. We must learn to smile and live in love, but we must listen above all.&lt;/p>
&lt;p>It is the one who writes. Profound, rebellious, furious, relaxed. In constant evolution, with an eagerness to overcome herself. We can find it organized, chaotic, with a smile, with its arms open, and to hold us and not let us go.&lt;/p>
&lt;p>Learn to listen, learn from it, and with it.&lt;/p>
&lt;hr />
&lt;h2 id="the-art-of-learning">The art of learning&lt;/h2>
&lt;p>Daydreaming. Remembering. Thinking about everything that has changed, what will change, what arouses each day, in each proposal we make ourselves, in each breath.&lt;/p>
&lt;p>Get sick, and sick with life. Thinking in the dark. Imagining a dreamy future. A future that, even in our childhood, we feared being too good, an impossible end.&lt;/p>
&lt;p>Just talk. Try it as well as you can; no one is born knowing how to talk. Learn how to talk. Conquer yourself. Get up each day as if it was the last. Some days pass, and when they do, we don’t realize they happened. Don’t allow that. Fall in love with your life and future as you learn to distinguish your reality and see and understand your surroundings and ecosystem.&lt;/p>
&lt;p>Listen to the sun. It’s a reason for joy. Move, give yourself a few minutes a day. Play with your life. Enjoy your growth more and more. Challenge yourself like never before and show yourself how wrong you were not long ago. Compare yourself, always with yourself first. Say yes to everything you can and will, but do not forget to say no.&lt;/p>
&lt;p>Cheer yourself up! Cheer yourself in a way you never have! Grow, dream, live, be. You’re all art, and your lifestyle depends only on you. It’s your attitude that will determine your quality of life.&lt;/p>
&lt;p>Write if necessary; if not, listen to your thoughts. We must organize them frequently, or they will rust. Enjoy it. Enjoy yourself. You are everything and the most significant thing you have. Care for it in a way you would never have imagined years ago.&lt;/p>
&lt;p>You are all art. Form yourself, be patient, and you’ll be talking when you least expect it.&lt;/p>
&lt;p>Cheer yourself up in a way you never have! Dare to smile while learning.&lt;/p>
&lt;hr />
&lt;h2 id="we-are-a-reflection">We are a reflection&lt;/h2>
&lt;p>What do we do each day? Where is the echo of our actions? These are a few of the most exciting questions we can ask ourselves, which almost made me lose my mind back in the day.&lt;/p>
&lt;p>We are a reflection of ourselves. We couldn’t be anything else. Each day is a new opportunity to do everything we still haven’t done and to repeat everything with which we feel complete: our thoughts, crazes, goals, our journey.&lt;/p>
&lt;p>We must transmit to the world everything we want to feel from life. We are our hope and chance. What we do will have an echo, not in eternity, but in our tomorrow. It will respond when we get up each day and look at the world in the eye with a hopeful glance. It will be our reflection, as we are the world.&lt;/p>
&lt;p>Each instant is vital to understand the real sense and ourselves.&lt;/p>
&lt;p>Smiling without reason is pointless, but don’t we have many reasons? Let’s take care of our reasons. It’s our most significant task: to smile with reason. Let’s rise higher than ever. Let’s learn to fly, to dream, not to settle.&lt;/p>
&lt;p>Let’s give ourselves a reflection, a glance, a breath, a “cheer”!&lt;/p>
&lt;p>Let’s reflect on who we want to be. Let’s be unique and essential to ourselves, different, original, and unpredictable.&lt;/p>
&lt;p>Let’s be bright and never stop shining. Let’s fall in love with our image as we are its reflection.&lt;/p></content></entry><entry xml:lang="en"><title>Prologue</title><subtitle>Words from the author, his brother Jesús, and his friend Francisco Javier</subtitle><published>2015-02-01T00:00:00+00:00</published><updated>2015-02-01T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/books/oeur/prologo/"/><id>https://chemaclass.com/books/oeur/prologo/</id><content type="html">&lt;h2 id="by-the-author">By the Author&lt;/h2>
&lt;p>This book is a compilation of brief and personal reflections that I started compiling at the beginning of my new life in a different country, Germany, without any knowledge of German and with a poor level of English. Fortunately, things have changed a lot since then.&lt;/p>
&lt;p>This book was born by itself. It is not a diary nor a manual. It is a compilation where we will experience the mind of someone who would not settle but fight to improve himself.&lt;/p>
&lt;p>The order of the reflections is by the written date; therefore, we can see their evolution, as of their prose and the different expressions. Addressing different and broad subjects is a book with unique ideas that others who don’t know the author (who writes through these sentences) have no reason to identify.&lt;/p>
&lt;p>All this journey has not been made for the reader to like it but for the author. Therefore, I feel invited to get to know myself better.&lt;/p>
&lt;h2 id="by-jesus-valera-reales">By Jesús Valera Reales&lt;/h2>
&lt;p>The book you have in your hands is the work of more than two years of one of the most skilled persons that I have ever met: my brother, José María. The real reason to write this prologue is to put the reader in a situation where, while reading the book, they can understand the context of specific chapters.&lt;/p>
&lt;p>In the year 2004, at the age of 37, our mother passed away. She had a stroke and left my father responsible for raising eight children by himself – the oldest was 13, José María was 11, and the youngest was just 19 days old. We all had to change schools and redo our lives.&lt;/p>
&lt;p>Three years later, he married another woman, who made our lives a living hell. After many discussions with our older sister, who had taken up the responsibility of being “the woman of the house,” she sent her to finish her university-level studies in another city, which she perfectly could have done in ours. By order of age, her next “target” was José María.&lt;/p>
&lt;p>Our father was overwhelmed by what was happening. The encounters between him and us got bigger and bigger until we relegated – all seven of us – to the garage in the duplex where we “lived,” as the backyard of a castle. Additionally, we were utterly forbidden to go upstairs where the main rooms were (kitchen, living room, bathrooms,
and bedrooms) unless it was time to eat or go to sleep, with all the “human necessities” that implies.&lt;/p>
&lt;p>The disagreements with her continued as time passed until my father was forced to decide that we all would return to the flat where we grew up with our mother, our home.&lt;/p>
&lt;p>The repercussions were so severe on José María that he tried to end his life unsuccessfully at a mountain not too long after returning home. That was an inflection point at which he moved on to be our older brother even more. We couldn’t learn much from our mother, but as siblings, we always used to stick with each other, and with him leading by example, to support one another and overcome difficulties together, I owe him a lot.&lt;/p>
&lt;h2 id="by-francisco-javier">By Francisco Javier&lt;/h2>
&lt;p>At the beginning of 2016, I heard of the idea of publishing this book, and when I felt that I “have to” make my contribution so this idea could become a reality. Throughout this time, I have tried to contribute everything I can by offering suggestions and corrections at every possible level.&lt;/p>
&lt;p>There have been many hours of searching, reflecting, and talking (with laughter now and then), trying to help the author to express his ideas in a better way. And all of this under the selflessness behind these 16 years of friendship.&lt;/p>
&lt;p>I want to add to the previous prologue a question that José María asked me one morning at the high school, a few days after they returned to the place where the eight siblings had grown up, “Do you know how it feels like to wake up on a weekend morning, to see it’s raining and to just stay in bed?” It was shocking because, usually, he had to go out anyway.&lt;/p></content></entry><entry xml:lang="en"><title>Chapters</title><subtitle>Full table of contents with all 30 chapters spanning three years</subtitle><published>2015-01-02T00:00:00+00:00</published><updated>2015-01-02T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/books/oeur/indice/"/><id>https://chemaclass.com/books/oeur/indice/</id><content type="html">&lt;ul>
&lt;li>&lt;a href="https://chemaclass.com/books/oeur/prologo/">Prologue&lt;/a>
&lt;ul>
&lt;li>From the Author&lt;/li>
&lt;li>By Jesús Valera Reales&lt;/li>
&lt;li>By Francisco Javier&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="2015">2015&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="https://chemaclass.com/books/oeur/2015-marzo/">Chapter 1: March&lt;/a>
&lt;ul>
&lt;li>In one drink&lt;/li>
&lt;li>For music&lt;/li>
&lt;li>The art of learning&lt;/li>
&lt;li>We are a reflection&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://chemaclass.com/books/oeur/2015-abril/">Chapter 2: April&lt;/a>
&lt;ul>
&lt;li>The art of writing&lt;/li>
&lt;li>From a dream&lt;/li>
&lt;li>Doubts&lt;/li>
&lt;li>At the forefront&lt;/li>
&lt;li>To the unexpected and necessary&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://chemaclass.com/books/oeur/2015-mayo/">Chapter 3: May&lt;/a>
&lt;ul>
&lt;li>At time&lt;/li>
&lt;li>Of concern&lt;/li>
&lt;li>Each different path&lt;/li>
&lt;li>On the death&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://chemaclass.com/books/oeur/2015-junio/">Chapter 4: June&lt;/a>
&lt;ul>
&lt;li>Older brother&lt;/li>
&lt;li>The 22’s end&lt;/li>
&lt;li>Solitaire&lt;/li>
&lt;li>There are&lt;/li>
&lt;li>To create&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://chemaclass.com/books/oeur/2015-julio/">Chapter 5: July&lt;/a>
&lt;ul>
&lt;li>Actions and words&lt;/li>
&lt;li>To listen unnoticed&lt;/li>
&lt;li>What is clear&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://chemaclass.com/books/oeur/2015-agosto/">Chapter 6: August&lt;/a>
&lt;ul>
&lt;li>Everything is stages&lt;/li>
&lt;li>Whose world is it?&lt;/li>
&lt;li>Your sense&lt;/li>
&lt;li>To the intention, I say&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://chemaclass.com/books/oeur/2015-septiembre/">Chapter 7: September&lt;/a>
&lt;ul>
&lt;li>God exists: it’s me, and you too&lt;/li>
&lt;li>I needed to dream&lt;/li>
&lt;li>The art of thinking&lt;/li>
&lt;li>Be right&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://chemaclass.com/books/oeur/2015-octubre/">Chapter 8: October&lt;/a>
&lt;ul>
&lt;li>Above good and evil&lt;/li>
&lt;li>What are we?&lt;/li>
&lt;li>Memories of a forgotten memory&lt;/li>
&lt;li>I believe I think too much&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://chemaclass.com/books/oeur/2015-noviembre/">Chapter 9: November&lt;/a>
&lt;ul>
&lt;li>To the motive&lt;/li>
&lt;li>My project, our project&lt;/li>
&lt;li>To the needed mediocrity&lt;/li>
&lt;li>Your last day&lt;/li>
&lt;li>Leaving a mark&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://chemaclass.com/books/oeur/2015-diciembre/">Chapter 10: December&lt;/a>
&lt;ul>
&lt;li>The art of adapting&lt;/li>
&lt;li>We will die&lt;/li>
&lt;li>Sudden emotions&lt;/li>
&lt;li>It’s not life&lt;/li>
&lt;li>The problem with Christmas&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="2016">2016&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="https://chemaclass.com/books/oeur/2016-enero/">Chapter 11: January&lt;/a>
&lt;ul>
&lt;li>Ambition in a dream&lt;/li>
&lt;li>I resign to God&lt;/li>
&lt;li>My purposes&lt;/li>
&lt;li>Sometimes&lt;/li>
&lt;li>Eyes on a memory&lt;/li>
&lt;li>Where success starts&lt;/li>
&lt;li>Fed up&lt;/li>
&lt;li>Ironies of life&lt;/li>
&lt;li>What not to die&lt;/li>
&lt;li>Tired&lt;/li>
&lt;li>My skin bristles&lt;/li>
&lt;li>Necessary insecurity&lt;/li>
&lt;li>Not enough&lt;/li>
&lt;li>I am not&lt;/li>
&lt;li>On another level&lt;/li>
&lt;li>Precisely&lt;/li>
&lt;li>It says a lot about you&lt;/li>
&lt;li>Whimsical fate&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://chemaclass.com/books/oeur/2016-febrero/">Chapter 12: February&lt;/a>
&lt;ul>
&lt;li>Travel to our encounter&lt;/li>
&lt;li>Unforgivable youth&lt;/li>
&lt;li>Religion&lt;/li>
&lt;li>Definitely&lt;/li>
&lt;li>Turns and rounds&lt;/li>
&lt;li>So easy&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://chemaclass.com/books/oeur/2016-marzo/">Chapter 13: March&lt;/a>
&lt;ul>
&lt;li>It becomes more noticeable&lt;/li>
&lt;li>It is when&lt;/li>
&lt;li>On the mountain&lt;/li>
&lt;li>To taste&lt;/li>
&lt;li>Hatred towards God&lt;/li>
&lt;li>And it won’t be enough&lt;/li>
&lt;li>The complexity of obligation&lt;/li>
&lt;li>We will miss&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://chemaclass.com/books/oeur/2016-abril/">Chapter 14: April&lt;/a>
&lt;ul>
&lt;li>To pretend or to be&lt;/li>
&lt;li>So many&lt;/li>
&lt;li>Constants&lt;/li>
&lt;li>Let us talk again&lt;/li>
&lt;li>It is time to&lt;/li>
&lt;li>What could it be?&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://chemaclass.com/books/oeur/2016-mayo/">Chapter 15: May&lt;/a>
&lt;ul>
&lt;li>At the end&lt;/li>
&lt;li>Having lost&lt;/li>
&lt;li>Are we really?&lt;/li>
&lt;li>History&lt;/li>
&lt;li>Numbers&lt;/li>
&lt;li>Trying to understand ourselves&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://chemaclass.com/books/oeur/2016-junio/">Chapter 16: June&lt;/a>
&lt;ul>
&lt;li>What if?&lt;/li>
&lt;li>Who will remember us?&lt;/li>
&lt;li>A matter of time&lt;/li>
&lt;li>Starting the 23&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://chemaclass.com/books/oeur/2016-julio/">Chapter 17: July&lt;/a>
&lt;ul>
&lt;li>Understanding&lt;/li>
&lt;li>Eternal return&lt;/li>
&lt;li>Disposition&lt;/li>
&lt;li>While time passes by&lt;/li>
&lt;li>Some&lt;/li>
&lt;li>The hardest&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://chemaclass.com/books/oeur/2016-agosto/">Chapter 18: August&lt;/a>
&lt;ul>
&lt;li>Being myself again&lt;/li>
&lt;li>With different eyes&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://chemaclass.com/books/oeur/2016-septiembre/">Chapter 19: September&lt;/a>
&lt;ul>
&lt;li>You only live once&lt;/li>
&lt;li>Young and innocent&lt;/li>
&lt;li>Finishing to start&lt;/li>
&lt;li>Tomorrow&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://chemaclass.com/books/oeur/2016-octubre/">Chapter 20: October&lt;/a>
&lt;ul>
&lt;li>Entropy&lt;/li>
&lt;li>The future&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://chemaclass.com/books/oeur/2016-noviembre/">Chapter 21: November&lt;/a>
&lt;ul>
&lt;li>Sweet Memories&lt;/li>
&lt;li>Even when&lt;/li>
&lt;li>Our biggest mistake&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://chemaclass.com/books/oeur/2016-diciembre/">Chapter 22: December&lt;/a>
&lt;ul>
&lt;li>Slave of death&lt;/li>
&lt;li>Singularities&lt;/li>
&lt;li>Education&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="2017">2017&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="https://chemaclass.com/books/oeur/2017-enero/">Chapter 23: January&lt;/a>
&lt;ul>
&lt;li>False freedom&lt;/li>
&lt;li>Living busy&lt;/li>
&lt;li>The importance&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://chemaclass.com/books/oeur/2017-febrero/">Chapter 24: February&lt;/a>
&lt;ul>
&lt;li>Our life&lt;/li>
&lt;li>Habits&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://chemaclass.com/books/oeur/2017-marzo/">Chapter 25: March&lt;/a>
&lt;ul>
&lt;li>The truth&lt;/li>
&lt;li>Endless&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://chemaclass.com/books/oeur/2017-abril/">Chapter 26: April&lt;/a>&lt;/li>
&lt;li>Chapter 26: April
&lt;ul>
&lt;li>The value&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://chemaclass.com/books/oeur/2017-mayo/">Chapter 27: May&lt;/a>
&lt;ul>
&lt;li>Masked mediocrity&lt;/li>
&lt;li>Trend&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://chemaclass.com/books/oeur/2017-junio/">Chapter 28: June&lt;/a>
&lt;ul>
&lt;li>Perceptions&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://chemaclass.com/books/oeur/2017-julio/">Chapter 29: July&lt;/a>
&lt;ul>
&lt;li>I am not talking about self-help&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="2025">2025&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="https://chemaclass.com/books/oeur/2025-diciembre/">Chapter 30: December&lt;/a>
&lt;ul>
&lt;li>Nine Branches&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul></content></entry><entry xml:lang="en"><title>About this book</title><subtitle>The story behind the book, the author, and the team that made it possible</subtitle><published>2015-01-01T00:00:00+00:00</published><updated>2015-01-01T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/books/oeur/acerca-de-este-libro/"/><id>https://chemaclass.com/books/oeur/acerca-de-este-libro/</id></entry></feed>