Core software engineering principles (SOLID, DRY, YAGNI, KISS) with detection patterns and refactoring guidance. Load when reviewing code quality, planning architecture, or identifying technical debt.
Installation
Details
Usage
After installing, this skill will be available to your AI coding assistant.
Verify installation:
skills listSkill Instructions
name: engineering-standards description: Core software engineering principles (SOLID, DRY, YAGNI, KISS) with detection patterns and refactoring guidance. Load when reviewing code quality, planning architecture, or identifying technical debt. license: MIT metadata: author: groupzer0 version: "1.0"
Engineering Standards
Foundational principles for high-quality software. Use this skill when:
- Reviewing code for quality issues
- Planning architectural changes
- Identifying refactoring opportunities
- Evaluating technical debt
SOLID Principles
Single Responsibility (SRP)
A class/module should have one reason to change.
Detection patterns:
- Class with 5+ public methods doing unrelated things
- Method longer than 50 lines
- Class name contains "And" or "Manager" with mixed concerns
- File imports from 10+ unrelated modules
Refactoring:
- Extract class for each responsibility
- Split into focused modules
- Use composition over inheritance
Open/Closed (OCP)
Open for extension, closed for modification.
Detection patterns:
- Switch/case on type with frequent additions
- if/else chains checking instance types
- Modifying existing code to add new features
Refactoring:
- Strategy pattern for varying behaviors
- Plugin architecture for extensions
- Dependency injection for configurability
Liskov Substitution (LSP)
Subtypes must be substitutable for their base types.
Detection patterns:
- Override that throws "not implemented"
- Subclass that ignores parent behavior
- Type checks before calling inherited methods
Refactoring:
- Favor composition over inheritance
- Extract interface for true polymorphism
- Use abstract base with required overrides
Interface Segregation (ISP)
Clients shouldn't depend on methods they don't use.
Detection patterns:
- Interface with 10+ methods
- Implementing classes that stub methods as no-ops
- "Fat" interfaces with unrelated method groups
Refactoring:
- Split into role-specific interfaces
- Use mixins/traits for optional behaviors
- Compose multiple focused interfaces
Dependency Inversion (DIP)
Depend on abstractions, not concretions.
Detection patterns:
- Direct instantiation of dependencies (
new ConcreteClass()) - Hard-coded database/API connections
- Test files creating production instances
Refactoring:
- Constructor injection
- Factory pattern for complex creation
- Interface-based dependencies
DRY (Don't Repeat Yourself)
Detection patterns:
- Copy-pasted code blocks (3+ occurrences)
- Similar functions with minor variations
- Duplicated validation logic
- Repeated configuration values
Refactoring:
- Extract shared function/class
- Parameterize variations
- Create configuration constants
- Use template method pattern
Exceptions (acceptable duplication):
- Test code clarity (explicit over DRY)
- Cross-boundary isolation (microservices)
- Performance-critical paths
YAGNI (You Aren't Gonna Need It)
Detection patterns:
- Unused parameters "for future use"
- Abstract classes with single implementation
- Configuration options never used
- Speculative generalization
Guidance:
- Build for current requirements
- Refactor when needs emerge
- Delete dead code immediately
- Prefer simple over flexible
KISS (Keep It Simple, Stupid)
Detection patterns:
- Cyclomatic complexity > 10
- Nested callbacks/promises 4+ deep
- Generic solutions for specific problems
- Framework overkill for simple tasks
Refactoring:
- Flatten control flow
- Extract named functions
- Use early returns
- Choose boring technology
Code Smells Quick Reference
| Smell | Symptom | Fix |
|---|---|---|
| Long Method | >50 lines, multiple concerns | Extract method |
| Large Class | >500 lines, many responsibilities | Extract class |
| Feature Envy | Method uses other class more than own | Move method |
| Data Clumps | Same fields appear together | Extract object |
| Primitive Obsession | Strings/ints for domain concepts | Value objects |
| Switch Statements | Type-based switching | Polymorphism |
| Parallel Inheritance | Every subclass needs partner subclass | Merge hierarchies |
| Lazy Class | Class doing too little | Inline class |
| Speculative Generality | Unused abstraction | Remove it |
| Temporary Field | Field only set sometimes | Extract class |
When to Apply
Always apply:
- SRP, DRY for production code
- KISS for all code
Apply with judgment:
- OCP when extension points are clear
- ISP when interfaces grow beyond 5 methods
- DIP at module boundaries
Defer:
- YAGNI violations until pattern emerges 3+ times
See references/refactoring-catalog.md for detailed refactoring techniques.
More by groupzer0
View allUnified document lifecycle management. Defines terminal statuses, unified numbering via .next-id, close procedures, and orphan detection. Load at session start.
Version management, release verification, and deployment procedures for software releases. Includes semver guidance, version consistency checks, and platform-specific constraints.
TDD workflow and test strategy patterns including test pyramid, coverage strategies, mocking approaches, and anti-patterns. Load when writing tests, designing test strategies, or reviewing test coverage.
Security vulnerability detection patterns including OWASP Top 10, language-specific vulnerabilities, and remediation guidance. Load when reviewing code for security issues, conducting audits, or implementing authentication/authorization.