home / skills / amnadtaowsoam / cerebraskills / tech-stack-selection

tech-stack-selection skill

/59-architecture-decision/tech-stack-selection

This skill guides choosing boring, maintainable technologies based on problem fit, team capability, and long-term viability to reduce technical debt.

npx playbooks add skill amnadtaowsoam/cerebraskills --skill tech-stack-selection

Review the files below or copy the command above to add this skill to your agents.

Files (1)
SKILL.md
8.7 KB
---
name: Tech Stack Selection
description: Systematic approach to choosing technologies, frameworks, and tools based on requirements, team capabilities, and long-term sustainability.
---

# Tech Stack Selection

## Overview

Tech Stack Selection is the process of choosing programming languages, frameworks, databases, and tools that will form the foundation of your system. Good choices enable productivity; poor choices create years of technical debt.

**Core Principle**: "Choose boring technology. Optimize for team productivity and long-term maintainability, not resume-driven development."

---

## 1. Selection Criteria Framework

### Primary Criteria
| Criterion | Questions to Ask |
|-----------|------------------|
| **Problem Fit** | Does this technology solve our specific problem well? |
| **Team Expertise** | Can our team learn and use this effectively? |
| **Community & Support** | Is there an active community? Good documentation? |
| **Maturity** | Is it production-ready or still experimental? |
| **Ecosystem** | Are there libraries/tools we need? |
| **Performance** | Does it meet our performance requirements? |
| **Cost** | Licensing, hosting, training costs? |
| **Hiring** | Can we hire developers with this skill? |
| **Long-term Viability** | Will it be maintained in 5 years? |

---

## 2. The "Boring Technology" Rule

```markdown
## Dan McKinley's "Choose Boring Technology"

**Rule**: You have ~3 "innovation tokens" per project. Spend them wisely.

### Example: E-commerce Startup

**Boring (Safe) Choices**:
- ✅ PostgreSQL (database) - Proven, reliable
- ✅ React (frontend) - Widely adopted, stable
- ✅ Node.js (backend) - Team knows it well

**Innovation Tokens Spent**:
- 🎫 Token 1: Kubernetes (new to team, but needed for scaling)
- 🎫 Token 2: GraphQL (better than REST for our use case)
- 🎫 Token 3: [Reserved for future needs]

**Avoided**:
- ❌ Rust backend (team doesn't know it)
- ❌ CockroachDB (PostgreSQL works fine)
- ❌ Svelte (React is good enough)
```

---

## 3. Technology Evaluation Matrix

```markdown
## Example: Choosing a Frontend Framework

| Criteria | React | Vue | Svelte | Weight | Winner |
|----------|-------|-----|--------|--------|--------|
| **Team Expertise** | 5/5 (everyone knows) | 2/5 (1 person) | 1/5 (nobody) | 30% | React |
| **Ecosystem** | 5/5 (huge) | 4/5 (good) | 3/5 (growing) | 20% | React |
| **Performance** | 4/5 | 4/5 | 5/5 (fastest) | 15% | Svelte |
| **Hiring** | 5/5 (easy) | 4/5 | 2/5 (harder) | 15% | React |
| **Documentation** | 5/5 | 5/5 | 4/5 | 10% | React/Vue |
| **Bundle Size** | 3/5 | 4/5 | 5/5 (smallest) | 10% | Svelte |

**Weighted Score**:
- React: 4.5/5
- Vue: 3.6/5
- Svelte: 3.2/5

**Decision**: React (best fit for team and ecosystem)
```

---

## 4. Database Selection Guide

### Relational (SQL)
```markdown
**Choose PostgreSQL when**:
- Complex relationships between entities
- ACID transactions required
- Strong consistency needed
- Rich query capabilities (JOINs, CTEs)

**Examples**: E-commerce, Banking, ERP

**Choose MySQL when**:
- Read-heavy workloads
- Simpler data model
- Need master-slave replication

**Examples**: Content sites, Blogs
```

### NoSQL
```markdown
**Choose MongoDB when**:
- Flexible schema needed
- Document-oriented data
- Rapid prototyping

**Examples**: Content management, Catalogs

**Choose Redis when**:
- Caching layer
- Session storage
- Real-time features (pub/sub)

**Examples**: Cache, Leaderboards, Rate limiting

**Choose Cassandra when**:
- Massive write throughput
- Multi-datacenter replication
- Time-series data

**Examples**: IoT, Analytics, Logs
```

---

## 5. Language Selection

### Backend Language Decision Tree
```
Do you need maximum performance?
├─ YES → Go, Rust
└─ NO → Continue

Do you have a large existing codebase?
├─ YES → Stick with current language
└─ NO → Continue

What's your team's expertise?
├─ JavaScript → Node.js/TypeScript
├─ Python → Python (Django/FastAPI)
├─ Java → Java/Kotlin (Spring Boot)
└─ None → TypeScript (easiest to hire)

Special requirements?
├─ ML/Data Science → Python
├─ Real-time/Gaming → Go, Rust
├─ Enterprise → Java
└─ Startups → TypeScript, Python
```

---

## 6. Framework Selection

### Backend Framework
```typescript
// Example: Node.js Framework Selection

// Express - Minimalist, flexible
app.get('/users', (req, res) => {
  // Manual validation, error handling
});

// Fastify - Performance-focused
fastify.get('/users', {
  schema: { /* validation */ }
}, async (req, reply) => {
  // Built-in validation, serialization
});

// NestJS - Enterprise, opinionated
@Controller('users')
export class UsersController {
  @Get()
  findAll(): Promise<User[]> {
    // Dependency injection, decorators
  }
}

// Decision: 
// - Express: Small projects, maximum flexibility
// - Fastify: Performance-critical APIs
// - NestJS: Large teams, enterprise apps
```

---

## 7. Cloud Provider Selection

```markdown
## Cloud Provider Comparison

| Feature | AWS | GCP | Azure |
|---------|-----|-----|-------|
| **Market Leader** | ✅ Yes | ❌ No | ❌ No |
| **Best for ML** | ❌ No | ✅ Yes (TensorFlow) | ❌ No |
| **Best for .NET** | ❌ No | ❌ No | ✅ Yes |
| **Pricing** | Complex | Simpler | Complex |
| **Enterprise Support** | ✅ Excellent | ✅ Good | ✅ Excellent |
| **Kubernetes** | EKS | GKE (best) | AKS |

**Decision Factors**:
- Existing contracts/credits
- Team expertise
- Specific service needs (e.g., BigQuery on GCP)
- Geographic requirements
```

---

## 8. Proof of Concept (POC)

```markdown
## POC Template for Technology Evaluation

### Objective
Evaluate [Technology X] for [Use Case]

### Success Criteria
- [ ] Can handle 10K requests/second
- [ ] Team can build basic CRUD in 1 day
- [ ] Integrates with existing auth system
- [ ] Deployment to staging works

### Timeline
- Day 1-2: Setup and basic implementation
- Day 3: Performance testing
- Day 4: Integration testing
- Day 5: Team review and decision

### Deliverables
- Working prototype
- Performance benchmarks
- Integration documentation
- Recommendation (Go/No-Go)
```

---

## 9. Technology Radar

```markdown
## Company Technology Radar (ThoughtWorks Style)

### Adopt (Use for new projects)
- PostgreSQL
- TypeScript
- React
- Docker
- GitHub Actions

### Trial (Experiment in non-critical projects)
- Bun (JavaScript runtime)
- Turso (Edge database)
- Astro (Static site generator)

### Assess (Keep watching)
- Deno 2.0
- HTMX
- Rust for backend

### Hold (Don't use for new projects)
- jQuery
- AngularJS
- MongoDB (for transactional data)
```

---

## 10. Common Selection Mistakes

### Anti-patterns
```markdown
❌ **Resume-Driven Development**
"Let's use Rust because it's cool"
→ Team doesn't know Rust, project delayed 6 months

❌ **Hype-Driven Development**
"Everyone's using NoSQL, let's use MongoDB"
→ Needed ACID transactions, had to migrate to PostgreSQL

❌ **Not-Invented-Here Syndrome**
"Let's build our own auth system"
→ Security vulnerabilities, 6 months wasted

❌ **Analysis Paralysis**
"Let's evaluate 10 more frameworks"
→ Never ship, competitors win

✅ **Better Approach**
- Use what team knows
- Choose proven technologies
- Validate with small POC
- Ship and iterate
```

---

## 11. Technology Selection Checklist

- [ ] **Requirements Clear**: What problem are we solving?
- [ ] **Team Expertise**: Can team learn this in reasonable time?
- [ ] **POC Completed**: Have we validated it works for our use case?
- [ ] **Ecosystem Evaluated**: Are there libraries/tools we need?
- [ ] **Performance Tested**: Meets our performance requirements?
- [ ] **Cost Analyzed**: Total cost of ownership acceptable?
- [ ] **Hiring Considered**: Can we hire developers with this skill?
- [ ] **Long-term Plan**: What's the 3-5 year outlook?
- [ ] **Exit Strategy**: Can we migrate away if needed?
- [ ] **Documented**: Decision recorded in ADR?

---

## 12. Tech Stack Decision Template

```markdown
# Tech Stack Decision: [Component Name]

## Context
We need to choose a [database/framework/language] for [use case].

## Requirements
- Performance: [specific metrics]
- Scale: [expected load]
- Team: [current expertise]
- Budget: [constraints]

## Options Evaluated

### Option 1: [Technology A]
**Pros**: [list]
**Cons**: [list]
**POC Results**: [link to POC]
**Score**: 7/10

### Option 2: [Technology B]
**Pros**: [list]
**Cons**: [list]
**POC Results**: [link to POC]
**Score**: 8/10

## Decision
We chose [Technology B] because [rationale].

## Mitigations
To address the cons:
- [Mitigation 1]
- [Mitigation 2]

## Next Steps
- [ ] Setup development environment
- [ ] Train team
- [ ] Update documentation
```

---

## Related Skills
* `59-architecture-decision/adr-templates`
* `59-architecture-decision/tradeoff-analysis`
* `59-architecture-decision/architecture-review`

Overview

This skill guides a systematic approach to choosing languages, frameworks, databases, and tools based on requirements, team capabilities, and long-term sustainability. It emphasizes pragmatic decisions—favoring proven, maintainable technology over novelty—to reduce technical debt and maximize team productivity. The goal is a repeatable process that yields defensible, documented stack decisions.

How this skill works

It provides a selection criteria framework that scores candidates against problem fit, team expertise, ecosystem, maturity, performance, cost, hiring, and long-term viability. Use the evaluation matrix and decision templates to weight criteria, run focused proofs of concept (POCs), and record trade-offs. A technology radar and checklist help operationalize choices and establish an exit strategy if contexts change.

When to use it

  • Starting a new project or product line
  • Replacing or upgrading a major component (database, backend, frontend)
  • When hiring or scaling a team and skills affect choices
  • Evaluating emerging technologies for pilot projects
  • Preparing architecture decision records (ADRs) or vendor comparisons

Best practices

  • Prefer well-understood, widely supported technologies to minimize risk
  • Allocate limited "innovation tokens"—reserve experimentation for high-value areas
  • Run short POCs with clear success criteria before committing
  • Weight team expertise and hiring availability heavily in scoring
  • Document decisions, mitigation plans, and an exit/migration strategy

Example use cases

  • Select a frontend framework when the team has mixed experience—use weighted scoring to decide between React, Vue, and Svelte
  • Choose a database for an e-commerce platform—apply SQL vs NoSQL guidance and POC benchmarks
  • Pick a backend language for a performance-sensitive service—follow the decision tree (Go/Rust vs Python/Node)
  • Compare cloud providers for data analytics workloads using feature and contract factors
  • Run a 5-day POC to validate a new runtime or managed service before production rollout

FAQ

How many technologies should I avoid adopting at once?

Limit major new technologies to a few per project—use the "innovation tokens" concept (about three high-risk items) to control scope.

What if team expertise favors a less-optimal technology?

Balance immediate productivity against long-term needs: favor what the team can deliver reliably, but plan training or phased migration if the tech is a poor long-term fit.