wiki/z-archive/a-strategy/market/Dev-Ops-Budget-Pace-VR-Sitzung.html
2026-04-06 00:46:32 +02:00

289 lines
14 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Dev & Ops Budget & Pace — VR-Sitzung</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=DM+Sans:ital,opsz,wght@0,9..40,300;0,9..40,400;0,9..40,500;0,9..40,600;0,9..40,700&display=swap" rel="stylesheet">
<style>
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
:root{
--coral:#F25843;
--coral-dark:#D94A37;
--beige:#C7C5B2;
--beige-light:#EFEDE5;
--text:#3A3A3A;
--text-light:#6F7373;
--bg:#F8F9FA;
--white:#fff;
--gray-border:#E0DDD3;
}
html{scroll-behavior:smooth;font-size:16px}
body{font-family:'DM Sans',sans-serif;color:var(--text);background:var(--bg);line-height:1.6;-webkit-font-smoothing:antialiased}
a{color:var(--coral);text-decoration:none}
.container{max-width:960px;margin:0 auto;padding:0 24px}
nav{position:fixed;top:0;left:0;right:0;z-index:100;background:rgba(248,249,250,.92);backdrop-filter:blur(12px);border-bottom:1px solid var(--gray-border);padding:12px 0}
nav .container{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:8px}
nav a{padding:6px 14px;border-radius:8px;font-size:.85rem;font-weight:500;color:var(--text)}
nav a:hover,nav a.active{background:rgba(242,88,67,.12);color:var(--coral)}
section{padding:64px 0}
.section-label{display:inline-block;color:var(--coral);font-size:.75rem;font-weight:600;letter-spacing:.06em;text-transform:uppercase;margin-bottom:8px}
.section-title{font-size:clamp(1.5rem,3vw,2rem);font-weight:700;line-height:1.2;letter-spacing:-.02em;margin-bottom:12px}
.section-desc{font-size:.95rem;color:var(--text-light);max-width:640px;line-height:1.6;margin-bottom:24px}
.center{text-align:center}
.center .section-desc{margin-left:auto;margin-right:auto}
.hero{padding:100px 0 48px;text-align:center}
.hero h1{font-size:clamp(1.8rem,4vw,2.6rem);font-weight:700;letter-spacing:-.02em;margin-bottom:12px}
.hero h1 em{font-style:normal;color:var(--coral)}
.hero-sub{font-size:1rem;color:var(--text-light);max-width:560px;margin:0 auto 24px}
/* Cards */
.card-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:20px}
.card{padding:24px;background:var(--white);border:1px solid var(--gray-border);border-radius:12px}
.card h3{font-size:1rem;font-weight:600;margin-bottom:12px;color:var(--coral)}
.card p{font-size:.88rem;color:var(--text-light);line-height:1.5}
/* Table benchmark */
.bench-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch;margin-top:16px}
table.bench{width:100%;border-collapse:collapse;background:var(--white);border-radius:12px;overflow:hidden;box-shadow:0 2px 12px rgba(0,0,0,.05);font-size:.82rem}
table.bench th,table.bench td{padding:10px 12px;text-align:left;border-bottom:1px solid var(--gray-border)}
table.bench th{background:var(--bg);font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--text-light)}
table.bench tr:last-child td{border-bottom:none}
table.bench .num{text-align:right}
table.bench .us{background:rgba(242,88,67,.06)}
table.bench .classic{color:var(--text-light)}
/* Tabs */
.tabs{display:flex;gap:4px;margin-bottom:24px;flex-wrap:wrap}
.tabs button{padding:10px 20px;border:1px solid var(--gray-border);background:var(--white);border-radius:8px;font-family:inherit;font-size:.9rem;cursor:pointer;color:var(--text)}
.tabs button:hover{border-color:var(--coral);color:var(--coral)}
.tabs button.active{background:var(--coral);color:var(--white);border-color:var(--coral)}
.tab-panel{display:none}
.tab-panel.active{display:block}
/* Slider panel */
.slider-panel{background:var(--white);border:1px solid var(--gray-border);border-radius:12px;padding:28px;margin-bottom:24px}
.slider-row{display:grid;grid-template-columns:1fr auto 120px;align-items:center;gap:16px;margin-bottom:20px}
.slider-row label{font-weight:500;font-size:.9rem}
.slider-row input[type="range"]{width:100%;accent-color:var(--coral)}
.slider-row .val{font-weight:600;color:var(--coral);text-align:right;font-size:.95rem}
.outcomes{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:16px;margin-top:28px}
.outcome{text-align:center;padding:20px 12px;background:var(--bg);border-radius:10px;border:1px solid var(--gray-border)}
.outcome .label{font-size:.72rem;text-transform:uppercase;letter-spacing:.05em;color:var(--text-light);margin-bottom:4px}
.outcome .value{font-size:1.25rem;font-weight:700;color:var(--coral)}
/* Bullets */
.ul-compact{margin:0;padding-left:1.2em}
.ul-compact li{margin-bottom:6px;font-size:.9rem;color:var(--text-light)}
footer{padding:24px 0;border-top:1px solid var(--gray-border);font-size:.8rem;color:var(--text-light);text-align:center}
</style>
</head>
<body>
<nav>
<div class="container">
<span style="font-weight:600;color:var(--text)">Dev & Ops Budget & Pace</span>
<div>
<a href="#intro" class="active">Intro</a>
<a href="#modell">AI-Modell</a>
<a href="#benchmark">Benchmark</a>
<a href="#pace">Pace</a>
<a href="#slider">Szenario</a>
</div>
</div>
</nav>
<section id="intro" class="hero">
<div class="container">
<div class="section-label">VR-Sitzung</div>
<h1>Dev & Ops: Budget, Pace und Mehrwert</h1>
<p class="hero-sub">Wie legen wir als Führungsgremium Monatsbudget und Entwicklungsgeschwindigkeit fest? Fokus: Speed of Dev, Entlastung Personal, klare Konsequenzen von «voll gas» vs. «Bremse».</p>
</div>
</section>
<section id="modell">
<div class="container">
<div class="section-label">Arbeitsmodell</div>
<h2 class="section-title">Komplett AI-enhanced</h2>
<p class="section-desc">Wir entwickeln mit AI Crew (Cursor). Die Rollen sind klar getrennt: Menschen für Kunden, Use Cases, Architektur und Methodik; AI für Codebase, Struktur, Umsetzung und Testing.</p>
<div class="card-grid">
<div class="card">
<h3>Menschen (2 Dev)</h3>
<p>Kunden, Use Cases, Architektur, Methodik, Entscheidungen. Nicht primär Tipparbeit oder Boilerplate.</p>
</div>
<div class="card">
<h3>AI (Cursor / Crew)</h3>
<p>Codebase, Struktur, Umsetzung, Tests. Schnelle Iteration, konsistente Qualität, weniger Kontextverlust.</p>
</div>
</div>
</div>
</section>
<section id="benchmark" style="background:var(--white)">
<div class="container">
<div class="section-label">Benchmark</div>
<h2 class="section-title">Letzte fünf Komponenten: Klassik vs. uns</h2>
<p class="section-desc">Was hätte eine klassische Softwarefirma an Aufwand und Zeit benötigt? Vergleich in CHF (Tagessatz 1'200 CHF, Developer intern voll belastet).</p>
<div class="bench-wrap">
<table class="bench">
<thead>
<tr>
<th>Komponente</th>
<th class="num">Klassisch (CHF)</th>
<th class="num">Wir (CHF)</th>
</tr>
</thead>
<tbody>
<tr class="us">
<td><strong>Trustee-Feature</strong><br><span class="classic">3 BUHA (Abacus, Bexio, RMA), API-Interfaces. Klassisch ~20 PT; wir 6 PT, 3 Wo, 4'000 CHF AI</span></td>
<td class="num classic">24'000</td>
<td class="num">11'200</td>
</tr>
<tr>
<td><strong>Nyla Teams Integration</strong><br><span class="classic">R&D Bridge, komplette Bridge (service-teams-browser-bot). Klassisch ~27 PT; wir 4 PT, 2'000 CHF AI</span></td>
<td class="num classic">32'400</td>
<td class="num">6'800</td>
</tr>
<tr class="us">
<td><strong>Private LLM</strong><br><span class="classic">Komponente CH-RZ (private-llm), Ollama/Vision/OCR. Klassisch ~11 PT; wir 2 PT, 1'500 CHF AI</span></td>
<td class="num classic">13'200</td>
<td class="num">3'900</td>
</tr>
<tr>
<td><strong>Kundenprojekt (plattformunabhängig)</strong><br><span class="classic">Applikation dokumentiert und migriert. Kunde 1015 PT geplant; wir 2 PT, 3'000 CHF AI</span></td>
<td class="num classic">14'400</td>
<td class="num">5'400</td>
</tr>
<tr style="background:var(--bg);font-weight:700">
<td>Summe (4 Komponenten)</td>
<td class="num classic">84'000</td>
<td class="num">27'300</td>
</tr>
</tbody>
</table>
</div>
<p style="margin-top:16px;font-size:.88rem;color:var(--text-light)">Fazit: Klassisch rund 84'000 CHF (nur Personentage), wir rund 27'300 CHF (Personentage + AI). Ersparnis ca. 56'700 CHF bei kürzerer Zeit und weniger PT.</p>
</div>
</section>
<section id="pace">
<div class="container">
<div class="section-label">Pace & Budget</div>
<h2 class="section-title">Wie viel Pace, wie viel Bremse?</h2>
<p class="section-desc">Maximaler Pace aktuell rund 6'000 CHF/Monat (AI). Wir können langsamer fahren, indem wir langsamere (günstigere) Modelle nutzen aber das bremst euch als Entwickler und frisst Kapazität: Menschen werden teurer, Effizienz sinkt.</p>
<ul class="ul-compact">
<li><strong>Max Pace (~6'000 CHF/mt):</strong> Schnelle Modelle (z. B. Anthropic fast). Höchste Speed, beste Entlastung, höchste AI-Kosten.</li>
<li><strong>Bremse (langsamere Modelle):</strong> Geringere AI-Kosten, aber mehr Wartezeit und Revisionsrunden → mehr menschliche PT pro Feature, weniger Durchsatz.</li>
</ul>
<p class="section-desc" style="margin-top:16px">Im VR wollen wir fixieren: Welchen Pace fahren wir? Wo stehen wir bewusst auf der Bremse und wo nicht?</p>
</div>
</section>
<section id="slider" style="background:var(--white)">
<div class="container">
<div class="section-label">Interaktiv</div>
<h2 class="section-title">Szenario: Budget & Modell wählen</h2>
<p class="section-desc">Sliders einstellen → Konsequenzen auf Speed, Kosten, Entlastung Personal und Durchsatz sehen. Basis: 2 Entwickler, AI Crew über Cursor.</p>
<div class="tabs">
<button type="button" class="active" data-tab="slider">Sliders</button>
<button type="button" data-tab="notes">Fragen fürs VR</button>
</div>
<div id="panel-slider" class="tab-panel active">
<div class="slider-panel">
<div class="slider-row">
<label>AI-Budget pro Monat (CHF)</label>
<input type="range" min="1500" max="6000" step="500" value="4500" oninput="recalc()">
<span class="val" id="sl-budget">4'500</span>
</div>
<div class="slider-row">
<label>Modell-Geschwindigkeit (langsam &rarr; schnell)</label>
<input type="range" min="0" max="100" value="80" oninput="recalc()">
<span class="val" id="sl-speed">Schnell</span>
</div>
<div class="slider-row">
<label>Gewünschter Pace (Bremse &rarr; Max)</label>
<input type="range" min="0" max="100" value="70" oninput="recalc()">
<span class="val" id="sl-pace">Hoch</span>
</div>
</div>
<h3 style="font-size:1rem;margin-bottom:12px">Konsequenzen (orientativ)</h3>
<div class="outcomes">
<div class="outcome"><div class="label">Dev-Speed</div><div class="value" id="box-speed">-</div></div>
<div class="outcome"><div class="label">AI-Kosten/mt</div><div class="value" id="box-cost">-</div></div>
<div class="outcome"><div class="label">Entlastung Personal</div><div class="value" id="box-relief">-</div></div>
<div class="outcome"><div class="label">Durchsatz Features</div><div class="value" id="box-throughput">-</div></div>
</div>
</div>
<div id="panel-notes" class="tab-panel">
<div class="card" style="max-width:640px">
<h3>Fragen für die VR-Sitzung</h3>
<ul class="ul-compact" style="margin-top:12px">
<li>Welchen monatlichen AI-Rahmen wollen wir fixieren (z. B. 4'000 / 5'000 / 6'000 CHF)?</li>
<li>Wo sind wir bereit, bewusst langsamer zu fahren (z. B. nur bei weniger kritischen Tasks)?</li>
<li>Wie messen wir «Speed of Dev» und Mehrwert (z. B. Features pro Quartal, Time-to-Market)?</li>
<li>Ab wann gilt: «Bremse» nur in Ausnahme, Standard = schnelle Modelle?</li>
</ul>
</div>
</div>
</div>
</section>
<footer>
<div class="container">PowerOn Strategy — Dev & Ops Budget & Pace. Stand Vorbereitung VR-Sitzung.</div>
</footer>
<script>
function recalc() {
var sliders = document.querySelectorAll('.slider-panel input[type="range"]');
var budget = Number(sliders[0].value);
var speed = Number(sliders[1].value) / 100;
var pace = Number(sliders[2].value) / 100;
document.getElementById('sl-budget').textContent = budget.toLocaleString('de-CH');
document.getElementById('sl-speed').textContent = speed < 0.4 ? 'Langsam' : speed < 0.7 ? 'Mittel' : 'Schnell';
document.getElementById('sl-pace').textContent = pace < 0.3 ? 'Niedrig' : pace < 0.7 ? 'Mittel' : 'Hoch';
var bf = budget / 6000;
var composite = (bf + speed + pace) / 3;
var devSpeed = composite > 0.8 ? 'Sehr hoch' : composite > 0.6 ? 'Hoch' : composite > 0.4 ? 'Mittel' : 'Niedrig';
var relief = speed > 0.7 && pace > 0.5 ? 'Sehr hoch' : speed > 0.5 ? 'Hoch' : speed > 0.3 ? 'Mittel' : 'Gering';
var tp = composite > 0.8 ? '3\u20134/mt' : composite > 0.55 ? '2\u20133/mt' : composite > 0.35 ? '1\u20132/mt' : '0.5\u20131/mt';
document.getElementById('box-speed').textContent = devSpeed;
document.getElementById('box-cost').textContent = budget.toLocaleString('de-CH') + ' CHF';
document.getElementById('box-relief').textContent = relief;
document.getElementById('box-throughput').textContent = '~' + tp;
}
recalc();
document.querySelectorAll('.tabs button').forEach(function(btn){
btn.onclick = function(){
document.querySelectorAll('.tabs button').forEach(function(b){ b.classList.remove('active'); });
document.querySelectorAll('.tab-panel').forEach(function(p){ p.classList.remove('active'); });
btn.classList.add('active');
var panel = document.getElementById('panel-' + btn.getAttribute('data-tab'));
if(panel) panel.classList.add('active');
};
});
document.querySelectorAll('nav a[href^="#"]').forEach(function(link){
link.onclick = function(){
document.querySelectorAll('nav a').forEach(function(a){ a.classList.remove('active'); });
this.classList.add('active');
var el = document.getElementById(this.getAttribute('href').slice(1));
if(el) el.scrollIntoView({ behavior: 'smooth' });
};
});
</script>
</body>
</html>