Malý tím, veľké zázraky: Riešenie (Časť 2)
Kapitola 4: The Great Downsizing (alebo: Menej je niekedy viac)
Team composition v peak:
👨💼 Manager (micromanager)
👨💻 Senior Developer (copy-paste expert)
👨💻 Mid Developer #1
👨💻 Mid Developer #2
👨💻 Mid Developer #3
👨💻 Junior Developer #1
👨💻 Junior Developer #2
🏗️ Ja (Architect/Team Lead)
Total: 8 people
Output: ChaosProblem: "Inventory" developer
interface Developer {
yearsOfExperience: number;
actualSkillLevel: SkillLevel;
willingnessToLearn: boolean;
bugProduction: number;
codeQuality: Quality;
}
const inventoryDev: Developer = {
yearsOfExperience: 15,
actualSkillLevel: SkillLevel.JUNIOR, // Harsh truth
willingnessToLearn: false,
bugProduction: 10, // bugs per week
codeQuality: Quality.LEGACY
};
const juniorDev: Developer = {
yearsOfExperience: 1,
actualSkillLevel: SkillLevel.MID, // Fast learner!
willingnessToLearn: true,
bugProduction: 2,
codeQuality: Quality.MODERN
};
// Math
if (inventoryDev.bugProduction > inventoryDev.value) {
team.remove(inventoryDev); // Painful but necessary
}Ťažké rozhodnutie: Musím sa zbaviť developera, ktorý nás brzdí.
Dôvody:
- Produkcia bugov > hodnota
- Odmietanie učiť sa nové veci
- Negatívny vplyv na tím ("Prečo sa musíme učiť nové frameworky?")
- Sabotovanie refactoringu ("Staré riešenie fungovalo!")
Reality check:
15 rokov skúseností ≠ 15 rokov vývoja
15 rokov skúseností = 1 rok skúseností × 15
Rozdiel:
15× learning & improving vs 15× repeat year 1Finding diamonds: Junior → Senior transformation
Zobral som do tímu junior developera s týmito charakteristikami:
const newJunior: Developer = {
yearsOfExperience: 0.5,
actualSkillLevel: SkillLevel.JUNIOR,
willingnessToLearn: true, // 🔥 Key factor
motivation: 100,
questionAsking: "constantly", // Good sign!
codeQuality: Quality.IMPROVING_DAILY
};6 mesiacov neskôr:
const formerJunior: Developer = {
yearsOfExperience: 1,
actualSkillLevel: SkillLevel.MID_TO_SENIOR, // 🚀
willingnessToLearn: true,
motivation: 100,
codeQuality: Quality.SOLID_PRINCIPLES,
canMentorOthers: true // Bonus!
};
// Growth rate
const growthRate = (formerJunior.skillLevel - newJunior.skillLevel)
/ timeInMonths;
// Result: 1.5 levels per 6 months = FASTWhat made the difference?
-
Attitude > Experience
"Neviem to, ale naučím sa" > "Viem to, nepotrebujem sa učiť" -
Modern stack adoption
typescript// Old stack (inventory comfort zone) jQuery + Angular.js 1.5 + callback hell // New stack (junior excitement) Angular 17 + RxJs + TypeScript + gRPC -
Ownership
Junior: "Môžem si vziať tento task?" Inventory: "To nie je moja zodpovednosť"
Kapitola 5: Stabilný tím = Produktivita
Final team composition:
🏗️ Ondrej (Solution Architect / Team Lead)
→ Architecture decisions
→ Code review
→ Mentoring
→ Crisis management
👨💻 Senior Developer (bývalý junior, rýchlo sa vypracoval)
→ Feature development
→ Complex implementations
→ Technical research
→ Peer programming
👨💼 Product Owner + Tester (2-in-1 superhero)
→ Requirements
→ Testing
→ Customer communication
→ Priorities
Total: 3 people
Output: 🚀 Higher than 7-person teamProduktivita: 3 vs 7
// Team of 7 (old)
const oldTeam = {
developers: 6,
communication_overhead: 0.5, // 50% času na meetings
code_conflicts: 0.3, // 30% času na merge conflicts
bug_fixing_old_code: 0.4, // 40% času na fixing bugs
actual_development: 0.2 // Len 20% času na vývoj!
};
// Team of 3 (new)
const newTeam = {
developers: 2,
communication_overhead: 0.1, // 10% času
code_conflicts: 0.05, // 5% času
bug_fixing_old_code: 0.05, // 5% času (dobrý kód)
actual_development: 0.8 // 80% času na vývoj! 🎉
};
// Productivity
oldTeam.productivity = 7 × 0.2 = 1.4 effective developers
newTeam.productivity = 2 × 0.8 = 1.6 effective developers
// Winner: 3-person team je produktívnejší!Prečo to funguje?
1. Minimálny communication overhead
Team of 7:
Communication channels = n × (n-1) / 2 = 7 × 6 / 2 = 21 channels
Daily sync: 21 possible conversations
Team of 3:
Communication channels = 3 × 2 / 2 = 3 channels
Daily sync: "Hey guys, quick update?" Done.2. Kvalita > Kvantita
def team_output(developers):
if all(dev.skill_level == "high" and dev.motivated):
return len(developers) * 2.5 # Synergy effect
else:
return len(developers) * 0.5 # Drag effect
# Old team (mixed skill)
output_old = team_output([high, high, low, low, low, low, low])
# = 7 × 0.5 = 3.5 units
# New team (all high)
output_new = team_output([high, high])
# = 2 × 2.5 = 5 units
# New team wins!Kapitola 6: Lessons learned
1. Roky skúseností ≠ Skill level
type Experience = {
years: number;
learningCurve: 'growing' | 'flat';
};
// Developer A
const devA: Experience = {
years: 15,
learningCurve: 'flat' // Learned once, repeated 15×
};
// Developer B
const devB: Experience = {
years: 2,
learningCurve: 'growing' // Learning daily
};
// After 2 years
devB.actualSkill > devA.actualSkill // Often true!2. Attitude > Experience
def hire_decision(candidate):
if candidate.attitude == "willing_to_learn":
return "HIRE" # Can teach skills
elif candidate.experience > 10 and candidate.attitude == "know_it_all":
return "PASS" # Can't teach attitude
else:
return "MAYBE"
# Priority
attitude > experience > certificates3. Refactoring nie je premrhaný čas
// Without refactoring
const timeToImplementFeature = (complexity: number) => {
return complexity × technicalDebt × 10; // 10× slower
};
// After refactoring
const timeToImplementFeature = (complexity: number) => {
return complexity × 1; // Clean codebase
};
// ROI calculation
const refactoringTime = 2; // weeks
const featuresPerYear = 50;
const timeSavedPerFeature = 0.5; // weeks
const totalTimeSaved = featuresPerYear × timeSavedPerFeature;
// = 50 × 0.5 = 25 weeks saved
const roi = (totalTimeSaved - refactoringTime) / refactoringTime;
// = (25 - 2) / 2 = 11.5× return!4. Small focused team > Large chaotic team
The mythical man-month is real!
9 žien nemôže porodiť dieťa za 1 mesiac.
9 developerov nemôže spraviť 1-týždeň projekt za 1 deň.
Sweet spot: 2-4 developers
- Can communicate effortlessly
- Can share knowledge easily
- Can maintain consistent code style
- Can actually get stuff done5. Toxic person removal > Team growth
interface TeamHealth {
morale: number; // 0-100
productivity: number;
turnover: number;
}
// With toxic person
const before: TeamHealth = {
morale: 30,
productivity: 40,
turnover: 60 // People leaving
};
// After removal
const after: TeamHealth = {
morale: 85,
productivity: 90,
turnover: 5
};
// Math
const improvement = (after.productivity - before.productivity)
/ before.productivity;
// = (90 - 40) / 40 = 125% improvement!Záver: Size doesn't matter (in teams)
Malý tím môže robiť veľké zázraky ak:
✅ Máte správnych ľudí (attitude > experience) ✅ Odstránite toxic influences (people > politics) ✅ Investujete do kvality (refactoring = investment) ✅ Používate moderne nástroje (technology matters) ✅ Dôverujete tímu (empowerment > micromanagement)
Nezáleží na:
❌ Počte rokov v praxi (15 years ≠ expert) ❌ Veľkosti tímu (7 people ≠ 7× productivity) ❌ Copy-paste productivity (lines of code ≠ value)
Lesson learned:
"Radšej mať 3 správnych ľudí než 10 nesprávnych."
"Roky v práci nemerajú skill level, ale len persistence."
"Malý tím s vysokou kvalitou > Veľký tím s nízkou kvalitou"
A najdôležitejšie:
"Niekedy musíte urobiť ťažké rozhodnutia pre dobro projektu. Vrátane toho, že niekoho necháte odísť."
Článok napísal Solution Architect, ktorý prežil micromanagement hell, refaktoroval 144 tabuliek na 1 konfigurovateľnú komponent, a dokázal, že 3-person team môže byť produktívnejší než 7-person team.
Lessons learned the hard way, ale bez regrets. Každý projekt je learning experience.
Sometimes less is more. Sometimes you need to let people go. Sometimes refactoring je najlepšia investícia. Always - attitude matters more than years.
P.S.: Ak máte na projekte 144 copy-paste tabuliek, zavolajte pomoc. Je to choré. Trust me, I've been there. 😅