<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ leadership - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Browse thousands of programming tutorials written by experts. Learn Web Development, Data Science, DevOps, Security, and get developer career advice. ]]>
        </description>
        <link>https://www.freecodecamp.org/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ leadership - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Wed, 27 May 2026 20:46:40 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/news/tag/leadership/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ How to Unblock Your AI PR Review Bottleneck: A Tech Lead’s Guide to Building a Codebase-Aware Reviewer ]]>
                </title>
                <description>
                    <![CDATA[ A few months ago, I was reviewing a pull request that added three new API endpoints. The diff was clean. Tests passed. The agent that generated it had even written sensible authorisation checks. By ev ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-unblock-ai-pr-review-bottleneck-handbook/</link>
                <guid isPermaLink="false">69f906a346610fd60629a300</guid>
                
                    <category>
                        <![CDATA[ AI ]]>
                    </category>
                
                    <category>
                        <![CDATA[ software development ]]>
                    </category>
                
                    <category>
                        <![CDATA[ code review ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Productivity ]]>
                    </category>
                
                    <category>
                        <![CDATA[ leadership ]]>
                    </category>
                
                    <category>
                        <![CDATA[ handbook ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Qudrat Ullah ]]>
                </dc:creator>
                <pubDate>Mon, 04 May 2026 20:50:43 +0000</pubDate>
                <media:content url="https://cdn.hashnode.com/uploads/covers/5e1e335a7a1d3fcc59028c64/c94dff21-66d0-4256-bf3e-25c1978364d9.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>A few months ago, I was reviewing a pull request that added three new API endpoints. The diff was clean. Tests passed. The agent that generated it had even written sensible authorisation checks. By every signal I usually rely on, it was ready to merge.</p>
<p>The problem only showed up when I checked which authentication middleware the agent had imported.</p>
<p>Our codebase had two: a v1 middleware backed by MongoDB and a v2 middleware backed by MySQL, which we had spent the previous quarter migrating.</p>
<p>New endpoints were supposed to use v2. The agent had used v1 for all three. Tests passed because user records still existed in both databases (that was the point of the migration), and the v1 middleware happily authenticated them. The code worked. But every new endpoint we shipped was reinforcing the legacy auth path we had just spent a quarter trying to retire.</p>
<p>I caught it on the second read. Twenty minutes after the comments, the engineer fixed it and reopened the PR. The third reviewer probably wouldn't have caught it. The migration timeline lived in a Slack thread from six months earlier. The rule that "new endpoints use v2" lived in my head.</p>
<p>This kind of catch is the slow-burn version of why AI changed my job as a tech lead. Code generation got faster. My review queue got longer. The hardest reviews were the ones where everything looked right, and the only thing wrong was something that lived in the team's collective memory rather than in the diff.</p>
<p>This handbook is about what we did to fix that. It's the story of how we went from drowning in clean-looking PRs to running a custom AI PR reviewer that catches a meaningful share of these mistakes before any human is pulled in. The fix turned out to be less about buying a better tool and more about moving the team's memory into a place the AI could actually read.</p>
<p>The lessons should transfer whether your team uses Claude Code, Cursor, Cline, GitHub Copilot, or any combination. The structure matters more than the tool.</p>
<h2 id="heading-table-of-contents">Table of Contents</h2>
<ul>
<li><p><a href="#heading-the-old-bottleneck-and-the-one-ai-created">The Old Bottleneck, and the One AI Created</a></p>
</li>
<li><p><a href="#heading-what-the-new-review-work-actually-looks-like">What the New Review Work Actually Looks Like</a></p>
</li>
<li><p><a href="#heading-why-i-did-not-just-buy-a-tool">Why I Did Not Just Buy a Tool</a></p>
</li>
<li><p><a href="#heading-the-realisation-move-the-rules-into-the-codebase">The Realisation: Move the Rules Into the Codebase</a></p>
</li>
<li><p><a href="#heading-two-files-that-changed-everything-agentsmd-and-claudemd">Two Files That Changed Everything: AGENTS.md and CLAUDE.md</a></p>
</li>
<li><p><a href="#heading-where-per-service-memory-files-earn-their-keep">Where Per-Service Memory Files Earn Their Keep</a></p>
</li>
<li><p><a href="#heading-what-this-looks-like-on-disk">What This Looks Like on Disk</a></p>
</li>
<li><p><a href="#heading-generated-documentation-as-a-side-effect">Generated Documentation as a Side Effect</a></p>
</li>
<li><p><a href="#heading-building-the-pr-review-command">Building the PR Review Command</a></p>
</li>
<li><p><a href="#heading-guardrails-read-only-by-default">Guardrails: Read-Only by Default</a></p>
</li>
<li><p><a href="#heading-the-compounding-loop-that-made-the-real-difference">The Compounding Loop That Made the Real Difference</a></p>
</li>
<li><p><a href="#heading-starting-from-zero-on-an-existing-project">Starting From Zero on an Existing Project</a></p>
</li>
<li><p><a href="#heading-what-still-needs-human-review">What Still Needs Human Review</a></p>
</li>
<li><p><a href="#heading-a-two-week-setup-plan">A Two-Week Setup Plan</a></p>
</li>
<li><p><a href="#heading-what-is-working-what-i-am-still-improving">What Is Working, What I Am Still Improving</a></p>
</li>
<li><p><a href="#heading-sources">Sources</a></p>
</li>
</ul>
<h2 id="heading-the-old-bottleneck-and-the-one-ai-created">The Old Bottleneck, and the One AI Created</h2>
<p>To understand why this fix was needed, it helps to remember what reviewing code looked like a couple of years ago.</p>
<p>Back then, the slow part was upstream of the PR. A ticket would land, and before anyone could open a branch, there was a long preamble of context-gathering.</p>
<p>Junior engineers needed time to understand what the change was for. Senior engineers had to explain business rules and architectural decisions. Tickets sat in "ready" columns for days while someone with the right context made themselves available. Then the writing itself took time, because typing real code is slower than typing comments about it.</p>
<p>That bottleneck mostly dissolved when the team got serious about AI-assisted development. Engineers used the agent to read the codebase, ask clarifying questions, draft an implementation plan, and produce a working branch in hours instead of days. Tickets moved through the queue faster. Junior engineers shipped more without blocking on senior availability. From the outside, this looked like an unambiguous win.</p>
<p>But the bottleneck didn't disappear. It moved.</p>
<p>Within a few weeks of widespread AI adoption, my review queue had doubled. Then tripled. Engineers were opening PRs faster than I could read them.</p>
<p>The PRs themselves looked clean: well-formatted, with sensible variable names, passing tests, and AI-generated descriptions that read better than most human-written ones.</p>
<p>On the surface, this was great. In practice, it was creating a different kind of pain. I was the senior engineer who knew which patterns mattered and which paths through the codebase were the right ones, and I was the bottleneck. The team's velocity was now capped by my reading speed.</p>
<p>The CircleCI 2026 State of Software Delivery report confirmed I was not alone. Drawing on more than 28 million CI workflow runs across over 22,000 organisations, the report showed feature branch throughput had grown 59% year over year, the largest jump CircleCI had ever measured. Main branch throughput, where code actually gets promoted to production, fell by 7% for the median team in the same period. Build success rates dropped to 70.8%, the lowest in five years.</p>
<p>The pattern was consistent across the industry. AI accelerated writing. The rest of the system absorbed the cost.</p>
<p>So the question for me, as a tech lead, became concrete: how do I unblock myself without lowering the bar?</p>
<h2 id="heading-what-the-new-review-work-actually-looks-like">What the New Review Work Actually Looks Like</h2>
<p>Before I explain the fix, it helps to know what kinds of issues were actually piling up. They weren't the dramatic kind. None of them would crash production. They were small, recurring, and looked plausible at a glance.</p>
<p>Take the simplest case I kept catching. An engineer would ask the agent to add a delete button on a new screen. The button needed to call our existing backend delete endpoint. Instead of reusing the hook the team already had for that endpoint, the agent would write the fetch call inline.</p>
<p>The code worked. The tests passed. But a week later, when someone changed the backend response shape, only one of the two call sites got updated.</p>
<p>That kind of duplication doesn't show up in a code review unless the reviewer happens to remember that a hook exists.</p>
<p>Another example I saw constantly: the agent comparing a status field against the literal string <code>"completed"</code> instead of using the <code>Status.Completed</code> enum that the rest of the services used. The code ran. The tests ran. The next refactor of the enum quietly skipped the file. After a few days, someone would spend half a day debugging a state machine that was working fine until the agent's literal silently fell out of sync.</p>
<p>These were two-minute fixes once spotted, but spotting them took me a reasonable time per PR. The friction wasn't the difficulty. It was the repetition.</p>
<p>The pattern repeated across larger problems, too.</p>
<p>I once asked an agent to build an event creation wizard. The wizard needed several dropdowns and one new component.</p>
<p>We have a design system folder where shared UI components live, and the rule on the team is simple: check there first, and if you build something new, register it there.</p>
<p>The agent had no way to know that. It only loaded the wizard's own files, so it never opened the design system folder. It generated brand new dropdowns inline, with APIs that were almost identical to the ones we already had. The new component went straight into the wizard rather than into the design system. CI passed. The wizard worked. We caught the duplication in human review, but it was the kind of catch that depended entirely on a reviewer who happened to know the design system existed.</p>
<p>The same pattern hit in one of the repos I was looking at for backend architecture. Backend follows a strict four-layer pattern: route, controller, app, repo. Controllers must never call repository functions directly. That rule keeps authorisation centralised, business logic testable, and database concerns isolated.</p>
<p>One PR I reviewed had the agent calling repo functions straight from a controller, skipping the app layer entirely. The code worked. The tests passed because the agent had also written tests against the new shape. But it broke a discipline the team had spent years building. If that PR had landed, the next AI-assisted PR could have used it as a template, and the layering would have eroded one diff at a time.</p>
<p>The common thread is that all of these mistakes had something written down somewhere, in code, in a Slack thread, in a senior engineer's head, that would have prevented them. The information existed. The agent just couldn't see it.</p>
<h2 id="heading-why-i-did-not-just-buy-a-tool">Why I Did Not Just Buy a Tool</h2>
<p>The obvious next move was to install one of the AI PR reviewers that flooded the market in 2026.</p>
<p>I evaluated several. Anthropic launched Claude Code Review in March 2026, billed on token usage and averaging \(15 to \)25 per review. CodeRabbit Pro charges \(24 per developer per month on annual billing, or \)30 per developer per month on monthly billing, with seats counted against developers who actually open PRs. Greptile in March 2026 moved to a base-plus-usage model at $30 per seat per month, including 50 reviews, after which each additional review costs a dollar. GitHub announced that all Copilot plans will transition to usage-based billing on June 1, 2026, with code reviews consuming both AI Credits and GitHub Actions minutes from that date.</p>
<p>For a small team with low PR volume, none of these is a dealbreaker. For a larger team running heavy AI-assisted development, the costs compound fast. A 10-person team running five PRs each per day blows through Greptile's included reviews in a single week. CodeRabbit Pro at \(24 per seat scales linearly with developers. The premium Claude Code Review at \)15 to $25 per PR is the most expensive option per review by an order of magnitude.</p>
<p>I looked at the cost numbers, but cost wasn't actually the deciding factor. The deciding factor was that none of these tools would have caught the problems I just listed.</p>
<p>A generic reviewer wouldn't have caught the v1/v2 middleware. It had no way to know v2 was the canonical path. A generic reviewer wouldn't have caught the duplicate dropdowns. It had no way to know our design system existed. A generic reviewer wouldn't have caught the bypassed architecture. It had no way to know that controllers must not call repositories.</p>
<p>The information that lets a reviewer flag any of these is exactly the information that lives in the team's head, not in any tool's default prompt.</p>
<p>The better-rated tools support custom rules, and that's where I started to see the real shape of the problem. Once you are configuring custom rules, you've already accepted that the value is in the rules. The tool is just whatever runs them.</p>
<p>This raised a different question: if the rules are the product, why pay per seat or per review for someone else's wrapper around them?</p>
<p>This is what made me change direction.</p>
<h2 id="heading-the-realisation-move-the-rules-into-the-codebase">The Realisation: Move the Rules Into the Codebase</h2>
<p>Once I started thinking of the rules as the product, the path forward got clearer.</p>
<p>I asked myself a simple question: what was I actually doing in code review that the AI was not? The answer turned out to be the same thing, over and over. I was typing review comments that captured a piece of the team's memory.</p>
<p>"Use the Status enum, not a string literal." "There is already a hook for this in <code>/hooks/useDeleteItem</code>." "Controllers must not import from the repo layer; route this through the app layer." "Check the design system folder before creating new components."</p>
<p>Each of those comments was knowledge that lived in my head and arrived in the codebase one PR comment at a time. None of it was available to the agent the next time it generated a similar PR.</p>
<p>So the fix was not to buy a smarter reviewer. The fix was to write the rules down in a place every agent on the team would read before any review happened.</p>
<p>If I had typed "use the enum, not a literal" three times in three different PRs, that was a rule the agent should know about from now on. If I had pointed at the design system folder for the fourth time, that was a rule. If I had explained the four-layer architecture twice in PR comments, that was a rule.</p>
<p>I needed somewhere to put these rules. That turned out to be a less obvious decision than I expected.</p>
<h2 id="heading-two-files-that-changed-everything-agentsmd-and-claudemd">Two Files That Changed Everything: AGENTS.md and CLAUDE.md</h2>
<p>If you start looking into how to give an AI agent a persistent project context, you run into two competing conventions almost immediately.</p>
<p>The first is <strong>AGENTS.md</strong>, an open standard that has gathered real momentum. According to InfoQ, by mid-2025, the format had already been adopted by more than 20,000 GitHub repositories and was being positioned as a complement to traditional documentation: machine-readable context that lives alongside human-facing files like README.md.</p>
<p>The standard's own site reports it is now used by more than 60,000 open-source projects and has moved to stewardship under the Agentic AI Foundation, which sits inside the Linux Foundation. The format is supported by OpenAI Codex, GitHub Copilot, Google Gemini, Cursor, and Windsurf, among others.</p>
<p>The second is <strong>CLAUDE.md</strong>, which is Anthropic's convention for Claude Code. The Claude Code documentation describes two complementary memory systems: CLAUDE.md, where you write the persistent context yourself, and an auto-memory mechanism that lets Claude save its own notes from corrections and observed patterns. By default, Claude Code reads CLAUDE.md, not AGENTS.md.</p>
<p>This split mattered for us because half the team uses Claude Code and the other half uses Cursor. We had two practical options: maintain both files with the same content (and accept the duplication), or symlink one filename to the other so both ecosystems read the same source of truth. We went with the symlink. It's one less thing to drift.</p>
<p>The next question was what to actually put in the file. After a few iterations, here's the shape that worked. Think of it as a briefing document for a new engineer who has read no code and seen no Slack threads. The minimum content was:</p>
<ul>
<li><p>The tech stack (languages, frameworks, package manager)</p>
</li>
<li><p>The project structure, especially important for our monorepo</p>
</li>
<li><p>Where shared utilities, components, and helpers live, and the rule that new code should reuse them before creating new versions</p>
</li>
<li><p>Architectural patterns the project follows, with file path examples</p>
</li>
<li><p>Anti-patterns and what to do instead</p>
</li>
<li><p>Test conventions and where good examples live</p>
</li>
<li><p>Pointers to deeper documentation when more detail is needed</p>
</li>
</ul>
<p>Two practical rules emerged from the first month of using these files.</p>
<p><strong>Keep them lean:</strong> There is a counterintuitive failure mode with long instruction lists: the agent doesn't just skip the new ones at the bottom. The average compliance across all of them drops. A bloated memory file becomes a memory file that the agent skims. If a section runs more than a paragraph or two, move it to a separate document and link to it.</p>
<p><strong>Phrase rules as imperatives, not aspirations:</strong> "Controllers must not call repositories. Route through the app layer." beats "Try to keep controllers thin." The first is testable. The second is decorative.</p>
<p>That was the entry point. But a single root-level file was not enough for a monorepo with multiple services and frontends, which led to the next decision.</p>
<h2 id="heading-where-per-service-memory-files-earn-their-keep">Where Per-Service Memory Files Earn Their Keep</h2>
<p>A single <code>AGENTS.md</code> at the root of a monorepo collapses under its own weight pretty quickly. Each service in our codebase has its own architecture, conventions, and business rules. Trying to fit all of that into one file produced a long document that the agent treated as background noise, and we were back to the bloat problem from the previous section.</p>
<p>The pattern that worked: every service or app gets its own <code>AGENTS.md</code> at its root, and the project-level <code>AGENTS.md</code> becomes an index that points to them.</p>
<p>A per-service <code>AGENTS.md</code> covers things like:</p>
<ul>
<li><p>The architecture for this service (the four-layer pattern, the directory layout)</p>
</li>
<li><p>Naming conventions specific to this service</p>
</li>
<li><p>Test patterns and where good examples live</p>
</li>
<li><p>Business rules that this service is responsible for</p>
</li>
<li><p>Inter-service contracts and what other services consume from this one</p>
</li>
<li><p>Pointers to deeper docs in <code>docs/</code></p>
</li>
<li><p>A "Lessons learned" section, which I'll come back to in the section on the compounding loop</p>
</li>
</ul>
<p>The same lean rule applies. Keep it short, point at examples, and phrase guidance as imperatives.</p>
<p>The reason this works mechanically is that the agent loads the right files for the work at hand. When an engineer asks the agent to change something in <code>backend/</code>, the agent reads the project-level <code>AGENTS.md</code>, sees that work in <code>backend/</code> should be guided by <code>backend/AGENTS.md</code>, and loads that file. It doesn't load the frontend's <code>AGENTS.md</code>, because that work is somewhere else. The context window stays focused on what's relevant.</p>
<p>Without this split, you have two bad options. Either you put everything in the root file, where the agent ignores most of it, or you put nothing in the root file, where the agent has no team context at all. The per-service split gives you both depth and signal.</p>
<p>But these files only work if the deeper docs they point to actually exist, which is where the next piece of the system came in.</p>
<h2 id="heading-what-this-looks-like-on-disk">What This Looks Like on Disk</h2>
<p>Before going further, it helps to see the whole structure laid out. Here's the shape we settled on for our monorepo. The exact folder names follow Claude Code's conventions. If you use Cursor, it would be <code>.cursor/</code>, and if you use Cline, it would be <code>.clinerules</code> – but the shape transfers directly.</p>
<pre><code class="language-plaintext">project-root/
├── AGENTS.md                       # symlink to CLAUDE.md
├── CLAUDE.md                       # root memory file
├── README.md                       # human-facing project readme
│
├── .claude/                        # tool-specific config folder
│   ├── README.md                   # explains the .claude/ layout
│   ├── settings.json               # permissions and guardrails
│   ├── agents/                     # specialised subagents (optional)
│   ├── commands/                   # slash commands engineers run
│   │   ├── review-pr.md            # the PR review command
│   │   └── plan-feature.md         # implementation plan command
│   ├── hooks/                      # lifecycle hooks (optional)
│   ├── pr-rules/                   # rule files for PR review
│   │   ├── common.md               # rules that apply to every PR
│   │   ├── frontend.md             # rules for frontend changes
│   │   ├── backend.md              # rules for backend changes
│   │   ├── service-a.md            # rules for service-a
│   │   └── service-b.md            # rules for service-b
│   └── skills/                     # reusable workflows
│
├── frontend/
│   ├── AGENTS.md                   # frontend conventions
│   ├── docs/
│   │   ├── overview.md
│   │   ├── architecture.md         # routing, state, data layer
│   │   ├── design-system.md        # design system reference
│   │   └── testing.md              # test conventions
│   └── src/
│
├── backend/
│   ├── AGENTS.md                   # the four-layer pattern
│   ├── docs/
│   │   ├── overview.md
│   │   ├── architecture.md         # route -&gt; controller -&gt; app -&gt; repo
│   │   ├── auth.md                 # v1 vs v2 middleware
│   │   ├── business-rules.md
│   │   └── integrations.md
│   └── src/
│
├── service-a/
│   ├── AGENTS.md
│   ├── docs/
│   │   ├── overview.md
│   │   ├── business-rules.md
│   │   └── integrations.md
│   └── src/
│
└── service-b/
    ├── AGENTS.md
    ├── docs/
    │   ├── overview.md
    │   ├── business-rules.md
    │   └── integrations.md
    └── src/
</code></pre>
<p>A few things worth pointing out:</p>
<p>The <code>.claude/</code> folder uses standard subfolder names: <code>commands</code>, <code>agents</code>, <code>hooks</code>, <code>skills</code>. These follow Claude Code's plugin model, but most modern AI coding tools have similar slots. Following the conventions makes the structure recognisable to anyone on the team and lowers the cost of switching tools later.</p>
<p>The <code>pr-rules/</code> folder isn't a standard convention. It's a folder we created to hold per-area review rules that the PR review command loads selectively. You don't have to call it <code>pr-rules</code> – the name matters less than having one place where review rules live.</p>
<p>Each service has its own <code>AGENTS.md</code> plus a <code>docs/</code> folder. The root <code>AGENTS.md</code> is short and acts as an index. It tells the agent things like "if you touch files in <code>backend/</code>, also read <code>backend/AGENTS.md</code> first." The per-service file then points at the deeper docs as needed.</p>
<h2 id="heading-generated-documentation-as-a-side-effect">Generated Documentation as a Side Effect</h2>
<p>Setting up per-service <code>AGENTS.md</code> files surfaced a problem I had been quietly avoiding. Most of our services didn't have decent documentation. Not API reference material, which lives in code, but the higher-level "what does this service do, what business rules does it enforce, what does it consume and produce" information that lives in nobody's head except the original author's.</p>
<p>The honest reason was that writing this kind of documentation by hand had never paid back the time it took. By the time the doc was finished, half of it was already stale.</p>
<p>So I tried something I wouldn't have considered earlier. I used the AI itself to generate a first draft for each service. I pointed the agent at each service's code and asked it to produce a <code>docs/</code> folder with a specific structure: an overview, a list of business rules, an integrations document, a domain model, and any quirks worth knowing. The agent read the code, traced the call paths, and wrote a draft.</p>
<p>I then reviewed the output by hand, corrected the things it got wrong, and committed the result. The first drafts were 70-80% correct. The remaining 20-30% was where the agent had made plausible but wrong inferences, and those were exactly the cases where human review mattered.</p>
<p>The generated docs ended up serving two audiences. The agent uses them when reasoning about changes, which means it has real context for the service it's touching rather than guessing from local files. And new engineers use them on their first day, which has cut our onboarding time noticeably.</p>
<p>We used to write onboarding documents that drifted out of date within months. These docs stay closer to current because the agent reads them on every PR, and any drift gets surfaced when the agent gives wrong advice based on stale information.</p>
<p>The pattern that works is to keep the per-service <code>AGENTS.md</code> short and pointing at the docs, rather than duplicating their content. <code>AGENTS.md</code> is the always-loaded index. <code>docs/</code> holds the details. The agent loads the relevant doc on demand when the task calls for it.</p>
<p>With the rules in place and the docs in place, I had everything I needed to build the actual reviewer.</p>
<h2 id="heading-building-the-pr-review-command">Building the PR Review Command</h2>
<p>This is the piece that most directly unblocked my queue.</p>
<p>This command didn't appear out of nowhere. It started as the checklist I was running through in my head every time I opened a PR. I was reviewing every change manually, leaving the same comments, flagging the same patterns. So I wrote that checklist down, expanded it with references to the per-service docs for the harder rules, and turned it into a command anyone on the team could run.</p>
<p>Then I handed it to the engineers and changed the rule: run this on your own branch before marking the PR ready for review. That single shift moved the work from after the PR was opened to before. Engineers now catch 90-95% of the blockers, improvements, and nice-to-haves on their own machine, fix them locally, and only then push the change.</p>
<p>The PR description includes the AI's summary, so when anyone opens the PR, they can see the reviewer's green signal at the top before even reading the diff.</p>
<p>GitHub stays clean. The conversation on the PR becomes about the things that actually need a human, not the recurring stuff the team already knows how to fix.</p>
<p>The command lives in <code>.claude/commands/review-pr.md</code>. Here's a generalised version. Your tool's command structure may differ, but the shape is what matters.</p>
<pre><code class="language-markdown"># Review PR

Review the current branch's PR. Be direct. Cite `file:line`. Surface real issues,
no padding.

## 1. Scope the diff

Run, in order:

    gh pr view --json number,title,body,headRefName 2&gt;/dev/null || true
    git fetch origin main
    git log --no-merges origin/main..HEAD --oneline
    git diff origin/main...HEAD --stat
    git diff origin/main...HEAD

Read the PR body. Note the stated intent. Every change should trace to it. Flag
anything that does not.

Use `...` (three dots) for the diff. It compares against the merge base and
excludes commits brought in by merging main.

## 2. Load rules

Always read `.claude/pr-rules/common.md`.

Then read the per-area file for each workspace touched in the diff:

| Workspace path | Rules file                      |
| -------------- | ------------------------------- |
| `frontend/**`  | `.claude/pr-rules/frontend.md`  |
| `backend/**`   | `.claude/pr-rules/backend.md`   |
| `service-a/**` | `.claude/pr-rules/service-a.md` |
| `service-b/**` | `.claude/pr-rules/service-b.md` |

For non-trivial changes, follow doc pointers inside the rules files (for
example, `backend/AGENTS.md`, `backend/docs/architecture.md`).

Apply every entry under each file's "Lessons learned" section as a check.

## 3. Output

Use exactly this format.

    ## Summary
    &lt;one paragraph: what the PR does, whether it matches the stated intent&gt;

    ## Blocking
    - [file:line] issue, why it blocks

    ## Should fix
    - [file:line] issue

    ## Nice to have
    - issue

    ## Verified
    - what was checked and looks good

If nothing blocks, say so. Do not manufacture concerns.

If you find an issue worth remembering for future PRs, suggest the bullet to
add to the relevant rules file's "Lessons learned" section. Do not edit the
rules file yourself, leave that to the human.
</code></pre>
<p>A few of the design choices in this command turned out to matter more than I expected.</p>
<p>The structured output format (Summary, Blocking, Should fix, Nice to have, Verified) keeps the review easy to scan and easy to paste into a PR description. The "Verified" section is the most underrated of the five: it tells the human reviewer what the AI already checked, so they can spend their attention elsewhere. Without it, the human reviewer ends up doing the same checks twice.</p>
<p>The instruction to be direct and stop padding does real work. Without it, AI reviewers tend to manufacture concerns to look thorough, which trains engineers to skim past the bot. Telling it explicitly to say "nothing blocks" when nothing blocks made the signal-to-noise ratio of the output much better.</p>
<p>The "suggest a bullet for the rules file" instruction at the end is the heart of the whole system, and I'll explain why in the section on the compounding loop. The key constraint here is that the agent suggests the bullet but doesn't commit to it. A human evaluates whether it's general enough to be a rule, and only then adds it to the file. That manual step is what keeps the rules sharp instead of bloated.</p>
<p>With each PR, if humans fix something or the AI suggests something, you keep adding those to your MD files and keep improving your agents for the future. The result compounds quickly.</p>
<p>One more thing here: the diff-scoping commands are all read-only. The command shouldn't be able to push, edit PRs, or close anything. Which is the next piece of the system.</p>
<h2 id="heading-guardrails-read-only-by-default">Guardrails: Read-Only by Default</h2>
<p>Giving an AI agent broad permissions on your codebase is a security incident waiting to happen. Even if you trust the model to behave, an LLM occasionally does unexpected things, and a fast-moving agent on an unrestricted shell can cause damage in seconds.</p>
<p>The fix is a <code>settings.json</code> (in Claude Code – other tools have their own equivalents) at the root of <code>.claude/</code> that explicitly declares what the agent can and can't do. The deny list matters more than the allow list, and a good one is organised around four categories of risk.</p>
<p>The first is <strong>secrets and configuration</strong>. Any read against anything that appears to be a credential is blocked. That covers <code>.env</code> files of every variant (<code>.env</code>, <code>.env.local</code>, <code>.env.production</code>, <code>.env.test</code>, and so on), <code>.npmrc</code>, <code>.netrc</code>, <code>.pgpass</code>, <code>id_rsa</code>, <code>id_ed25519</code>, <code>*.pem</code>, <code>*.key</code>, <code>*.p12</code>, <code>**/credentials.json</code>, <code>**/secrets.json</code>, <code>**/.aws/**</code>, <code>**/.ssh/**</code>, <code>**/.gcloud/**</code>, and <code>**/.kube/**</code>. Environment dumps are blocked too: <code>env</code>, <code>printenv</code>, <code>set</code>, <code>export</code>. The agent has no legitimate reason to read or echo any of these, ever.</p>
<p>The second is <strong>destructive Git operations</strong>. The agent can read Git history but can't rewrite or push it. Blocked: <code>git push</code>, <code>git commit</code>, <code>git revert</code>, <code>git cherry-pick</code>, <code>git merge</code>, <code>git rebase</code>, <code>git reset --hard</code>, <code>git tag</code>. Allowed: <code>git fetch</code>, <code>git status</code>, <code>git log</code>, <code>git diff</code>, <code>git show</code>, <code>git branch</code>, <code>git rev-parse</code>, <code>git merge-base</code>, <code>git config --get</code>.</p>
<p>The third is <strong>write operations on PRs and issues</strong>. The agent can read your GitHub state but can't act on it. Blocked: <code>gh pr create</code>, <code>gh pr edit</code>, <code>gh pr merge</code>, <code>gh pr close</code>, <code>gh pr comment</code>, <code>gh pr review</code>, <code>gh issue create</code>, <code>gh issue edit</code>, <code>gh issue close</code>, <code>gh issue comment</code>, <code>gh release create</code>, <code>gh repo create</code>, <code>gh repo edit</code>, <code>gh repo delete</code>. Allowed: <code>gh pr view</code>, <code>gh pr list</code>, <code>gh pr diff</code>, <code>gh pr checks</code>, <code>gh issue view</code>, <code>gh issue list</code>, <code>gh release view</code>.</p>
<p>The fourth is <strong>workflow and automation control</strong>. These are the surfaces where a compromised or misled agent could do the most damage. Blocked: <code>gh workflow run</code>, <code>gh run rerun</code>, <code>gh run cancel</code>, <code>gh secret</code>, <code>gh variable</code>, <code>gh auth</code>, <code>gh ssh-key</code>, <code>gh gpg-key</code>, and the unrestricted <code>gh api</code>.</p>
<p>For shell commands the agent legitimately needs to run, like build and test commands, allowlist specific patterns: <code>pnpm test</code>, <code>pnpm lint</code>, <code>pnpm format:check</code>, <code>pnpm build</code>, <code>pnpm vitest</code>. Anything outside the allowed list requires human confirmation. These are your own settings&nbsp;– I've just mentioned what I prefer.</p>
<p>The pattern is simple: read-only by default, write-allowed only for the specific commands you have explicitly approved. The agent can investigate, plan, and recommend. It can't ship.</p>
<p>With the structure in place and the guardrails set, the system started doing its job. What I didn't expect was how much better it would get over the months that followed.</p>
<h2 id="heading-the-compounding-loop-that-made-the-real-difference">The Compounding Loop That Made the Real Difference</h2>
<p>When we started, the AI reviewer was useful but not transformative. It caught some obvious issues, missed plenty of subtle ones, and produced a fair amount of noise.</p>
<p>The first month, my review burden dropped by 35%. The time I was spending on PR checking was reduced to 1/3, almost. Decent, not life-changing.</p>
<p>What changed over time wasn't the tool. It was the rules.</p>
<p>Every time a PR creator and reviewer caught something the AI had missed, we were adding bullets to the relevant rules file. Every time the AI flagged something useful that turned out to be a recurring pattern, the agent's own suggestion at the end of the review went into the file.</p>
<p>After a few days, the rules files had grown into something that captured a meaningful fraction of the team's collective review knowledge, written down in a place every agent on the team would read.</p>
<p>The catch rate went up. The noise went down because the rules also said what was acceptable and what we already considered solved. New engineers stopped getting the same comments on their first three PRs because the AI caught the comments first. Engineers joining the team didn't have to absorb the conventions through six months of review feedback. They installed the project, opened it in their editor, and the agent already knew.</p>
<p>This is the part most teams miss when they evaluate AI PR review tools. They look at the catch rate today and decide whether the tool is worth the price. The catch rate today isn't the right number. The right number is what the catch rate looks like in six months, after the rules file has absorbed every recurring mistake your team has made.</p>
<p>A single rule written down today saves a small amount of review time. Over a hundred PRs, it saves more. After a year, the rules file is a written-down version of a tech lead's accumulated taste. We've switched between Claude Code, the GitHub Copilot CLI, and Cursor for various tasks during this period. The AI tool changes, but the rules file in the repo stays the same.</p>
<p>The discipline that makes this work is treating the rules file as living documentation. Every recurring review comment is a candidate for promotion into the file. If you catch yourself typing the same feedback in two different PRs, that's a rule that belongs in <code>pr-rules/</code>. The "suggest a bullet" instruction in the review command is what makes this practical: the AI does the typing, the human does the deciding.</p>
<p>This is also what made me realise the system was worth the time it took to set up. The PR review command, on its own, is useful but unremarkable. The compounding loop is what turns it into infrastructure.</p>
<h2 id="heading-starting-from-zero-on-an-existing-project">Starting From Zero on an Existing Project</h2>
<p>If you've read this far and feel like the gap between your project and what I just described is a sprint of work, that's the most common reaction. It's also not correct.</p>
<p>The blank <code>AGENTS.md</code> is intimidating, especially on an existing codebase. You know your team has a thousand conventions, and writing a thousand rules sounds like a project that takes weeks before it produces any value.</p>
<p>The honest answer is that you can't write all the rules up front, and you shouldn't try. The first version of any of these files should take an afternoon, not a sprint.</p>
<p>Here's how I would actually start.</p>
<p>Run <code>/init</code> (or your tool's equivalent). In Claude Code, <code>/init</code> scans the project, infers the obvious shape (language, framework, entry points, build commands), and writes an initial <code>CLAUDE.md</code>. The output is a starting point, not a finished file. Read it, delete most of what it generates, and keep the bones.</p>
<p>Then add three things, each one bullet long.</p>
<p>First, an architecture rule. Pick the single most important convention your team enforces. For us, that was the four-layer pattern. The bullet was: "Controllers must not call repository functions directly. They must go through the app layer."</p>
<p>Second, a discoverability rule. Pick the single most important shared resource the team has, the one new code is most likely to duplicate. For us, that was the design system. The bullet was: "Before creating a new UI component, check <code>/src/design-system/</code> first."</p>
<p>Third, a "do not touch" rule. Pick the single most dangerous file or area in the codebase. Auth, billing, or migrations whichever has the most production risk. The bullet was: "Do not modify files in <code>/auth/</code> without human approval."</p>
<p>That's enough to start. Three rules, ten minutes of writing, and most of your team's recurring AI mistakes start to drop.</p>
<p>If even three rules feels like too much, start with one. Pick a single line that matters in your codebase and write it down.</p>
<p>"No <code>any</code> types in TypeScript." "Always use the enum, never compare against the string literal." "Run the linter before opening a PR." It doesn't have to be sophisticated. It doesn't have to cover edge cases. It just has to capture one piece of judgement that lives in your head today and would otherwise stay there.</p>
<p>Tomorrow, add another. The first week, you might catch 5% of the recurring mistakes. By 20 or 30 PRs in, you might catch 20-30%. The rules file doesn't need to be impressive on day one. It needs to exist and keep growing.</p>
<p>This is the compounding effect I'll come back to soon, and it's the reason this approach works on real projects rather than just in theory.</p>
<p>From there, the file grows the same way it would grow for any team. Every review catch becomes a candidate rule. After a few weeks, you have ten or fifteen rules. After a few months, you have a real review system.</p>
<p>The mistake is trying to write the perfect file on day one. The right file is the one you start with and keep editing.</p>
<h2 id="heading-what-still-needs-human-review">What Still Needs Human Review</h2>
<p>This system doesn't replace human review, and it shouldn't be allowed to.</p>
<p>The AI reviewer catches what the rules describe, plus a fair number of obvious things it would have spotted anyway. It doesn't catch problems that depend on context the rules don't capture. It doesn't catch product judgement. It doesn't catch the question of whether the change should have been built at all.</p>
<p>It also has an important blind spot when reviewing AI-authored code. The reviewer shares the same training data and reasoning patterns as the agent that wrote the code. If the original agent missed the v1/v2 distinction because it had no way to see the migration timeline, an AI reviewer reading the same diff has the same problem. Two AIs in a review loop are not two independent reviewers. They share blind spots.</p>
<p>That is why the AI reviewer in this setup never approves a PR. It produces a structured review that goes into the PR description. A human still reads the change and approves it. The AI is the first pass, not the gate.</p>
<p>Accountability also has to live with a human. When something the AI approved breaks production, someone has to own the post-mortem and decide what changes are needed for next time. The AI can't be that person. What it can do, well, is reduce the stack of small mistakes a human reviewer has to find before they get to the harder questions.</p>
<h2 id="heading-a-two-week-setup-plan">A Two-Week Setup Plan</h2>
<p>If you want to set this up for your own team, here's a concrete plan that fits in a couple of weeks. None of this needs to happen in a single push.</p>
<h3 id="heading-day-1-bootstrap-the-memory-file">Day 1: Bootstrap the memory file.</h3>
<p>Run <code>/init</code> (or your tool's equivalent) at the root of the project. Read the generated <code>CLAUDE.md</code> (or <code>AGENTS.md</code>). Delete most of it. Keep the tech stack and project structure sections.</p>
<p>Add the three rules from the previous section: one architecture rule, one discoverability rule, and one "do not touch" rule. Decide whether you want both files or a symlink.</p>
<h3 id="heading-day-2-add-per-service-files-for-your-highest-risk-areas">Day 2: Add per-service files for your highest-risk areas</h3>
<p>Pick the two or three areas of the codebase that change most often or carry the most risk. Add an <code>AGENTS.md</code> to each, following the same lean pattern. Include the architectural pattern for that area, the naming conventions, where to find good test examples, and pointers to any existing docs. Skip anything that doesn't need to be there yet.</p>
<h3 id="heading-day-3-set-up-the-directory-structure-and-guardrails">Day 3: Set up the directory structure and guardrails</h3>
<p>Create a <code>.claude/</code> folder (or your tool's equivalent) at the root, with <code>commands/</code> and <code>pr-rules/</code> subfolders. Add a <code>settings.json</code> with the deny list categories from the guardrails section. Test that the agent can't read a <code>.env</code> file, run <code>git push</code>, or create a PR. If any of those work, fix the settings before doing anything else.</p>
<h3 id="heading-day-4-write-the-pr-review-command">Day 4: Write the PR review command</h3>
<p>Adapt the command in this article to your structure. Include the diff scoping, the rule loading, the output format, and the "suggest a new rule" instruction at the end. Run it on a branch you've already merged, and tune the output until it's useful.</p>
<h3 id="heading-day-5-run-it-on-real-prs">Day 5: Run it on real PRs</h3>
<p>Have one or two engineers run the command on their next PRs before opening them. Read the output. Note what it caught, what it missed, and what was noise. Add the missing catches to the rules files. The first week is mostly tuning.</p>
<h3 id="heading-week-2-roll-out-and-document">Week 2: Roll out and document</h3>
<p>Once the command produces useful output reliably, ask the whole team to run it before opening PRs and paste the output into the PR description. Add a short section to your contributing guide explaining the workflow. Set a recurring item in your team's rituals to review the rules files monthly and trim anything that has gone stale.</p>
<p>That gets you to a working system. From there, the maintenance is incremental. Every recurring review comment becomes a candidate rule. Every architectural decision becomes a candidate update to the relevant <code>AGENTS.md</code>. The system improves as a side effect of the work the team is already doing.</p>
<h2 id="heading-what-is-working-what-i-am-still-improving">What Is Working, What I Am Still Improving</h2>
<p>Here's my honest assessment after a few months of running this:</p>
<h3 id="heading-whats-working">What's Working</h3>
<p>My review burden is meaningfully smaller. Engineers fix most of the easy mistakes before I see the PR. The "Verified" section of the AI's output tells me what to skip past. New engineers ramp faster because the conventions live in a place their tooling reads. The rules files have grown into something I would actually use to onboard someone new.</p>
<h3 id="heading-what-isnt-finished">What Isn't Finished</h3>
<p>The AI still misses problems that depend on context, and the rules don't capture them. The rules files grow, but they also need pruning, and we haven't been disciplined about that.</p>
<p>We're still figuring out how to handle rules that apply only conditionally. Docs are helping in that case, but we need to keep those up to date. And no system survives a determined engineer who skips the workflow or docs when they're in a rush.</p>
<p>There's no shortcut here. The work is real, ongoing, and mostly about discipline. The discipline is treating your codebase as something the AI needs to learn, and treating every recurring review comment as something that should be written down once instead of typed thirty times. If you're willing to do that, the tools take care of the rest.</p>
<p>If you take three things from this article, take these.</p>
<ol>
<li><p>First, don't pay for a generic reviewer to do a job your codebase needs to inform. Generic reviewers catch generic problems. Most of your real review work is specific to your team.</p>
</li>
<li><p>Second, put the rules in a file the AI reads, not in your head. <code>AGENTS.md</code>, <code>CLAUDE.md</code>, per-service files, per-area rules files. Pick a structure and stick to it.</p>
</li>
<li><p>Third, treat every human review catch as a chance to update the rules. The compounding effect over months is the entire point. A review system that improves itself is worth more than any single tool.</p>
</li>
</ol>
<p>That's the system. It took a couple of weeks to build the foundation and a few months for the rules to mature. It costs very little to run, and it has done more for our PR throughput than any tool I evaluated.</p>
<h2 id="heading-sources">Sources</h2>
<ul>
<li><p>CircleCI's 2026 State of Software Delivery report, analysing more than 28 million CI workflows from over 22,000 organisations: <a href="https://circleci.com/resources/2026-state-of-software-delivery/">https://circleci.com/resources/2026-state-of-software-delivery/</a></p>
</li>
<li><p>CircleCI's blog post detailing the year-over-year throughput numbers, including the 59% feature branch growth and the main branch decline: <a href="https://circleci.com/blog/five-takeaways-2026-software-delivery-report/">https://circleci.com/blog/five-takeaways-2026-software-delivery-report/</a></p>
</li>
<li><p>GitHub announcement of Copilot's transition to usage-based billing on June 1, 2026: <a href="https://github.blog/news-insights/company-news/github-copilot-is-moving-to-usage-based-billing/">https://github.blog/news-insights/company-news/github-copilot-is-moving-to-usage-based-billing/</a></p>
</li>
<li><p>GitHub changelog confirming Copilot code review will start consuming GitHub Actions minutes on June 1, 2026: <a href="https://github.blog/changelog/2026-04-27-github-copilot-code-review-will-start-consuming-github-actions-minutes-on-june-1-2026/">https://github.blog/changelog/2026-04-27-github-copilot-code-review-will-start-consuming-github-actions-minutes-on-june-1-2026/</a></p>
</li>
<li><p>AGENTS.md, the open standard's official site, including its stewardship under the Agentic AI Foundation and the Linux Foundation: <a href="https://agents.md/">https://agents.md/</a></p>
</li>
<li><p>Anthropic's Claude Code documentation on the memory system, including CLAUDE.md, auto memory, and the /init command: <a href="https://code.claude.com/docs/en/memory">https://code.claude.com/docs/en/memory</a></p>
</li>
<li><p>Anthropic's Claude Code GitHub Actions documentation, including notes on token-based billing and recommended cost controls: <a href="https://code.claude.com/docs/en/github-actions">https://code.claude.com/docs/en/github-actions</a></p>
</li>
<li><p>CodeRabbit's pricing documentation, confirming the per-developer-per-month seat model: <a href="https://docs.coderabbit.ai/management/plans">https://docs.coderabbit.ai/management/plans</a></p>
</li>
<li><p>Greptile's March 2026 pricing announcement, introducing the base-plus-usage model at $30 per seat per month with 50 included reviews: <a href="https://www.greptile.com/blog/greptile-v4">https://www.greptile.com/blog/greptile-v4</a></p>
</li>
<li><p>HumanLayer's write-up on writing a good CLAUDE.md, including data on instruction-following degradation: <a href="https://www.humanlayer.dev/blog/writing-a-good-claude-md">https://www.humanlayer.dev/blog/writing-a-good-claude-md</a></p>
</li>
</ul>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How I Added Some Structure to a Start-up's Development Team - And What I Learned from the Process ]]>
                </title>
                <description>
                    <![CDATA[ By Hughie Coles Until recently, I'd spent the last 4 years of my career at FinTech start-ups. I'd always worked for smaller companies, and being at a start-up was the next logical step in looking for roles where I could make the biggest difference.  ... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-i-added-some-structure-to-a-start-up-dev-team/</link>
                <guid isPermaLink="false">66d45f3133b83c4378a517d8</guid>
                
                    <category>
                        <![CDATA[ agile ]]>
                    </category>
                
                    <category>
                        <![CDATA[ development process  ]]>
                    </category>
                
                    <category>
                        <![CDATA[ leadership ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Sun, 24 May 2020 22:48:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2020/05/you-x-ventures-Oalh2MojUuk-unsplash-1.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Hughie Coles</p>
<p>Until recently, I'd spent the last 4 years of my career at FinTech start-ups. I'd always worked for smaller companies, and being at a start-up was the next logical step in looking for roles where I could make the biggest difference.  </p>
<p>But a common problem with early-stage start-ups is that it's kind of a free-for-all in terms of how they're managed. </p>
<p>These companies tend to be run by people who don't have a ton of experience running companies. And management tends to consist of founders and those who got in early, not necessarily those who excel in leadership roles. (No shade – good person + talented doesn't necessarily mean they're a good boss or leader).</p>
<p>During my time at one such start-up, I was promoted from senior developer to lead developer. </p>
<p>The catalyst for this change was that the development team lacked leadership. The CTO had too many responsibilities, and the job of keeping the dev team engaged and productive was falling through the cracks. </p>
<p>On top of this, we didn't have a project manger, and our product managers were too inexperienced to introduce any kind of structure.</p>
<p>This is the story of the wins and losses, and how to add process to a company that has none.</p>
<h2 id="heading-events-leading-to-the-change">Events leading to the change</h2>
<p>First, a little bit of background. My previous job had been as a developer at a digital agency. This agency was a hard-core scrum shop that had trained all of their employees fairly thoroughly in scrum, and agile in general. </p>
<p>So I came from an environment with a lot of process. That's partially why I left to pursue a start-up. </p>
<p>About a year in, I started to notice some issues. Firstly, the developer turn-over was growing. Developers weren't feeling engaged. They were handed half-baked projects with no context on how it would aid the growth of the company, no input in the design or planning, and with nowhere near enough detail.</p>
<p>Then came a project that crystallized our problem. The product that I worked on had the concept of bills (payables) and invoices (receivables). We were working on a new feature that would allow users to upload an image of an invoice and have it input manually by a service. </p>
<p>The problem was that the product manager kept saying "bills" instead of "invoices". There was no user story, no ticket, this was all in the mind of the product manager. Requirements were communicated verbally or in slack messages. The developer working on the project had only ever been told "bills". </p>
<p>It wasn't until the CTO overheard a conversation a few days before release that we realized that we'd targeted the wrong aspect of the system. </p>
<p>Luckily, bills and invoices were, for the most part, symmetrical in our system, so it wasn't much work to make the change. It just became very clear that we had a problem.</p>
<p>Given my background and the fact that I was one of the most senior and tenured developers at the company, it made sense for me to take the lead. </p>
<p>Since I was leading the initiative, I chose to implement a scrum-type process.  In the remainder of this article, I'll outline <strong>what</strong> we did, <strong>how</strong> we did it, and <strong>why</strong> it was done, as well as my <strong>learnings</strong>.</p>
<h2 id="heading-getting-buy-in">Getting Buy-in</h2>
<p>I'm gonna preface this by saying that I don't like handing commandments down from on high. I feel like a leader-team relationship is a collaborative one. I may occasionally play leader because it's my nature, but it's important that ideas are discussed and that people feel their opinions are heard and valued.</p>
<p>The first step was to gather the developers to have a discussion.  In this initial discussion, I outlined what I felt our issues were.  This included lack of clarity on requirements, sliding deadlines, and our complete lack of a testing strategy.  The discussion validated my thoughts, because the team felt the same way.  </p>
<p>The rest of the meeting consisted of me outlining scrum, what elements I felt could benefit us, and what that would look like. I also discussed some things that I learned about test plans and systematic QA that I learned in my agency days.  We then went around the table, giving thoughts, asking questions, and tweaking.</p>
<p>I conceded that manual testing wasn't fun or ideal for the dev team, but until we could justify a full-time QA engineer, we had to do the best with what we had.</p>
<p>Learnings: </p>
<ul>
<li>If you have a good idea, all you need is a chance to prove its worth. </li>
<li>Enlist your team to help build this together, make everyone part of the solution and they'll own it with you.</li>
</ul>
<h2 id="heading-our-version-of-scrum">Our Version of Scrum</h2>
<p>After describing what a "full" scrum process would look like, I laid out to the team what the purpose of each aspect and ritual was.  I wanted to highlight where we could get the most gains. No one wanted 10 hours of meetings per sprint.  </p>
<p>Speaking of sprints, we decided to start with a 2 week time-box with an eye on moving it to 3 weeks if we wanted less overhead and could afford less frequent releases.</p>
<p>The process I put in place was as follows.</p>
<p>We'd have a sprint started with a 2-hour grooming/planning meeting on a Monday morning. In this planning meeting we (the dev team and the product manager) did a pass over the backlog.  This pass consisted of clarifying the story to clear up misunderstandings; estimating using story points; and prioritizing based on company road-map.  The team then picked out the amount of work we felt we could do, based on priority, and brought it into the current sprint. </p>
<p>This work was a collection of user stories. The product manager would leave, and the dev team would break these stories down into tasks, get a general sense of who would work on what, and then we got to work.  This gave the product manager transparency on what we could deliver, which was sorely lacking.  It also gave the team their full workload for 2 weeks, which allowed us to plan and pace accordingly.</p>
<p>The next week and a half were dev days. This included peer code reviews on feature branches before they were merged. Dev hands-off was the Wednesday of the 2nd week at noon. We would then prepare the QA build, QA spreadsheet (more on this in a bit), and start manual testing.  </p>
<p>The idea was to finish the initial QA pass by the end of the Wednesday, and spend Thursday and Friday in a bug fix/test loop until we were satisfied with the build.  </p>
<p>At this point, the build would be handed off to the CTO for a final code review, and it would be deployed the following Tuesday. Issues found in the code review would be fixed and tested on the Monday if needed.</p>
<p>Friday afternoon we would have a blameless retrospective/postmortem. Here we laid things bare. It's important to acknowledge what went poorly, and to address the cause(s) so that we could avoid it in the future. </p>
<p>All of the developers (including myself) learned a lot through this process. I feel like we're all better off after having gone through it. I actually overheard the CEO suggest doing blameless postmortems a few weeks after we started doing them on the dev team. It was nice to see that our ideas were catching on. </p>
<p>This was one of the big wins. We learned why a feature was needed, what the intention behind it was, and all of the details and expectations.</p>
<p>Learnings:</p>
<ul>
<li>Split and join meetings based on your team's needs.  Don't do things "just because"</li>
<li>Share your progress outside your department.  Sometimes your ideas can provide benefits outside of your team.</li>
</ul>
<h2 id="heading-a-testing-framework-that-you-can-believe-in">A Testing Framework That You Can Believe In</h2>
<p>This company had never had a formal testing process. This meant no test plan, no peer testing, just a developer verifying that it worked, and it going to production.  </p>
<p>In my experience, developers are as good at testing as they are at estimating, so we needed to change that. We had a good suite of automated tests (unit and integration), but no end-to-end tests. I also prefer to have some exploratory testing as well. In the past, I've seen it uncover weird behaviors that automated testing can miss.  </p>
<p>We set up a google doc with all of the tickets (including links to the user stories) in the first column, and all of the developer names (and the PM) in the first row. The idea was that every ticket had to have 2 X's, both from people who didn't work on the feature. This divide and conquer strategy allowed us to test very thoroughly in a fairly short amount of time. </p>
<p>Learnings: </p>
<ul>
<li>Lean hard on automated testing.  It's reliable and finds many classes of bugs with no manual time.</li>
<li>Test with a plan.  You're going to waste a lot of time just wandering.  A systematic approach can make manual testing more efficient.</li>
</ul>
<h2 id="heading-success">Success</h2>
<p>What was the result? I don't have exact numbers, but the defect rate plummeted. There were no longer rushed hot fixes to production. The work promised was delivered. Features were being released on time. </p>
<p>We were moving faster than ever, and the developers were happier. We were working as a team instead of in silos, we all knew each others' features intimately because we all went through the user stories and estimated together. There was no more of this "oh, I can't touch feature X, I didn't work on it" siloing stuff. </p>
<p>One dev who was planning on leaving stopped looking. It was great.</p>
<p>Learnings:</p>
<ul>
<li>Keep adjusting your process based on results.  It's an ongoing process.</li>
<li>Sometimes people don't want to leave a company, they want to leave a situation.</li>
</ul>
<h2 id="heading-an-abrupt-end">An Abrupt End</h2>
<p>But nothing gold can stay :) Ok, that's a bit dramatic. While the dev team was gelling, increasing our velocity, and building more camaraderie, management was going in a different direction. </p>
<p>The CEO had done a ton of reading and decided that OKRs were what was gonna get the company to the next level. Unfortunately, it was decided that OKRs would go down to the individual level, meaning that the team would no longer be pooling work, breaking it down and tackling it together. Instead, each developer would work out (or in practice, given) a set of KRs, and they alone would be responsible for delivering on them.  </p>
<p>We were back to silos. The development team pushed back, we tried to compromise, to stop OKRs at the team level, but it was no use. The dream was dead. Yes, again with the drama, but it was a little sad. </p>
<p>This change coincided with a slight change in power structure, my title as lead developer became little more than a platitude, "leadership" said some very unkind things to the development team (somewhere along the lines of "get on board or get out"), which led to half the dev team, including myself, leaving within a month.</p>
<p>Learnings:</p>
<ul>
<li>Good ideas don't always win out.  Even in a situation like this, you can learn a lot.</li>
<li>Recognize when you can no longer make a difference. </li>
</ul>
<h2 id="heading-mistakes-were-made">Mistakes Were Made</h2>
<p>Given the way that last paragraph ended, you may thing that I was about to enumerate the mistakes that the company made. But I'm not going to do that. </p>
<p>It's been about a year since I left, and in that time I've learned a thing or two. There were some serious gaps in the process that we'd created. These were things that I just didn't really understand or know about at the time. It was due to my shortcomings, but we all get better every day. </p>
<p>In hindsight, here are some major things I'd missed:</p>
<h3 id="heading-we-werent-measuring">We weren't measuring.</h3>
<p>How do you know you've done it right if you didn't take measurements before and after? We had no telemetry, very little alerting, and frankly, if a feature had negative impact, we didn't know about it.</p>
<h3 id="heading-too-much-manual-testing-not-embracing-automation">Too much manual testing, not embracing automation.</h3>
<p>What we were really missing was a nice suite of automated E2E tests. We started working on these near the end, but we didn't prioritize them enough. Many of the errors we found during manual testing could have been caught during some acceptance tests using cucumber, or some E2E selenium tests.</p>
<h3 id="heading-big-bang-releases">Big bang releases.</h3>
<p>I know a common part of scrum for many companies is the idea that all of the sprint work is demoed and released together. </p>
<p>The problem with this is two-fold. Firstly, at a start-up you need to move quicker. You need to beat others to the punch and get value out to customers and feedback from customers as quickly as possible. And the tighter that feedback look is, the better.  </p>
<p>Therefore, multiple releases per sprint would have been better. It's more difficult to coordinate testing and QA, but it's still better to release quickly and often. </p>
<p>Secondly, the larger the release, the more risk is involved. Releasing smaller chunks means that fewer changes are released at one time. If there's any issue, it's easier to identify and fix, and a rollback won't affect other, correctly functioning features.  </p>
<p>So I've learned that releasing in verticals that are as small as possible is the safest, least coupled way of releasing software.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>For all of the missteps and the unfortunate ending, I feel like the experience was a success. I learned what it meant to guide a team of developers through a process, to take feedback and apply it, and to try and discard ideas that, even though they are "supposed to be there", just didn't fit our team.  </p>
<p>It's important to cater your process to your team and organization. You have to add enough process to guide, but not so much to hinder. It taught me how to implement process, to push ideas forward, to help others be heard, and how to lead from within a team.  </p>
<p>Although it ended poorly, it was a big step forward in my career, and really solidified my ability and desire to lead.</p>
<p>You can find more of my articles on my <a target="_blank" href="https://medium.com/@hughie.coles">medium blog</a>.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Handle Impostor Syndrome and Time Management Issues ]]>
                </title>
                <description>
                    <![CDATA[ By Leonardo Faria I often hear people talking about impostor syndrome and time management issues. Sometimes I hear about these issues from a friend, a direct report, and occasionally from myself. We are always challenged by them and they can affect o... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/facing-impostor-syndrome-and-time-management-issues/</link>
                <guid isPermaLink="false">66d85176ef84e4cc27cfbe55</guid>
                
                    <category>
                        <![CDATA[ Career ]]>
                    </category>
                
                    <category>
                        <![CDATA[ impostor syndrome ]]>
                    </category>
                
                    <category>
                        <![CDATA[ leadership ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Sun, 26 Apr 2020 15:20:08 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2020/04/roller-coaster.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Leonardo Faria</p>
<p>I often hear people talking about impostor syndrome and time management issues. Sometimes I hear about these issues from a friend, a direct report, and occasionally from myself. We are always challenged by them and they can affect our mood, our ability to be productive, and our judgement.</p>
<p>We have days where everything works great and also we have bad days, where everything seems to go wrong. This emotional roller coaster can make us doubt our accomplishments and can create a persistent fear of being exposed as a fraud.</p>
<p>There a few things that you can do to remember that you are great:</p>
<ul>
<li><strong>Keep a daily journal</strong> with notes of achievements: this daily exercise will train your brain to feel more confident.</li>
<li><strong>Focus on your strengths</strong>, especially when you are in a new role at work, use your natural strengths to add value to your position.</li>
<li><strong>Find quick wins</strong>, they will help you build a reputation of someone adept in a particular skill.</li>
</ul>
<p>Issues with time management also impact our feeling of getting the job done. Sometimes the problem starts early on when we are assigned a task that may not make much sense. </p>
<p>Let's step back for a moment and think about the levels of uncertainty of a task:</p>
<ol>
<li>Well understood</li>
<li>Have a few questions</li>
<li>Understood, but unfamiliar with the approach</li>
<li>Know the area, but not the direction</li>
<li>Generally unclear</li>
</ol>
<p>How does uncertainty affect time management? </p>
<p>If something is well understood, it is very unlikely you will get lost in the woods and things will take as long as expected. </p>
<p>Starting with the level of "have a few questions", you need to be careful because the uncertainty will affect your time management and your sense of achievement. </p>
<p>The good news is, you can always use this problem as an opportunity to improve.</p>
<ul>
<li><strong>Have a few questions</strong>: Find the best person to answer your question. If the description is unclear, go to the person who created that task. If the question is technical, talk to a developer on the team that can help you.</li>
<li><strong>Understood, but unfamiliar with the approach</strong>: If you understand the big picture but you are not confident with the approach, talk to another developer and ask for help. This is a good opportunity for pair programming.</li>
<li><strong>Know the area, but not the direction</strong>: This is a good opportunity to talk to another developer and hear their initial thoughts. They may have an opinion on how to get the task started or be able to suggest a good resource to review.</li>
<li><strong>Generally unclear</strong>: If the problem in the task is unclear, ask for clarification. If the technical approach is unclear, talk to other developers, think about having a pair programming session, and speak with other members of your team to understand how they approach their work.</li>
</ul>
<p>Overall, facing imposter syndrome is something that we all face at some point in our careers. It is an issue that I have certainly struggled with, but find that facing these struggles provides an excellent opportunity for me to reflect on my skills and discover new areas of potential learning. </p>
<p>With these suggestions in mind, I hope that you are able to improve your sense of confidence and self-efficacy in your professional life.</p>
<p><em>Also posted on <a target="_blank" href="https://bit.ly/355gluB">my blog</a>. If you like this content, follow me on <a target="_blank" href="https://twitter.com/leozera">Twitter</a> and <a target="_blank" href="https://github.com/leonardofaria">GitHub</a>. Photo credit: <a target="_blank" href="https://pixabay.com/photos/roller-coaster-people-thrill-park-1553342/">roller coaster (Pixalbay)</a></em></p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Navigating my seat at the product table as a self-taught designer. ]]>
                </title>
                <description>
                    <![CDATA[ By Kim Thuy Tu Two years ago, I switched from medicine and redesigned Instagram. Three months after, I packed what I could fit into my carry-on and two moving boxes, and flew to Saigon to become Christina’s second product designer. Fast forward to to... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/navigating-my-seat-at-the-product-table-as-a-self-taught-designer/</link>
                <guid isPermaLink="false">66d45f6738f2dc3808b790bd</guid>
                
                    <category>
                        <![CDATA[ leadership ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Life lessons ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Self Development ]]>
                    </category>
                
                    <category>
                        <![CDATA[ startup ]]>
                    </category>
                
                    <category>
                        <![CDATA[ UX ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Fri, 27 Sep 2019 03:44:41 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2019/09/1_gc1cMHEivelCAmhr4Z33sw.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Kim Thuy Tu</p>
<p><strong>Two years ago, I switched from medicine and</strong> <a target="_blank" href="https://medium.com/free-code-camp/i-wanted-to-see-how-far-i-could-push-myself-creatively-so-i-redesigned-instagram-1ff99f28fa8b"><strong>redesigned Instagram</strong></a><strong>.</strong></p>
<p>Three months after, I packed what I could fit into my carry-on and two moving boxes, and flew to Saigon to become <a target="_blank" href="http://christinas.vn">Christina’s</a> second product designer. Fast forward to today and I am now their Head of Product.</p>
<p>I can still remember my first task on the job: creating color swatches for our tour guide’s awesome new helmets. It might sound like a simple feat, but after trying out hundreds of color combinations and learning a thing or two about color theory, I was pretty proud of the results.</p>
<p>As Christina’s grew from 100 to well over 450+ team members spanning all across Vietnam, so did my responsibilities. From tour guide helmets to redesigning the company’s flagship communication app to then launching it for <a target="_blank" href="https://www.twohearts.app/inbox-app/">Airbnb hosts all over the world to use</a>, its been a crazy (but fun) ride.</p>
<p>As I look forward to my next journey back to the States, I wanted to reflect on my experiences by sharing what I’ve learned along the way as someone who started with zero knowledge about product design and technology.</p>
<p>Let’s be clear — I still feel like I know nothing. I just know <em>a little bit less of nothing</em> than the day before.</p>
<hr>
<h2 id="heading-trust-your-gut-when-it-comes-to-recruitment">Trust your gut when it comes to recruitment.</h2>
<p>If you, your team, and your culture are playing to the same tune — you <strong>will</strong> know whether the candidate is a good fit (or not). As a rule of thumb, my go-to question after assessing a candidate’s technical skill is:</p>
<blockquote>
<p><em>“How did this person make me</em> <strong><em>feel</em></strong><em>?”</em></p>
</blockquote>
<p>My goal for going into any interview is to gain a better understanding of who the candidate is beyond what is on their resume and what their motivations are for arriving in this room with me. If I left the interview feeling more confused and conflicted than I did going in, it’s probably a good sign that this candidate is not the one. If I left the room feeling energized and excited, s/he is most likely a keeper.</p>
<p>Hire someone you would be excited to work with and most importantly, trust your gut instinct.</p>
<h2 id="heading-be-consistent-in-expressing-your-values">Be consistent in expressing your values.</h2>
<p>From creating wireframes to leading a team of developers, I knew it was important to establish our design and engineering principles early. It helps guide us in making product decisions, examining trade-offs during development, and uniting us stronger as a team.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/09/0_rBRGudVZsC_HHsVi.png" alt="Image" width="600" height="400" loading="lazy">
<em><em>Our team’s north star ?</em></em></p>
<p>An example of when we put our principles to the test was when my CTO had fixed a bug only to have it spam our users with <strong>hundreds</strong> of push notifications within a span of minutes.</p>
<p>I suggested to my CTO that he should write a post to be considerate of our users, take accountability, and explain what had happened so that our users can empathize with us through our immediate transparency. It will also be the kind of leadership that our junior engineers can learn from. And he did.</p>
<p>Instead of receiving any backlash, his post was received with likes and heart-eye emojis. Not only did our principles became a model for how we communicated as a team and developed our products, but it also forged the path for building a trusting relationship with our users.</p>
<blockquote>
<p>It goes without saying that leaders lead best through their actions, and not only by what they have to say.</p>
</blockquote>
<p>Now whenever there’s a bug (not saying it happens often), <a target="_blank" href="https://en.wikipedia.org/wiki/Desensitization_%28psychology%29">our users are much more forgiving and understanding of it</a>. Not only that, but the other engineers on our team started to follow his example and took accountability for their own missteps as well.</p>
<h2 id="heading-dont-underestimate-the-power-of-11-meetings-because-they-are-so-so-important">Don’t underestimate the power of 1:1 meetings, because they are so, so important.</h2>
<p>Whether you’re a designer or the CEO of a company, 1:1 meetings will always be the bread and butter for building a personal connection with your team. My engineers and I have weekly 1:1 meetings to QA the state of our product and pending features. To my engineers, it might be just a routine product QA. To me, it’s a perfect window of opportunity for me to get to know them on a personal level, address concerns they might have, and provide insights to help them find more value in their work.</p>
<p>If you’re looking for mentorship or growth in your career, I suggest scheduling 1:1 meetings with your team leader. First, it shows initiative. Second, you might also be surprised by the feedback and support you get in return. Before reaching out, make sure you understand what your goal is for the meeting. Is it to understand how you’re doing in your role? Is it to ask for additional remote days? After figuring out what your objective is, <strong>make sure to communicate it</strong>. This will help give your team leader ample time to prepare and keep the meeting focused.</p>
<h2 id="heading-creating-a-process-is-great-but-staying-flexible-is-even-better">Creating a process is great, but staying flexible is even better.</h2>
<p>Create processes, but <strong>plan for disruption</strong>. This can mean one of two things. One, the process you created didn’t work out as intended. Two, the process you created worked, but it ended up being discarded somewhere along the ever-evolving development process. This is especially true for startups during their <a target="_blank" href="https://hackernoon.com/navigating-the-stages-of-hyper-growth-6201d65eaaa8">hyper-growth stage</a> when you have many cross-functional teams working together to build and ship a product. When this happens, you have to be able to quickly switch gears, and adopt new <a target="_blank" href="https://fs.blog/mental-models/">mental models</a>, while pushing the overall product vision forward.</p>
<p>So instead of looking for an evergreen process, make your process of implementing and iterating <em>evergreen</em>.</p>
<h2 id="heading-figma-is-king">Figma is king.</h2>
<p>This article is not sponsored by <a target="_blank" href="https://medium.com/u/bf1152b11387">Figma</a>, but I figured this would be a great chance for me to give this amazing team (and product) a shoutout. Before Figma, our design team at Christina’s was getting around with using Sketch for design, Zeplin for hand-off, and Abstract for version control. It was a lot of tools but we had figured out a process that worked for us. Intrigued by Figma’s approach to design and collaboration, I decided to test out the tool to see for myself.</p>
<p>With Figma, design to developer handoff became almost instantaneous. In addition to the speed and efficiency, we also saved a lot of money in not having to use multiple software to maintain our design system, version control, and hand-offs. Since then, our entire product team has switched over to using Figma, and we haven’t looked back since.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/09/1_VnqX4GVtfIs4pPPl37172w.png" alt="Image" width="600" height="400" loading="lazy">
<em>Thanks Figma ✌?</em></p>
<h2 id="heading-work-politics-will-always-be-a-thing-but-it-doesnt-mean-you-have-to-be-a-part-of-it">“Work politics will always be a thing, but it doesn’t mean you have to be a part of it.”</h2>
<p>My COO said this to me during one of our lunch conversations after I had told him my reason for not wanting to accept the promotion to Head of Product.</p>
<p>With my previous role as a product designer/owner, I was able to influence business decisions, resolve problems, and focus on building products from behind the shadows, politics-free. However, when he said this to me, it made me realize that it’s not about the situation or the environment, but rather how I choose to react (or not react) to it.</p>
<p>More importantly, he made me realize that my new role will only put me in a better position to squash any office politics (with my killer resting face), reinforce our core values, and further protect the positive and empowering culture we have built together.</p>
<h2 id="heading-start-building-your-persona-capital-early">Start building your persona capital early.</h2>
<p>A persona is in short — a representation of a target audience or a person. Research shows it takes about 3 seconds for people to form a perception of you upon the initial meeting. <a target="_blank" href="https://www.businessinsider.com/science-of-first-impressions-2015-2">Sometimes even before you’ve even spoken a word</a>. Now consider this in terms of all the micro-interactions you might have with your colleagues, clients, and business partners day-to-day. Add in impromptu slack messages, random hallway exchanges, desk drop-ins, meetings, and company events — now you have given every person you’ve interacted with countless seconds to form their opinion of you.</p>
<p>What kind of team member would you like to be? What kind of leader do you want to be perceived as? What do you want to be known for? Have these questions answered before you join any team or company — or someone else will answer them for you.</p>
<blockquote>
<p><em>If you want to be perceived as a competent, reliable, and self-sufficient person — show it and own it every opportunity you get.</em></p>
</blockquote>
<p>Once you build your persona capital, it’ll be one of your most valuable assets when communicating with stakeholders, influencing key decisions, and working with cross-functional teams.</p>
<h2 id="heading-imposter-syndrome-never-truly-goes-away-but-it-does-get-easier">Imposter syndrome never truly goes away, but it does get easier.</h2>
<p>Several months after joining Christina’s, I had a heart-to-heart with my CTO. <a target="_blank" href="https://medium.com/the-year-of-the-looking-glass/the-imposter-syndrome-9e23e2326d88">I told him how I felt like an imposter</a>. I told him how I felt like everything I’ve achieved up to this point had all been attributed to luck. It also didn’t help that I’ve never had any formal design education. I’m afraid that I was going to be exposed as a fraud one day. I was upfront about my personal assessment, and honestly, it felt good to finally say it out loud.</p>
<p>What he said next shocked me:</p>
<blockquote>
<p>he told me he felt the same.</p>
</blockquote>
<p>I was in disbelief and all I could muster was… really? This made me realized that this so-called imposter syndrome is perfectly normal, and it can happen to anyone regardless of age, sex, and experience. If anything, it just means you’re a humble person with <em>really</em> high expectations of yourself.</p>
<p>It’s been a couple of years since that exchange, and since then, I’ve felt less and less like an imposter. If you’re feeling these insecurities, share it with someone you trust. It’ll help relieve some of the burden and guilt.</p>
<p>One reassuring thing I’ll add is this — it will only get easier with time as long as you show up, put in the work, and commit to continuously learn.</p>
<p>Remember, you’ve earned your spot at the table. The only person that you need to convince now is <strong>yourself</strong>.</p>
<h3 id="heading-your-harshest-critic-is-always-going-to-be-yourself-dont-ignore-that-critic-but-dont-give-it-more-attention-than-it-deserves">“Your harshest critic is always going to be yourself. Don’t ignore that critic but don’t give it more attention than it deserves. </h3>
<p>— <a target="_blank" href="https://www.brainyquote.com/quotes/michael_ian_black_494912">Michael Ian Black</a>”</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Leadership is not made of code ]]>
                </title>
                <description>
                    <![CDATA[ By Luca Florio The team leader is a key figure in a team of developers. It is a difficult role, involving both technical and social skills. This is the reason why not everyone is tailored for it. The technical competence usually is not the problem (e... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/leadership-is-not-made-of-code-1de22ba168f3/</link>
                <guid isPermaLink="false">66d45e4af855545810e9343a</guid>
                
                    <category>
                        <![CDATA[ leadership ]]>
                    </category>
                
                    <category>
                        <![CDATA[ management ]]>
                    </category>
                
                    <category>
                        <![CDATA[ self-improvement  ]]>
                    </category>
                
                    <category>
                        <![CDATA[ teamwork ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tech  ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Mon, 15 Apr 2019 16:32:21 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*iENh9a07LS9umDVcmOVT6Q.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Luca Florio</p>
<p>The team leader is a key figure in a team of developers. It is a difficult role, involving both technical and social skills. This is the reason why not everyone is tailored for it.</p>
<p>The technical competence usually is not the problem (emphasis on <em>usually</em>). The social skills — let’s call that <em>leadership</em> — are a different story. Technical skills are fundamental, but <strong>leadership is not made of code</strong>. It is what keeps teams together and motivated.</p>
<p>Bad leadership can compromise not only the success of the product but the team itself. It is not uncommon to see good developers leave because of a bad team leader (a.k.a. <em>the boss</em>). This is not to be taken lightly, and it is a topic worth exploring a bit. So, what is leadership made of?</p>
<h3 id="heading-leadership-is-made-of-respect">Leadership is made of respect</h3>
<p>Respect is a key point in leadership. A good team leader needs to be respected by developers, first of all like a professional. It is hard to give respect to someone that you consider unqualified. But as stated before, leadership is not only about technical competence. This means that a team leader should also be respected as a person. How to achieve this? The answer is easy: if you want respect, you must give respect.</p>
<h4 id="heading-respect-is-a-two-way-road"><strong>Respect is a two-way road</strong></h4>
<p>Have you ever felt like your boss doesn’t like you? That you are not really part of the team? That everything you do is not enough or correct? That’s the kind of feeling that leads a developer to perform below their capabilities. It is also what brings a developer not to respect the boss. If I feel you don’t like me, probably in the end, <strong>I won’t like you either</strong>.</p>
<h4 id="heading-have-no-bias"><strong>Have no bias</strong></h4>
<p>Developers are human beings. They have their virtues and vices, they have a life or family outside the office. A team leader should understand and respect developers, both as professionals and as people, all the same way and <strong>without bias</strong>. Personal feelings should be kept outside the office. It is hard, but a good team leader manages to do it.</p>
<h3 id="heading-leadership-is-made-of-trust">Leadership is made of trust</h3>
<p>Trust is the foundation of every relationship, and professional ones are no exception. <strong>Leadership means trusting your developers</strong>.</p>
<h4 id="heading-your-way-isnt-my-way"><strong>Your way isn’t my way</strong></h4>
<p>Personally, I hate when the boss tells me not only what task to do, but also how to do it in every detail. It’s even worse when they are always shoulder-surfing me, checking what I’m doing — and how I’m doing it. Eventually, I will think that the boss does not trust me. The end result is that I’m more worried about completing the task in the way my boss would like instead of doing it the best possible way (yes, the two things sometimes do not overlap).</p>
<h4 id="heading-to-delegate-is-a-win-win"><strong>To delegate is a win-win</strong></h4>
<p>This is why it is important for a team leader to give trust to developers. There is a new feature of the product to implement? Choose a couple of developers and let them handle the feature, from design to implementation to production. Check with them on the status of the work, give suggestions if it is necessary, but let them be free to handle the task.</p>
<p>Delegating the task shows that you trust your developers to do a good job. This lets you focus on the big picture instead of implementation details. They will appreciate it and will try to deliver the best possible work. I call this a win-win.</p>
<h3 id="heading-leadership-is-made-of-rules">Leadership is made of rules</h3>
<p>Rules are what makes society work. The same is for a team of developers. Anyone can create a set of rules and impose them on the team. Leadership is what makes the team follow the rules <strong>because they want to follow them</strong>, not because they are obliged to. This is possible only if they trust the leader to create a set of rules based on shared values (trust and respect).</p>
<h4 id="heading-forced-rules-are-no-rules"><strong>Forced rules are no rules</strong></h4>
<p>I don’t know you, but I have hard times following rules I don’t believe in. I cannot do it just because someone imposed them on me, without explanation and without a minimum discussion. I can try to do it, but probably I will bend the ones I find wrong. If everyone on the team bends some rules, the result is that there aren’t rules anymore. Say goodbye to productivity.</p>
<h4 id="heading-create-common-ground"><strong>Create common ground</strong></h4>
<p>Even if you as the team leader have the final say, discuss these rules with the whole team. In this way, there will be a <strong>common ground</strong> to work on. No more rules bending. These rules can go from coding conventions to the choice of the IDE. It may sound trivial, but it is better to point out even simple things. The team leader should set an example, and should be the first one to follow the rules.</p>
<h3 id="heading-leadership-is-made-of-time">Leadership is made of time</h3>
<p>A team leader should value their time; it’s one of the most important things they can give to the team. Avoid unnecessary meetings and save time for your developers. Leadership is being there for a developer asking for your time.</p>
<h4 id="heading-my-time-is-valuable-like-yours"><strong>My time is valuable like yours</strong></h4>
<p>I can understand that everyone is always busy. But if I ask you to talk — because I need to talk, for some valid reason — and you set up a meeting, I expect that you will attend that meeting. My time is valuable exactly like yours. If you don’t respect my time, this is bad for a couple of reasons. First, if you made me wait for nothing, you wasted my time. I could have done something useful instead. Second, I feel like <strong>I’m not worth your time</strong>.</p>
<h4 id="heading-take-some-time-to-talk-to-developers"><strong>Take some time to talk to developers</strong></h4>
<p>Set checkpoint meetings to discuss the status of the work. Find a time slot monthly to do a one-on-one with every member of the team, to check how things are going and understand their needs. Always be on time when you schedule a meeting. By the way, remember a simple rule:</p>
<ul>
<li>5 minutes in advance is on time.</li>
<li>On time is late.</li>
<li>Late is <strong>unacceptable</strong></li>
</ul>
<p>I said it before, but I can’t repeat it enough: the team leader should always set an example.</p>
<h3 id="heading-leadership-is-made-of-strength">Leadership is made of strength</h3>
<p>Sometimes things go south. When this happens, a team leader stays strong.</p>
<h4 id="heading-when-pieces-start-falling-down"><strong>When pieces start falling down…</strong></h4>
<p>You as the team leader should be a reference in every situation. Otherwise, when something is falling down, you will trigger a chain reaction that will make the team unable to solve the situation. In the worst case, things go wrong and your developers are blamed because you cannot handle what’s happening. If you cannot handle a difficult situation, chances are you are not suited for the role of team leader.</p>
<h4 id="heading-dont-panic"><strong>Don’t panic</strong></h4>
<p>Leadership requires the strength to be always a solid reference for the developers, even in an Armageddon-like situation. If your developers see you panicking and losing control of the situation, they will panic too. This is the last thing you want in a difficult situation. Panic doesn’t fix problems. Do yourself and your developers a favour: stay calm. <strong>Don’t panic</strong>.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/xY7B-zaTo5aYaQqFHP61v5AChIARSgfXRUoW" alt="Image" width="800" height="468" loading="lazy">
<em>Please, don’t panic</em></p>
<h3 id="heading-conclusion">Conclusion</h3>
<p>The role of the team leader is a complex one, involving both technical and social skills. Technical competence is a must, but it is not enough to be a good team leader. There are aspects that are far more important in the creation of a productive and close-knit team.</p>
<p>As a final note, remember that the trick is to think about what’s best for your team. In the end, <strong>the team leader works for the developers</strong>, not the other way around.</p>
<p>See you! ?</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How I organized Google Hash Code 2019 at Chandigarh University Hub ]]>
                </title>
                <description>
                    <![CDATA[ By Neeraj Negi This is me !!! @Neeraj Negi — Google HashCode Organizer “Organizing the event is not a big deal but handling and making it successful is”- Nj Over 900+ students participated in Google HashCode2019 from “Chandigarh University Hub”. I ... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/google-hash-code-2019-chandigarh-university-hub-organized-by-neeraj-negi-923118fce083/</link>
                <guid isPermaLink="false">66c34bcc9972b7c5c7624e6e</guid>
                
                    <category>
                        <![CDATA[ community ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Google ]]>
                    </category>
                
                    <category>
                        <![CDATA[ leadership ]]>
                    </category>
                
                    <category>
                        <![CDATA[ General Programming ]]>
                    </category>
                
                    <category>
                        <![CDATA[ technology ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Mon, 08 Apr 2019 18:08:55 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*tYI12tT28CbrPwkQJjgI1Q.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Neeraj Negi</p>
<blockquote>
<p>This is me !!! <strong>@Neeraj Negi — Google HashCode Organizer</strong></p>
<p><em>“Organizing the event is not a big deal but handling and making it successful is”- Nj</em></p>
</blockquote>
<p><strong>Over 900+</strong> students participated in <strong>Google HashCode2019</strong> from “<strong>Chandigarh University Hub”</strong>. I am writing this so that my peers and fellow juniors can learn something from my experience <em>because in life we don’t have enough time to fall and then learn</em>. I hope you will enjoy this and learn how I was able to manage this event.</p>
<p>So the story starts with getting notification from Google about “Google HashCode 2019”. I live in the beautiful city of Chandigarh, India and am currently pursuing my Bachelors in Computer Science &amp; Engineering. Being a <strong>Google Web Specialist Scholar</strong> and <strong>Google Pytorch Scholar,</strong> I was able to get the notification about <strong>GH19</strong> earlier via communication. ?</p>
<h4 id="heading-a-little-bit-about-me">A little bit about me</h4>
<p>I have already handled many huge events but this particular event has been one of the biggest — not only in terms of student engagement, but also in terms of expectations. I was very excited about the event and I also wanted to participate in the hashcode Competition in spite of being an organizer. I am a member of <strong>Women Tech-Makers by Google,</strong> <strong>Google Developer Group- Chandigarh, AWS Educate Member, 1MWIT, Linkedin Local, Adobe Club Member and in many other clubs hosted by the university<em>.</em></strong></p>
<p><strong>Background:</strong> <em>I am a Full stack web developer (MEAN Stack) |UI/UX -Web Design | Voice-Recognition Developer | Founder of Business Targeting |Linkedin Enthusiast | Google Adwords Certified | Alexa Skill and Google Assistant Developer| Mentor of 1millionWomen in Tech |Adobe Campus Representative | Working on Self Driving Cars (ML, AI) |CompTIA+| Working on AWS</em>  </p>
<p>I have already gotten my hands dirty with C, C++, and Python during my High School years and have learned new programming languages like Java, JavaScript, Node.Js, Angular.Js in University. My natural curiosity led me towards the field of web development and self-driving cars. I have ongoing research on deep neural networks.</p>
<p><strong>So now let’s go back to the story.</strong> ? Most of the students in my university were not aware of the Google hashcode Competition. So I decided to spread some awareness to the students and convince them to participate so that they could learn something from real-world problems. Even if they didn’t know how to write &lt;&lt;hello world; they could still research and start exploring.</p>
<blockquote>
<p><em>“Research is to see what everybody else has seen and to think what nobody else has thought. — Albert Szent-Gyorgyi”</em></p>
</blockquote>
<h3 id="heading-google-hashcode-competition-timing-hashcode-hubs-dashboard-team-formation">Google HashCode — Competition Timing | HashCode Hubs | DashBoard | Team Formation</h3>
<p><img src="https://cdn-media-1.freecodecamp.org/images/JaWJC6e0Qwr7LQnqm2VGx-BM8W2CH1DMIWpG" alt="Image" width="800" height="800" loading="lazy"></p>
<p>A little context, first: Google Hash Code is a programming competition. You get a task from Google, along with a few input files. You’re supposed to write a program that reads an input file and produces an output file which solves the problem. The hard part: you have to do it within 4 hours.</p>
<p><strong>Online Qualification Round</strong> The initial online based Qualification Round was held on Thursday, February 28, 2019, from 17:30 UTC until 21:30 UTC.</p>
<p><strong>Reason to participate:</strong></p>
<p>Whether you’re new to programming or a coding competition pro, there are plenty of reasons to participate in Hash Code. Lindsay Taub, my mentor, <a target="_blank" href="https://blog.google/technology/developers/three-reasons-to-participate-in-hashcode/">put it best</a>:</p>
<ol>
<li><strong>Optimization problems for the win.</strong> _Just like the problems that Google engineers tackle, there’s never one right answer to a Hash Code problem. Instead, each round of the competition is designed as a “battle of heuristics” — imperfect solutions. There are many ways to approach the challenge, and teams should continuously iterate on their solution throughout the round. Getting familiar with past problems is the best way to prepare; always hold a practice session (or two) with your team using the Hash Code <a target="_blank" href="https://codingcompetitions.withgoogle.com/hashcode/archive?utm_medium=blog&amp;utm_source=keyword&amp;utm_campaign=reg_promo&amp;src=Online/TOPs/HC">archive</a>._</li>
<li><strong>Hash Code is all about community.</strong> _From competing on a team of two to four people to participating in the competition from a <a target="_blank" href="https://codingcompetitions.withgoogle.com/hashcode/hubs?utm_medium=blog&amp;utm_source=keyword&amp;utm_campaign=reg_promo&amp;src=Online/TOPs/HC">Hash Code hub</a> (a local meetup that <a target="_blank" href="https://codingcompetitions.withgoogle.com/hashcode/hubs/organize?utm_medium=blog&amp;utm_source=keyword&amp;utm_campaign=reg_promo&amp;src=Online/TOPs/HC">you can organize</a>), opportunities to connect with other Hash Coders are everywhere. This is the first year Hash Code is open to developers globally, and we’re excited to see this community continue to grow. Meet other Hash Coders, find teammates and stay up-to-date on all the latest Hash Code buzz._</li>
<li><strong>Googley fun.</strong> <em>Hash Code is an opportunity to get a glimpse into software engineering at Google, and when our teams come together to solve challenging problems, you can bet they have some fun while doing it.</em></li>
<li><strong>Learning and learning.</strong> <em>If problems are solved by you or not! you always get some benefits by learning new things, getting familiar with new tools and methods. You can’t learn these things without participating so if you did your best, kudos to you.</em></li>
</ol>
<blockquote>
<p>You never lose…. either you win or you learn.</p>
</blockquote>
<p>The best way to experience the Hash Code is to discover it for yourself. ?</p>
<p><strong>Here are some of the photographs taken on that day!</strong></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/D2sWRFRa1NWetwa2QINISdmudlIHLHq85o43" alt="Image" width="800" height="800" loading="lazy"></p>
<h4 id="heading-here-are-some-questions-i-would-like-to-answer">Here are some questions I would like to answer:</h4>
<ol>
<li><strong>Why did I choose to organize a hub at Chandigarh University?</strong></li>
</ol>
<p>I chose to organize a hub here at CU is because I felt that providing an opportunity for people to come together and work on a challenging problem is the best way to let them develop their skills and themselves. Hub gives you a platform so that you can showcase your coding talent and at the same time learn something from others too.</p>
<p><strong>2. What was the process of setting up my hub?</strong></p>
<p>There were so many things to do, like booking a room, Labs, getting approvals from our university, and ensuring Wifi was set up. At that time I was expecting around 400–500 participants but the count went way beyond that... I booked 2 Seminar halls and 14 Computer labs containing 36 PCs each for participants on that day. But later I booked 4 more rooms and that's how I managed to put all the students in one block. Getting permission for rooms for a night was one of the hardest parts, but thanks to my supportive friends I was able to do it.</p>
<p>We also started promoting the event a few weeks earlier to be sure we had as many participants as possible. The real fun started just before the competition when we decorated the room with balloons and posters — luckily a few Volunteers came early so they decided to join us and help!</p>
<p><strong>3. What was my favorite part about hosting a hub?</strong></p>
<p>Meeting new people! That’s definitely the best part. You can feel the passion and excitement in the room.</p>
<p>Students came here not only for coding but for being a part of world level competition.</p>
<p><strong>Thanks, guys for coming here!</strong></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/drJja8NgFSBwV2QzEqoVTYdDGWcq8ElW-YCH" alt="Image" width="800" height="800" loading="lazy"></p>
<h3 id="heading-3-days-before-google-hashcode"><strong>3 days before Google Hashcode</strong></h3>
<h4 id="heading-planning"><strong>Planning</strong></h4>
<p>In India, the timing of Google hashcode Competition was 28th Feb at 11 pm at night. So I had to find out the availability of the students at night and also space, decorations, wifi, food resources, and security.</p>
<p>The most difficult task was getting permission for a night event. 3 days prior I emailed my department head and UIR about this event so that no problems would occur. They got my email and replied back to me on the same day. The department helped me in arranging the stay of day-scholars and getting permission for hostler to reach our Hub. Then I got help from my university branding department for printing out the Google printable kit for decorations and visitor cards or participants cards.</p>
<p>I would like to thank the professors, deans and all other faculty members of <strong>Chandigarh University</strong> who gave me permission for this and helped me in each and every arrangement.</p>
<h4 id="heading-promotion"><strong>Promotion</strong></h4>
<p>We did promotion for 2 days before hashcode by showing posters and flyers on the student portal. We were not expecting that kind of participation from students — my volunteering team told me that for a night event we could assume less than 400 participants.</p>
<p>But I knew that I could engage more than 400 students for this event. So I created a simple presentation describing the event and the benefits of participation. I also created a Google form so that I could get the information about participants.</p>
<h4 id="heading-decoration"><strong>Decoration</strong></h4>
<p>The most interesting and eye-catching thing was the decorations. Thanks to my friend ? @Deepika for taking responsibility for the decorations. She helped me a lot during this event and I really appreciate her effort.</p>
<p>Also, @Shushant,@Anant @Aditinegi, @ayesha, @itika @priyanka @manish @simran were working on Whiteboard Designing, Balloons and cutting Google sign prints.</p>
<p>Thanks for all kinds of efforts you gave to this event!</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/oUTtXDOAyrJI0m4liSMr2NP281ZadmMc90e9" alt="Image" width="800" height="800" loading="lazy"></p>
<h4 id="heading-volunteering-team"><strong>Volunteering Team</strong></h4>
<p>I am aware that for these kinds of events, you need your own team who can help you to arrange all kinds of stuff so that you can more focus on the core parts.</p>
<p>I have already a team of 150 students, but this time I thought to give this opportunity to new people.</p>
<p>It took me 2 days to find the right volunteers and give them the opportunity to grow. Before this, a session was held in the morning with volunteers so that they could be more comfortable and flexible with me!</p>
<p>What life has taught me is that you can not lead people if they do not respect you, do not trust you, and do not believe you. You can order them around, but to get them to do their best you need to win their hearts.</p>
<p><strong>People do not care how much you know until they know how much you care and can help them solve their problems.</strong></p>
<p>Creating this volunteering team and finding each and every volunteer becomes worth it. Thanks to all the 80+ coordinators who helped me with this event.</p>
<p>Special thanks to @avlin and @ashish @jatin @akhil @kartik and @karan for helping me with setting arrangements.</p>
<p>I think I was able to make each and everyone volunteer a good leader by guiding them in the right direction.</p>
<blockquote>
<p><em>“Leaders become great not because of their power but, because of their ability to empower others and find out the strength they have.”</em> — John C. Maxwell</p>
</blockquote>
<p><em>That's what I did!</em></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/MPWSBYsz2lGCWfsh9iFcvSP4k-J5OfUF6Let" alt="Image" width="800" height="800" loading="lazy"></p>
<h4 id="heading-28th-feb-2019-ist"><strong>28th Feb 2019 IST</strong></h4>
<p>At 8:30 pm this was the crowd ?</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/DCx7GcMsrKrZDlraKI-L1jQZPRgYgNxNan2I" alt="Image" width="800" height="533" loading="lazy"></p>
<h4 id="heading-ama-session-before-hashcode-online-qualification-round"><strong>AMA Session before HashCode Online Qualification Round!</strong></h4>
<p>So before the Google HashCode Competition started, I held a session to get students familiarized with the HashCode Dashboard, Point and ranking system, Optimisation of the problem and input-output logic. I also talked about lots of things other than hashcode and shared my experience with the students.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/uJBlAgmW78ANbKWGWTbecPsj15-iCO7tiRNK" alt="Image" width="800" height="800" loading="lazy"></p>
<h4 id="heading-questions-and-queries"><em>Questions and Queries</em></h4>
<p>I also took some questions from the students.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/4JebYQTe5Bp9-ucdih0-668fLMtsiKv4pnev" alt="Image" width="800" height="800" loading="lazy"></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/63jDlS0G1GRWXXfvVQR7Efc-HIgJ1qPk7POX" alt="Image" width="800" height="800" loading="lazy"></p>
<h4 id="heading-1st-march-2019-ist"><strong>1st March 2019 IST</strong></h4>
<p><strong>Competition started!</strong></p>
<p>As the problem was released, all coders started working on their solutions. All the students were busy with the problem statement.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/2QkrXeKkhchVadkhGZSCSmeo7W6iTgmQIpb9" alt="Image" width="800" height="800" loading="lazy"></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/MeRkvi4m1kFjoUzvuOkWZmwF-Oz-MDPDW0He" alt="Image" width="800" height="450" loading="lazy"></p>
<h3 id="heading-fun-quiz-music-game-kahoot">Fun | Quiz | Music Game | Kahoot</h3>
<p>After the Hashcode competition, we organized some Quiz and music ball games so that the students did not get bored and stayed connected with the event. It’s important not only to code but also to enjoy the moment.</p>
<p>Thanks, @sahil, and <a target="_blank" href="https://www.freecodecamp.org/news/google-hash-code-2019-chandigarh-university-hub-organized-by-neeraj-negi-923118fce083/undefined">Nilansh Gupta</a> — these are my friends who were with me while organizing Kahoot, the music ball game, and the AR game. I got feedback from the students and they really enjoyed these games. After the games, the students started taking photographs.</p>
<p>Thanks to @kashish, @himanngshu boro, and @saurav for taking photographs!</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1cUujGlvvKFd47bTmEz5H5UsFczxrA7T-K1d" alt="Image" width="800" height="800" loading="lazy"></p>
<p><em>Kahoot Quiz</em></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/OljZ1z1IvW1FPK5eKujS8IP1Ec5qFe52P1jS" alt="Image" width="800" height="450" loading="lazy"></p>
<p><em>Music Game after Hashcode Competition!</em></p>
<p>At 5:00 am the students went back to their homes.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/Ff5la69a7cRjPb-cQRhGWRzm27hGWNj7VyOb" alt="Image" width="800" height="450" loading="lazy"></p>
<h3 id="heading-volunteer-team-behind-hashcode">Volunteer Team Behind HashCode</h3>
<p>I think it is the main responsibility of a Team leader to see the potential in others, to help them develop their strengths they did not even know they had, and give others opportunities to grow and always appreciate them even if it’s a small win by them.</p>
<blockquote>
<p>It is impossible to be a good leader without being a good person!</p>
</blockquote>
<p>It costs nothing to be respectful, kind, nice, supportive, grateful and positive.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1VMSU8wwgFbeizDXWDbklcPj061CK4gvuv95" alt="Image" width="800" height="651" loading="lazy"></p>
<p><em>“We are not a team because we work together. We are a team because we respect, trust, and care for each other.”</em></p>
<p>Here was my appreciation message from my side for volunteers at 6am on next day!</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/wUWOFDG3lLLIj6N8Iu4ceZtu-6C4cJ2bySwX" alt="Image" width="631" height="494" loading="lazy"></p>
<p>What I learned from my mentors was that “<em>a person who feels appreciated will always do more than what is expected.”</em></p>
<h3 id="heading-feedback-amp-responses-after-hash-code-competition">Feedback &amp; Responses After Hash Code Competition</h3>
<p>I got around 300+ appreciation messages for the hashcode event from different platforms. I want to take this moment to thank all the participants and coordinators who were there and joined Google Hashcode 2019 with me. In the future, I will definitely organize another event like this. ?</p>
<p>Thanks, @Lindsay Taub for mentoring me!</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/PTmyziCSjif5zPitoti1HtuM9EEVqy9Miatx" alt="Image" width="500" height="157" loading="lazy"></p>
<p>Leading is not about winning, but it is about bringing others with you to the finish line. Agree?</p>
<p>Comments and claps are highly appreciated!</p>
<p>Connect with me on Social Media:</p>
<p>Twitter: <a target="_blank" href="https://twitter.com/realneerajnegi">@realneerajnegi</a></p>
<p>Linkedin: <a target="_blank" href="https://www.linkedin.com/in/neerajnegideveloper/">https://www.linkedin.com/in/neerajnegideveloper/</a><br>Instagram: <a target="_blank" href="https://www.instagram.com/neerajnegi_nj/">https://www.instagram.com/neerajnegi_nj/</a></p>
<p>Follow our Hashcode page: Hashcodenj and #HashCodenj</p>
<p><a target="_blank" href="https://www.instagram.com/hashcodenj/">https://www.instagram.com/hashcodenj/</a></p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to be a team player in the tech world ]]>
                </title>
                <description>
                    <![CDATA[ By Ofer Vugman These tips will boost your relationships and your team’s efficiency at work _Photo by [Unsplash](https://unsplash.com/@yuriyr?utm_source=medium&utm_medium=referral" rel="noopener" target="_blank" title="">Yuriy Rzhemovskiy on <a href=... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-be-a-team-player-in-the-tech-world-c78aa9f4e898/</link>
                <guid isPermaLink="false">66c34f1af41767c3c96bacea</guid>
                
                    <category>
                        <![CDATA[ leadership ]]>
                    </category>
                
                    <category>
                        <![CDATA[ self-improvement  ]]>
                    </category>
                
                    <category>
                        <![CDATA[ software development ]]>
                    </category>
                
                    <category>
                        <![CDATA[ teamwork ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tech  ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Mon, 25 Mar 2019 15:38:11 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/0*FNPBtaldjaMi_rgN" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Ofer Vugman</p>
<h4 id="heading-these-tips-will-boost-your-relationships-and-your-teams-efficiency-at-work">These tips will boost your relationships and your team’s efficiency at work</h4>
<p><img src="https://cdn-media-1.freecodecamp.org/images/i78s5ojofYJVA4V7ZzG3ttGhcwSFRyllzBdP" alt="Image" width="800" height="533" loading="lazy">
_Photo by [Unsplash](https://unsplash.com/@yuriyr?utm_source=medium&amp;utm_medium=referral" rel="noopener" target="_blank" title=""&gt;Yuriy Rzhemovskiy on &lt;a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral" rel="noopener" target="<em>blank" title=")</em></p>
<p>When I landed my first job as a junior developer, I felt I had reached my ultimate goal: get paid for doing what I love most.</p>
<p>It was exhilarating to get recognition for my skillset, especially after years of theory and academia.</p>
<p>I was super hyped.</p>
<p>Shortly after, I learned my first hard lesson in this new world of mine. Turned out, there was a huge difference between what I was taught during my computer science degree, to how things work in the real world.</p>
<p>It was a nasty free fall from, “I know a lot” to “there’s so much more for me to learn.”</p>
<p>From understanding the frameworks, to the patterns and workflow, I was literally miles away from where I had to be.</p>
<p>I realized that if I wanted to strengthen my coding and improve as a developer, I had to keep on learning. It hit me that the learning process would, in effect, never end.</p>
<p>Fast forward a decade later and I’m still learning new technical things every day, and it’s awesome.</p>
<p>But my biggest lesson has been that technical skills alone just don’t cut it.</p>
<h3 id="heading-technical-skills-are-only-half-the-story">Technical skills are only half the story</h3>
<p>We spend a lot of time sharpening our technical skills. We learn new languages, frameworks, methodologies, and patterns. We invest so much time that we sometimes forget another aspect of our day to day work: our human team members.</p>
<p>Whether as a developer, team leader, QA engineer, designer, or product manager, most of us work in teams. We share moments of epic releases and frustrating debugging sessions.</p>
<p>For a group of individuals, coming with their own baggage (experience, opinions, and expertise), it’s not always easy to work and collaborate efficiently. Each individual must adopt specific skills to be the most valuable team member they can be.</p>
<blockquote>
<p>“The strength of the team is each individual member. The strength of each member is the team.” — Phil Jackson</p>
</blockquote>
<p>So while technical skills are crucial, they’re only part of the equation. The other part is becoming the best team member you can be.</p>
<h3 id="heading-how-to-be-a-better-team-member">How to be a better team member</h3>
<p>Honestly, it takes a lot. But let me lay down four of the most crucial requirements you can adopt pronto.</p>
<h4 id="heading-1-leave-your-ego-at-the-threshold">1. Leave your ego at the threshold</h4>
<p>We live in a competitive world. As such, over time, we develop habits we believe will make us stand out and survive.</p>
<p>We want to show we’re smarter, stronger, and better than the rest. We want our strength to be acknowledged by our teammates and managers.</p>
<p>Our ego is often used as a survival skill to help us stand out, and we often blindly believe our solution to a problem is the best one. We categorically reject everyone else’s opinions and suggestions.</p>
<p>In the worst case scenarios, we even make our colleagues feel as though they don’t know what they’re talking about.</p>
<p>This behavior, while it may feed our ego and make us feel better, is destructive. It sucks the air out of every conversation, and creates frustration and a poisonous working environment.</p>
<blockquote>
<p>“The ego can be the great success inhibitor. It can kill opportunities, and it can kill success.” — Dwayne Johnson</p>
</blockquote>
<p>For a team to work and collaborate efficiently, its members must respect one another, allow other’s voices to be heard and accept their opinions, even if we don’t completely agree.</p>
<p>By doing that, we encourage a safe environment. And when we feel safe, our ego becomes irrelevant.</p>
<h4 id="heading-2-embrace-feedback">2. Embrace feedback</h4>
<p>Continuous feedback, whether positive or negative, is key for personal growth, as well as for teamwork. Without it, we’ll never know our weaknesses or how we can improve.</p>
<p>Receiving negative feedback is hard. We tend to get defensive and may push back, trying to reason our behavior or actions.</p>
<p>Giving negative feedback is equally hard, because we’re scared of how the other side will react. We’re concerned it could come off as patronizing, and so we often avoid it altogether.</p>
<blockquote>
<p>“We all need people who will give us feedback. That’s how we improve.” — Bill Gates</p>
</blockquote>
<p>But feedback — giving it and receiving it — is the most powerful tool we have to understand what we need and how we can improve.</p>
<p>So while we should learn how to give constructive feedback, we should also work on accepting criticism. That way, you can implement changes in your every day, and become a more valuable team member.</p>
<h4 id="heading-3-be-accountable">3. Be accountable</h4>
<p>When we release a kick-ass feature, fix an elusive bug, or give an inspiring talk, we expect to get recognition for our efforts. It’s easy to be accountable for the good things we do.</p>
<p>But we’re humans and we’re prone to make mistakes. We might introduce a critical bug in production, say something that was misunderstood, or act in a manner that offended someone.</p>
<p>Being accountable for our mistakes is never easy. It feels like we’re walking around with a big ‘I was wrong’ sign and a lady behind us yelling ‘shame, shame, shame.’</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/mV8YeGEy5FLM261uXUrJEx7nCZGJoSFNP5Fh" alt="Image" width="480" height="269" loading="lazy"></p>
<p>The first thing to understand is that it’s OK to make mistakes. Rather than reveling in the mistake itself, see it as an opportunity to grow.</p>
<p>So be accountable. Accountability implies maturity. It is a key factor for building trust within a team. When something you said was understood differently, or something you coded caused a bug in production — stand up to that failure and be accountable.</p>
<blockquote>
<p>“<strong>He that is good for making excuses is seldom good for anything else.</strong>” — <em>Benjamin Franklin</em></p>
</blockquote>
<p>You’ll build trust among your team members and they’ll know they can count on you to be there in even the most challenging situations.</p>
<h4 id="heading-4-dont-be-a-knowledge-hoarder">4. Don’t be a knowledge hoarder</h4>
<p>We’re in a constant process of learning. Whether reading over an answer on StackOverflow, an online course, or teaching yourself a new framework, your brain is consuming knowledge nonstop.</p>
<p>We acquire a lot of knowledge over the years. We become experts in our field, and if we’re really good, we become the go-to person for that topic.</p>
<p>It can easily fool us to believe that the amount of knowledge we have makes us so valuable to the company - we’re irreplaceable. So we hoard that knowledge.</p>
<p>But knowledge hoarders are destructive for any team.</p>
<p>When we deny access to the knowledge we acquired throughout our career, we not only harm our team’s productivity and efficiency, but we create an ‘every (hu)man for himself’ culture.</p>
<p>It’s toxic.</p>
<p><strong>When you share knowledge, you empower others. You take an active part in their personal growth. You encourage conversations and creative thinking.</strong></p>
<p>The best part about sharing knowledge is that it encourages reciprocity: others will be more likely to share their knowledge with you. You’ll be surprised by how much you can learn from the person sitting next to you.</p>
<blockquote>
<p>_“If you have knowledge, let others light their candles in it.” — M_argaret Fuller</p>
</blockquote>
<p>Being an expert in your field doesn’t necessarily make you a great educator; spending time teaching and learning will make you a much more valuable team member.</p>
<h3 id="heading-make-time-for-teamwork">Make Time for Teamwork</h3>
<p>While you need to hone your technical skills continuously to step up your game, make room for your teamwork skillset. There’s nothing worse than having a team member that may be good technically, but is the absolute worst when it comes to working together.</p>
<p>It’s not only about creating a positive environment — curating the perfect team with individual team members that embody these four requirements will bring you better technical results, and extraordinary efficiency.</p>
<p>And that’s something that works for everyone.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/LDB07xYaTRezsDwVgTN68dzkyGWVwPREBr-F" alt="Image" width="539" height="270" loading="lazy"></p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ What I wish I knew before becoming a VP at a large startup ]]>
                </title>
                <description>
                    <![CDATA[ By Assaf Elovic When I started my position as VP of R&D at a growing startup, I thought my biggest challenges would be mainly technical. That is, provide state of the art architecture solutions, conduct code reviews, help solve complex algorithmic ch... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/what-i-wish-i-knew-before-becoming-a-vp-at-a-large-startup-d2336645a38b/</link>
                <guid isPermaLink="false">66c3658c0002df282f2225cd</guid>
                
                    <category>
                        <![CDATA[ leadership ]]>
                    </category>
                
                    <category>
                        <![CDATA[ management ]]>
                    </category>
                
                    <category>
                        <![CDATA[ self-improvement  ]]>
                    </category>
                
                    <category>
                        <![CDATA[ startup ]]>
                    </category>
                
                    <category>
                        <![CDATA[ technology ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Mon, 04 Mar 2019 16:31:33 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*v_4R_8Cke5N4s081y-pCeg.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Assaf Elovic</p>
<p>When I started my position as VP of R&amp;D at a growing startup, I thought my biggest challenges would be mainly technical. That is, provide state of the art architecture solutions, conduct code reviews, help solve complex algorithmic challenges and maybe even push some code. That’s because my previous technical leading positions were at small startups, where anyone who can code is needed when dealing with limited resources in a fast paced environment.</p>
<p>A few mistakes straight into the position made me realize very quickly that leading R&amp;D for a team of over 20 people requires a variety of skills. Just to clarify, my team is constructed of five divisions - Front End, Back End, Mobile, Research (mostly machine learning) and QA.</p>
<p>So here are 5 lessons I wish I had known when starting this position:</p>
<h3 id="heading-1-get-to-know-your-people">1. Get to know your people</h3>
<p>Understanding what empowers and motivates your team members is powerful. It’s important to remember that every person is different: they need different things, have different communication styles, and focus on different things.</p>
<p>Get to know what motivates each of your team members and what are their passions and career goals. This way you can leverage tasks and responsibilities based on it and maximize productivity and motivation within your team. It’ll also help retain your employees and make them feel more resourceful and self-fulfilled.</p>
<p>I schedule a weekly 1-on-1 meeting with each team leader and a monthly 1-on-1 with the rest of my team. In these meetings, I try to focus mainly on the personal level. Some meetings are very short, and some suddenly take hours. This policy provides me with a constant pulse of my teams’ status and motivation level, allowing me to prioritize who and when needs that extra push and attention. And believe me, there was always someone who needed it.</p>
<h3 id="heading-2-dont-be-the-hero">2. Don’t be the Hero</h3>
<p>I truly agree with the saying “You’re only as successful as your team”. As engineers, we are constantly striving to solve complex problems, or in other words, be the hero. As the leader of your team, your job is to have a capable team that can solve any challenge on their own, <strong>without you</strong>. The more you try and solve for them, the more they’ll rely on you for future challenges.</p>
<p>I found this rule to be very hard to follow since sometimes it feels much more effective to bring out a solution from experience, than have your team research for days on end. However, down the line, it’s proven to be the most valuable lesson I’ve learned. With an independent and capable team, you’ll have much more time and focus to push and improve areas of your R&amp;D that you are mostly capable of.</p>
<h3 id="heading-3-never-be-a-bottleneck">3. Never be a Bottleneck</h3>
<p>The first mistake I made going into the position was to take on a coding task. Coding is my comfort zone which is why I probably fell back to it. Very quickly I was flooded with unexpected top priority issues to deal with, hours and hours of staff, business, and product meetings, not finding almost a single hour to focus on the coding task. Even when I did find some time, we all know coding requires getting “into the zone”, which was hard when constantly getting interrupted. In the end, I was creating a bottleneck in my own team, which almost delayed deployment.</p>
<p>I am still amazed at how many unexpected issues can occur on a daily basis. From HR and external relations to technical and political company challenges. As a leader, you should make sure you’re always available to deal with urgent issues. If you take on tasks such as deployment yourself, you’ll either be risking being a bottleneck or not have enough time to deal with urgent tasks that only you can help solve effectively.</p>
<h3 id="heading-4-strive-to-be-clear-and-assertive-about-estimates">4. Strive to be clear and assertive about estimates</h3>
<p>We’ve all been asked questions such as “how long will this take?”, “why is it taking so long?”, etc. Surprisingly, we are often asked these kinds of questions when things are not taking any longer than estimated. We are often asked these questions when our peers either didn’t really like the original estimation or didn’t ask for it in the first place, and now they’re upset, despite nothing going wrong.</p>
<p>Therefore, you must always be assertive about sharing estimates and updating accordingly, <strong>even when people don’t ask</strong>. It is your job to make it clear, as best you can, what “long” actually is by providing your best view into the timescale of a project, and proactively updating that view when it changes.</p>
<p>Nonetheless, you should also be assertive about getting estimates from your team, and constantly strive to improve their estimation process and instincts. Try to take part in estimation meetings, and don’t be afraid to challenge their input and cut scope toward the ends of projects in order to make important deadlines. Your role in these meetings is to play a tiebreaker and make decisions about which features are worth cutting, and which features are essential to the project’s success.</p>
<h3 id="heading-5-focus-on-building-processes-and-strategy">5. Focus on building processes and strategy</h3>
<p>As someone who’s constantly aware of both the high-level business needs, and internal requirements and pains, you’re in the best position for focusing on building external processes.</p>
<p>When I started the position, the first process I focused on was <a target="_blank" href="https://medium.freecodecamp.org/code-review-the-ultimate-guide-aa45c358bbf5">how to conduct code reviews</a>. While this is something that might be expected of a VP of R&amp;D, it is a process my team can probably build better than I can. Since they face the daily challenges of deployment, and understand each other’s styling preferences and coding standards, this was definitely an internal process I could give my team leaders to build while I was focusing on external processes.</p>
<p>Also, by having your team lead such internal processes, you’d increase overall engagement and sense of responsibility that will ultimately lead to more initiatives within your team.</p>
<p>An example of an external process would be the delivery process between the product and R&amp;D team. Each division has its own requirements, culture, and needs. I’d conduct meetings with the VP of Product, and interview product managers and my team leaders to fully understand how to build a process that’s aligned with everyone’s needs and maximize delivery productivity.</p>
<p>Only you have the time and resources to fully understand and see the high-level picture of what’s needed to accomplish such cross-functional external processes.</p>
<p>I have no doubt many more lessons are to be learnt as I continue my journey in my role, so I hope to continue sharing them with you.</p>
<p><em>If you’ve enjoyed this piece, go ahead, give it a clap ??! You can also share it somewhere online so others can read it too. If you have any questions, feel free to drop me a line in the comments below!</em></p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Have you tried turning your software team’s identity off and on again? ]]>
                </title>
                <description>
                    <![CDATA[ By Victoriya Kalmanovich This series portrays my experience as an R&D group leader of a group that has the same behavior as a failing startup. In my last two blog posts, I’ve presented a short background regarding the developers and the technologies.... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/have-you-tried-turning-your-software-teams-identity-off-and-on-again-a06aad5f1f50/</link>
                <guid isPermaLink="false">66c34c3093db2451bd441470</guid>
                
                    <category>
                        <![CDATA[ Business development ]]>
                    </category>
                
                    <category>
                        <![CDATA[ leadership ]]>
                    </category>
                
                    <category>
                        <![CDATA[ software development ]]>
                    </category>
                
                    <category>
                        <![CDATA[ startup ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tech  ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Fri, 01 Feb 2019 17:13:35 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*Ei2UmVQ2cAA2FM2Vy8Pi-A.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Victoriya Kalmanovich</p>
<p>This series portrays my experience as an R&amp;D group leader of a group that has the same behavior as a failing startup. In my last two blog posts, I’ve presented a short background regarding the developers and the technologies. This blog post will deal with the vague definition of a group’s identity.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/dCrW5k8kCjFHInx9n8fbXL-bVB2Q6sE0DUe8" alt="Image" width="800" height="467" loading="lazy"></p>
<p>In <a target="_blank" href="https://medium.com/@vicki.kalm/overcoming-a-technological-gap-a-horrible-circumstance-or-a-creative-adventure-ad3e97e64e44">my last blog post</a>, I portrayed an image almost too good to be true. An image of a productive software group, full of energy and hunger for projects. I knew I must look away from newly gained success and only into the problems, however unfortunate that made me feel.</p>
<p>On the one hand, I felt the need to present the milestones I’ve created to restore some kind of productivity. I wanted to show the boss all the recent successes — the coding methodology, working regulations and other concepts we’ve begun implementing. I wanted to present the training concepts and procedures we’ve established. I wanted to present the strong cooperation I’ve led with another organization. This cooperation granted an opportunity to combine the organization’s knowledge pool and create better professional training for my group. On top of these, one of our projects was accepted to an acceleration program. I really wanted to show that off as well.</p>
<p>But I knew this image would soon fade unless I continued targeting the main issues. The primary issue was this next hard truth. The group didn’t have a strong basis and it was just a matter of time until it might collapse again. I identified it as the group’s lost identity.</p>
<h4 id="heading-what-is-a-group-identity">What is a group identity?</h4>
<p>When we reach a point in life where we seek our unique identity we look into various questions. Where am I from? What is my heritage? Who influences me? What’s exciting for me? What’s the reason I wake up in the morning? These questions helped me shape my personal identity both as a human being and as a leader. The same process happens one way or another in every organizational structure.</p>
<p>Defining a group’s identity must happen the moment a manager takes the reins. They must look at the group’s responsibilities and define each group member’s position. It clears many things up. It provides clear borders regarding the manager’s and the developers’ responsibilities.</p>
<p>This process must occur at the group manager’s level and even higher. It is rare that a complex organizational understanding such as an identity can depend on the team leads’ scope or lower. It is also unfair to the team leads, who already have enough on their plate.</p>
<p>As you may recall from my previous blog post, I talked about the vicious zero-products cycle. This cycle started somewhere, so I started retracing the group’s steps. I realized that the moment the last official product version was released was the breaking point. This was the point where there was no clear view on what the group’s main objective was, what was its purpose and what was the product it was responsible for delivering.</p>
<h4 id="heading-what-was-the-main-objective">What was the main objective?</h4>
<p>The main objective was software and system maintenance for a very complex system. In order to perform software maintenance on such a large amount of code, a developer must work on the code. The developer must understand it and get to know its genius functions, but also its inherent faults and flaws. The developer must feel the code. They can only gain this feeling through massive research and deep understanding of procedures within the system.</p>
<p>In my view, it is impossible to maintain the entire system simultaneously, as a result of a small number of maintenance dedicated developers and a very serious lack of knowledge. So I declared that maintaining specific domains every year was good enough for us. The alternative would be scattered maintenance that would only lead to more gaps in the long run.</p>
<p>Let’s look at a simple example such as inserting an image on a screen. This is easy in modern systems written in readable code that follows proper coding methodologies.</p>
<p>In our case, to insert a feature, the developer needed to follow more complex steps. They would research the entire screen’s code and the entire code of screens that might be affected by the change. It might take up to a month of research. After the research would’ve developed some conclusions. They would try to decipher the relevant piece of the system’s architecture and find a few ways to implement image insertion.</p>
<p>In parallel, and this is the important part, the developer must document EVERYTHING. Every difficult method. Every process they discover. Every architecture or network insight they have. Every unusual phenomenon and its investigation all the way to its origin. This is crucial since the existing documentation and most of the written code are barely readable.</p>
<p>The objective seems very straightforward, but regulated documentation and code maintenance is not the only thing that defines a group’s identity. The group has to have a purpose. Our purpose went missing.</p>
<h4 id="heading-where-did-the-purpose-go">Where did the purpose go?</h4>
<p>At some point, software maintenance was performed under no regulations and slowly went out of the professional focus. What started flowing instead were side projects. Side projects became the main objective. Whenever a client approached one of the teams, in need of a quick fix, the group would pivot in that direction. People were working on side projects for the sake of working. The difficult yet crucial maintenance was completely abandoned.</p>
<p>When I started my position as group leader, almost every group member told me they didn’t know exactly what the group was actually meant to do. They felt they had no real goals when they came to work. Side projects scattered the purpose.</p>
<h4 id="heading-why-do-we-sometimes-need-to-manage-our-clients">Why do we sometimes need to manage our clients?</h4>
<p>A software group cannot blindly do what the client wants. Especially when the client changes their mind frequently. For example — back when I was a software developer, my team and I were working on a navigation project similar to “Waze”. Our product owner kept requesting changes that made no difference whatsoever to the system’s functionality. It was always a request to change button colors or move toolbars around the UI. This kept the team from making any progress for a very long time.</p>
<p>In my software group, the problem was on a larger scale. The group didn’t have one indecisive client. It had a few separate clients and each client pulled in their own direction. There wasn’t one integrating factor, looking at the larger picture and managing the clients and the projects. For a long time, the group worked through a queue — first client in meant first project the group developed. Therefore, almost any type of project could be brought to the group. In time the group began dealing with QA, IT and even hardware issues, rather than software development.</p>
<p>Retrieving the purpose, and consequently the motivation, was an ongoing process. It began with a definition — I’ve defined, along with my team leads, our projects. We’ve prioritized them in accord with our clients’ demands, thus setting a roadmap we will not slip from, as happened in the past. This roadmap indicated our objective — system’s software maintenance was declared our purpose.</p>
<p>We’ve added one more project to the roadmap, a second main project, related to the system but not directly. It added to the purpose since it had great unimplemented potential. I believed it would be great for PR and to enhance the developers’ belief in their own skills. This dedicated roadmap focused the teams. We knew that by the end of the year we needed to deliver two products end-to-end.</p>
<p>Setting the professional compass was important. The bigger problem was regaining the developers’ trust in the group. After so many years, my developers — both experienced and new — had no fuel nor will to work. After some of my scheduled one on one talks, I mapped each developer’s strengths. If for example, one developer was really good at research — I let them do the research.</p>
<p>After mapping individual strengths, I mapped team strengths. Some paired programming was performed in order to strengthen some developer’s self-esteem. We’ve held a professional workshop for team leads, to strengthen management abilities. I addressed the issues I picked up when I observed the programming process and the issues the developers themselves had presented.</p>
<h4 id="heading-so-how-was-the-identity-restored">So how was the identity restored?</h4>
<p>By finding a definition and restoring order. We’ve defined our field of expertise. I’ve put borders around our designated projects and let no other project cross that border. Limited the issues we work on (no more hardware issues!). Made sure there was proper usage of coding methodologies and version control. Made everyone document their work. Strengthened each programmer’s strengths. Sharpened the team leads’ set of soft skills.</p>
<p>I targeted both professional and personal values in order to restore the group’s inevitable software DNA.</p>
<p>The difficulties of leading changes in an unforgiving environment, leading innovation instead of sinking and how to survive as a young female in a very ego driven male environment? Stay tuned, all this and more as the series unravels!</p>
<p><a target="_blank" href="https://medium.com/@vicki.kalm/how-can-corporations-heal-a-dying-software-group-1abe03d8a492">Part 1 — How Can Corporations Heal a Dying Software Group?</a></p>
<p><a target="_blank" href="https://medium.com/@vicki.kalm/overcoming-a-technological-gap-a-horrible-circumstance-or-a-creative-adventure-ad3e97e64e44">Part 2 — Overcoming a Technological Gap — a Horrible Circumstance or a Creative Adventure?</a></p>
<p><a target="_blank" href="https://medium.freecodecamp.org/how-i-started-the-process-of-healing-a-dying-software-group-d5610cf416bc">Parts 1+2 — How I started the process of healing a dying software group</a></p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Why humility is the most important trait of a great developer ]]>
                </title>
                <description>
                    <![CDATA[ By Semi Koen Leave your ego out of software development! _Photo by [Unsplash](https://unsplash.com/@sniv?utm_source=medium&utm_medium=referral" rel="noopener" target="_blank" title="">Shirly Niv Marton on <a href="https://unsplash.com?utm_source=med... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/a-first-class-temperament-the-emergence-of-a-star-developer-9321eeb57005/</link>
                <guid isPermaLink="false">66c342860bafa8455505c65c</guid>
                
                    <category>
                        <![CDATA[ Humility ]]>
                    </category>
                
                    <category>
                        <![CDATA[ leadership ]]>
                    </category>
                
                    <category>
                        <![CDATA[ General Programming ]]>
                    </category>
                
                    <category>
                        <![CDATA[ software development ]]>
                    </category>
                
                    <category>
                        <![CDATA[ women in tech ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Tue, 15 Jan 2019 14:44:11 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/0*L1LyjRYFtlh53sA1" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Semi Koen</p>
<h4 id="heading-leave-your-ego-out-of-software-development">Leave your ego out of software development!</h4>
<p><img src="https://cdn-media-1.freecodecamp.org/images/NeaULvq2aVo4beHJJAYUsxXaFBNiPI1qrnVF" alt="Image" width="800" height="533" loading="lazy">
_Photo by [Unsplash](https://unsplash.com/@sniv?utm_source=medium&amp;utm_medium=referral" rel="noopener" target="_blank" title=""&gt;Shirly Niv Marton on &lt;a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral" rel="noopener" target="<em>blank" title=")</em></p>
<h3 id="heading-a-first-class-temperament-the-emergence-of-a-star-developer">A First-Class Temperament: The emergence of a star developer</h3>
<p>In my recent roles I have been responsible for a team of very talented senior developers and I have come to realise that the hardest problems I have faced are not of a technical nature but rather dealing with interpersonal relationships. I have therefore concluded that intelligence and technical competencies are necessary for success but are <strong>not sufficient</strong> to make us great developers.</p>
<p>Here I will talk about the one value I rank at the top, which rockets a great developer to the <strong>best asset</strong> a company has. It is the one value that managers fight wholeheartedly for, to have in their team: <strong>Humility</strong>!</p>
<p>⚠️ To clarify: In this post I take for granted that the developer is <strong>gifted technically.</strong> I am not debating whether technical or interpersonal skills are more important. However, if I had to make a choice, as a lead, I would always choose the latter!!</p>
<blockquote>
<p><strong>“Second class intellect; first class temperament”</strong><br> — Supreme Court Justice Oliver Wendell Holmes, on meeting Franklin Roosevelt</p>
</blockquote>
<p>So let’s explore the art and science of humility at work…</p>
<h3 id="heading-humility-is-not-thinking-less-of-yourself-its-thinking-of-yourself-less">Humility is not thinking less of yourself, it’s thinking of yourself less</h3>
<p>During my career as a developer, the more I learnt about building good quality software, the more humble I became. The hardest thing was to accept that I don’t know everything there is to know and acknowledge the fact that, even if I was an expert in some particular area, knowing all the corner cases and gotchas, there was still much to learn. <strong>And that’s ok!</strong></p>
<p>Humility is not suppressing our opinions, keep a low profile or let others walk over us. Simply put, it is to:</p>
<ul>
<li>realize that we are not the <strong>centre</strong> of the universe: the team is, and then the company;</li>
<li>remember that our manager does not want to deal with a ‘<strong>diva</strong>’ on a daily basis — doing business is their priority;</li>
<li>recognise that no one is <strong>irreplaceable</strong> — this is the foundation of all business that keeps the industry competitive and focused;</li>
<li>appreciate that those big <strong>egos</strong> won’t get us anywhere in a software team — whether it is in a small software house, or big corporate bank or Silicon Valley!</li>
</ul>
<p>Ego is the belief in our <strong>self-importance</strong> and the thinking that the world begins and ends with us. It is our <strong>childish inner voice</strong> that chooses to win all the time and sometimes at the expense of others.</p>
<ul>
<li>It makes us feel threatened when we are questioned. We feel exposed and vulnerable and as such we become <strong>defensive</strong> and in the worst cases spiteful and arrogant.</li>
<li>It is what prevents us from <strong>asking</strong> for help, collaborating and learning something new.</li>
<li>It stops us from recovering from our <strong>failed projects</strong> and learning from our mistakes.</li>
<li>It makes us <strong>dismiss</strong> someone else’s solution because it is not ours.</li>
<li>It makes us <strong>brag</strong> about our previous important achievements, as we think that this is all our teammates need to know to respect us.</li>
</ul>
<p>…and so many more toxic behaviours that not only affect the project and the team but also impact us! But we are too short-sighted to recognise!</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/WiqnKN0zLFViwkMlSL9I6APktqwTRRQu2cWY" alt="Image" width="800" height="523" loading="lazy">
_Photo by [Unsplash](https://unsplash.com/@rawpixel?utm_source=medium&amp;utm_medium=referral" rel="noopener" target="_blank" title=""&gt;rawpixel on &lt;a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral" rel="noopener" target="<em>blank" title=")</em></p>
<h3 id="heading-being-a-superb-developer">Being a superb developer</h3>
<p>Over the years I have observed that those who are true masters of their craft are aware of their own limits. They are less inclined to assume that they automatically know it all. They are a <strong>blessing to work with</strong>! Their peers love them and their managers do too. You can do <em>pair</em> <em>programming</em> with a humble person. You can do code <em>reviews</em> with a humble person. You can <em>instruct</em> a humble person!</p>
<p>Here are some examples of their behaviour:</p>
<ul>
<li>They are <strong>open-minded</strong> and actively ask questions, listen and <strong>adjust</strong> their points of view accordingly.</li>
<li>They <strong>respect</strong> other people’s opinions and their level of competence — their attitude is to teach not to offend.</li>
<li>They do a code review and they provide <strong>impartial</strong> feedback, they care both about their colleagues’ feelings but also about the quality of the code.</li>
<li>They appreciate that bad code can be the result of aggressive deadlines or inattention to technical debt and not necessarily of terrible developers and as such, they don’t <strong>judge</strong>!</li>
</ul>
<h3 id="heading-the-take-away">The Take-Away</h3>
<p><img src="https://cdn-media-1.freecodecamp.org/images/Kst37La8WbEoB4IQ9n5zyNk-5GwYAd2C3GkF" alt="Image" width="800" height="450" loading="lazy"></p>
<p>For better or worse, there is an increasing demand for developers at this point in time (and most certainly for the foreseeable future). We do have <strong>niche</strong> knowledge and are able to solve problems — skills that may seem unfathomable to anyone not in IT. There is also a magnification of the perception that <strong>code</strong> is the only output of our work that has any value and soft skills do not matter.</p>
<p><em>This should not be a justification nor an excuse for arrogance and rampant egotism!</em></p>
<p>In physics there is something called entropy: <strong>We either go up or down</strong>! There is no stagnation. It’s easy to be successful for a week, or a month or even a few years. At some point we will get trapped by our ego, <strong>people will see through us</strong> and we will fail quickly. I believe true success is sustainable by demonstrating humility every single day!</p>
<p>Thanks for reading!</p>
<p><strong>P.S.</strong> Have you come across “<a target="_blank" href="https://www.cs.utexas.edu/~EWD/ewd03xx/EWD340.PDF">The Humble Programmer</a>” essay by <a target="_blank" href="https://en.wikipedia.org/wiki/Edsger_W._Dijkstra">Edsger W. Dijkstra</a>? It’s a classic!</p>
<blockquote>
<p>“<strong>The competent programmer is fully aware of the strictly limited size of his skull</strong>; therefore he approaches the programming task in full humility, and among other things he avoids clever tricks like the plague”</p>
</blockquote>
<p><em>I regularly write about Leadership, Technology and Data. If you would like to read my future posts please <a target="_blank" href="https://medium.com/@semika">Follow me on Medium</a>!</em></p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ The path to technical leadership: how to go from developer to team leader ]]>
                </title>
                <description>
                    <![CDATA[ By Alex Bachuk If software development feels like it is only part of your professional purpose, perhaps you should consider becoming a tech lead. A tech lead could mean different things: a team lead (with no direct reports), or a manager. For example... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/the-path-to-technical-leadership-how-to-go-from-developer-to-team-leader-8c544f15a431/</link>
                <guid isPermaLink="false">66c361fbc6c49ae59cf21af7</guid>
                
                    <category>
                        <![CDATA[ career advice ]]>
                    </category>
                
                    <category>
                        <![CDATA[ leadership ]]>
                    </category>
                
                    <category>
                        <![CDATA[ management ]]>
                    </category>
                
                    <category>
                        <![CDATA[ General Programming ]]>
                    </category>
                
                    <category>
                        <![CDATA[ technology ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Thu, 27 Dec 2018 22:28:55 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*_0gfg9mP7W4tjVCzB3_KGQ.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Alex Bachuk</p>
<p>If software development feels like it is only part of your professional purpose, perhaps you should consider becoming a tech lead. A tech lead could mean different things: a team lead (with no direct reports), or a manager. For example, an engineering manager is a person who is responsible for the team and its projects. That means they are also responsible for peoples’ careers, business growth, deliverables, deadlines, culture, code standards, technical debt, and more.</p>
<p>If you’re a developer, it may not be clear how to get from where you are to a technical leadership position. If your goal is to become a manager soon, you will need to ask yourself why you want this role. Becoming a manager may or may not align with your long-term goals.</p>
<p>I got into software development because I felt more comfortable working with computers than people. But after a while I found myself helping other developers more and more. I enjoyed leading projects and pushing for better code standards. It was an obvious choice for me personally.</p>
<p>For many software engineers, growing as an individual contributor (IC) could be a more appropriate path. Many companies provide IC alternatives to management. These alternatives include a staff engineer, distinguished engineer or fellow engineer. These are very senior technical roles, but no one reports to them as they would to a manager.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/EdAqIzsA5Ae738brdBxENeGwRsTT11wgjqt9" alt="Image" width="800" height="533" loading="lazy">
<em>the stereotype of a developer: eating pizza, works at night alone, etc, etc</em></p>
<p>So, do you want to become an engineering manager or another type of team leader? It is important to be honest about what drives you — is it writing code and architecting software? Or, is it helping others to get better results, negotiating deadlines with stakeholders, and convincing your business team that code refactoring is not a waste of time? Your answers to these questions should help you determine which path is more appropriate for your desired outcomes.</p>
<p>If you’re still convinced a technical leadership path is right for you, then you have some work ahead of you. Consider working with your manager or a mentor to have them help you in areas where you are less familiar. Here is an outline of ten key areas of focus:</p>
<p><strong>Stepping up</strong>. A true leader can lead without the title or authority. Anyone with a fancy title and enough authority given by the organization chart can give orders. But that’s not what leadership is — it is about what you do.</p>
<p>Therefore, you should start small. Take on more responsibilities during difficult projects. Help your peers by providing feedback in pull requests. Volunteer to present on the project updates. Propose improvements to your team or product workflow. Mentor a colleague.</p>
<p>There are enough opportunities that people either don’t want to see or don’t have enough expertise or confidence to take on. Determine what your colleagues are struggling with, and then step up and do them.</p>
<p><strong>Ownership</strong>. When taking on responsibilities, be accountable for everything you do or don’t do. A leader takes responsibility and avoids blaming others for mistakes, missing deadlines, or bugs.</p>
<p>Rather than complaining about a bug someone introduced, just help them fix it and explain how to avoid it in the future. Coming up with excuses doesn’t help anyone. Take the time to deliver what you committed to. If necessary, negotiate a better deadline with your manager. Run a project like your own business and actually care about it.</p>
<p>Recently, one of the tech leads on my team pulled the latest master branch. They saw a big drop in unit test coverage. Rather than complaining, he added missing test coverage. And then presented how to properly check for the coverage and how to write a unit test for complex features. He offered to help if anyone needs it without blaming anyone. The team appreciated that.</p>
<p><strong>Relationships</strong> (or politics). Sometimes people misinterpret relationships and call them “politics”. They are the same things. If you don’t want to deal with “politics” then perhaps think again if you want to get into leadership in the first place.</p>
<p>Building meaningful relationships is one of the responsibilities of engineering managers. Management is making things happen through other people. Start building good relationships with other engineering managers. They are your future peers.</p>
<p>There are a few ways to do this, such as presenting at tech talks, doing workshops, and mentoring developers outside of your team. Engineering managers will appreciate the relationships you build through these tasks.</p>
<p><strong>Technical expertise</strong>. An engineering manager should be an engineer first. They must have a strong software engineering background and hands-on experience. Becoming one of the strongest engineers on the team is a requirement. A manager who can’t code or doesn’t understand the technical details can’t take part in technical discussions. Once you become a manager, you should always keep your skills sharp enough to be competent at higher level architecture.</p>
<p><strong>Mentorship</strong>. Any “really good developer” on the team who’s not a team player is more harmful than helpful. If you’re technically strong, then you should be helping others to get to your level. Pair programming, code reviews, presentations, open source or inner source projects are all great examples of how to get started in mentoring others.</p>
<p>It is rare for someone to come to you and ask you to mentor them. Yet, by branding yourself “the expert” and proactively doing the things mentioned above, people will naturally start coming to you for advice. By helping others you build meaningful relationships and gain people’s respect. Hopefully, they do the same in return and mentor others as well.</p>
<p><strong>Project management</strong>. Delivering projects on time is one of the core responsibilities of any leader. If, as a developer, you’re constantly missing deadlines and underestimating tasks, others can’t trust you. You have to be organized and be on top of your tasks.</p>
<p>We all know estimating software projects is hard as there is a lot of uncertainty. However, with the right process, it’s not impossible. Constantly communicate the progress and expectations of the project with your manager or stakeholders.</p>
<p>For example, my team is doing a weekly status report, where the project tech leads have an opportunity to communicate the progress, mention any blockers or raise a major concern of not delivering on time.</p>
<p><strong>Communication</strong>. Communicating clearly and concisely is a very important characteristic of any leader. If you can’t explain clearly what you want from your team, then you have failed as a leader before any work even begins.</p>
<p>Communication comes in many forms, including verbal, written and even body language. Always work on improving all of your communication skills.</p>
<p>My team missed a few deadlines because I failed to communicate the requirements clearly and on-time. There were few instances where the lack of communication created confusion on the team who was supposed to do what. I learned that relying on project managers or business stakeholders to explain the project details isn’t working. An engineering manager has to understand the project and then explain it and sell it to the team. And motivate them to want to work on it.</p>
<p><strong>Managing up</strong>. Manage your manager (and sometimes their manager). This means constantly communicating with them and managing expectations. Managers rarely like surprises, good or bad. Establish trusting relationships with your manager. Be the go-to person for important and high profile projects, and actually get them done on time and on budget. Then more projects will follow and you can repeat the process.</p>
<p><strong>Conflict and crises</strong>. Production issues happen, no matter how many unit or integration tests you have. Yes, you want to minimize the number of bugs your projects have. What matters more is how you handle production issues. A person who starts panicking under pressure is immediately disqualified as a leader in the eyes of others. The team and other managers want to see a calm person who has everything under control, even in the most stressful situations.</p>
<p>A tech lead I used to work with was always calm. There was no conflict or pressure that could make him snap. At least nobody saw him stressed out. When it came to handling a production issue at 3 am, he didn’t disappoint. The issue was fixed in minutes and he showed up to work as if nothing happened.</p>
<p>Another tech lead got so stressed out with the deadline he called in sick on the day we were supposed to launch the feature. He was so anxious, it made everyone else around him uncomfortable to work with him.</p>
<p>Even though these are 2 complete opposites, you can guess which one was more successful as a tech lead.</p>
<p><strong>Vision</strong>. For everything they are responsible for, a leader should understand “why”. They are also responsible for ensuring everyone else understands “why” they are working on a project. A leader must explain (often many times) why the project is happening, why the specific people are working on it and how this project fits into the “big picture”. A team has to believe in what they do, only then can they can be effective.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/Z2tn3Zr15AYaVkCy8KYF97crFrVwAb5XYQQP" alt="Image" width="800" height="534" loading="lazy">
<em>Leadership is not limited to one or two people</em></p>
<h3 id="heading-lead-the-way-forward-starting-today">Lead the Way Forward, Starting Today</h3>
<p>Leadership is not limited to one or two people, so don’t wait for permission, step up today. Be an expert in your field and start helping people when they are stuck. Work on your communication skills, even something minor like technical documentation. Build great professional relationships with your current and potential future peers. Make sure you manage your time wisely and be on top of your projects’ deadlines. And don’t forget that leadership is about people, so genuinely help people grow and do their best job.</p>
<p>You can find me on Twitter <a target="_blank" href="https://twitter.com/netxm">https://twitter.com/netxm</a> if you have questions or just want to say “hi”.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ These books helped me navigate my first time being a tech lead ]]>
                </title>
                <description>
                    <![CDATA[ By Danny Perez The tech lead was moving to another team for a long-term assignment, and I took over as the engineering manager/team lead. From the outside, the tech lead’s job seemed doable, but I quickly realized I was getting in over my head. Unfor... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/these-books-helped-me-navigate-my-first-time-being-a-tech-lead-a9e0d100524f/</link>
                <guid isPermaLink="false">66c362f20cede4e9b1329d07</guid>
                
                    <category>
                        <![CDATA[ leadership ]]>
                    </category>
                
                    <category>
                        <![CDATA[ management ]]>
                    </category>
                
                    <category>
                        <![CDATA[ self-improvement  ]]>
                    </category>
                
                    <category>
                        <![CDATA[ software development ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tech  ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Tue, 11 Dec 2018 06:25:21 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*D3szlrL9e05JzsY-Eyvweg.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Danny Perez</p>
<p>The tech lead was moving to another team for a long-term assignment, and I took over as the engineering manager/team lead.</p>
<p>From the outside, the tech lead’s job seemed doable, but I quickly realized I was getting in over my head. Unfortunately, my team was responsible for a lot of centralized infrastructure as well as day-to-day technical operations. I had no tech lead training, and how could there be? I was certain that the tech lead role was so different across companies, so how could there be guidelines to it?</p>
<p>In my previous role as the senior engineer on my team, I felt capable of tackling larger projects, but I only ever had 1 project to tackle. Now, I needed to manage 3–5 projects for my small team of 5 engineers.</p>
<p>The best I could do was do as the last person did which only gets you far enough to keep your head above water. I realized that the only way for me to get past this would be to hit the books, and learn all the management that I never learned in college.</p>
<p>I read a lot that year. More than the past 3 years combined. The most helpful books I read all boiled down to 3 areas of the job that I (like many others) struggled with: dealing with team &amp; individual performance, delegating, and making my team a great team to work on.</p>
<p>*Disclaimer: I’ve tried to link to the authors website where I could. Otherwise, the links go to Amazon (not referral links) if you want to get the book. I have no association with any of the below authors, just a fan of their writing.</p>
<h3 id="heading-dealing-with-performance">Dealing with performance</h3>
<p>One thing that I felt affected the team was an under-performing team member. Surely like many others, I hadn’t ever seen an effective performance review myself, or seen how other leads dealt with performance on their team (thats probably a good thing, but unhelpful for me).</p>
<p>While I know at a high level what you’re supposed to do, like talk about and deal with the problem, I struggled to actually do it — how could I, a new lead, give feedback to someone who was previously a peer on my team? It’s definitely awkward the first few times!</p>
<p>Fortunately, in this area, there are people much smarter than I who have shared their experiences in great deal to help you get past these types of problems.</p>
<ul>
<li><a target="_blank" href="https://www.radicalcandor.com/">Radical Candor: Be a Kick-Ass Boss Without Losing Your Humanity by Kim Scott</a><br>If you want to focus on giving great feedback — this provides a pretty powerful mental model for giving and receiving feedback without feeling like a jerk. It’s focused on being upfront with people, lest you be plotting against them or humiliating them.</li>
<li><a target="_blank" href="https://www.amazon.com/Leading-Teams-10-Challenges-Solutions-ebook/dp/B014K0ONV2">Leading Teams: 10 challenges and solutions by Mandy Flint, Elisabet Vinberg Hearn</a> and <a target="_blank" href="https://www.amazon.com/dp/1491932058">Debugging Teams: Better Productivity through Collaboration by Brian W. Fitzpatrick, Ben Collins-Sussman</a><br>If you want to focus on getting yourself un-stuck from some problems on your team — these 2 books go in-depth on common issues that teams might have, and some step-by-step guidelines for how to deal with them.<br>This was an area I didn’t feel comfortable asking any of the other managers about. We had many small teams, and we were all very friendly so it was hard to find people you can talk to. The next best thing was seeing what other more successful leaders had done in these scenarios.</li>
<li><a target="_blank" href="https://youtu.be/RXxHBSuW4lM">Manager Conversation with Low Performers at UMCB on Youtube</a><br>It’s very rare you’ll ever get to shadow someone else’s performance review — they’re private and personal by nature (or you’re HR). If you’ve ever wondered what a “good” conversation about poor performance could look like, this video helped me a TON! There’s some other related videos there that will show you what NOT to do, but it is great to see how you can quickly diffuse an awkward situation.</li>
</ul>
<p>Lesson #1 summary: Be incredibly explicit about your expectations <strong>with their job</strong> so that they can never say, “How was I supposed to know?”</p>
<h3 id="heading-delegating">Delegating</h3>
<p>Another awkward part about my job was telling people what to do — our team had a mission that we were mostly aligned on, but we don’t always get to work on cool stuff and the work still has to get done on time.</p>
<p>I had seen other people do it well, I had seen others do it poorly — but I wouldn’t have been able to explain to you why. I felt awkward the first few times saying, “hey Roger, can you take a look at this issue?” only to have that developer come back with something that I wasn’t expecting (see Lesson #1).</p>
<p>When I was a fellow engineer on the team, I felt capable of working on bigger projects and making sure that we shipped the right things. But now, I was also accountable for all the projects the team was working on, not just mine. I had about twice as many things to do now, and the typical-engineer-turned-manager in a bout of frustration might ask, “When am i supposed to code if I’m stuck in meetings and dealing with people all the time?”</p>
<p>It was difficult to juggle all the projects that I was now responsible for, as well as do the work on critical projects, and plan cross-team initiatives, and insert 20 more things here.</p>
<ul>
<li><a target="_blank" href="https://www.amazon.com/dp/0789428903">How to Delegate (Essential Managers Series) by Robert Heller</a></li>
<li><a target="_blank" href="https://www.amazon.com/dp/0814414745">The Busy Manager’s Guide to Delegation (Worksmart Series) by Richard Luecke, Perry McIntosh</a></li>
</ul>
<p>To summarize these books: be incredibly explicit about your expectations <strong>with projects/tasks</strong> so that they can never say, “How was I supposed to know?”</p>
<p>While these two books sound a little cheesy, they gave me a great framework and process for delegating. After reading them, I started blocking out time on my calendar for going through our projects and trying to match people’s goals and motivations with the work we had to do. A bunch of us got AWS certificates, one engineer earned with a promotion, and an intern joined us full-time. And we built great stuff too.</p>
<h3 id="heading-making-a-good-team">Making a good team</h3>
<p>One way to build a better team is to see more teams and how they operate, and use them as guiding examples for building your own teams. The catch is, barring you leaving your job and working elsewhere, you won’t get to see that many teams and so you might not even know what your team would look like at its best!</p>
<p>I absolutely loved reading these books because they provided case studies of real teams with real stories across some high-profile companies. Some people had really crappy times at their job, others didn’t, and they explain why in-depth.</p>
<p>These books are more focused on software engineering teams:</p>
<ul>
<li><a target="_blank" href="https://www.thekua.com/atwork/2014/09/talking-with-tech-leads/">Talking with Tech Leads: From Novices to Practitioners by Patrick Kua</a><br>Patrick Kua is a great speaker <a target="_blank" href="https://www.youtube.com/results?search_query=patrick+kua">with some of his talks available on Youtube</a> about technical leadership covering things like <a target="_blank" href="https://www.youtube.com/watch?v=CjgWwmBW-bc">What I wish I knew as a first time Tech Lead</a> and <a target="_blank" href="https://www.youtube.com/watch?v=N9UPW-2wL5U">Geek’s Guide to Leading Teams</a></li>
<li><a target="_blank" href="https://www.amazon.com/dp/149195177X">Building Software Teams: Ten Best Practices for Effective Software Development by Joost Visser, Sylvan Rigal, Gijs Wijnholds, Zeeger Lubsen</a></li>
</ul>
<p>These books cover teams in general:</p>
<ul>
<li><a target="_blank" href="https://www.amazon.com/dp/0596518021">Beautiful Teams: Inspiring and Cautionary Tales from Veteran Team Leaders by Andrew Stellman, Jennifer Greene</a></li>
<li><a target="_blank" href="https://www.amazon.com/dp/B01HUER114">Extreme Teams: Why Pixar, Netflix, Airbnb, and Other Cutting-Edge Companies Succeed Where Most Fail by Robert Bruce Shaw</a></li>
<li><a target="_blank" href="https://www.amazon.com/dp/149195227X">Scaling Teams: Strategies for Building Successful Teams and Organizations by David Loftesness, Alexander Grosse</a></li>
</ul>
<p>To summarize these in one sentence: Be incredibly explicit about your expectations <strong>with the team’s culture</strong> so that they can never say, “How as I supposed to know?”</p>
<h3 id="heading-wrapping-up">Wrapping up</h3>
<p>I had a great time leading my team for over a year. While at times, it was incredibly daunting to think how I would get through a particularly problematic week, my team would stay on track and over time, we were able to move to more proactive work. There’s many different areas in management where you could spend days and day learning, but if you do 1 thing and nothing else…</p>
<p><strong>Tell your team to be incredibly explicit about their expectations from you as their lead so that you can never say, “How was I supposed to know?”</strong></p>
<p>Fellow tech leads on Medium: What was the hardest part of becoming a tech lead for the first time?</p>
<p>If you enjoyed the article, give it some ? and follow me here on Medium.</p>
<p><em>Originally published at <a target="_blank" href="https://www.intricatecloud.io/2018/12/9-books-that-helped-me-navigate-my-first-time-being-a-tech-lead">www.intricatecloud.io</a> on December 11, 2018.</em></p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ If you want to become a tech leader, follow this advice ]]>
                </title>
                <description>
                    <![CDATA[ By Dalia Simons Over the past two years since I became a Tech Lead at Wix, I’ve come across questions on how I got this role. I must be honest and say that I wasn’t actively looking for it, but looking back I would like to share a few tips ]]>
                </description>
                <link>https://www.freecodecamp.org/news/if-you-want-to-become-a-tech-leader-follow-this-advice-831c8fdecff8/</link>
                <guid isPermaLink="false">66c35797c7095d76345eaf92</guid>
                
                    <category>
                        <![CDATA[ growth ]]>
                    </category>
                
                    <category>
                        <![CDATA[ leadership ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Life lessons ]]>
                    </category>
                
                    <category>
                        <![CDATA[ self-improvement  ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tech  ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Mon, 26 Nov 2018 22:31:31 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*ZITdBJP3AUWTJ_n-N0o8ZQ.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Dalia Simons</p>
<p>Over the past two years since I became a Tech Lead at Wix, I’ve come across questions on how I got this role. I must be honest and say that I wasn’t actively looking for it, but looking back I would like to share a few tips for developers who want to become Tech Lead.</p>
<p>I think the role of tech lead is hard to define and differs between people.<br>For me it’s mainly about mentoring: helping the engineers on the team improve. This means helping them with their design, code reviewing, and teaching them the best way to communicate with other teams and make an impression.</p>
<p>When I started in the industry, the only career path I knew was management. Today it’s already clear that management is a different role than it used to be, and you can also advance by becoming a Tech Lead or an Architect.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/xdtPwrG7lwakdzNotTjiACq86VW2lmb9v1s5" alt="Image" width="320" height="213" loading="lazy">
<em>Becoming a tech leader</em></p>
<p>I think the keys to becoming a good tech lead is asking questions and expanding your knowledge while being friendly and socially aware. Here are my top tips:</p>
<h4 id="heading-really-understand-what-youre-working-on"><strong>Really understand what you’re working on</strong>.</h4>
<p>Fully understand the product requirements, the design of your system and the different technologies you use. Even if you weren’t part of the decision making, ask the questions: why were specific technologies chosen? Why was this design preferred?</p>
<p>Know all parts of the system, including the parts other people are working on. You don’t need to read every commit done. But you do need to know what your peers are working on and what their part of the system does.</p>
<h4 id="heading-say-whats-on-your-mind"><strong>Say what’s on your mind</strong>.</h4>
<p>It’s harder for shy people to learn and become leaders. You have to always sit at the table at meetings and make your opinion heard. Try and be involved in conversations.</p>
<p>Challenge decisions made by other people, and don’t be afraid to ask architects or tech leads why they made a specific choice. Successful people welcome the debate and are always happy to explain their choices.</p>
<p>Technical people can and should challenge product decisions. You should always have the customers in mind and make sure that what you’re working on gives them value.</p>
<h4 id="heading-when-you-see-something-wrong-get-it-fixed"><strong>When you see something wrong — get it fixed</strong>.</h4>
<p>Don’t stand by when you think a mistake is being made. Politely inform the person in charge and ask what they think about it. You might find that you are wrong, but a lot of times you will help fix a problem. If the responsible person doesn’t have the time to fix it, you can offer to contribute your time. This way you can learn another area of the code and you will be appreciated for being a team player.</p>
<p>I had a few times where I integrated with other projects and didn’t think their design was right. I told them I didn’t fully understand why they chose this design and asked them to explain it to me. Most times it made sense after they explained, because I wasn’t fully aware of all the limitations and concerns. However, a few times I managed to help by highlighting concerns they weren’t aware of.</p>
<p>Even if your concern is wrong it’s good to raise it: You will get better at understanding design and concerns and your opinions will be valued.</p>
<h4 id="heading-volunteer-for-extra-work-when-you-can"><strong>Volunteer for extra work when you can</strong>.</h4>
<p>Every once in a while an opportunity will come to volunteer for some side project or some other task. Be the person that volunteers, even if you’re not sure you can do the task. This is the way to grow, you will learn your missing capabilities and maybe get the opportunity to work with people you don’t know yet.</p>
<p>A few examples we have at Wix:</p>
<ul>
<li>Be in charge of weekly lectures organized for the backend engineers,</li>
<li>Make sure Post mortems are created and shared for production issues,</li>
<li>GDPR integration across the company.</li>
</ul>
<p>I personally volunteered to help engineers that write talks for conferences, as it gave me the opportunity to work with different engineers I don’t usually interact with.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/00rkEKgVhPDIIPpukDe42uEVz-PaDfFc8BVW" alt="Image" width="305" height="164" loading="lazy">
<em>Volunteer for extra work</em></p>
<h4 id="heading-invest-in-making-connections"><strong>Invest in making connections</strong>.</h4>
<p>Some people refer to coffee breaks as a waste of time, but I think they are crucial. When you meet people and create a social connection you create a relationship that will help you in the future.</p>
<p>As human beings, we’re much happier to help our friends. The more friends and connections you have, the faster you can get help when you need it. This helps integration projects go more smoothly if you know the people you’re integrating with.</p>
<p>This is also a great opportunity to step into conversations other developers are having about their design. You might hear about new opportunities that can advance your career. The more people know you, the more opportunities you will get.</p>
<p>Last week I overheard a conversation by engineers I didn’t know and realised that they are unaware of a product I was working on. So I joined in politely and was able to save them lot’s of time while make new connections.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/yomi0HCuhkAg7NrI4hO0dikpZxuobtuA8cuA" alt="Image" width="320" height="213" loading="lazy">
<em><strong>Invest in making connections</strong></em></p>
<h4 id="heading-seize-opportunities"><strong>Seize opportunities</strong>.</h4>
<p>Opportunities will come your way, either inside your company or from companies that wish to hire you.</p>
<p>When a good opportunity comes by you should grab it. Don’t let your imposter syndrome deny you a great advancement. You have to believe that if you were offered the chance — you can make it. There might be a learning curve but learning new skills is how we grow.</p>
<p>If you hear of a good opportunity you like and weren’t offered, ask if you can have it. You might get a negative answer, but there is always a chance you will get a positive one.</p>
<p>My first position as a tech lead was offered to me by a project that was going through a big rewrite and thought I could help. It was a big job but I seized this opportunity. I opened many doors for me for other tech lead roles in the company.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/3F4wVJaSXNKv970kk8cfx0K05FUTg0TIrh9N" alt="Image" width="318" height="240" loading="lazy">
<em><strong>Seize opportunities</strong></em></p>
<p>Becoming a leader is about taking initiative and showing your peers and your managers your capabilities.</p>
<p>Becoming a Tech leader involves all of the above and having a deep understanding of technology and design.</p>
<p>If you play the part of a tech leader in your current role you will become one. Believe in yourself and your capabilities and you’ll succeed.</p>
<p>You’re welcome to follow me on <a target="_blank" href="https://twitter.com/simonsDalia">twitter</a> :) Thank you for reading!</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ What I learned leading my first team and winning at Startup Weekend ]]>
                </title>
                <description>
                    <![CDATA[ By Mike Zetlow By day, I work as the UX Architect for CHSI Technologies, a Las Vegas-based insure-tech company. After hours, I organize Las Vegas Developers, the largest meetup of coders in our city. I signed up for Startup Weekend this year with the... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/what-i-learned-leading-my-first-team-and-winning-at-startup-weekend-e84a6db077b6/</link>
                <guid isPermaLink="false">66c365818e244e1678738628</guid>
                
                    <category>
                        <![CDATA[ leadership ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Life lessons ]]>
                    </category>
                
                    <category>
                        <![CDATA[ startup ]]>
                    </category>
                
                    <category>
                        <![CDATA[ teamwork ]]>
                    </category>
                
                    <category>
                        <![CDATA[ technology ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Fri, 29 Jun 2018 16:14:54 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*A9AN-00gy3MgHNouhx0UBQ.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Mike Zetlow</p>
<p>By day, I work as the UX Architect for <a target="_blank" href="https://chsiconnections.com/">CHSI Technologies</a>, a Las Vegas-based insure-tech company. After hours, I organize <a target="_blank" href="https://www.meetup.com/Las-Vegas-Developers/">Las Vegas Developers</a>, the largest meetup of coders in our city.</p>
<p>I signed up for <a target="_blank" href="https://startupweekend.org/">Startup Weekend</a> this year with the intention of personally hacking out a simple web application: a self-updating directory of developers in Las Vegas.</p>
<p>Prior to Startup Weekend, Las Vegas Developers had little web presence besides our Meetup page. I wanted to change that by making an application that would display our members’ projects online after they presented them at our monthly event, <a target="_blank" href="http://demoday.vegas/">Demo Day</a>.</p>
<p>I decided to pitch on the first night’s Call for Ideas to see if anyone wanted to help build this in the next two days. When I got six amazing team members volunteering their diverse abilities, I realized someone needed to lead. Combined with the fact that my CTO at CHSI Technologies asked me to take more of a management role this quarter, I knew I had to step away from coding and step up to lead the team. But how?</p>
<h3 id="heading-pitch-for-culture">Pitch for culture</h3>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*8gN--M40w8oVFqYaHbafcA.jpeg" alt="Image" width="800" height="281" loading="lazy"></p>
<p>“I’m looking for stone-cold killers willing to kick ass and get s<strong>t done!” I declared. I wanted to be </strong>divisive<strong> in my <a target="_blank" href="https://medium.com/swlh/the-most-important-thing-i-learned-about-culture-after-hosting-300-open-mic-nights-b8f0a9420a76">call-to-arms</a>. I wanted some people to be turned off. And I wanted a </strong>select few** to rally around the cause — in this case, people who saw themselves as ass-kickers.</p>
<p>I learned this from fellow Vegas resident Tony Hsieh, CEO of Zappo’s, who will <a target="_blank" href="https://hbr.org/2008/05/why-zappos-pays-new-employees">pay you to quit</a>, weeding out those less dedicated to the cause.</p>
<h3 id="heading-fire-before-you-hire">Fire before you hire</h3>
<p>Leading at a hackathon is an interesting challenge. People are volunteering their weekend to your idea. Turning away voluntary help can be awkward.</p>
<blockquote>
<p>“Unfortunately all of our spots are filled and our team is already built,” I said, looking a newcomer in the eye. My 6 other team members froze.</p>
<p>“Ok,” the newcomer said and went off to join another group.</p>
<p>“Damn.”</p>
<p>“That was cold.”</p>
<p>“I feel bad for him.”</p>
</blockquote>
<p>My team members were shocked when I immediately turned someone down who approached our growing group. I felt bad too! But I saw how disruptive this newcomer was. I had been scouting the room all night, and this particularly loud and obnoxious attendee was someone I didn’t feel good about.</p>
<p>When he train-wrecked the team he eventually joined, dissolving its final pitch into a shouting match and battle for the microphone, we all felt better about this decision.</p>
<p>We were stone-cold. I said it in my pitch and backed it up with action.</p>
<h3 id="heading-set-expectations">Set expectations</h3>
<p>Immediately after that, I set expectations for the team. We’re not here to pretend we are Steve Jobs and we’re launching the iPhone. We’re here to have fun and build something cool. We are going to behave like this a viable product and a real company for the sake of the competition, but in the back of our minds we will really be there to have fun and make something cool.</p>
<p>“Is everyone okay with that?” I asked. “If not, you could pull me aside and join another team, or just take off without saying a word, no hard feelings.”</p>
<p>We talked openly about what we wanted to get out of Startup Weekend. No one said they expected to start a unicorn business from this venture. Most spoke of gaining experience or having a good time. I was glad to see our goals were realistic and aligned and made us feel good.</p>
<h3 id="heading-break-the-ice-and-dive-deep">Break the ice and dive deep</h3>
<p>After an intense first night, I wanted to unite the team. I spent the rest of the night at home planning how we could do this. Then we spent the first hours of the next morning getting to know each other.</p>
<p>I believe ice-breaker questions should have an intention behind them, not just be a silly time-waster.</p>
<p>One of those questions was, “What is something about you that no one else at Startup Weekend knows?”</p>
<p>I did this to make the team feel collegially conspiratorial — like we were all sharing secrets with each other, and we had these things to unite us.</p>
<p>Then I asked: “What amount of money would it take for you to ‘fast forward’ to next week, everything occurring as it would in your ‘timeline’ but you just miss it?”</p>
<p>Most people said their time was priceless and couldn’t put a figure on it.</p>
<p>And that’s the point. Our time is priceless, so let’s make the most of this weekend with each other. Let’s spend the time as if it’s all we’ve got.</p>
<p>Ironically, this activity took up the entire morning of the first day of hacking. But I believed it was an investment that would pay off immediately.</p>
<p><a target="_blank" href="https://medium.freecodecamp.org/i-entered-a-hackathon-with-13-days-of-coding-experience-here-is-what-i-learnt-5538d73ee7ce">One of our team members</a> said it best:</p>
<blockquote>
<p>It was a worthwhile investment. I think this really brought us together as a team and unified us toward creating a working product.</p>
</blockquote>
<h3 id="heading-offer-voice-and-choice">Offer voice and choice</h3>
<p>“Voice and choice” is a way to grant team members autonomy while still focusing on the team’s goal. It’s an idea taken from thought leaders in the education world.</p>
<p>Take 2 minutes to watch this video made by high school science teacher Jeff Robin and think of how business leaders can apply this to their teams:</p>
<p>Giving a voice and choice to team members increases buy-in and moves members’ motivation up <a target="_blank" href="https://en.wikipedia.org/wiki/Maslow%27s_hierarchy_of_needs">Maslow’s hierarchy of needs</a> toward self-actualization and pure joy.</p>
<p>Our hackathon team did this by brainstorming all the features our application could have. Then every developer initialed which feature they’d like to work on, allowing for multiple developers to initial the same thing.</p>
<p>They would either pair on such things or one developer would grab something while another was occupied.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*l1fGqM2ub3ANsf98bGHYlQ.jpeg" alt="Image" width="800" height="544" loading="lazy"></p>
<p>Together we decided on the most minimum feature set that we had to release, truly a minimum viable product. Then we ranked the remaining nice-to-have features individually, 6 through 1, and added up their scores.</p>
<p>Now we had a roadmap: the minimum we had to execute, and the cool stuff we would get to if we had time. And it was divvied up according to what each developer wanted to work on, their voice and choice.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*0p61TqZYD6NNi1rydoifaw.jpeg" alt="Image" width="800" height="733" loading="lazy"></p>
<h3 id="heading-dance-in-chains">Dance in chains</h3>
<p>If you watched the video above, you heard a beautiful phrase borrowed from Nietzsche.</p>
<blockquote>
<p>The artist is he who dances in chains.</p>
</blockquote>
<p>Jeff Robin explains that by giving his students constraints, he enables their creativity.</p>
<blockquote>
<p>Voice and choice is tempered with… experience and preset parameters. Everyone has parameters. Pop singers have three minutes, accountants have the tax code, physicists have Newton, and artists have canvases.</p>
</blockquote>
<p>So I had to use my experience and consider the skillset of the team to make “canvas” decisions — laying out an environment where everyone could feel successful.</p>
<p>Would I have preferred to use robust task management software like Github Projects, Waffle, or Moo.do? Yep! But one of our team members had only been coding for 13 days!</p>
<p>And we had two team members who weren’t coders, but were business analysts or marketing folks. So I made the decision that we would use <a target="_blank" href="https://trello.com/">Trello</a> for task prioritizing and workflow and <a target="_blank" href="https://slack.com/">Slack</a> for communication — tools everyone could adopt quickly.</p>
<p>I also made the “canvas” decision that we would use a React / Firebase / Bootstrap 4 framework I made — it was simple and modular. Our most senior dev wrote up a strict branching / pull request checklist, put it in the README, and helped everyone get aboard the codebase.</p>
<p>With these preset parameters, we allowed the developers to work within constraints and actually be more creative and enjoy their contribution to the project.</p>
<h3 id="heading-leading-is-out-facilitating-is-in">“Leading” is out, facilitating is in</h3>
<p>Everyone thinks <strong>other people</strong> need to be managed, but no one thinks <strong>they themselves</strong> need to be managed.</p>
<p>Everyone thinks of themselves as a self-starter. But then they believe their employees need to be assigned work, or led in a direction, or “held accountable.”</p>
<p>If you’ve hired well, a leader’s job is to make sure the team can do their job — no longer leading them, hand-holding, managing, micro-managing, directing, or anything else that puts a bad taste in my mouth as I type the words. The only word I like to use to describe this role is “facilitator.”</p>
<p><a target="_blank" href="https://marcusblankenship.com/">Marcus Blankenship</a>, a coach for tech leaders, redefines leadership to mean something similar:</p>
<blockquote>
<p>Leadership is the process of creating an environment where everyone can participate in solving the problems at hand.</p>
</blockquote>
<p>Call yourself a leader on your résumé, but act like a facilitator while in the trenches.</p>
<p>You’ll know you’re doing it right when people are coming to you for quick advice and leaving happily empowered to do more.</p>
<p>The leader isn’t the one talking the most, it’s the one everyone talks to.</p>
<h3 id="heading-a-happy-team-results">A happy team = results</h3>
<p>Again, many bad managers think their reports would be happiest slacking off all day. This demonstrates a clear ignorance of <a target="_blank" href="https://en.wikipedia.org/wiki/Maslow%27s_hierarchy_of_needs#Self-actualization">Maslow’s hierarchy of needs</a> and the fact that “the self only finds its actualization in giving itself to some higher outside goal.” People are happiest achieving things. Enable them!</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1*A9AN-00gy3MgHNouhx0UBQ.jpeg" alt="Image" width="800" height="642" loading="lazy">
<em>Awww, lookit these smiling stone-cold killers. :)</em></p>
<p>In the end, we came together as a group, worked hard on a common goal, and had a ton of fun. Developing something useful and winning Startup Weekend was just a byproduct of that process.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to talk to your tech lead and fix your communication glitches ]]>
                </title>
                <description>
                    <![CDATA[ By Greg Sabo Here’s where you messed up. Your tech lead told you to build out a new API endpoint for an upcoming feature. It was supposed to be simple: just return a list of the current user’s email addresses. You start with the usual boilerplate. Yo... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/the-best-way-to-talk-to-your-tech-lead-fc6e7adb1e55/</link>
                <guid isPermaLink="false">66c360ece4cb1ff6521c8272</guid>
                
                    <category>
                        <![CDATA[ leadership ]]>
                    </category>
                
                    <category>
                        <![CDATA[ General Programming ]]>
                    </category>
                
                    <category>
                        <![CDATA[ software development ]]>
                    </category>
                
                    <category>
                        <![CDATA[ startup ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tech  ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Mon, 30 Apr 2018 18:06:58 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*By6rwJTTUNUXSsm0iTEZaw.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Greg Sabo</p>
<p>Here’s where you messed up.</p>
<p>Your tech lead told you to build out a new API endpoint for an upcoming feature. It was supposed to be simple: just return a list of the current user’s email addresses.</p>
<p>You start with the usual boilerplate. You register the new endpoint. You associate it with a controller. You add an explanatory comment.</p>
<p>Then you discover that the query is impossible. The user’s email addresses all live on different database shards.</p>
<p>The footlights flip on. The curtain rises. This is your time to be a software superstar! You’ll use your hard work and creativity to find a solution to this unique problem.</p>
<p>You begin building a denormalized table to keep the data local to the user’s shard, as well as a wrapping layer to keep the copies in sync. Your solution is scalable and performant. Look at you go!</p>
<p>Here’s the problem. You didn’t talk to your tech lead. From their perspective, they gave you a simple thing to work on, and it’s taking you three times longer than expected. It doesn’t matter if you’re creating the perfect architecture. You’ve eroded trust in your relationship with your team lead.</p>
<p>The best engineers can create elegant systems, but they also talk to their tech leads the right way. Here’s what I recommend.</p>
<h3 id="heading-1-during-meetings-focus-on-how-youre-tackling-whats-going-wrong">1. During meetings, focus on how you’re tackling what’s going wrong</h3>
<p>It’s time for the standup. What are you going to say to your team and your teach lead?</p>
<p>“I’ve made some progress on this thing yesterday. I ran into some test failures, and I’m fixing them now. I hope to ship this today.”</p>
<p>That was a status update. And it was pointless.</p>
<p>Status updates are communications that have no response other than “OK, sounds good.” Why spend the time giving these in-person updates then?</p>
<p>The whole point of holding standups is to encourage team members to unblock one another. The traditional three questions are:</p>
<pre><code><span class="hljs-number">1.</span> What did you finish yesterday?<span class="hljs-number">2.</span> What will you finish today?<span class="hljs-number">3.</span> What<span class="hljs-string">'s blocking you?</span>
</code></pre><p>People often focus on the first two and omit the final thing entirely. But it’s the most important!</p>
<p>People often interpret “What’s blocking you” as “What’s completely stopping you from working?” That’s why I prefer the question “What’s your red flag?” instead.</p>
<p>A red flag is <strong>anything</strong> that’s going to slow you down. Here are some examples of red flags:</p>
<ul>
<li>“I’m not sure how to get started on the test for this.”</li>
<li>“I need to figure out what the mobile team needs me to do here.”</li>
<li>“I need to refactor this component to get this to work.”</li>
</ul>
<p>None of these are things that are completely stopping you from working. But they are going to take up a considerable portion of your time.</p>
<p>This is what your tech lead wants to hear. It’s their best opportunity to do their job, to help speed you up and come up with solutions to your trickiest problems.</p>
<p>An important note about red flags: you should always maintain clear <strong>responsibility</strong> for your project as you state your red flag. You shouldn’t be in the habit of using red flags as an excuse for not getting your work done.</p>
<p>Most people want to sound impressive during their standup. They want to say, “Look at all this stuff I got done yesterday! Look at how awesome I am.” Resist that temptation, and instead focus on how you can accelerate the work ahead.</p>
<h3 id="heading-2-between-meetings-communicate-proactively">2. Between meetings, communicate proactively</h3>
<p>When you’re working as a team lead or tech lead, you have this constant paranoia that your team is completely stuck and you don’t know it.</p>
<p>You come into your team’s work pod, and everyone’s at their desk. But what are they doing? Are they making good progress? Are they spending their time implementing something the completely wrong way? It’s hard to tell.</p>
<p>And of course, the tech lead absolutely must have a trusting relationship with their team. They can’t let this paranoia control their behavior at all times. So they end up not asking.</p>
<p>This is your opportunity to meet one of your tech lead’s needs. You should proactively communicate about what you’re doing at least twice per day.</p>
<p>What do I mean by proactive communication? I mean any conversation that’s initiated by you. Check-ins started by your tech lead and scheduled meetings don’t count as proactive.</p>
<p>Examples of ways to kick of proactive communication:</p>
<ul>
<li>Sending a Slack message</li>
<li>Commenting on an Asana task that they’re following</li>
<li>Catching them as they come back to their desk</li>
</ul>
<p>Proactive communication sometimes takes the form of <a target="_blank" href="https://hackernoon.com/how-awesome-engineers-ask-for-help-93bcb2c7dbb7">asking for help</a>. “I can’t get this module to import and I don’t know what’s wrong. Can you help?” These are opportunities for the tech lead to do their job, and if you’re truly blocked then it’s time well spent.</p>
<p>The other form proactive communication can take is a checkpoint. Something like, “I’m working on this feature, and I’m finding that I’ll need to hoist this state up all the way to the root component for it to work. Let me know if you want to discuss this.” This is a great way to surface potential architectural disagreements. Stop waiting for code review before talking about this stuff, seriously.</p>
<p>Proactive communication seems easy. In practice everyone hesitates before “bothering” someone else with this kind of communication. Try adding a daily task to your to-do list to proactively communicate, and you’ll see what I mean.</p>
<p>Like all communication patterns, it’s worth your time to have an open discussion with your tech lead on their preferences. Do they hate Slack? How many status updates per day is too many? Did your communication over the past week benefit the team or not?</p>
<h3 id="heading-3-during-technical-discussions-repeat-and-summarize">3. During technical discussions, repeat and summarize</h3>
<p>It’s important that you and your tech lead have at least some alignment around the technical decisions you’re making. Your opportunity for making this alignment happen is technical conversations.</p>
<p>Technical conversations might look like your tech lead sitting down with you to kick off a new project. Your tech lead has some initial thoughts on how it could be implemented, and they’re sharing them with you.</p>
<p>Often, your tech lead might have more historical context than you on the system that’s changing. So they’ll probably say at least one thing that makes you go “huh?”</p>
<p>Your tech lead knows this. But they don’t know which things they’re saying are going to make you go “huh?” unless you actually say “huh?”</p>
<p>Always clarify both what you <strong>do</strong> and <strong>don’t</strong> find confusing. Rather than saying “I’m lost,” clarify “I understand X, but I don’t understand Y.”</p>
<p>Ultimately, you want your tech lead to walk away from the conversation with a lot of confidence that you heard and understood what they had to say. A lot of people try to achieve this by smiling and nodding. That has the opposite effect.</p>
<p>Instead of smiling and nodding when you understand, <strong>repeat and summarize</strong> what you heard.</p>
<p>For example:</p>
<blockquote>
<p>“Got it. What I’m hearing is, I should calculate this value on the server to reduce roundtrips, and send it down to the client during page load.”</p>
</blockquote>
<p>This pretty much proves to your tech lead that you were listening to them. And it actually forces you to listen better.</p>
<p>When trying this out, you’re going to resist at first. It kind of feels like you’re being bossy and interruptive. It also kind of feels like you’re just patronizingly copying what they say.</p>
<p>Don’t let that stop you. Think about how the tech lead will feel. I can tell you that it’s a real relief to see the other person take the initiative to repeat and summarize.</p>
<p>These summaries are usually action items. Your next step should be to write them down somewhere. Put them somewhere that your tech lead can see them and provide corrections if you’re wrong.</p>
<h3 id="heading-be-a-super-collaborator">Be a super collaborator</h3>
<p>Tech leads want to work with engineers who take responsibility. This can be hard to do on a technical level if you’re not familiar with the systems that you’re working with.</p>
<p>But what you <strong>can</strong> take responsibility for is how you <strong>communicate</strong> about your work. Think about how you can shift your communication patterns with your tech lead, and you’ll easily discover powerful new habits to build.</p>
<h4 id="heading-if-youre-passionate-about-helping-teams-collaborate-effectively-you-should-work-with-me-at-asanahttpsasanacomjobsengineeringutmsourcemediumamputmmediumblogamputmcontenttalk-to-tech-lead">If you’re passionate about helping teams collaborate effectively, you should <a target="_blank" href="https://asana.com/jobs/engineering?utm_source=medium&amp;utm_medium=blog&amp;utm_content=talk-to-tech-lead">work with me at Asana</a>.</h4>
 ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
