At the beginning of ICS 314, I was primarily excited about learning web application development. I wanted to gain the skills to build functional, interactive websites and applications. While the course certainly taught me about web development, I quickly realized that the real value came from understanding fundamental software engineering concepts that go far beyond web applications. Concepts like configuration management, Agile project management, and design patterns are the most valuable concepts I got out of this class.
This essay reflects on what I have learned about these three concepts: Configuration Management, Agile Project Management, and Design Patterns. I will explain each of these terms and discuss how they can be applied in various software engineering contexts, including but not limited to web development.
One of the most valuable concepts I learned in this course was configuration management. Configuration management is the process of handling changes to a software system so that the system remains consistent and functional. This is especially important when working on large projects with multiple developers, as it prevents people from overwriting or breaking each other’s work.
In ICS 314, we used Git and GitHub as tools for configuration management. Git is a version control system that allows developers to track changes to their code over time. GitHub is an online platform that hosts Git repositories and makes collaboration easier. Through our class projects, I learned how to create branches, resolve merge conflicts, and use pull requests to safely integrate changes.
For example, during our final project, my group collaborated on a web application called SpotMeBro. Using GitHub made it possible for my team members to work on the code at the same time. One team member worked on the front end while another tackled the back end. By pushing changes to separate branches and reviewing each other’s pull requests, we avoided the risk of overwriting/changing each other’s code. This process gave me a new appreciation for how teams can collaborate efficiently on complex software. I can definitely see myself using these tools in the future for personal projects, group work, or even professional software development.
Another key takeaway from ICS 314 was learning about Agile project management, specifically through a style called Issue Driven Project Management (IDPM). Agile project management is a flexible and iterative approach to managing projects. Instead of planning every detail upfront, teams work in short cycles (sprints) to complete small chunks of work. This makes it easier to adapt to changing requirements or unexpected challenges. I was a little familiar with Agile project management from a past internship, but I learned a lot more about it by actually doing it myself.
The project is broken down into small, manageable issues or tasks. For our final project, my group used GitHub to create issues for each task, such as “Build the homepage” or “Fix login functionality.” This made it clear who was responsible for what and allowed us to track our progress throughout the sprint.
Working in an Agile environment proved to be challenging but also very rewarding. At first, it just seemed like busy work. However, as the project progressed, I realized how much easier it made the overall process and how much it helped us stay organized. By focusing on smaller goals, we avoided feeling overwhelmed and could make steady progress.
The great thing about Agile project management is that it can be applied to almost any type of project/task. For example, if I were working on a home project, like setting up a home gym , I could use the same principles: break the work into small issues, assign tasks to team members, and track the progress.
Finally, one of the most interesting concepts I learned was design patterns. A design pattern is a general, reusable solution to a commonly occurring problem in software design. Developers can rely on proven patterns to solve specific challenges in a more organized way.
In ICS 314, we explored design patterns when building our web application for the final project.
Beyond web development, design patterns are useful for all types of software. For example, an example an old professor of mine used to explain the Observer pattern was how applications like Spotify use the Observer pattern for managing email subscriptions. When a user subscribes to notifications, they become an “observer” of certain events, such as new music releases, playlist updates, or personalized recommendations. When Spotify detects that a new album or playlist is available, it notifies all subscribed users (the observers) automatically. This way, the system keeps users updated without requiring each user to manually check for updates. Similarly, the Singleton pattern can be used to manage resources like database connections or configurations, ensuring that there is only one instance of these components running at any given time to improve efficiency and prevent conflicts.
This class has taught me a lot about software engineering concepts that will be useful in any development environment. I’ve learned how configuration management enables teams to collaborate efficiently, how Agile project management helps break large projects into manageable pieces, and how design patterns provide reusable solutions for common problems.
These concepts have changed the way I think about software development. I know that the skills I learned in this class will help me work more effectively and efficiently. While the final project was challenging, it was also incredibly rewarding because it allowed me to see how these ideas come together in a real-world context. I’m excited to apply what I’ve learned in future projects and continue growing as a software engineer.