289 lines
14 KiB
HTML
289 lines
14 KiB
HTML
<!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 10–15 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 → 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 → 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>
|