<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Mario Herreros</title>
    <description>The latest articles on Forem by Mario Herreros (@mariohhd).</description>
    <link>https://forem.com/mariohhd</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F11548%2F6be92e61-8ba8-4604-8a2c-0f84e1ced0d2.jpg</url>
      <title>Forem: Mario Herreros</title>
      <link>https://forem.com/mariohhd</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/mariohhd"/>
    <language>en</language>
    <item>
      <title>How to Craft Effective Prompts Using PARTS</title>
      <dc:creator>Mario Herreros</dc:creator>
      <pubDate>Tue, 19 Aug 2025 14:42:00 +0000</pubDate>
      <link>https://forem.com/mariohhd/how-to-craft-effective-prompts-using-parts-2587</link>
      <guid>https://forem.com/mariohhd/how-to-craft-effective-prompts-using-parts-2587</guid>
      <description>&lt;p&gt;GenAI is transforming the way developers write and refine code. From generating boilerplate to debugging complex issues, AI can save hours of work—&lt;strong&gt;but only if you ask it the right way&lt;/strong&gt;. The secret? Crafting clear, detailed prompts.&lt;/p&gt;

&lt;p&gt;Think of your prompt as the &lt;strong&gt;specification document&lt;/strong&gt; for the AI. If it’s vague, you’ll get something generic. If it’s precise, you’ll get code that fits your needs.  &lt;/p&gt;

&lt;p&gt;To make this easy, use &lt;strong&gt;PARTS&lt;/strong&gt;:&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;P – Persona: Identify Your Role&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Start by telling the AI who you are and your context. This shapes the complexity, depth, and tone of the response.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Examples:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;I am a backend engineer working on a microservices architecture using Node.js.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;I am a DevOps specialist automating CI/CD pipelines for a Kubernetes environment.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;I am a full-stack developer integrating Stripe payments into a React app.&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; A DevOps engineer might expect infrastructure-as-code templates, while a backend engineer wants clean, modular functions.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;A – Aim: State Your Objective&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Clearly state &lt;strong&gt;what you want the AI to do&lt;/strong&gt;. Start with a strong verb: &lt;em&gt;write&lt;/em&gt;, &lt;em&gt;debug&lt;/em&gt;, &lt;em&gt;optimize&lt;/em&gt;, &lt;em&gt;explain&lt;/em&gt;, &lt;em&gt;convert&lt;/em&gt;, etc.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Examples:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Write a Python script to upload large files to AWS S3 using multipart upload.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Debug the following Dockerfile for a Node.js app that crashes on startup.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Optimize this SQL query for faster performance on a 10M-row PostgreSQL table.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Convert this Express.js middleware to TypeScript with proper types.&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Pro tip:&lt;/strong&gt; Always specify the language, framework, and purpose. “Write a login feature” is vague. “Write a Next.js API route for user authentication using JWT” is clear.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;R – Recipients: Specify the Audience&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Who will use this code? Your &lt;strong&gt;audience determines complexity and style&lt;/strong&gt;. Is it for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Your dev team&lt;/strong&gt; (production-ready, optimized, minimal comments)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open-source contributors&lt;/strong&gt; (clean, documented, maintainable)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Junior developers&lt;/strong&gt; (extra comments, educational tone)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Examples:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;The code should be production-ready for a fintech app with strict security requirements.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Output should include comments for maintainability because multiple teams will contribute.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Provide a lightweight solution that avoids external dependencies for a performance-critical system.&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;T – Theme: Define Style and Constraints&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This is where you set &lt;strong&gt;coding conventions, tone, and any restrictions&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Examples:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Follow PEP 8 guidelines and include type hints.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Use functional programming principles; no OOP classes.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Avoid any third-party libraries; stick to Node.js core modules.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Add inline comments explaining performance trade-offs.&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;S – Structure: Specify the Format&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Decide &lt;strong&gt;how you want the answer delivered&lt;/strong&gt;. Just code? Code + explanation? Step-by-step?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Examples:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Provide the final code only—no explanation.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Show the code, then explain the solution in bullet points.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Include unit tests using Jest for the provided function.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Give two versions: a basic solution and an optimized one.&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Example of a Full Prompt Using PARTS&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Here’s how you can combine everything into a real-world scenario:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;I am a backend engineer building a payment service (Persona). Write a Node.js function to generate Stripe payment intents with error handling (Aim). The code will be reviewed by senior developers and deployed to production (Recipients). Use modern JavaScript (ES2022) and include JSDoc comments for maintainability (Theme). Provide the function and an example usage snippet (Structure).&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Why PARTS Makes Your Prompts Better&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;By applying &lt;strong&gt;PARTS&lt;/strong&gt;, you turn vague instructions like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Write code to handle payments.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Into:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“I am a backend engineer building a payment service. Write a Node.js function to generate Stripe payment intents with error handling. The code will be reviewed by senior developers and deployed to production. Use modern JavaScript (ES2022) and include JSDoc comments for maintainability. Provide the function and an example usage snippet.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The second prompt gives the AI &lt;strong&gt;context, goals, and constraints&lt;/strong&gt;, resulting in code that’s closer to what you actually need—saving you time and reducing rewrites.&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ &lt;strong&gt;Pro-Tip: Test and Iterate&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Prompt engineering is like debugging: the first try may not be perfect. &lt;strong&gt;Iterate, refine, and add details&lt;/strong&gt; until the output meets your expectations.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Not Just for Coding&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Although this article focuses on coding, the &lt;strong&gt;PARTS works for many other domains&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Design&lt;/strong&gt;: &lt;em&gt;I am a UX designer creating wireframes (Persona). Suggest 5 user flow improvements for a food delivery app (Aim)...&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content Writing&lt;/strong&gt;: &lt;em&gt;I am a tech blogger writing an article on AI ethics (Persona). Generate 10 catchy titles (Aim)...&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Project Management&lt;/strong&gt;: &lt;em&gt;I am a product manager preparing a sprint plan (Persona). Create a roadmap for a SaaS product launch (Aim)...&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Any time you need AI to &lt;strong&gt;generate content, brainstorm ideas, analyze data, or create structured output&lt;/strong&gt;, PARTS gives you a blueprint for clarity and precision.&lt;/p&gt;

</description>
      <category>genai</category>
      <category>ai</category>
      <category>parts</category>
      <category>programming</category>
    </item>
    <item>
      <title>Setting Up Custom Instructions for GitHub Copilot</title>
      <dc:creator>Mario Herreros</dc:creator>
      <pubDate>Wed, 13 Aug 2025 15:13:48 +0000</pubDate>
      <link>https://forem.com/mariohhd/setting-up-custom-instructions-for-github-copilot-54lh</link>
      <guid>https://forem.com/mariohhd/setting-up-custom-instructions-for-github-copilot-54lh</guid>
      <description>&lt;p&gt;Your company has just purchased &lt;strong&gt;GitHub Copilot&lt;/strong&gt; licences for the entire development team.&lt;br&gt;&lt;br&gt;
The promise is appealing: faster delivery, less repetitive work, more focus on the important stuff.  &lt;/p&gt;

&lt;p&gt;But after a few weeks… problems start to emerge:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code that is inconsistent with project standards.&lt;/li&gt;
&lt;li&gt;Missing unit tests.&lt;/li&gt;
&lt;li&gt;Insecure implementations in critical areas such as cookies, authentication, or input validation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This happens because &lt;strong&gt;Copilot, by default, does not know your internal rules&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
The solution: &lt;strong&gt;create a shared custom instructions file that every developer can use&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  1. What are “Custom Instructions” for Copilot?
&lt;/h2&gt;

&lt;p&gt;Instead of giving instructions in every comment or prompt, you can &lt;strong&gt;define a persistent set of rules&lt;/strong&gt; that Copilot will always consider.&lt;br&gt;&lt;br&gt;
When it suggests code, it will then respect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Project style guidelines.&lt;/li&gt;
&lt;li&gt;Security practices.&lt;/li&gt;
&lt;li&gt;The correct framework and internal libraries.&lt;/li&gt;
&lt;li&gt;Linter rules.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;💡 These instructions can be stored in a file (e.g., &lt;code&gt;.copilot-instructions.md&lt;/code&gt;) and distributed to the whole team.&lt;/p&gt;


&lt;h2&gt;
  
  
  2. Example &lt;code&gt;.copilot-instructions.md&lt;/code&gt; file
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# GitHub Copilot – Corporate Instructions&lt;/span&gt;

&lt;span class="gu"&gt;## Style and Linter&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Always follow the rules from &lt;span class="sb"&gt;`.eslintrc.json`&lt;/span&gt; for JavaScript and &lt;span class="sb"&gt;`.pylintrc`&lt;/span&gt; for Python.
&lt;span class="p"&gt;-&lt;/span&gt; Use single quotes in JavaScript/TypeScript.
&lt;span class="p"&gt;-&lt;/span&gt; Always end statements with &lt;span class="sb"&gt;`;`&lt;/span&gt; in JS/TS.

&lt;span class="gu"&gt;## Security&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; For cookies: set &lt;span class="sb"&gt;`httpOnly`&lt;/span&gt;, &lt;span class="sb"&gt;`secure`&lt;/span&gt;, &lt;span class="sb"&gt;`sameSite: strict`&lt;/span&gt;, and &lt;span class="sb"&gt;`maxAge`&lt;/span&gt;.
&lt;span class="p"&gt;-&lt;/span&gt; Never include passwords or secrets in code.
&lt;span class="p"&gt;-&lt;/span&gt; Validate all external input using patterns from &lt;span class="sb"&gt;`utils/validators`&lt;/span&gt;.

&lt;span class="gu"&gt;## Tests&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Always generate unit tests alongside new code.
&lt;span class="p"&gt;-&lt;/span&gt; Use Jest for JS/TS projects and pytest for Python.
&lt;span class="p"&gt;-&lt;/span&gt; Minimum coverage: 90%.

&lt;span class="gu"&gt;## Internal Libraries&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Use &lt;span class="sb"&gt;`logger`&lt;/span&gt; for logs, not &lt;span class="sb"&gt;`console.log`&lt;/span&gt;.
&lt;span class="p"&gt;-&lt;/span&gt; Use &lt;span class="sb"&gt;`fetchWithAuth`&lt;/span&gt; instead of &lt;span class="sb"&gt;`fetch`&lt;/span&gt; for authenticated HTTP calls.

&lt;span class="gu"&gt;## Other&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Document every public function with JSDoc or Python docstrings.
&lt;span class="p"&gt;-&lt;/span&gt; Avoid external dependencies not listed in &lt;span class="sb"&gt;`approved-deps.json`&lt;/span&gt;.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. How to implement this across your team
&lt;/h2&gt;

&lt;p&gt;Create the file .github/.copilot-instructions.md at the root of your project (create .github folder if you don't have it).&lt;/p&gt;

&lt;p&gt;Share it in the base repository or in your project templates.&lt;/p&gt;

&lt;p&gt;Configure Copilot so that it applies these rules: If you use Visual Studio Code, open the file at the start of a session and paste its content into Copilot’s “Custom Instructions” settings.&lt;/p&gt;

&lt;p&gt;If your team uses GitHub Copilot Chat, paste the content as initial context.&lt;/p&gt;

&lt;p&gt;In enterprise setups, include it as part of onboarding scripts or IDE initialisation steps.&lt;/p&gt;


&lt;h2&gt;
  
  
  4. Example in practice
&lt;/h2&gt;

&lt;p&gt;Without instructions, Copilot might produce:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;res.cookie('sessionId', id);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With .copilot-instructions.md in place, it will suggest:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;res.cookie('sessionId', id, {
  httpOnly: true,
  secure: process.env.NODE_ENV === 'production',
  sameSite: 'strict',
  maxAge: 1000 * 60 * 60 // 1 hour
});

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. Benefits
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Consistency: all developers receive aligned suggestions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Security: reduced risk of unsafe implementations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Less friction: no need to repeat the same instructions in every prompt.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Faster onboarding: new joiners produce better code from day one.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Copilot is not a senior developer – it needs context.&lt;br&gt;
A corporate instructions file turns that “intuition” into a set of explicit rules, helping Copilot to produce code that is secure, consistent, and compliant with your organisation’s standards.&lt;/p&gt;

&lt;p&gt;For more details, see the &lt;a href="https://docs.github.com/en/copilot/how-tos/configure-custom-instructions/add-repository-instructions?pp=ygUUZmlnbWEgZ2l0aHViIGNvcGlsb3Q%3Dhttps%3A%2F%2Fgithub.com%2F0GiS0%2Ftour-of-heroes-with-gh-copilot-coding-agent&amp;amp;tool=vscode" rel="noopener noreferrer"&gt;Github Docs&lt;/a&gt;&lt;/p&gt;

</description>
      <category>githubcopilot</category>
      <category>programming</category>
      <category>team</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Scrum Must Die ☠️</title>
      <dc:creator>Mario Herreros</dc:creator>
      <pubDate>Mon, 11 Aug 2025 18:04:00 +0000</pubDate>
      <link>https://forem.com/mariohhd/scrum-must-die-209k</link>
      <guid>https://forem.com/mariohhd/scrum-must-die-209k</guid>
      <description>&lt;p&gt;Scrum was born as the savior of development teams.&lt;br&gt;&lt;br&gt;
Now, in too many companies, it’s turned into a &lt;strong&gt;corporate religion with more sermons than miracles&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
And like any bureaucratic religion... it either reforms, or it dies.&lt;/p&gt;




&lt;h2&gt;
  
  
  Scrum: from agile revolution to organizational theater 🎭
&lt;/h2&gt;

&lt;p&gt;Years ago, when someone said "we're agile," people smiled.&lt;br&gt;&lt;br&gt;
Today, it means: "brace yourself for more meetings, more metrics, and more PowerPoints."  &lt;/p&gt;

&lt;p&gt;Once, companies hired Scrum Masters and Agile Coaches like rare Pokémon.&lt;br&gt;&lt;br&gt;
Now? They're laying them off, merging their roles, or keeping them as ceremony police.  &lt;/p&gt;




&lt;h2&gt;
  
  
  The slow death of technical excellence ⚰️💻
&lt;/h2&gt;

&lt;p&gt;Scrum &lt;strong&gt;doesn't ship technical practices out of the box&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Without a strong engineering commitment — tests, CI/CD, TDD, living architecture — the framework becomes &lt;strong&gt;a conveyor belt of broken features&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;The result:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code that ages worse than a banana forgotten in a drawer.
&lt;/li&gt;
&lt;li&gt;Deadlines that dictate more than quality.
&lt;/li&gt;
&lt;li&gt;Developers stuck in chronic burnout.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The mutant Scrum Master 🧪
&lt;/h2&gt;

&lt;p&gt;In too many organizations, the Scrum Master is gone.&lt;br&gt;&lt;br&gt;
Instead, we have the &lt;strong&gt;Scrum-PM-Dev-Tester-CoffeeMaker&lt;/strong&gt;: a hybrid creature that doesn't lead or serve, just survives.  &lt;/p&gt;

&lt;p&gt;A role meant to protect agility now spends the day filling spreadsheets and chasing tickets instead of empowering teams.&lt;/p&gt;




&lt;h2&gt;
  
  
  Management overload and the cost of ignorance 💸
&lt;/h2&gt;

&lt;p&gt;There's a growing &lt;strong&gt;management overload&lt;/strong&gt; in many "agile" organizations: too many decision-makers with &lt;strong&gt;too little technical background&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;This creates a dangerous loop:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Decisions are made without understanding the engineering impact.
&lt;/li&gt;
&lt;li&gt;Expensive mistakes are repeated in the name of "delivery".
&lt;/li&gt;
&lt;li&gt;Teams feel they're being managed, not led.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When non-technical managers dictate technical priorities, the result is often waste, rework, and long-term pain disguised as "progress".&lt;/p&gt;




&lt;h2&gt;
  
  
  The Agile Industrial Complex 🏭
&lt;/h2&gt;

&lt;p&gt;Agility has been packaged into certifications, workshops, and consulting packages that promise transformation but deliver &lt;strong&gt;empty mechanics&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;Scrum becomes a theater where everything is done "by the book" but &lt;strong&gt;without soul, values, or real continuous improvement&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Reform it or throw it overboard? 🚢🔥
&lt;/h2&gt;

&lt;p&gt;If you still want to rescue Scrum, here's the recipe:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How Scrum could improve:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Less ceremony, more value&lt;/strong&gt;: if the daily stand-up lasts 20 minutes, something's broken.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integrate technical practices&lt;/strong&gt;: TDD, CI/CD, Pair Programming… without this, forget about quality.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clear roles&lt;/strong&gt;: a Scrum Master is not your Project Manager, boss, or on-call developer.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real autonomy&lt;/strong&gt;: the team decides, not the hierarchy.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Technical literacy in management&lt;/strong&gt;: decision-makers must understand the cost and complexity of engineering work.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Alternatives that might shine brighter:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Kanban&lt;/strong&gt;: flows like water, no forced iterations.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extreme Programming (XP)&lt;/strong&gt;: hardcore engineering, quality above all.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lean&lt;/strong&gt;: less waste, more focus on what matters.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mix &amp;amp; Match&lt;/strong&gt;: take what works, drop what doesn't — like a good buffet.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusion: Scrum isn't the enemy... but your implementation might be 👀
&lt;/h2&gt;

&lt;p&gt;Scrum doesn't have to die, but &lt;strong&gt;the zombie, bureaucratic, tech-agnostic Scrum&lt;/strong&gt; we see in too many companies... that one should be buried.&lt;br&gt;&lt;br&gt;
Preferably with one last retrospective... and no sticky notes.&lt;/p&gt;

</description>
      <category>scrum</category>
      <category>agile</category>
      <category>development</category>
      <category>management</category>
    </item>
    <item>
      <title>Strengthening Web Security with HTTP Headers in Express.js</title>
      <dc:creator>Mario Herreros</dc:creator>
      <pubDate>Thu, 31 Jul 2025 16:10:00 +0000</pubDate>
      <link>https://forem.com/mariohhd/strengthening-web-security-with-http-headers-in-expressjs-50jn</link>
      <guid>https://forem.com/mariohhd/strengthening-web-security-with-http-headers-in-expressjs-50jn</guid>
      <description>&lt;p&gt;When developing web applications, security should always be a top priority. A simple yet powerful way to protect your app and users is by configuring HTTP security headers. These headers instruct the browser on how to behave when handling content from your site, helping to mitigate common attacks like cross-site scripting (XSS), clickjacking, and content sniffing.&lt;/p&gt;

&lt;p&gt;In this article, we’ll walk through an Express.js middleware that sets key HTTP headers, explain their purposes, and suggest additional headers you should consider for modern, robust protection.&lt;/p&gt;

&lt;h2&gt;
  
  
  An example of security header middleware
&lt;/h2&gt;

&lt;p&gt;The following is an example of security header middleware:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const express = require('express');
const app = express();

app.use((req, res, next) =&amp;gt; {
  res.set({
    'Strict-Transport-Security': 'max-age=63072000; preload',
    'X-Content-Type-Options': 'nosniff',
    'X-XSS-Protection': '1; mode=block',
    'Content-Security-Policy': "default-src 'self'; script-src 'self'; object-src 'none'; upgrade-insecure-requests",
    'Referrer-Policy': 'strict-origin-when-cross-origin',
    'Permissions-Policy': 'fullscreen=(self), camera=(), geolocation=()',
    'Cross-Origin-Embedder-Policy': 'require-corp',
    'Cross-Origin-Opener-Policy': 'same-origin',
    'Cross-Origin-Resource-Policy': 'same-origin'
  });
  next();
});

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What These Headers Do
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Strict-Transport-Security
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Strict-Transport-Security: max-age=63072000; preload&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This tells browsers to only connect via HTTPS for the next 2 years (63072000 seconds). The preload directive allows your domain to be added to browsers' HSTS preload list, preventing even the first request from using insecure HTTP.&lt;/p&gt;

&lt;p&gt;Why it matters: Protects against SSL stripping attacks by ensuring all future connections are encrypted.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. X-Content-Type-Options
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;X-Content-Type-Options: nosniff&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Prevents browsers from guessing (or "sniffing") the MIME type of a resource. This is important because misinterpreted files (e.g., JavaScript served as images) can be dangerous.&lt;/p&gt;

&lt;p&gt;Why it matters: Reduces risk of executing malicious files disguised as safe content.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. X-XSS-Protection
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;X-XSS-Protection: 1; mode=block&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This enables the XSS protection filter in some older browsers. It tells the browser to block the page if an attack is detected.&lt;/p&gt;

&lt;p&gt;Why it matters: Offers limited protection against cross-site scripting attacks in legacy environments.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Content-Security-Policy (CSP)
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Content-Security-Policy: default-src 'self'&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Purpose: Controls which resources (scripts, images, styles, etc.) can be loaded. Strong CSP rules help prevent XSS and data injection attacks.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Referrer-Policy
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Referrer-Policy: strict-origin-when-cross-origin&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Purpose: Limits what referrer information is shared when navigating away from your site, protecting user privacy and sensitive URLs.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Permissions-Policy (formerly Feature-Policy)
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Permissions-Policy: fullscreen=(self), camera=(), geolocation=()&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Purpose: Restricts browser APIs (like camera, geolocation, microphone, etc.) to only allowed origins or disables them entirely.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Cross-Origin-Embedder-Policy (COEP), Cross-Origin-Opener-Policy (COOP) &amp;amp; Cross-Origin-Resource-Policy (CORP)
&lt;/h3&gt;

&lt;p&gt;These help isolate your site from other origins and protect against cross-origin attacks and speculative execution vulnerabilities (like Spectre).&lt;/p&gt;

&lt;p&gt;Recommended configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Resource-Policy: same-origin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Using &lt;a href="https://www.npmjs.com/package/helmet" rel="noopener noreferrer"&gt;helmet&lt;/a&gt; — the easier way
&lt;/h2&gt;

&lt;p&gt;Instead of manually adding headers, you can use &lt;a href="https://www.npmjs.com/package/helmet" rel="noopener noreferrer"&gt;helmet&lt;/a&gt;, a middleware package that sets many of these headers by default:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install helmet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then in your app:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const helmet = require('helmet');
app.use(helmet());
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also configure each header individually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app.use(helmet.contentSecurityPolicy({
  directives: {
    defaultSrc: ["'self'"],
    scriptSrc: ["'self'"]
  }
}));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;HTTP security headers are a simple but essential way to reduce your application’s attack surface. While no single measure guarantees complete protection, layering these headers with best practices (like input validation and HTTPS) significantly strengthens your web app’s defenses.&lt;/p&gt;

&lt;p&gt;Start small, use tools like helmet, and review your security settings regularly—because protecting your users is not optional.&lt;/p&gt;

</description>
      <category>security</category>
      <category>headers</category>
      <category>helmet</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
