Engineering Before Generation
Spec-Based Development for Production Software - 2 days
Turn requirements into systems you can explain, test, secure, operate, and maintain.
Spec-based development becomes valuable only when the people writing and executing the specification understand what software is actually doing underneath it. A detailed specification cannot compensate for weak reasoning about control flow, state, data structures, interfaces, failure modes, dependencies, security boundaries, or deployment. It can simply produce bad software more systematically.
That distinction has become more important as AI-assisted coding moves deeper into mainstream software engineering. Current descriptions of spec-driven development increasingly position the specification as the persistent source of truth connecting requirements, architecture, implementation, and validation rather than treating an AI prompt as the design itself. Microsoft describes the approach as aligning intent before allowing AI to accelerate implementation, while IBM similarly describes the specification as the agreed foundation for what is being built and how it should behave.
This two-day programme therefore approaches spec-based development from the engineering side first. Participants will examine how software moves from a problem statement into algorithms, data structures, components, APIs, processes, services and deployable systems before considering how an AI coding system should be instructed to implement it. The objective is not to turn two days into a compressed computer-science degree. It is to establish the minimum engineering discipline required to recognise whether generated code makes architectural and operational sense.
The course also addresses technology selection. Python, Java, C#, C++ and modern .NET are not interchangeable syntax choices. They have different runtime models, ecosystems, deployment characteristics and areas where they are particularly useful. The same distinction applies to monoliths, services, microservices, background workers and agents. An agent is not automatically an AI agent: many enterprise agents are deterministic processes responsible for monitoring, orchestration, communication or local execution, while AI-enabled agents introduce models, tools, context, guardrails and additional security boundaries.
One terminology point is worth correcting explicitly. .NET Framework is legacy technology for many new-development scenarios, but it is not literally dead. Microsoft continues servicing supported .NET Framework versions, including 4.8/4.8.1, while modern cross-platform development has moved to the unified .NET platform. As of September 2026, .NET 10 is the current LTS release, while .NET 11 is at RC stage ahead of its expected November release. This course therefore distinguishes maintaining legitimate Framework workloads from choosing Framework for new architecture without a defensible reason.
Security is treated in the same way. DevSecOps is not a security scan placed at the end of DevOps. OWASP describes secure development as incorporating security into requirements, design, implementation, verification and operations, with DevSecOps integrating controls such as threat modelling, secrets management, SAST, DAST and software-composition analysis into the delivery process. Participants will therefore learn to put security requirements and trust boundaries into the specification itself rather than asking an AI system to "make it secure" after implementation.
The instructor brings over 30 years of industry experience and will teach this as an engineering programme rather than an academic survey. The emphasis will be on the concepts and practices that developers are expected to apply when building real production systems, including knowing when AI-generated code should be rejected regardless of how convincing it appears.
Learning Outcomes
By the end of the programme, participants will be able to:
- Explain the relationship between requirements, specification, architecture, implementation, testing and deployment.
- Trace program execution, state changes, data movement and failure paths.
- Apply essential algorithms and data-structure reasoning during software design.
- Decompose software requirements into components, interfaces and implementation responsibilities.
- Write specifications suitable for human developers and AI-assisted development.
- Distinguish specification from prompts, implementation instructions and generated code.
- Evaluate AI-generated code rather than accepting it purely because it compiles.
- Recognise technical debt created by uncontrolled AI-assisted development.
- Select appropriate implementation technologies across Python, Java, C#, modern .NET and C++.
- Distinguish modern .NET from legacy .NET Framework workloads.
- Decide when modular monoliths, services, microservices, background processes or agents are appropriate.
- Distinguish deterministic software agents from AI-enabled agents.
- Understand API-based, on-premises and tool-enabled agent architectures.
- Incorporate security requirements, trust boundaries and validation into specifications.
- Understand the role of CI/CD and DevSecOps in taking specified software into production.
- Maintain traceability from requirement through implementation, test and operational behaviour.
Prerequisites
Participants must have:
- Professional programming experience.
- Ability to write working code without AI assistance.
- Strong understanding of variables, functions, classes and control structures.
- Working knowledge of object-oriented programming.
- Working knowledge of APIs and HTTP.
- Working knowledge of Git.
- Basic SQL knowledge.
- Good experience with posix development tools.
- Ability to read unfamiliar source code.
- Ability to debug a program using logs, breakpoints or equivalent tooling.
- Access to either Codex, Claude Code or Gemini backend (either APi and web based authentication)
- Access to pro version of either ChatGPT, Claude or Gemini
Training Outline
- Software Engineering Foundations for Spec-Based Development
- From Business Problem to Executable Software
- Requirements
- Constraints
- Functional and non-functional behaviour
- Acceptance criteria
- System boundaries
- Understanding Program Execution
- Control flow
- Data flow
- State and mutation
- Function and method calls
- Exceptions and failure paths
- Synchronous and asynchronous execution
- Algorithms and Data Structures for Engineering Decisions
- Complexity and Big-O reasoning
- Arrays and lists
- Stacks and queues
- Hash maps and sets
- Trees and graphs
- Searching and sorting
- Algorithm selection
- From Business Problem to Executable Software
- Designing Software Before Generating Code
- Software Decomposition
- Separation of concerns
- Cohesion and coupling
- Interfaces and contracts
- Dependency management
- SOLID principles
- Architecture Fundamentals
- Layered architecture
- Modular architecture
- Domain boundaries
- Monoliths and modular monoliths
- Services and microservices
- Event-driven components
- Data and Interface Design
- Data models
- API contracts
- Validation rules
- Error contracts
- Versioning
- Idempotency
- Software Decomposition
- Spec-Based Development
- Specification Structure
- Problem and objective
- Scope and exclusions
- Functional requirements
- Non-functional requirements
- Architecture constraints
- Data requirements
- Interface contracts
- Security requirements
- Acceptance criteria
- Requirements Decomposition
- Features
- Components
- Dependencies
- Implementation tasks
- Verification criteria
- Specification Quality
- Ambiguity removal
- Assumption management
- Constraint definition
- Edge conditions
- Failure behaviour
- Traceability
- Specification-Driven AI Development
- Specification versus prompting
- Context management
- Controlled code generation
- Incremental implementation
- Generated-code review
- Specification drift
- Technical-debt control
- Specification Structure
- Programming Language and Platform Selection
- Python
- Automation and orchestration
- APIs and backend services
- Data and AI workloads
- Agent development
- Java
- Enterprise services
- JVM ecosystem
- Concurrent applications
- Microservices
- C# and Modern .NET
- .NET runtime
- ASP.NET Core
- Enterprise APIs and services
- Cross-platform workloads
- .NET Framework versus modern .NET
- C++
- Native applications
- Performance-sensitive components
- Systems integration
- Lightweight native agents
- Technology Selection Criteria
- Runtime requirements
- Performance
- Portability
- Ecosystem
- Operational complexity
- Maintainability
- Python
- Services, Microservices and Software Agents
- Service Architecture
- Process boundaries
- Service contracts
- Service communication
- State ownership
- Failure isolation
- Microservices Engineering
- Appropriate use cases
- Distributed-system complexity
- Service discovery
- Messaging
- Observability
- Agent Architecture
- Deterministic agents
- Monitoring agents
- Automation agents
- On-premises agents
- API-connected agents
- AI-enabled agents
- AI Agent Components
- Models
- Instructions
- Tools
- Context
- Memory
- Guardrails
- Human control points
- Pub Sub Systems for Multi Agent Synchronization & Orchestration
- Clusters
- Message queues
- Transmission and Consumption
- Guardrails
- HITL
- Service Architecture
- Secure Software Engineering and DevSecOps
- Security by Design
- Assets and trust boundaries
- Threat modelling
- Authentication
- Authorization
- Secrets
- Input and output validation
- Secure Development Lifecycle
- Security requirements
- Secure implementation
- Dependency management
- Code review
- SAST and DAST
- Software composition analysis
- DevSecOps Flow
- Source control
- Build
- Automated testing
- Security gates
- Artifact management
- Deployment
- Monitoring and feedback
- Agent and API Security
- Least privilege
- Service identities
- Credential management
- Tool permissions
- Audit trails
- Untrusted input boundaries
- Security by Design
- Engineering Quality in AI-Assisted Development
- Verification of Generated Software
- Compilation and static analysis
- Unit testing
- Integration testing
- Contract testing
- Security testing
- Code Quality
- Readability
- Maintainability
- Duplication
- Dependency control
- Refactoring
- Specification-to-Production Traceability
- Requirement to implementation
- Implementation to test
- Test to deployment
- Production feedback
- Specification evolution
- Verification of Generated Software
The increased use of coding agents makes this discipline particularly relevant: current agent tooling emphasises controlled execution, explicit instructions, tool boundaries, guardrails, tracing and evaluation rather than unrestricted code generation.
Disclaimer
This training outline is intended to serve as a structured guideline for delivery rather than an immutable syllabus. The trainer may amend, reorder, expand, reduce or substitute topics where reasonably necessary to reflect participant capability, available training time, technological developments, organisational requirements or instructional priorities, without prior notice.
Practical, connected learning
My wider training approach brings hands-on implementation and systems thinking together, connecting technology with real operational needs.