Category Archives: CS@Worcester

Blog post 2

Over the past few weeks in CM-348, we’ve been learning about Scrum and how it’s used in team-based environments. Before this class, I had heard the word tossed around in tech spaces and job descriptions, but I didn’t fully understand what it meant. Now that we’ve gone through some of its core ideas in class, it’s starting to make more sense. Scrum is a framework that helps teams stay organized, break up big projects into smaller pieces, and work together efficiently, even when plans or priorities change.

To learn more outside of class, I watched a video on YouTube titled “Scrum in Under 10 Minutes” by The Agile Coach. It’s a short breakdown of how Scrum works, why it’s useful, and the key roles and events involved, like the Product Owner, Scrum Master, sprint planning, daily stand-ups, and retrospectives. It gave me a clearer picture of how teams actually use Scrum in real-life software projects and how those short sprint cycles keep things moving forward without getting stuck in too much planning.

I picked this video because it connects directly to what we’ve been doing in CM-348 and helped me visualize how everything fits together. The video was quick but packed with helpful context, and it explained the same terms we’ve been using in class. I wanted to find something that would reinforce what we’re learning while also giving me a glimpse of how this works in practice outside of school.

What I liked most about the resource and about Scrum in general is the focus on communication and reflection. It’s more than checking off tasks, it’s about talking with your team regularly, making adjustments, and working in cycles. That really connects with our work using Git and GitHub. Every commit tells a story of progress, and every pull request is a small review. Scrum brings that same kind of accountability and structure to the whole project process.

Watching this video helped me see how important soft skills are in tech roles. Communication, time management, and teamwork are just as important as technical skills. It also reminded me that being flexible is key; you have to be ready to pivot and adapt when things don’t go as planned. As I move closer to graduating and start looking at jobs, I want to take what I’ve learned about Scrum and apply it in myroles. Even personal projects could benefit from this kind of organization. I could plan out sprints, reflect on progress, and stay focused on what matters.

Scrum is helping me connect the dots between managing code and managing people and tasks. Between that and what we’re doing in Git, CM-348 is giving me tools to work better and smarter, both on my own and in teams.

From the blog CS@Worcester – Tristan CS by Tristan Coomey and used with permission of the author. All other rights reserved by the author.

Blog Post 2

For this blog entry I decided to choose something related to Agile. In the blogpost, Agile Principles: The Complete Guide To All 12 Principles For 2025 written by Sean O’Connor, he goes over how Agile’s flexibility gives it real world benefits for businesses, development teams, and customers. Much like how with what we went over in class, Sean O’Connor explains that Agile’s strengths aren’t so much about speed of delivery of a product, but in it’s efficiency in producing a working project, with speed as positive byproduct. As someone who’s never been good at long term planning, what was explained in the blogpost really resonated with me. Things like catching problems early when it hasn’t become a core “feature” of the software, building what the customer actually needs rather then wasting time, and especially the part of creating quick wins, are some things that I value in a game plan. The blogpost then goes into 12 principles that makeup all Agile methodologies, a couple of which really stood out to me.

One of the principles was delivering working software frequently. I like the idea of real progress you can actually see and use, not just what it could potentially be. It’s nice when you get to see something that actually works early, even if it’s just a rough version. This approach makes more sense to me than spending weeks or months planning something that might not even be what was wanted, which is just a huge waste of time and energy. So to me being able to get instant feedback, learn faster, and fix problems before they turn into something major, is huge.

Another principle that ties into that is measuring progress by working software. That line really sums up Agile’s idea of “cutting out the chaff”. It’s easy to get caught up in planning, documentation, or presentations that sound good but don’t actually move the project forward. A working prototype says more than any report could. I think that same logic applies to class projects too, seeing your code actually run feels like a real measure of progress, not how well it’s outlined on paper.

The principle of simplicity, or “maximizing the amount of work not done,” also hit home for me. It’s about focusing on what truly matters and using just enough time and energy needed. I tend to overthink projects at the start, but this mindset reminds me that getting the essentials working is more productive than building unnecessary features. Fewer moving parts also means fewer ways for things to break (something I know all to well).

All in all, it’s reassuring to see that my “slacker mindset” can be the basis for something actually productive.

From the blog CS@Worcester – CS Notes Blog by bluu1 and used with permission of the author. All other rights reserved by the author.

Understanding Design Patterns: Creational, Structural, and Behavioral

Hello everyone, and welcome to my blog entry for this week! Technically, not a blog entry since I am just re-doing the one, I previously posted.

Last weekend, I listened to the podcast from the Coding Blocks Podcast (codingblocks.net). I’ve always been curious about how experienced developers structure their code to make it easier to maintain and scale, so this seemed like the perfect topic to explore. The episode focused on design patterns, specifically the three main categories: Creational, Structural, and Behavioral. Listening to it gave me a new appreciation for how these patterns help solve common software design problems and make codebases more adaptable over time.

Summary of the Podcast

The episode, which runs for about 50 minutes, features developers Michael Outlaw, Joe Zack, and Allen Underwood discussing how design patterns provide reusable solutions to recurring challenges in software development. They describe Creational patterns as those that handle object creation in a flexible way, Structural patterns as those that organize and relate classes and objects, and Behavioral patterns as those that define how objects communicate and share responsibilities.

They shared several examples, such as the Factory Method (a Creational pattern used to create objects without specifying exact classes), the Adapter (a Structural pattern that allows incompatible interfaces to work together), and the Observer (a Behavioral pattern that lets one object notify others when its state changes). What I liked most was how the hosts emphasized that patterns aren’t rigid rules, they’re practical tools developers use to make their code more consistent and easier to maintain.

Why I Selected This Resource

I chose this podcast because I wanted to deepen my understanding of how large software systems are organized. I’ve often heard about design patterns being essential for professional software engineering, but I never had a clear idea of how they were actually applied. The podcast stood out because it explained patterns in an approachable way, connecting them to real-world examples like GUI systems, game engines, and web frameworks. It helped me see that these patterns appear everywhere from database connections to event handling, and that learning them is key to writing scalable, professional-grade code.

Personal Reflections: What I Learned

After listening, I realized that design patterns are really about thinking ahead.

  • Creational patterns reminded me that object creation should be flexible, not hard-coded.
  • Structural patterns showed me how organizing relationships properly can make systems easier to extend.
  • Behavioral patterns highlighted the importance of communication between objects and how good design reduces dependencies.

What stood out to me most was how design patterns encourage better decision-making. They don’t just make code work, they make it work better over time.

Application to Future Practice

Moving forward, I plan to start identifying patterns in the code I write. I want to experiment with the Singleton pattern for managing shared resources, like configuration files, and use the Strategy pattern when implementing algorithms that can be swapped dynamically. Understanding these patterns will help me approach programming challenges with more structure and confidence, and will prepare me for real-world software development where scalability and design quality matter most.

Citation / Link

Outlaw, Michael; Zack, Joe; and Underwood, Allen. Design Patterns Explained. Coding Blocks Podcast, 2019. Available online at codingblocks.net.

This podcast helped me see how Creational, Structural, and Behavioral design patterns provide a common language for building better software. Listening to it last weekend gave me new insights into how thoughtful design decisions can make a project more flexible, maintainable, and ready for growth.

From the blog CS@Worcester – Rick’s Software Journal by RickDjouwe1 and used with permission of the author. All other rights reserved by the author.

Effective API Design

I have been reading one of the articles by Martin Fowler titled APIs: Principles and Best Practices to Design Robust Interfaces. It discusses how API, or small bridges that are known as Application Programming Interfaces, enable various software systems to communicate and keep up with one another. Fowler emphasizes such points as the clarity of words, offering simplicity, being consistent, and not having to break old versions, and supports it with real code demos and real-life scenarios. It is a combination of theory and practical tips, so every person, who is interested in software design, can dive in.

I picked the read as the API design is one of the foundations of software engineering and intersects my course on Software Development and Integration. I prefer scalable apps that keep their heads clean and easy to be connected to by other developers. Exploring the work of Fowler was my form of education on how to create interfaces with sound principles of how to get folks to jump on and expand therein with no hassle. Most of the stuff that remains all theory-heavy is not so in this article but instead it presents actual, practical tactics, just what one needs at school and in the job.

The importance of versioning and maintaining backward compatibility was one of the largest things that I took away in the article. Fowler gives a reminder that APIs must evolve, but not exist to ruin other clients, which will require you to plan, test, and discuss with your users. That resonated with me as in group projects I had done before, a minor change to our module could bring down the line. Upon reflection, the well-planned API design rules seem to be the instinctive means of preventing such headaches and wasting less time.

I also liked the fact that Fowler emphasized intuitive naming and consistency. According to him, the more predictable the method names, parameters and endpoints are, the friendlier an API is. It actually saves a fair deal of time to establish a proper structure and hierarchy and results in a significant reduction of mix-ups, accelerates integration, and makes the entire process of dev enjoyable. I have remembered that a considerate design ensures not only the end user as well as the people who actually create with the API, but the ecosystem becomes efficient and simpler to maintain.

In the future, I will apply these tricks to my class projects and whatever work I happen to do in the profession. Whenever I create an API to support the web application or integrate more third-party services, I will focus on clean documentation, predictability, and retaining older versions. Following these rules, I will deliver interfaces that are great, that are easy to maintain, that will assist other developers and that will survive update. This paper has made me even more respectful of the discipline of API design, and I am willing to put these tangible strategies to immediate use.

From the blog CS@Worcester – Site Title by Yousef Hassan and used with permission of the author. All other rights reserved by the author.

Quarterly Blog 2

From the blog CS@Worcester – dipeshbhattaprofile by Dipesh Bhatta and used with permission of the author. All other rights reserved by the author.

Importance of version control in the process of development

An infographic illustrating version control processes in Git, showcasing key operations like fork, merge, and pull request.

As a software developer version control you will undoubtedly run into version control of any projects which you are working on. Eventually a developer will have to fix bugs or add a feature to a product. In order to learn more about version control there is no better website to learn from than Github.

What is Version Control?

Illustration of distributed version control system showing interactions between developers and the main repository.

Github gives an amazing allegory: Imagine you’re a violinist in a 100-piece orchestra, but you and the other musicians can’t see the conductor or hear one another. Instead of synchronized instruments playing music, the result is just noise.

Version control is a tool used to prevent this noise from happening. It helps streamline development, keep track of any changes, and allow for upscaling of projects.

Version Control tool factors

Version control may not be necessary depending on the scale of your project, however most of the time it is useful to have it set up. Some of the factors of deciding to use version control include:

  • Scalability: Large projects with many developers and files benefit from VC
  • Ease of Use: User friendly UI helps manage learning curves and adoption.
  • Collaboration features: Supporting multiple contributors and communication between them.
  • Integration with existing tools: Using tools everyone already has access to.
  • Supports branching: Ability for developers to work on different parts of development benefits a project greatly.

Common Version Control pplications

  • Git: Git is an open-source distributed version control tool preferred by developers for its speed, flexibility, and because contributors can work on the same codebase simultaneously.
  • Subversion (SVN): Subversion is a centralized version control tool used by enterprise teams and is known for its speed and scalability.
  • Azure DevOps Server: Previously known as Microsoft Team Foundation Server (TFS), Azure DevOps Server is a set of modern development services, a centralized version control, and reporting system hosted on-premises.
  • Mercurial: Like Git in scalability and flexibility, Mercurial is a distributed version control system.
  • Perforce: Used in large-scale software development projects, Perforce is a centralized version control system valued for its simplicity and ease of use.

Final thoughts

Every developer has at one point heard of Git, and without a doubt it may be one of the best developer tool ever invented. I have prior experience using version control but this research was an important refresher to learn from. If you wish to learn directly from Github you can read the article this blog was inspired by here.

From the blog CS@Worcester – Petraq Mele blog posts by Petraq Mele and used with permission of the author. All other rights reserved by the author.

Refactoring your program

Sometimes when a program undergoes consistent updates it can get messy, in cases like this it can be useful to refactor it. I’ve had a few experienced cleaning a program however I have never refactored an entire program. The developers over at refactoring guru luckily have a website dedicated to this subject.

An illustrated depiction of a programming refactoring process, highlighting the importance of clean code.

Purpose for refactoring

When you refactor a program you are fighting something they call technical debt and create clean code. With clean code comes a few benefits including:

  • Obvious for other programmers
  • Doesn’t contain duplicate code
  • Minimal number of classes and other moving parts
  • Passing of all tests
  • Easier and cheaper to maintain

What is technical debt?

“Technical debt” as a metaphor was originally suggested by Ward Cunningham using bank loans as an example.

You can make purchases faster If you get a loan from a bank however now on top of principal you have interest. and with time you can rack up so much interest that the amount of interest exceeds your total income, making full repayment impossible.

The same concept can be applied to code. Speeding up without testing new features will gradually slow your progress.

Some causes of technical debt include:

  • Business pressure
  • Lack of understanding the consequence
  • Failing to combat the strict coherence of components
  • Lack of tests, documentation, communication.
  • Long-term simultaneous development in several branches
  • Delayed refactoring
  • Incompetence

So when should one refactor?

Refactoring guru comes up with a few instances on when to refactor.

  • Rule of three:
    • When doing something for the first time, just get it done.
    • When doing something similar for the second time, cringe at having to repeat but do the same thing anyway.
    • When doing something for the third time, start refactoring.
  • Adding a feature:
    • If you have to deal with someone else’s dirty code, try refactoring it first; Easier for future features.
  • Fixing a bug:
    • Clean the code and errors will discover themselves
  • Code reviews:
    • Last chance to tidy up the code
    • Best to perform these reviews in pair with an author

We know when, but how?

Refactoring is done via a series of small changes, each making the existing code slightly better while leaving the program in working order.

Here is a checklist on refactoring done the right way:

  • The code is cleaner
  • There should not be new functionality
  • All existing tests pass

Final Thoughts:

Overall, I found this website on refactoring to be really informative and would recommend refactoring guru as a starting point. The most important thing that I got out of this is that developers should always try to write clean code or clean code as its undergoing development. Unfortunately sometimes software development can be very time containing and its not always possible which is why refactoring is important.

From the blog Petraq Mele blog posts by Petraq Mele and used with permission of the author. All other rights reserved by the author.

DESIGN SMELLS AND PATTERNS: WHY QUALITY CODE MATTERS

Writing code involves more than just making it functional, it focuses on creating solutions that are understandable, maintainable, and flexible. Yet, as deadlines approach and requirements change, our codebases frequently reveal subtle indicators that they may not be as robust as they appear. These indicators are commonly referred to as code smells and anti-patterns. In this blog today, we will explore the meanings of these terms, their significance, and how software developers can begin to identify and tackle them in their own projects.

What Are Code Smells vs Anti-Patterns?

A code smell is like a little red flag. It doesn’t necessarily mean your code is broken, but something might be off. Think of it as an indicator of hidden trouble.
An anti-pattern is a commonly used approach or structure that seems reasonable but tends to lead to problems. It’s like following the “wrong recipe” because it looks familiar.
In short, we shall term code smells are symptoms and anti-patterns are traps. Recognizing both helps keep your codebase healthy, especially as your projects grow or you work with others

Five Common Code Smells

Here are five code smells to be aware of, along with simple examples:

1. Duplicated Code

If you notice the same logic appearing in multiple locations, that’s a code smell. For example

def calculate_area_rectangle(length, width):
return length * width

def calculate_area_square(side):
return side * side

Here, calculate_area_square merely duplicates logic. Duplicated code complicates maintenance if a bug is present in one instance, it is likely present in others as well.

2. Large Class / Method

When a class or method attempts to handle too many responsibilities, it becomes difficult to comprehend, test, or maintain. For example, a User class that also manages discount calculations breaches the single responsibility principle. Instead, that functionality could be placed in a separate DiscountCalculator.

3. Long Parameter List

These are methods that require numerous parameters are harder to read and invoke correctly. For example:

def create_user(name, age, address, phone, email, gender, occupation):
pass

Organizing related parameters or encapsulating them within an object can simplify the process.

4. Feature Envy

When a method in one class predominantly interacts with the data of another class, the logic likely belongs in the latter. For example, a get_full_address method in the User class that extensively accesses data from the Address class should probably reside in the Address class.

5. Data Clumps

This refers to a collection of variables that consistently appear together such as street, city, state, postal code and indicates a lack of abstraction. Instead, they should be grouped into an Address class or struct. Having ungrouped data results in redundancy and inconsistencies.

Common Anti-Patterns to Avoid

Here are several prevalent anti-patterns and the reasons they pose risks:

1. Golden Hammer

Dependence on a familiar tool due to personal preference, even when it is inappropriate for the task at hand. For instance, utilizing a list comprehension for side effects such as printing in Python solely because of a fondness for list comprehensions.

2. Cargo Cult Programming

Imitating structures, patterns, or frameworks that you have observed without comprehending their purpose or applicability. For example, incorporating a decorator in Python that serves no significant function merely because other code examples included decorators.

3. Analysis Paralysis

Allocating excessive time to planning, resulting in no actual progress. While planning is beneficial, there comes a time when one must construct, test, and iterate. Over-analysis can hinder advancement.

4. God Object

A class or module that encompasses all functionalities—managing data, processing, displaying, logging, etc. This centralization undermines modularity and increases the risk associated with changes. An example would be a SystemControl class that logs errors, saves data, processes data, displays data, and so forth.

5. Spaghetti Code

Code lacking a clear structure or modularity, characterized by numerous nested loops and conditionals. This complexity makes debugging or extending the code exceedingly challenging. An example includes deeply nested if statements and loops within a single function.

Here’s why you should care as a aspiring developer or even as someone interested in code;

When you write code applying these ideas makes your work cleaner, more maintainable, and often higher quality.
When you show up for internships or team projects, knowing about code smells and anti-patterns gives you a professional edge,you’ll write code that is easier for others to work with. If you eventually lead or participate in code reviews, you’ll be able to spot and explain refactoring opportunities and not just “it works”, but “it works and is maintainable”. As your projects grow, technical debt can bite hard. Early awareness helps you avoid getting overwhelmed by messy code in bigger projects.

Conclusion

Recognizing code smells and anti-patterns isn’t about perfection, it’s about awareness and intentional improvement. By spotting the subtle indicators, you give your codebase and yourself a chance to evolve gracefully rather than crumble under its own complexity. If you want to take a next step: pick one small project maybe an assignment, or one module of your Android app and identify one smell you can fix. Refactor it. See how your code feels afterwards. Because when you clean up smells and avoid traps, your code becomes more than just a working program it becomes something you’re proud of.

References:

https://blog.codacy.com/code-smells-and-anti-patterns

From the blog CS@Worcester – MY_BLOG_ by Serah Matovu and used with permission of the author. All other rights reserved by the author.

Word wide outage

https://www.cnn.com/2025/10/25/tech/aws-outage-cause

The cloud AWS provider experienced a massive outage on oct 20, 2025 that shut down or impacted many of the most popular services and products on the internet like Roblox, and snapchat. The outage was so large many systems and product became unusable. This issue stemmed from a DNS issue where multiple automated systems were trying to update the same DNS entry which then threw a empty field. This empty field then was carried down to other services like EC2 which then caused those to fail and further down into other workflows and other systems that relied on services like EC2. Those failures carried down to Network balancers which essentially snowballed into a enormous mess that wrecked many apps and services. I personally clocked into work with our error handling system and alerts absolutely flooded will alarms and alerts. This became so bad my boss told me to just ignore the errors for the day (One of my sprint tasks is to keep alerts down). I chose this article due to its relevance to testing software and the probable use of git to find out when and where the error occurred. As the use of git bisect could be used to troubleshoot where the issue was introduced into the workflow to find out where the DNS field was assigned to two systems that could trigger at the same time. Furthermore AWS in their statement to the public states that “We know this event impacted many customers in significant ways, We will do everything we can to learn from this event and use it to improve our availability even further” This statement aligns with the values of scrum since it prioritizes openness and respect which AWS gives to its customers by openly documenting the issue that occurred while at the same time stressing the communication with the customers to reassure them in their recovery from the failure. They also follow the AGILE manifesto as they are responding to change over developing a plan since their customers need their services back now, prioritizing getting their services back online rather than documenting and collaborating with customers to have their systems restored. Delivering that they are only releasing their documentation once the system was fully restored under 15 hours showing that they needed to deliver on working software. In a way they could also be benefiting from focusing on individuals and interactions over tools since this error occurred at multiple levels but started at the same point so one tool or process couldn’t immediately understand the root cause.

From the blog CS@Worcester – Aidan's Cybersection by Aidan Novia and used with permission of the author. All other rights reserved by the author.

The Importance of UML in an Agile World

The Unified Modeling Language (UML) has been playing a part in software development for years as it provided a standardized visual language for modeling the structure of complex systems. But there have been questions about UML and whether it is still useful because the software industry has shifted towards more iterative, flexible Agile methodologies, there have been questions about the relevance of UML. But the article explains that if you look at it closer then UML remains a valuable asset, especially when leveraged appropriately in an Agile context. UML has four main strengths which include visualization, abstraction, standardization, and design documentation. Visualization means that UML diagrams offer a powerful way to visualize and document the static structure and dynamic behavior of a software system. Abstraction is when UML supports modeling at various levels of abstraction, from high-level conceptual diagrams to detailed design specifications. Standardization is since it is a widely-adopted industry standard, UML provides a common language that can be understood by software professionals worldwide. Finally, design documentation means that UML diagrams can serve as a valuable reference for documenting the design of a system, which can aid in maintenance, support, and future enhancements.

Using these strengths there are many ways that UML can make its way into Agile environments. The first is ideation and communication, UML can be particularly useful during the initial stages of an Agile project, quick, lightweight UML diagrams can help the team visualize and communicate their concepts, leading to a shared understanding before diving into implementation. Next is agile modeling, rather than a complex upfront design, Agile teams can adopt a modeling approach where they create diagrams as needed through their current sprints. The third is architectural blueprinting, UML can play a role in defining and documenting the overall system architecture. By having a high level model, teams can ensure consistency and maintainability as the system evolves over time. The final one is knowledge capture and transfer. UML diagrams can serve as pieces for capturing and transferring info, particularly when gaining new team members or supporting the system in production.

The reason I chose this blog post to talk about is because we just recently did an assignment on UML and have talked a lot about it. During this time I always wondered why it was so important or what place it really had in a team of developers. Overall I believe that the blog itself did a great job at making me see why I was so wrong and what really was important. It can adapt so well over time and allows developers a way to help other members understand their work better and to communicate exactly what they are trying to accomplish. I plan to get better at using UML as a skill I can use in jobs to showcase Agile methodologies and hopefully it will help show not only a technical skill but also my ability to work more collaboratively in teams.

From the blog Thanas CS343 Blog by tlara1f9a6bfb54 and used with permission of the author. All other rights reserved by the author.