Everything after implementation: foundations and application types, the toolchain and CI/Delivery/Deployment, involving system users, integration and commissioning with formal acceptance, enterprise integration patterns, operation (ITIL, roles, SLAs, monitoring, optimization), rollout strategies (Blue/Green, A/B, Canary), versioning and changelogs, migration, maintenance (categories, types, processes), and successor-system risks (Lehman/Belady, lock-in, second-system effect).
Deployment/Maintenance — Foundations
Definitions of commissioning/operation/maintenance, the application types and their operation/update implications, the toolchain, and development strategies.
Notes for Inbetriebnahme, Betrieb und Wartung
Inbetriebnahme, Betrieb und Wartung†(Commissioning, operation, and maintenance)
Commissioning (Inbetriebnahme): "all measures necessary for the first functional take-over of components and systems at their final locations" — including integration into an existing system/IT landscape and training the responsible staff. Operation (Betrieb): the period in the life cycle during which a product is used in its operational environment and continuously monitored/adapted. Maintenance (Wartung, IEEE STD 1219-1993): "the modification of a software product after delivery to correct faults, to improve performance or other attributes, or to adapt the product to a modified environment."
These phases are the "crowning" but challenging end of a project: data from old systems must be taken over, new versions are released in short intervals, and the maintenance phase usually lasts longer than all previous phases combined.
Notes for Application types and their operation/update implications
Application types and their operation/update implications
Web applications and services
Run on one/many servers (often cloud VMs); accessed via browser. Failover/availability (24/7) and scalability (handle peaks, e.g. 18–23h) are key. Update: rollback must always be possible; handle active users (notify, roll back, load balancers for stepwise transparent migration).
Apps
Run on the user's device, distributed centrally via an app store. Update: rollback possible; store notifies of updates (user may not install — how to handle?); store supports rollout/alpha-beta/limited rollout and auto-collects quality metrics (crash rate, memory) that affect store ranking and revenue.
Rich clients
Run on the user's machine; must be provided for many OSes/versions with possibly complex install/distribution. Update: patches per client; user can be notified; cumulative updates skip versions (2.1→2.3); auto-patching is convenient but a security risk if it goes wrong.
Embedded systems
Shipped with the hardware, run only in that technical context (cards, clocks, traffic lights, PLCs). Update: test in a safe environment first, keep a backup for rollback; updates are hard if devices are offline; often no auto-update, so cheap mass-sold faulty devices get hacked en masse (routers, cameras).
Notes for Toolchain and development strategies
Toolchain and development strategies
A toolchain (configured to the requirements) supports development, operation and maintenance: SCM (Git, Mercurial, SVN), IDE (Eclipse, Visual Studio, XCode), CI software (Jenkins, Hudson), issue/project-management with dashboards (Jira, Redmine, GitLab), wiki software (Confluence), artifact repository (Nexus, Artifactory).
Build to Change: develop software so it can be adapted quickly and easily to changed conditions.
Release Management: the process of putting software into operation — planning and carrying out the release from the first idea to reaching the end user.
Continuous Delivery: bring changes of all kinds to the end user as fast as possible, minimizing the risk of a change by automating as many steps as possible (build jobs) so changes reach the market faster.
CI vs. Continuous Delivery vs. Continuous Deployment
The development stages and the difference between Continuous Integration, Continuous Delivery, and Continuous Deployment.
Notes for Continuous Integration, Delivery, and Deployment in practice
Continuous Integration, Delivery, and Deployment in practice
Continuous Integration (CI)
Commit changes to the master branch as often as possible; each change is validated automatically by building the application and running automatic tests (build + test automated).
Continuous Delivery
Extends CI with an automated release process: build, test and the deploy-to-staging + acceptance tests are automated, but the deploy to production stays a manual (button) step.
Continuous Deployment
Goes one step further than Continuous Delivery: if all stages pass successfully, every update goes to the customer automatically (deploy to production and smoke tests automated too).
Self-managed deployment with Gradle
Gradle suffices for most simple continuous-deployment needs: gradle build (resolve dependencies + build), gradle test (unit tests, plus smoke/acceptance tests via e.g. Gatling), and SSH plugins to transfer built jars / restart servers on a new release.
GitLab CI/CD
GitLab integrates CI & CD: a .gitlab-ci.yml script runs on every commit (compile, test, linters) with stages like build and test; the faculty GitLab has a shared runner so student group repos can use CI/CD directly, and success/failure is documented in GitLab.
Software passes development stages of rising quality (local development → test system → QA system → production). The pipeline is build → test → deploy to staging → acceptance tests → deploy to production → smoke tests; CI/Delivery/Deployment differ only in how far down that pipeline automation reaches.
Involving the System Users
Why user acceptance matters, training measures, and user documentation.
Notes for User acceptance, training, and documentation
User acceptance, training, and documentation
User acceptance is decisive for a successful commissioning: involve users early; adapt training material/user documentation to their needs; run extensive training and a trial operation with feedback to remove fears (making mistakes, work taking longer) — fear of change otherwise causes resistance; show the new system's advantages; introduce the software gradually.
Training: scope depends on the software's size and the user base; different user groups have different rights/functions and need different training concepts/material; explaining unneeded aspects hurts acceptance; make training interactive, keep groups small (≤10), ideally with a professional trainer.
User documentation: target group is the end users; write target-group-oriented, organized by application modules/functions (not technical structure), understandable, with examples and sensible screenshots/videos; its two functions are introducing the feature scope and serving as a reference; technical (developer) documentation is normally not part of it.
Integration and Commissioning
Planning and key questions for commissioning, the acceptance and introduction phase, the formal acceptance of software, and a good integration approach.
Notes for Commissioning — planning and key questions
Commissioning — planning and key questions
Plan the steps before doing them (stakeholders must accept them); work iteratively (revising assumptions) within a predefined change process; account for iterations in scheduling and plan buffers — commissioning can bring big surprises (data centres still being built, visas denied, even war/sabotage).
Central questions: where does the app run (own machine/cloud/with others)? own or shared DB? how are system boundaries defined? interfaces to other apps? foreign-language integration (training/docs)? integration of external systems/libraries?
Plus: who is responsible for each step and for acceptance? how are integration tests done? who writes/provides documentation? who answers user questions? when does operation begin? a trial operation (Probebetrieb) eases familiarization, raises acceptance, and lets customer feedback flow into the product.
Notes for Formal acceptance (Abnahme) of software
Formal acceptance (Abnahme) of software
Acceptance is the customer's formal taking-over of the work. The more complex the system, the more complex the acceptance — so multi-stage acceptance is needed, often by several stakeholders, and it must be traceable/auditable against a complete specification of all parts (simple systems need only a single acceptance).
Questions to clarify: who accepts (admins, management), what is accepted, how exactly, with what (test-system spec), against what (target/should-spec), and when.
Details/consequences: final checks; payment becomes due; warranty obligations and the limitation period for defect claims begin; the burden of proof for defects shifts to the customer; acceptance is formal on the basis of the specification and must be documented; what/when and required test cases should be predefined; several stakeholders should accept; budget time/cost for it.
Steps: integration tests (functionality), installation and staff training, and an acceptance protocol (what was tested, how the system was integrated, further steps).
Levels: technical basis (developer/function tests confirming runnability), content level (black-box and user-acceptance tests), and integration tests (interplay with other components — also important for updates). Test details are in Block 5 (QA).
Notes for Module/component integration and a good integration approach
Module/component integration and a good integration approach
Integrating a module should need no knowledge of its internals: modularization splits software into modules with one task each, reusable and scalable, communicating via clearly defined interfaces; component integration starts from a clean architecture with clear interfaces and uses the Block-5 integration strategies (top-down, bottom-up, big-bang, vertical) and CI.
Good approach: big-bang integration switches the way of working instantly with no familiarization phase → acceptance problems; instead run a trial operation during development with a representative user group giving feedback (changes within project scope), then after completion do extensive training, optionally parallel operation (costly, to avoid inconsistencies), iron out last issues — costly but safe, raising acceptance.
Enterprise Integration Patterns
Integrating multiple large IT systems via File Transfer, Shared Databases, Remote Procedure Invocation, and Messaging.
Notes for Enterprise integration — context
Enterprise integration — context
Enterprise integration connects several (large) IT systems; the goal is to integrate applications without having to adapt them, covering data, application and process integration, usually via middleware and adapters (compare SOA, the onion-shell model, microservices). The negative case is point-to-point integration where every app implements interfaces to every other — already 6 connections for 4 systems; Enterprise Integration Patterns are the better approach.
Notes for The four enterprise integration patterns
The four enterprise integration patterns
File Transfer
Exchange via files (app A writes a file, it is copied and read by app B); one of the oldest practices, now mostly historical, often run in batch mode (e.g. 2×/day). Problems: data often stale / coarse granularity, needs shared drives, often manual (effortful, error-prone). E.g. bank systems processing transfers.
Shared Databases
Several apps access a common (relational) DB; still used, finer granularity than shared files, apps share the same data model, changes are immediately visible on committed transactions. Problems: breaks encapsulation, hard-to-grasp dependencies, scales poorly. E.g. data-driven document processing (Austrian parliament).
Remote Procedure Invocation (RPI)
Exchange by calling a method on a remote machine (Java RMI, CORBA); keeps data encapsulation, very efficient within a platform. Problems crossing platform boundaries or with stronger decoupling. (RPC is similar but not object-oriented and outdated.)
Messaging
Exchange via a message broker: data packed into messages put on a message bus that handles transport; a complex topic (guaranteed times/order/delivery, varying connection quality) needing frameworks; arbitrary, often text formats (XML/JSON), binary possible.
The upper two (File Transfer, Shared DB) are simpler but couple via shared files/data models, break encapsulation and scale poorly; the lower two (RPI, Messaging) preserve encapsulation and decouple better, with Messaging giving the loosest coupling at the cost of complexity.
Operation
Operation with ITIL, the operation roles, requirements, SLAs (SMART), monitoring, optimization, and the robustness-vs-performance tradeoff.
Notes for Operation, ITIL, and roles
Operation, ITIL, and roles
Operation is the life-cycle period during which a product is used and monitored for satisfactory performance; it is heavily formalized by process frameworks like ITIL (Information Technology Infrastructure Library — predefined processes, functions, roles and best practices, e.g. requiring prepared plans describing failure scenarios and solutions). Main tasks: monitoring and optimization.
Roles (with different rights): Operators (ongoing monitoring, no infrastructure access — black box); Administrators (network admin = network infrastructure, technical admin = individual systems like app/DB/server, functional admin = apps via own UI, usually no underlying-infrastructure access); Support (contact for users, error reports come in here, with First/Second Level support).
Notes for Operation requirements and SLAs
Operation requirements and SLAs
Requirements: high stability/fault tolerance (minimal downtime); data security (protection from unauthorized access/loss, emergency plans, backups); documentation for all relevant areas; recoverability (restart/recovery any time); easy analysability/adaptability/configurability; frugality (low CPU/memory use); independence (apps don't interfere); trained staff in place before commissioning.
Service Level Agreements (SLAs): fix criteria for non-functional requirements, set by stakeholders before development and met during operation or penalties apply; define per the SMART principle — Specific, Measurable, Achievable, Reasonable, Time-bound. Examples: service availability, response time under load, time to answer a maintenance request.
Notes for Monitoring, optimization, and the operation checklist
Monitoring, optimization, and the operation checklist
Monitoring: check reachability and task fulfilment, enable fast reaction to outages, serve as an internal quality benchmark (measure availability/response times, also for SLAs); the monitoring itself should be tested regularly; across all services; supported by tools like Nagios or Zabbix (Nagios: modules to monitor infrastructure across OSes, network services, a network analyzer for bandwidth bottlenecks, a log server for analysis/audits/threat detection; open source).
Optimization: identify and use unused capacity (e.g. consolidating services onto one machine) for optimal infrastructure use — but balance hardware savings against less compute power and higher failure risk (one machine down = whole service down); keep in line with SLAs; always test optimizations first (does it deliver, what side effects, are SLAs kept), don't run them at peak times, optimize only where necessary and with measurable results.
Operation checklist: are response times acceptable? sufficient availability? behaviour as expected? all SLAs met? backup/recovery strategies? redundancy/load balancing needed? enough staff? what if a machine fails? any single points of failure?
Notes for Robustness vs. performance and premature optimization
Robustness vs. performance and premature optimization
Operation often pits robustness against performance: defensive checks, validation and safe framework APIs cost speed, while raw speed can sacrifice safety. "Premature optimization is the root of all evil" — don't optimize before you have measured where the real bottleneck is; sensible optimization requires measurement ("you can't control what you can't measure"; "without data you are just another person with an opinion").
Framework API vs clever faster workaround: a ~20% faster combination of calls 'not meant for it' risks breaking on framework updates, is harder to understand/maintain, and may have undocumented side effects — usually not worth it unless measurement proves the bottleneck matters; prefer the intended API.
Measuring is hard in practice (e.g. concurrency, JIT warm-up, caching, GC pauses distort timings); the Block-5 link is to measure systematically (profiling, performance tests with latency/throughput metrics) rather than guess.
Rollout Strategies
Introducing new versions without downtime and validating whether they meet their goals — Blue/Green deployment, A/B testing, and Canary releases.
Notes for Blue/Green vs. A/B testing vs. Canary releases
Blue/Green vs. A/B testing vs. Canary releases
Blue/Green deployment
Run two identical environments: Blue (current) live and Green (new) idle; deploy and test the new version on Green, then switch all traffic from Blue to Green at once. Enables zero-downtime releases and instant rollback (switch back to Blue) if something is wrong.
A/B testing
Route different user groups to different versions (A vs B) simultaneously and compare a target metric (e.g. number of purchases) to learn which version actually meets the goal — a data-driven way to validate that a new version is an improvement, not a regression.
Canary release
Roll the new version out to a small subset of users/servers first (the 'canary'); monitor it, and only gradually expand to all users if it behaves well — limiting the blast radius of a bad release.
These techniques solve two problems: introducing new versions without downtime, and finding out whether a new version really reaches its goals (it may not be clear in advance, and a release can even worsen the metric). Automation, monitoring and (for migration) load balancers that switch new connections to the new version are typically required.
Versioning and Changelogs
The purpose of versioning, Semantic Versioning (major/minor/patch and deprecation), and the changelog.
Notes for Semantic Versioning
Semantic Versioning
Versioning communicates what an update contains and how risky it is; developers created rules (a versioning scheme) so version numbers carry meaning. The course references Semantic Versioning, a MAJOR.MINOR.PATCH scheme.
MAJOR (X): incremented for incompatible API changes (breaking changes).
MINOR (Y): incremented for new, backward-compatible functionality.
PATCH (Z): incremented for backward-compatible bug fixes.
Deprecation: before removing functionality (which would be a major change), mark it as deprecated in a release to signal it will be removed, giving users time to migrate — so removal does not come as a surprise.
Notes for Changelog
Changelog
A new version should be accompanied by a changelog: it informs users and developers about what is new, what changed, and problems to expect on an update.
Content/structure: group changes by type (Added, Changed, Removed, etc.); always give the date and version number (see Semantic Versioning); keep an Unreleased section and update it during development so nothing is missed.
Example (Markdown): an [Unreleased] section, then e.g. ## [1.2.3] - 2001-02-03 with ### Added / ### Changed subsections listing the concrete changes.
Automatic generation from commits (even with Conventional Commits) tends to be too detailed and needs much manual finalization/control.
Migration
Why migration is needed, the migration types and strategies (Cold-Turkey vs. Chicken-Little, forward/reverse), ETL, and migration vs. integration.
Notes for Migration — motivation and types
Migration — motivation and types
IT development cycles are short, so software/hardware age fast and apps must be adapted to changed needs (legal or market-driven) to bring them to the state of the art (performance, throughput, flexibility). Migration requirements: no negative impact on running operation, and a well-ordered process.
Software migration: switching from existing software to a new one (new DB/OS version, new ERP/CRM, Windows→Linux).
Data migration: transferring data between systems (DB-vendor change, schema change, new ERP/CRM) — often using Extract-Transform-Load (ETL) tools.
Hardware migration: changing the hardware (new machines, fibre vs copper).
Application migration: replacing an application with a new one. Often a combination (software migration usually needs data migration too).
Notes for Migration strategies and integration
Migration strategies and integration
Cold-Turkey (big bang)
Parallel complete development of the new system, then switch everything (system + all data) at once. Can be very time-consuming and hard to oversee → higher risk; advantage: no gateways needed, simpler data handling.
Chicken-Little (incremental)
Incremental migration in many small, manageable steps until the whole system is migrated; simpler and clearer, problems are fixed/rolled back faster. Forward migration: migrate the DB first (old apps use it via forward database gateways); Reverse migration: migrate the application first (it works on the old schema via reverse database gateways).
Migration
A changeover process that must follow an ordered procedure so the running operation is not affected during the switch.
Integration
A process to use heterogeneous data from different sources in one application (closely linked to the test phase). Physical integration copies data into a common DB; logical integration leaves data at the sources and converts/transfers it on demand.
ETL (Extract-Transform-Load), one of the oldest data-integration processes (from data warehousing), merges heterogeneous data: Extract (load from sources, sync/async), Transform (prepare for the target schema — the main, often complex step), Load (into the target DB).
Maintenance
Maintenance motivation and definition, the maintenance categories and the four maintenance types, the maintenance processes, related terms, change artefacts, and maintenance vs. further development.
Notes for Maintenance foundations, terms, and artefacts
Maintenance foundations, terms, and artefacts
Motivation: investment protection (software has strategic-economic value, keep its quality/functionality alive long, like renovating buildings) and cost minimization (not maintaining can cost more than maintaining).
Maintenance = all software changes for fault correction, runtime-behaviour improvement, or adaptation to a changed environment (e.g. framework/library updates); triggers: found faults, runtime weaknesses, performance problems (more users), security holes, changed environment.
Details: don't underestimate the effort (big OS/framework updates); relevant across the whole life cycle (ERP systems run 20+ years); maintenance cost often far exceeds initial development; happens alongside further development; preventive restructuring minimizes future effort; large maintenance should be its own project; record its scope in SLAs; specify maintenance artefacts (not just code — network, servers, frameworks, OS); plan maintenance already at initial analysis; high effort if maintainers ≠ developers (DevOps combines both); architecture-affecting maintenance is very costly; automation is often the only viable way.
Software reengineering: re-developing a working component with the same functionality to improve quality (prepare for new functionality or migration); a higher abstraction level than refactoring (which can be a step of it). Refactoring: changing code without affecting functionality, to keep an app maintainable during maintenance (IDE-supported, e.g. splitting oversized methods).
Reverse engineering: recovering code/models from artefacts like compiled binaries when old source is missing; includes re-documentation; aids understanding, usually a prep step before reengineering. Anti-patterns: common bad solutions, recognized early so improvement strategies can fix/avoid them.
Artefacts: change requests (change wishes/fault reports — track controllably, transparently, via issue trackers, involve users); documentation of implemented changes/corrections (keep product docs consistent and traceable: who/what/why/how).
Maintenance vs further development: maintenance does not change the functional state (only brings the technical realization up to date / further-develops existing functionality), whereas further development changes the functional state (add/remove functions); they can run in parallel, possibly by different teams.
Notes for The four maintenance types
The four maintenance types
Corrective maintenance
Correction + reactive: fixing faults, typically triggered by the customer.
Adaptive maintenance
Enhancement + reactive: adapting the app to a changed environment (software/services it works with, or the hardware it runs on).
Preventive maintenance
Correction + proactive: preventing faults in production before they can occur (classic example: the Y2K/Millennium bug preparation for four-digit years — largely successful). Challenges: deliver new versions globally and securely, may changes even be made, ensure users install updates.
Perfective maintenance
Enhancement + proactive: all improvements of an existing app (usability, performance, maintainability, memory) — done only on demand; needs standardized, reproducible measurement to prove the improvement.
The types come from crossing two category axes — Correction vs Enhancement, and Reactive vs Proactive maintenance. Effort split is often correction/reactive ~25% and enhancement/proactive ~75%.
Notes for The maintenance processes
The maintenance processes
Process implementation: define all plans (incl. the maintenance plan) and procedures for maintenance.
Problem and modification analysis: an iterative process at the start of each maintenance phase, usually triggered by a change request — analyse the problem, develop and select change options.
Modification implementation: implement the selected change.
Maintenance review/acceptance: evaluate the change (correctness, whether the problem is solved); completed changes go into production.
Migration: transfer the application to a changed environment and make all changes needed to run there.
Retirement: all measures to stop operating an application (e.g. exporting data).
Successor-System Risks
The Lehman/Belady maintenance laws, framework updates and lock-in effects, and the second-system effect (Brooks).
Notes for Lehman and Belady's laws of software maintenance
Lehman and Belady's laws of software maintenance
Maintenance typically makes software larger and architecturally worse over time. Lehman and Belady (data collected 1976–1992) condensed this into six laws, holding especially for large, continuously used software:
Continuing change (software in use must continually adapt or becomes less useful); Increasing complexity (complexity grows unless work is done to reduce it); Self-regulation / fundamental law of program evolution (evolution is a self-regulating process); Conservation of organizational stability (invariance of work rate — the average effort/activity stays roughly constant over a release's life); Conservation of familiarity (invariance of release content — the incremental growth/change per release stays roughly constant); Continuing growth (the functional content must keep growing to keep users satisfied).
Notes for Framework lock-in and successor-system risk
Framework lock-in and successor-system risk
Every library/framework you embed is another dependency you must update regularly, adapt to, and rarely control — a real challenge even for pros (GitHub needed 1.5+ years to move from Rails 3.2 to 5.2).
Brooks (analysing systems like OS/360) found that successor systems — the 2.0 built after the 1.0 release — carry an especially high risk of failing or being badly delayed (the "second-system effect").
A likely reason: emboldened by the first system's success and freed of its time pressure, developers over-engineer the successor — piling in all the features and refinements they had to leave out the first time — so it becomes bloated, over-ambitious and late. The remedy is disciplined scope control and incremental delivery.
Lock-in: the more deeply you depend on a framework, the harder and costlier it is to update or switch away, because much of your code is tied to its conventions/APIs (compare consistent early abstraction from the framework).
To minimize update pain: abstract from frameworks early, keep dependencies up to date in small steps (don't skip many versions), have good automated tests/regression to catch breakage, weigh the benefits (security, features, support) against the migration cost, and isolate third-party APIs behind your own interfaces.