# Contents

With over 20 years in the tech industry, I've seen firsthand how developer responsibilities have rapidly expanded. What used to be a straightforward edit-compile-debug workflow has exploded into a dizzying array of languages, frameworks, infrastructure, and deployment environments. This complexity takes a toll on productivity and innovation.

TL;DR
  • Golden Path: The "opinionated and supported path" to build and run systems, originally coined by Spotify. It provides recommended tools, processes, and documentation tailored for developers within an organization. It acts as guardrails but allows some flexibility. Owned by central platform teams.

  • Paved Road: The "recommended path" with tooling and documentation provided by central platform teams at companies like Netflix. It is less opinionated than a Golden Path, with fewer constraints on developers.

  • Guardrails: Constraints, guidelines, or architectural boundaries that steer developers towards an organization's recommended "Golden Path" or "Paved Road" for building and running systems, while allowing some flexibility. Guardrails help developers avoid deviations that could cause issues. They provide visibility, monitoring, and automation to enable organizational best practices, rapid validation of changes, and identification of issues without limiting velocity. Guardrails allow organizations to maintain safety while moving fast.

The Evolution of Development Complexity

In my early days, codebases were monolithic, and tools were minimal - usually just a Linux workstation with GCC, Emacs, or Vim. Fast forward to today, and developers are often accountable for the entire stack. This includes languages, frameworks, containers, Kubernetes, CI/CD pipelines, and cloud infrastructure. Each area requires expertise that could fill entire careers. This vast scope hampers developers' ability to write code, which is what they want to focus on.

Guardrails: Safety without Obstruction

The first I heard of guardrails was a talk from Jason Chan at LASCON 2013, titled "From Gates to Guardrails - Alternate Approaches to Product Security."

Guardrails are not mere constraints but are integral to a secure and efficient development pipeline. They replace restrictive gatekeeping with automated, integrated security checks that empower developers to innovate safely within set boundaries.

We support Netflix’s cultural values of Freedom and Responsibility by creating guardrails that guide the company to secure solutions rather than gates that would limit speed and innovation.

Jason Chan, LASCON 2013
Guardrails - Controls that allow developers the flexibility to innovate within the boundaries of defined policies.
Guardrails - Controls that allow developers the flexibility to innovate within the boundaries of defined policies.

These guardrails are the invisible structures that enable developers to maneuver within the boundaries of established policies without stifling speed or creativity. Adopting enforced code reviews, using libraries with approved OSI licenses, and consuming approved images from trusted sources are just skimmed facets of what these guardrails represent. Layered over with Kubernetes checks, they symbolize a safety net that empowers developers rather than entraps them.

Streamlining the Route to Production

Building on guardrails, the terms "golden path" and "paved road" emerged from Spotify and Netflix, respectively. The goal was to make a smoother, easier 'path' through the development lifecycle - from writing code locally to deploying to production. This path would be standardized, documented, and automated as much as possible.

The paved or golden path, as described by Evan Smith, weaves an opinionated yet supportive route for creating software. It specifies a task-specific trajectory that offers structure as developers move from local development through various stages of integration and delivery, each with its own set of tools and checkpoints designed to ensure quality and security.

Golden Paths  or Paved Paths
Golden Paths or Paved Paths

Such paths are not rigidly defined. Rather, they offer a foundation upon which developers can rely for basic development necessities while maintaining the freedom to innovate and carve out niche solutions that suit specific problems.

Benefits of Paved Paths

In my view, well-designed paved paths offer compelling benefits:

  • Streamlined route to production

  • Support from platform teams who maintain the paved paths

  • Avoidance of many infrastructure complexities

  • Standardized tools and workflows

  • Faster onboarding for new hires

Essentially, they remove speed bumps and undifferentiated heavy lifting. This empowers developers to concentrate on writing code vs wrestling with operational tasks.

Creating Paved Paths

Constructing effective paved paths requires choosing the right approach. The "platform view" involves extensive upfront planning and architecting. The "iterative" approach tackles pain points incrementally.

  1. Take a platform view: Define goals, users, and priorities upfront. Build solutions in a product-focused manner.

  2. Iteratively improve pain points: Identify the biggest pain points for developers. Fix the most painful issue first, then move on to the next one.

The iterative approach provides quick wins if focused on the right problems. However, the platform approach is better for building a robust long-term solution.

When creating paved paths, it's important to leverage tools and solutions that fit naturally into developers' workflows—for example, integrating solutions into existing IDEs and using familiar languages/formats like Docker.

Developers should be encouraged but not forced to use the paved paths. Allowing developers to 'break glass' provides an escape hatch if the paved path doesn't meet a project's needs.

Daytona's Approach to Development Environments Management

At Daytona, we understand the delicate balance required for developers to remain productive while having the flexibility to branch out. In our efforts, we maintain a philosophy that such guidelines should be a carrot, an enticing pull towards the streamlined route to production, rather than a stick that punishes deviation.

Start with Developer Environments
Start with Developer Environments

Our development environment management (DEM) platform creates standardized development environments (SDE) that cater to the specific needs of companies. These environments are customizable and offer a balance between flexibility and standardization, akin to an enterprise-level version of Codespaces within the secure boundaries of the client's infrastructure.

Daytona's Dev Container Implementation

In our commitment to developer efficiency and security, Daytona adopts dev containers to standardize development environments. This standard provides an assortment of building blocks configured to enable the versatility necessary for innovation-driven development. It offers a range of images, features, and templates that propel developers forward within a secure yet malleable framework.

Benefits of Dev Container standard
Benefits of Dev Container standard

To illustrate this point, the following devcontainer.json example establishes a Python workspace with essential tools, enforces code style, and automates setup tasks, all within a secured, non-root user context. This ensures immediate productivity with the flexibility needed for innovative software development, perfectly aligning with our paved path philosophy.

1{
2 "name": "Daytona's Secure and Standardized Dev Environment",
3 "build": {
4 "dockerfile": "Dockerfile",
5 "context": "..",
6 "args": {
7 "VARIANT": "3.8",
8 "SOME_BUILD_ARG": "value" // Custom build arguments to tailor the environment
9 }
10 },
11 "settings": {
12 "terminal.integrated.shell.linux": "/bin/bash",
13 "python.pythonPath": "/usr/local/bin/python",
14 "editor.formatOnSave": true // Automatically format code on save for consistency
15 },
16 "extensions": [
17 "ms-python.python", // Python support in VS Code
18 "ms-azuretools.vscode-docker" // Docker integration for easy container management
19 ],
20 "forwardPorts": [8000], // Forward the port for web applications
21 "postCreateCommand": "pip install -r requirements.txt", // Install project dependencies after creation
22 "remoteUser": "vscode", // Use a non-root user for security best practices
23 "runArgs": [
24 "--env", "DATABASE_URL=postgres://..." // Inject environment variables for external services
25 ],
26 "features": { // Enable or disable features like the SSH server or the Git client
27 "ssh-server": "latest",
28 "git": "latest"
29 }
30}

Conclusion

Constructing 'paved paths' through the development lifecycle can substantially improve developer productivity and satisfaction. But it requires thoughtful design and solid technical execution. When done right, paved paths create a frictionless workflow that empowers developers to do their best work.

I host weekly live streams, on Twitch and YouTube, for those interested in exploring these concepts further. Join me to share insights, ask questions, and seek assistance in enhancing your development workflows.

Tags::
  • DEM
  • SDE