How does one design, develop, and maintain software systems effectively?
What Do I Need To Know?
Software engineering is certainly more than just programming—it’s about the systematic application of engineering approaches to the development of software systems. There are various principles, methods, and best practices that guide the process. Your goal as a software engineer is to create systems that are efficient, maintainable, scalable, reliable, and secure.
To build a software system, you’ll need to know exactly what the user requirements are, so you’ll need to know how to get them, and be able to communicate with stakeholders effectively before, during, and after development. Communication is a power skill.
Here’s what you need to know:
One of the main takeaways from this video: Programming is turning specifications into working software. AI is good at that. Human “programmer” jobs have been going away for a while now—AI coding agents are doing almost all of that work now. Engineering, on the other hand, involves design, reliability, tradeoff analysis, cross functional collaboration, and incident response. Humans are needed for these tasks. The number of software engineering jobs is expected to rise over the next several years.
Exercise: There are at least two other major takeaways from this video. What are they?
The SDLC
There are quite a few phases one goes through in building software systems. Roughly, they are Ideation, Planning, (Requirements) Analysis, Design, Implementation, Code Review, Testing, Documentation, Integration, Deployment, Maintenance, Evaluation, Retirement, Disposal. Collectively, these phases are known as the Software Development Life Cycle, or the Systems Development Life Cycle (SDLC). You can learn more by starting a web search at Wikipedia.
Skills and Practices
In no particular order, software developers, engineers, architects, and anyone involved in producing software systems should hone technical skills in:
Programming languages (you should be able to read and write code in multiple languages)
Frameworks, libraries, APIs, and tools
Working with agents
Version control systems
Testing methodologies
Debugging techniques
Design patterns
Project management tools
Working with command line interfaces ALWAYS IMPORTANT
and, of equal or greater importance, so-called durable human skills, also known as power skills (or sometimes soft skills), such as:
Communication (oral and written, also understanding your audience)
Collaboration
Inclusion (bring everyone together, software is a team effort)
Problem solving (includes first identifying the real problem)
Critical thinking (this term is overloaded, but hopefully you get the idea)
Creativity
Adaptability and flexibility
Time management
Organization
Attention to detail
Ethical awareness
Empathy
Emotional awareness
Self-management
Continuous learning
Exercise: What else?
Exercise: These notes discuss engineering. How is engineering different from science? From art? From craft? How is it related to design?
People skills are power skills.
Initiation
The early phases of the SDLC are focused in ideation, gathering requirements, understanding the problem domain, defining the scope of the project, and high-level design.
Ideation: Identifying an opportunity for an audience. Understanding users and their needs.
Conceptualization: Exploring potential solutions. Coming up with multiple approaches and evaluating their risks and feasibility. Identifying the systems boundary. Performing cost-benefit analyses. Generating a proposal.
Planning: Outlining the project’s goals, timeline, resources, and budget. Defining who the stakeholders are and their roles.
Requirements Analysis: Gathering and analyzing user requirements to ensure the software meets their needs. For large projects, you need more that a requirements document, you need a requirements database. Includes not only what the project needs to be correct (functional requirements), but also what it needs to satisfy cost, latency, and privacy concerns.
Design: Creating the architecture and design of the software system. Where will the code run? What kind of storage is necessary? What kind of network infrastructure is required? What kind of security measures are needed? (You’ll need to learn about Threat Modeling.) How will users interface with the system? What are the correctness criteria?
Notice that security concerns are part of system design, and not something you tack on at the end.
Security is a design concern, not an afterthought.
Implementation
The software that gets built includes (at least) executable programs, supporting scripts, and configuration files. Test scripts are essential during implementation, too! They should be created alongside the main code to ensure functionality and reliability. Code reviews for correctness, conformance, security compliance, and performance are also crucial.
This is the part that AI agents can do pretty well. But humans must be kept in the loop.
As of 2026, four “layers” are emerging in getting the code and tests produced by AI agents:
There are many resources available that will show you, for each layer, best practices (and common mistakes). Mistakes can be quite costly!
Exercise: (Research) Why should you avoid “just dropping in a whole bunch of PDFs” as context for an AI agent? What are the alternatives?
Exercise: Find guides for intent engineering and agentic engineering. What are some of the best practices? What are some of the common mistakes?
Implementation is not just “coding” the main functionality. Testing and Security (especially Software Security) are concerns that are 100% integral to the development process.
Testing happens during software development.
Ethics
The two major professional societies for software engineers are the IEEE Computer Society and the ACM, and each have published codes of ethics. They should be read in full:
Exercise: Read through, and consider interacting with, the course module An Introduction to Software Engineering Ethics from the Markkula Center for Applied Ethics at Santa Clara University. (Thanks to Monica DeLong at the Markkula Center for permission to share this resource.)
Recall Practice
Here are some questions useful for your spaced repetition learning. Many of the answers are not found on this page. Some will have popped up in lecture. Others will require you to do your own research.
What is software engineering?
The systematic application of engineering approaches to the development of software.
What is programming?
The conversion of specifications into executable code.
Marina Wyss mentions that AI is really good at programming, but there are things that humans excel at in the software engineering process. What are those things?
Design, reliability, tradeoff analysis, cross functional collaboration, and incident response.
What are some of the phases of the Software Development Life Cycle (SDLC)?
Is there a security analysis phase of the SDLC? Why or why not?
Security analysis should be integrated throughout the SDLC rather than being a separate phase. Security must be built-in to the entire software development process.