Full Page

Engineering, Culture, Craft

On the Slow Erosion of Craft in Software

Why shipping fast and shipping well are not the opposites we pretend they are

There is a persistent myth in our industry that careful engineering is the enemy of velocity. That "move fast and break things" represents a genuine philosophy rather than a retroactive justification for technical debt. I have spent fifteen years writing software, and the fastest teams I have worked on were invariably the most disciplined. They wrote tests not because a manager told them to, but because they had been burned enough times to internalize the cost of not testing. They reviewed each other's code not to gatekeep, but to teach. The erosion happens gradually. First you skip the tests for "just this one feature." Then you stop writing documentation because "the code is self-documenting." Then you stop thinking about edge cases because "we'll fix it when users report it." Before you know it, you are spending 80% of your time fighting fires that careful engineering would have prevented.

Blog Article

Long-form blog post layout with cover image, author byline, and body text.

by DesignGenerate 0 stars 1 renders 0 forks

Schema

FieldType
title string
subtitle string
author_name string
author_avatar image
cover_image image
body text
tags list<string>
author_url link

Apply Values

POST JSON to the API endpoint:

POST /api/templates/blog-article/apply
Content-Type: application/json

{
  "title": "On the Slow Erosion of Craft in Software",
  "subtitle": "Why shipping fast and shipping well are not the opposites we pretend they are",
  "author_name": "Tomás Vega",
  "author_avatar": "/images/defaults/author-avatar.webp",
  "cover_image": "/images/defaults/cover-blog.webp",
  "body": "There is a persistent myth in our industry that careful engineering is the enemy of velocity. That \"move fast and break things\" represents a genuine philosophy rather than a retroactive justification for technical debt.\n\nI have spent fifteen years writing software, and the fastest teams I have worked on were invariably the most disciplined. They wrote tests not because a manager told them to, but because they had been burned enough times to internalize the cost of not testing. They reviewed each other's code not to gatekeep, but to teach.\n\nThe erosion happens gradually. First you skip the tests for \"just this one feature.\" Then you stop writing documentation because \"the code is self-documenting.\" Then you stop thinking about edge cases because \"we'll fix it when users report it.\" Before you know it, you are spending 80% of your time fighting fires that careful engineering would have prevented.",
  "tags": [
    "Engineering",
    "Culture",
    "Craft"
  ],
  "author_url": "https://example.com/tomas"
}

AI Prompt

Copy this prompt to generate a compatible template with any LLM:

You are an expert frontend designer.
Create a beautiful, modern HTML template for "Blog Article" that strictly follows the constraints and schema below.

## Constraints
- Style everything using inline style="" attributes only (no external CSS, no <link>, no <style> tags)
- Do NOT use: <script>, <iframe>, <form>, <input>, <textarea>, <button>, <select>, <object>, <embed>, <details>, <dialog>
- Place data placeholders using this syntax: {{title:string}}, {{subtitle:string}}, {{author_name:string}}
- The template must be a single HTML fragment (no <html>, <head>, or <body> tags)
- Use system fonts: font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif (or Georgia, serif for editorial)

## JSON Schema
```json
{
  "title": "string",
  "subtitle": "string",
  "author_name": "string",
  "author_avatar": "image",
  "cover_image": "image",
  "body": "text",
  "tags": [
    "string"
  ],
  "author_url": "link"
}
```

## Placeholder Syntax
Each data point uses `{{key:type}}` — for example:
- `{{title:string}}` → string
- `{{subtitle:string}}` → string
- `{{author_name:string}}` → string
- `{{author_avatar:image}}` → image
- `{{cover_image:image}}` → image
- `{{body:text}}` → text
- `{{tags:list<string>}}` → list<string>
- `{{author_url:link}}` → link

Output ONLY the HTML code block. No explanation.