Before the questions, make sure you can: explain the difference between programming and software engineering and why time, teams and users change everything; describe at least three famous software failures and name their real root causes; state Brooks's four essential difficulties of software and the difference between essential and accidental complexity; list the main lifecycle activities (requirements, design, construction, verification and validation, deployment and operation, maintenance) and explain why maintenance costs so much; use quality attributes (reliability, security, usability, performance, maintainability, portability…) to describe what "good software" means for a given user; explain what AI coding assistants do well, where they fail, and what the evidence says about them; and apply the rule "verify, then trust" to code you did not write yourself — including code written by an AI.
Anyone can learn to make a program run once, on their own laptop, for themselves. Software engineering is about building software that keeps working — for other people, with a team, under a budget, for years, while the world around it changes. In 2026 an AI assistant can write a function in seconds. That makes the engineering part more important, not less: someone still has to decide what to build, check that the code is right and safe, and take responsibility when it runs in the real world. This course trains you to be that person.
From programming to software engineering
Cooking dinner for yourself is programming. Running a restaurant kitchen is software engineering. The recipes are the same, but now there are hundreds of customers with allergies, a team of cooks who must coordinate, health inspectors, a budget, and a menu that must still work next year when the suppliers change.
The term software engineering was made popular at a NATO conference in Garmisch, Germany, in 1968. Computers had become powerful, projects had become large, and many of them were late, over budget or simply did not work. People called this the software crisis. The organizers chose the word engineering on purpose: they wanted software to be built with the same discipline as bridges and aircraft.
The classic IEEE definition says software engineering is "the application of a systematic, disciplined, quantifiable approach to the development, operation, and maintenance of software." Notice the last three words: development is only the beginning. A shorter modern definition, from Google's engineers, is: software engineering is programming integrated over time.
| Programming (a class exercise) | Software engineering (a real product) | |
|---|---|---|
| Who uses it | You | Thousands of people you have never met |
| Who writes it | One person | A team that changes over the years |
| How long it lives | Until the deadline | Often 5–20 years |
| "It works" means | It printed the right output once | It works for every user, every day, on every device, and stays secure |
| Requirements | Given in the assignment | Unclear, conflicting, and changing |
| Cost of a bug | A lower grade | Lost money, lost data, sometimes lost lives |
| Main difficulty | Writing correct code | Deciding what to build and keeping it correct while it changes |
Programming is one activity inside software engineering. The others — understanding needs, designing, testing, deploying, operating, maintaining, and working with people — usually take more time and cost more money than writing the code.
Why software projects fail: five famous stories
Studying failures is the fastest way to understand why the discipline exists. In each story below, look at where the problem really came from. It is almost never "a programmer who could not code".
1. Ariane 5, Flight 501 (1996). Thirty-seven seconds after launch, Europe's new rocket turned sideways and was destroyed. The navigation software had been reused from Ariane 4. One line converted a 64-bit floating-point number (a horizontal velocity value) into a 16-bit signed integer. On the faster Ariane 5 the value was larger than 32,767, the conversion overflowed, the navigation computer shut down, and its backup — running the same code — failed the same way. Root cause: reuse without re-checking the assumptions (requirements) of the new environment, and no test with realistic Ariane 5 flight data.
2. Therac-25 (1985–1987). A radiation therapy machine gave massive overdoses to at least six patients; several died. Earlier models had hardware safety locks; the Therac-25 relied on software alone. A race condition appeared only when an experienced operator typed quickly and edited the settings within a few seconds. Root causes: removing independent safety barriers, no proper safety analysis, reused code, confusing error messages ("MALFUNCTION 54"), and a manufacturer that did not believe the first reports.
3. Knight Capital (2012). A trading company lost about 440 million US dollars in 45 minutes. A new version was deployed manually to only seven of its eight servers. On the eighth server, a reused configuration flag switched on old, dead code that bought and sold shares in a loop. Root causes: manual deployment with no check, dead code left in the system, a flag reused with a new meaning, and no automatic "kill switch".
4. Healthcare.gov (2013). The US health-insurance website crashed on its first day; only a handful of people could register. Root causes: many contractors with no single technical leader, requirements that changed until the last weeks, and almost no end-to-end testing under real load before launch.
5. CrowdStrike (July 2024). A faulty content update (a configuration file, not a program) for a security product caused about 8.5 million Windows computers to crash and restart in a loop. Airlines, hospitals and banks stopped working. The file triggered an out-of-bounds memory read in code that runs inside the operating system kernel. Root causes: the update was sent to all customers at once instead of step by step (no staged rollout), and the validation of that kind of file had a gap.
| Failure | Where the real problem was |
|---|---|
| Ariane 5 | Requirements (unchecked assumptions), testing, reuse |
| Therac-25 | Safety design, testing, communication with users |
| Knight Capital | Deployment and operation, maintenance (dead code) |
| Healthcare.gov | Project organization, requirements, testing |
| CrowdStrike | Verification and deployment of updates |
A bug is the last link in a chain. Asking "which line was wrong?" is not enough; an engineer asks "why did our process allow this line to reach users?" Every failure above had a missing review, test, check or safety barrier that would have stopped it.
Why software is hard: Brooks's four difficulties
In 1986 Fred Brooks (the manager of IBM's OS/360 project) wrote a famous essay, "No Silver Bullet". He argued that no single tool or method would ever make software development ten times easier, because software has four essential difficulties:
- Complexity. A program has an enormous number of states; no two parts are alike (if they were, we would make them one function). Complexity grows faster than size.
- Conformity. Software must fit the messy world around it: laws, other systems, file formats, human habits. Physics has simple laws; tax rules do not.
- Changeability. Software is always asked to change, because it is "easy" to change — it is only text. Successful software changes the most.
- Invisibility. You cannot see software. A building has a floor plan; software needs many different diagrams, and none of them shows everything.
Brooks separated two kinds of difficulty:
- Accidental complexity comes from our tools: syntax, memory management, slow compilers, writing the same boilerplate code again and again. Better tools remove it.
- Essential complexity comes from the problem itself: what the system must do, the rules, the special cases, how the pieces fit together. No tool removes it, because it is the job.
Translating a contract from Chinese to English with a great dictionary is faster than with a bad one — that is accidental complexity. But deciding what the contract should say is just as hard with any dictionary — that is essential complexity.
This distinction is the key to understanding AI in software engineering. AI assistants are excellent at removing accidental complexity: they remember APIs, write boilerplate, and translate between languages. They do much less about essential complexity: knowing what the users need, which rule applies when two rules conflict, and whether the design will survive the next five years of changes.
The lifecycle: what engineers actually do
Every software product, whatever process a team follows (Chapter 2), goes through the same basic activities:
| Activity | Key question | StudyBuddy example |
|---|---|---|
| Requirements | What should the system do, for whom, and how well? | "Students can ask Buddy about course material, and Buddy only answers from the instructor's files." |
| Design / architecture | How will we structure it? | A REST API in Java, a MySQL database, a separate service that calls the AI model. |
| Construction | Write the code | Implement the Q&A board, the matching algorithm, the reminder scheduler. |
| Verification & validation | Did we build it right? Did we build the right thing? | Unit tests, a security review, a test with 20 real students. |
| Deployment & operation | Put it in users' hands and keep it running | Release to the app store, monitor errors, handle incidents at 2 a.m. |
| Maintenance & evolution | Fix, adapt and improve it for years | New semester format, a new Android version, a cheaper AI model. |
Verification asks "Are we building the product right?" (does it meet its specification?). Validation asks "Are we building the right product?" (does it meet the users' real needs?). You will meet these two words many times.
Studies across decades agree that most of the total cost of a long-lived system is spent after the first release — fixing defects, adapting to new platforms and laws, and adding features. Estimates vary, but a majority share (often quoted as 60% or more) is typical. Code is written once and read, changed and debugged for years. This is why this course cares so much about readable code, tests and documentation.
Another classic result: the later a defect is found, the more it costs to fix. A misunderstood requirement caught in a 10-minute conversation costs almost nothing. The same misunderstanding found after release may require redesign, new code, new tests, a new release, data repairs and apologies to users.
What does "good software" mean? Quality attributes
A program can do exactly the right thing and still be a bad product: too slow, impossible to use, easy to hack, or impossible to change. Engineers describe quality with quality attributes (also called non-functional requirements). The international standard ISO/IEC 25010 lists them; the most common are:
| Attribute | Question it answers | StudyBuddy example |
|---|---|---|
| Functional suitability | Does it do the right things, correctly? | A quiz shows the right score. |
| Performance efficiency | Is it fast and light enough? | Buddy answers within 5 seconds for 95% of questions. |
| Reliability | Does it keep working? | The Q&A board is available 99.5% of the time during exams. |
| Usability | Can people use it easily? | A new student posts a question in under one minute without help. |
| Security | Is it protected against attacks? | A student cannot read another student's AI-chat history. |
| Maintainability | Can we change it safely? | A new developer can fix a simple bug on their first week. |
| Portability / compatibility | Does it run where needed and work with other systems? | Works on Android 10+ and on the campus Wi-Fi in China. |
"The app must be fast" cannot be tested. "95% of search results appear within 2 seconds with 500 users online" can. A quality attribute becomes useful only when it is measurable. Chapter 4 practises this.
Quality attributes often conflict. More security (two-factor login) can reduce usability. More performance (caching) can hurt data freshness. Engineering means choosing the right trade-off for these users and writing the reason down.
The AI angle: what changes and what does not
AI coding assistants appeared in three waves: autocomplete (suggesting the next lines), chat (answering questions and writing whole functions), and agents (tools that read a code base, run commands, edit many files and open pull requests on their own). By 2026 most professional developers use at least one of them.
What does the evidence say? It is mixed — and that is itself an important lesson:
- In a 2022 controlled experiment by GitHub, developers using Copilot finished a small, well-defined task (writing an HTTP server in JavaScript) about 55% faster than those without it.
- A 2022 study from New York University ("Asleep at the Keyboard?") generated programs with Copilot in security-sensitive scenarios and found that about 40% of them contained a known type of vulnerability.
- A 2025 randomized study by METR followed experienced open-source developers working on their own large projects. With AI tools allowed they took about 19% longer — while believing they had been about 20% faster.
The pattern: AI helps most on small, clear, familiar tasks (accidental complexity) and least — sometimes negatively — on large, unfamiliar code bases with unwritten rules (essential complexity). And people are poor judges of their own productivity with AI.
An AI assistant is like a very fast new intern who has read every programming book in the world but has never seen your project, never met your users, and sometimes answers with total confidence when it is wrong. You would not ship an intern's code without reading it. The same rule applies here.
What AI does not change:
- Responsibility. When code reaches users, the team that shipped it is responsible — legally and ethically. "The AI wrote it" is not a defence (Chapter 12).
- Understanding the problem. An AI answers the question you asked. If you asked the wrong question (a wrong requirement), you get a perfect solution to the wrong problem.
- Verification. AI output must be reviewed and tested at least as carefully as human code, because its mistakes look plausible: correct style, confident comments, wrong logic.
- Security and privacy. Pasting StudyBuddy's database of student emails into a public AI chat is a privacy incident, however useful the answer.
When a question asks what AI changes in software engineering, a strong answer separates the two kinds of complexity: AI reduces accidental complexity (boilerplate, syntax, API lookup); it does not remove essential complexity (what to build, conflicting rules, design trade-offs), and it adds new risks (plausible but wrong code, security flaws, data leaks, unclear licensing).
The engineer's rule: verify, then trust
Throughout this course you will use one habit for anything you did not write and check yourself — a library, a colleague's pull request, a Stack Overflow answer, or AI output:
- Read it. Can you explain every line? If not, you cannot own it.
- Check it against the requirement, not against what the code seems to do.
- Test the edges: empty input, zero, negative numbers, very large values, special dates, missing data.
- Check the risks: security (input from users), privacy (personal data), licences (copied code).
- Only then merge it.
Here is a typical example. A student asks an AI for "a Java method that checks whether a year is a leap year" and receives:
static boolean isLeapYear(int year) {
return year % 4 == 0; // leap years are divisible by 4
}
It compiles, the comment sounds right, and it works for 2024 and 2023. But the real rule is: divisible by 4, except years divisible by 100, unless also divisible by 400. So 1900 was not a leap year and 2000 was. An engineer finds this by testing the edge cases — not by trusting the comment.
static boolean isLeapYear(int year) {
return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
}
Meet StudyBuddy, our case for the semester
Every chapter uses the same system, so you can see how requirements, design, testing, security, privacy, law and operations connect.
StudyBuddy is a course-help app for Wenzhou-Kean University students, built by a five-person student team: Lina (product owner), Omar (backend), Mei (mobile), Daniel (testing) and Aisha (UX design).
- Users: students, teaching assistants, instructors and a department administrator.
- Features: a Q&A board for each course; Buddy, an AI tutor that answers from the instructor's uploaded course materials by calling an external large-language-model service; study-group matching by course and free time; flashcards and practice quizzes; deadline reminders; a moderation queue for reported posts.
- Data: student ID, name, WKU email, enrolled courses, posts, AI-chat history, availability, optional photo. No grades.
- Technology: a web app and an Android app, a Java backend with a REST API, a MySQL database, hosted on a cloud server in mainland China — while some users study at Kean in the United States.
Even this small description already raises engineering questions for later chapters: What exactly may Buddy answer (requirements)? What happens when the AI service is down (design, reliability)? Who can read chat histories (security, privacy)? Which laws apply to data of students in two countries (legal)? How much energy do thousands of AI calls use (sustainability)?
Lina's first idea was: "An AI agent can generate the whole app in a weekend." It can generate an app. It cannot tell the team what instructors will accept, which student data may be stored, how to handle a wrong answer from Buddy before an exam, or how to keep the system running for four years. That is the work of this course.
Key takeaways
- Software engineering is programming integrated over time: teams, users, change, and years of operation.
- Famous failures (Ariane 5, Therac-25, Knight Capital, Healthcare.gov, CrowdStrike) came from requirements, reuse, testing, deployment and organization — rarely from a lack of coding skill.
- Brooks: software is complex, must conform, keeps changing, and is invisible. Accidental complexity can be removed by tools; essential complexity cannot.
- The lifecycle activities are requirements, design, construction, verification and validation, deployment and operation, and maintenance; most of the cost comes after the first release, and late defects are the most expensive.
- Quality is described by measurable quality attributes that often conflict and must be traded off.
- AI assistants mostly reduce accidental complexity; evidence on productivity is mixed; they add risks (plausible wrong code, vulnerabilities, data leaks). Responsibility stays with the engineer.
- Habit for the whole course: verify, then trust.
Ready? Close the notes and practise.
30 questions. Predict the output before you check — that is the skill the exam measures.