Category Archives: cs-wsu

Week 9: Software Testing vs. Quality Assurance: Understanding the Difference

In software development, Software Testing and Quality Assurance (QA) are two essential practices, but they serve different purposes. While both aim to ensure the delivery of high-quality software, understanding their differences is key to a successful development process.

What is Software Testing?

Software Testing involves evaluating a software application to find bugs, defects, or issues. The goal is to verify that the software functions as expected, meeting the specified requirements. Testing usually takes place after the software is developed, and it includes various types such as unit, integration, and system testing. The primary purpose of testing is to identify errors before releasing the product.

What is Quality Assurance?

Quality Assurance (QA) is a broader, more proactive approach. It focuses on improving the entire software development process to prevent defects before they happen. QA involves setting up best practices, frameworks, and guidelines to ensure that all stages of development—planning, coding, testing—follow high standards. QA runs throughout the software lifecycle, not just after development, and aims to ensure continuous quality improvement.

Key Differences Between Software Testing and Quality Assurance

  1. Scope:
    • Software Testing focuses on identifying defects in the finished product.
    • QA aims to prevent defects by improving the development process.
  2. Objective:
    • Software Testing’s goal is to find issues in the product.
    • QA’s goal is to enhance the development process and ensure quality from start to finish.
  3. Timing:
    • Software Testing typically happens after development.
    • QA is an ongoing process that begins early in development and continues throughout.
  4. Approach:
    • Software Testing is reactive, identifying issues after they arise.
    • QA is proactive, aiming to prevent issues before they occur.

Conclusion

While Software Testing focuses on finding defects in the product, Quality Assurance works on improving processes to avoid defects in the first place. Both are critical in ensuring that the final product is reliable and meets user expectations. By integrating both, development teams can produce high-quality software more effectively.

From the blog CS@Worcester – Nguyen Technique by Nguyen Vuong and used with permission of the author. All other rights reserved by the author.

Week 8: A Comprehensive Guide for Product Managers

Introduction

Unit testing is a critical aspect of software development that ensures code reliability, maintainability, and efficiency. While often considered a developer’s responsibility, product managers (PMs) can benefit from understanding unit testing fundamentals to improve collaboration, enhance product quality, and streamline the development process.

What is Unit Testing?

Unit testing involves testing individual components or functions of a software application in isolation. By verifying that each unit of code performs as expected, teams can detect and resolve issues early in the development lifecycle. Typically, unit tests are automated and executed frequently to maintain code integrity.

Why Product Managers Should Care About Unit Testing

Though unit testing is primarily a technical function, PMs should have a basic grasp of its significance. Here’s why:

  • Improved Code Quality: Unit testing helps catch bugs early, reducing the risk of defects in production.
  • Faster Development Cycles: Automated tests accelerate development by reducing the time spent on debugging and QA.
  • Better Collaboration: Understanding unit testing enables PMs to facilitate better conversations with engineers and align on quality expectations.
  • Reduced Technical Debt: Encouraging a test-driven approach helps maintain clean and maintainable code.

Key Concepts of Unit Testing

1. Test-Driven Development (TDD)

TDD is a methodology where developers write tests before writing the actual code. This practice ensures that each piece of code is created with testability in mind, leading to more robust software.

2. Mocking & Stubbing

Mocking involves creating simulated objects to mimic real dependencies in unit tests. This technique helps isolate the component under test, ensuring that external dependencies do not interfere with test results.

3. Code Coverage

Code coverage measures the percentage of code executed by unit tests. While high coverage is beneficial, quality matters more than quantity—focusing on critical components rather than achieving 100% coverage.

Best Practices for Unit Testing

  • Write Small, Focused Tests: Each test should validate a single functionality to improve clarity and maintainability.
  • Keep Tests Independent: Avoid dependencies between tests to ensure they run reliably in any order.
  • Automate Testing: Integrate unit tests into the CI/CD pipeline for continuous validation.
  • Maintain Readability: Write clear and well-documented tests to help teams understand their purpose.

How Product Managers Can Support Unit Testing

  • Advocate for Testing in Development Planning: Encourage teams to allocate time for writing and maintaining tests.
  • Align Testing Goals with Business Objectives: Ensure that critical features have adequate test coverage to minimize risks.
  • Foster a Quality-Driven Culture: Promote the importance of testing in team discussions and retrospectives.

Conclusion

Unit testing is a powerful practice that enhances software reliability and efficiency. While product managers may not write tests themselves, understanding their role in the development process fosters collaboration and contributes to delivering high-quality products. By embracing unit testing principles, PMs can help bridge the gap between technical teams and business goals, ultimately driving better outcomes for users and stakeholders alike.

From the blog CS@Worcester – Nguyen Technique by Nguyen Vuong and used with permission of the author. All other rights reserved by the author.

Sprint 1 Retrospective

My first sprint was a trial of figuring things out. Had to get accustomed to my team members and the program that was already created before. I was assigned to the reporting system and going in with my teammates and I didn’t know how far along the project had been. We had to first get settled and understand what updates needed to be done to complete our first sprint. Our sprint planning went well we understood the issues left before from a different class could be used for our sprint in this class. We all selected an issue that each one of us would resolve including some minor ones that came later on. I was chosen to Determine the startup procedure for MongoDB and RabbitMQ in the development environment

At first, I was confused with understanding what I had to do but after reading the comments made I began to understand what needed to be done. It was more of a test by creating another docker-compose file to run the Rabbimq without the backend. I created a devDocker-compose to achieve my goal. I then created another index.js file. I did this to run the developer versions or production of the up scripts. I did minor updates during the sprint including updating devcontainer so it would work better on Macs. There were several things we had to update so we split up the work and committed the corresponding ones to the main. I helped my teammates in their projects as well by working in their branches and accepting their merges when needed. As a team, we worked united and we always made sure we were all on the same page. During this sprint, we learned new things that we could incorporate into our team including updating each other on what we are working on today to be on the same page. We never let any team get lost and we were always there to pick each other up. One moment I could recall is that one of our member’s computers was having issues and we all as a unit came to find the issue which we did. Even for minor mistakes like commit messages, we made sure to edit and fix them to pass the pipeline. 

The pattern I would choose from the Apprenticeship Patterns book would be to expose your ignorance. It’s great to work alone and do your own thing but if you get stuck don’t be scared to get help from teammates instead of figuring it out alone. It’s great to get feedback and ask questions to everyone. This pattern is key for the growth of a developer and being able to be humble when addressing gaps of knowledge. You don’t have to act like you know everything because of pride or embarrassment but be willing to learn and be curious without fear. During this sprint, if I didn’t ask for help in certain scenarios I wouldn’t have known how to continue my project but being able to discuss boosted my work progress. When you are first joining a team you want to be reliable instead of a burden but asking questions as a whole will strengthen your team. During this spring I wouldn’t have hesitated to ask more questions that I had figured out on my own.     

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

Week 7: Best Practices for Writing Test Cases: A Beginner’s Guide

Writing effective test cases is an essential skill for software testers, ensuring that applications function as expected while identifying potential issues before deployment. In the blog post Best Practices for Writing Test Cases: An Introduction, TestDevLab provides a comprehensive guide to crafting high-quality test cases. Here’s a summary of key takeaways and best practices to follow when writing test cases.

Why Are Test Cases Important?

Test cases serve as a foundation for the testing process, ensuring consistency and thorough evaluation of an application’s features. Well-written test cases:

  • Improve testing efficiency.
  • Provide clear documentation.
  • Reduce ambiguity.
  • Enhance collaboration among development and QA teams.

Best Practices for Writing Test Cases

To create test cases that are effective and easy to understand, consider the following best practices:

1. Use Clear and Concise Language

Write test cases in simple, unambiguous language to ensure they are easy to understand by testers, developers, and stakeholders.

2. Maintain a Consistent Format

A well-structured test case typically includes:

  • Test Case ID
  • Test Description
  • Preconditions
  • Test Steps
  • Expected Results
  • Actual Results (after execution)
  • Pass/Fail Status

3. Focus on a Single Objective Per Test Case

Each test case should validate a specific function or behavior of the application to maintain clarity and effectiveness.

4. Use Realistic Test Data

Incorporate real-world scenarios when defining test data to simulate how users interact with the application.

5. Ensure Test Cases Are Reusable

Write test cases in a way that allows them to be reused in multiple testing scenarios, reducing redundancy and saving time.

6. Include Both Positive and Negative Test Scenarios

Consider both valid and invalid inputs to ensure the application behaves correctly under all conditions.

7. Continuously Update Test Cases

As software evolves, regularly update test cases to reflect new features, changes, and bug fixes.

Conclusion

Effective test case writing is fundamental to delivering high-quality software. By following these best practices, testers can improve efficiency, enhance collaboration, and ensure comprehensive application validation. For a more detailed guide, check out the full blog post on TestDevLab’s website.

Do you have any experiences or tips for writing test cases? Share them in the comments below!

From the blog CS@Worcester – Nguyen Technique by Nguyen Vuong and used with permission of the author. All other rights reserved by the author.

Week 6: Things Senior Developers Never Do

Every senior, experienced developer once started their career as a junior developer with basic coding skills and foundational knowledge of computer science. Junior developers gradually learn real-world design patterns, architectural decisions, advanced programming concepts, and domain knowledge to transition into senior developers—those who understand the big picture of the software products they develop.

Being a senior developer is not a permanent badge based on your past experience—your “seniority” depends on how you work and the decisions you make to ensure the success of a software project. A poor decision or a deliberate wrong action can damage your reputation, so senior developers must always be mindful of their coding activities and their consequences.

In this article, we will explore things that senior developers never do to maintain their reputation within a software development team. Avoid these habits and actions to become a skilled senior developer and advance your career!

Overcomplicating Project Architecture

An artist showcases their skill and experience through paintings. Similarly, a project’s source code becomes the playground for developers to demonstrate their expertise. Using an optimized infrastructure and dependencies focused on architectural simplicity is a great way to prove your experience.

However, adding advanced architectural components beyond what a project actually needs—just to show off expertise or make the project look “high-end”—results in overengineering. An overengineered project introduces unnecessary complexity to the entire team, even when the project itself only requires a simple solution.

A common example is startups implementing hundreds of microservices when a simple monolithic REST API would suffice.

A great case study is Stack Overflow, which serves millions of developers without needing hundreds of microservices.

Senior developers never overcomplicate project architecture to showcase their skills or make a project appear sophisticated—they focus on simplifying the architecture to use resources efficiently and impress through minimalism.

Writing Overly Complex Code & Chasing “Perfect” Code

Using appropriate design patterns in source code enhances maintainability. Additionally, experienced developers leverage language features, design patterns, and efficient data structures to improve software performance and maintainability.

However, perfect code does not exist—developers can always refine their code using design patterns and language features, believing they are achieving perfection. But what happens when a developer over-improves their code beyond the “good enough” threshold?

Striving for perfection often leads to overengineering the code.

For example, imagine implementing a Fahrenheit-to-Celsius converter in Python as part of a simple weather app. A senior developer anticipates future maintenance needs but never adds unnecessary complexity in pursuit of “perfect” code—they write simple, sufficient, and maintainable code.

They improve code only when necessary for maintainability but never write unnecessarily complex code based on speculative future requirements.

Ignoring Increasing Technical Debt

Technical debt arises when developers choose short-term, easy solutions without considering long-term consequences, especially regarding maintainability. While technical debt is unavoidable in the competitive software industry with tight budgets, it can be managed through continuous code improvements and well-organized code review sessions. Technical debt can also accumulate in project architecture components.

Here are common situations that lead to technical debt:

  • Writing code solely to ship features and fix bugs without prioritizing maintainability.
  • Extending features on a weak code foundation by adding duplicate code and quick fixes—for example, working on a plugin without stabilizing the core plugin runtime APIs.
  • Choosing infrastructure and runtime services that are difficult to scale for a high-user product.
  • Ignoring outdated, unsupported, or deprecated code and libraries.
  • Integrating incompatible libraries or sticking with suboptimal architectural decisions.

Technical debt may seem harmless at first, but if it accumulates too much, it can shorten the lifespan of your product.

From the blog CS@Worcester – Nguyen Technique by Nguyen Vuong and used with permission of the author. All other rights reserved by the author.

Week 5: 4 THINGS YOU SHOULD KNOW ABOUT GIT AND GITHUB

Are you one of those people who occasionally find using GitHub a bit of a headache?

I get it. At first glance, GitHub can seem intimidating—so many branches, pull requests, merges, conflicts… it’s easy to feel lost.

I’ve been there too. I often wondered whether I was following best practices or just making things messier for the team with every commit I pushed.

The good news is, it doesn’t have to be that way. With the right approach and a few key tips, GitHub can seamlessly integrate into your development workflow.

Whether you’re a complete beginner or someone overwhelmed by its countless features, GitHub is here for you.

WHY SHOULD YOU CARE ABOUT GITHUB?

GitHub is more than just a fancy cloud storage for code—it’s where the magic of collaboration happens.

It allows you to implement version control in the most efficient way possible, something every developer needs when working with a team to avoid stepping on each other’s toes. Mastering GitHub will make your life easier, whether you work solo or in a group.

BASIC WORKFLOW

Let’s go through a simple GitHub workflow. This assumes you have a basic understanding of Git, so we’ll focus on GitHub as a collaboration hub.

CREATING A NEW REPOSITORY

Go to your GitHub dashboard and click the “New Repository” button. Give it a cool name—maybe “super-cool-project” or something more professional if you’re working in a team.

CLONING TO YOUR LOCAL MACHINE

Now, clone this new repository to your local computer.

(Illustration: “GitHub Repo Clone”)

BRANCHING OUT

This is where many beginners struggle: branching. If you’re developing a new feature, always create a new branch from main (or master, depending on your default setup).

(Illustration: “Branching Out”)

MAKING CHANGES

Go ahead and do what you need—write great code, add some files, maybe fix a few bugs along the way.

COMMITTING AND PUSHING

Once you’re happy with the changes, stage them and commit. Remember the golden rule: write meaningful commit messages. Avoid vague messages like “fix stuff” or “final version control.”

(Illustration: “Commit and Push”)

CREATING A PULL REQUEST (PR)

After pushing your branch, it’s time to create a pull request on GitHub. This is a crucial step. PRs allow others to review your code, provide feedback, and discuss potential changes.

Go to your repository on GitHub, and you’ll see a big button that says something like “Compare & Pull Request.”

Click it, add a meaningful title, and write a clear description. Be specific—let your teammates know what you changed and why.

MERGING THE PULL REQUEST

Once your team has reviewed your code and you’ve addressed their feedback, merge the PR into the main branch. Voilà!

You’ve just successfully collaborated like a pro.

HANDLING MERGE CONFLICTS LIKE A “BOSS”

Merge conflicts are inevitable, but don’t let them stress you out. If two people edit the same part of a file, Git won’t know which version to keep. That’s where you come in.

When Git notifies you of a conflict, it will mark the conflicting parts in the file. You’ll see something like this:

(Illustration: “Handling Merge Conflicts”)

Simply decide which code to keep, or merge both in a logical way, save the file, and commit again. That’s it!

GITHUB ACTIONS: AUTOMATE YOUR WORKFLOW

Another game-changing feature on GitHub is GitHub Actions. Why waste time manually running tests, building code, or deploying updates when GitHub can do it for you?

Actions allow you to automate almost anything in your workflow.

For example, you can set up GitHub Actions to automatically run tests every time a pull request is created, ensuring no buggy code gets merged. You can even set up continuous deployment to push changes to production once they pass all tests.

Here’s a basic setup for an action that runs tests on your code:

(Illustration: “GitHub Actions”)

This means that every time you push to main, GitHub will run tests for you—like a little assistant reminding you, “Hey, let me check if everything’s still good to go.”

FINAL THOUGHTS

GitHub is your best friend in the world of version control and collaboration. With features like branching, pull requests, and GitHub Actions, it provides everything you need to work effectively with others—or even just by yourself.

It’s not as scary as it seems. Stick to good practices, keep things organized, and soon, you’ll be committing, merging, and collaborating like a seasoned developer.

Key takeaways:

✔ Use meaningful branch names and commit messages.
✔ Don’t fear pull requests—they’re your safety net.
✔ Handle merge conflicts with confidence, not panic.
✔ Automate testing with GitHub Actions to save time.

And remember: no matter how great GitHub is, it’s the people using it that create the real magic.

Have a good day!

From the blog CS@Worcester – Nguyen Technique by Nguyen Vuong and used with permission of the author. All other rights reserved by the author.

Apprenticeship Patterns Chapter 1 and Chapter 2-6 Introductions

“Apprenticeship Patterns Guidance for the Aspiring Software Craftsman” by Dave Hooper and Adewale Oshineye was interesting. This reading allowed me to reconnect my work to the text. The simple route would be to create a technical guideline but instead, this book goes into greater depth that mentality is the key. The mental fortitude to be humble and to always be open to learning new things from anyone to master your craft.

All the chapters hold great importance to me, I found chapters 3 and 5 to be the standouts. Two key things that stood out to me mainly were developing a long-lasting career and being adaptable in any situation. I am just beginning my career and one goal that I have to achieve before the rest is starting to create a long path to success. Not everything is going to happen in a day but taking it one day at a time and not focusing on the short term can come a long way. Slowly progressing and making small strides is the way to go. Adaptability is self-explanatory but with technology always changing and advancing, you must always be ready for the change. If you don’t adapt to it, technology will leave you behind. Some people may not like change but it’s great to always learn new things and change the way you used to do something for something better. An open mind is better than a closed one.

After reading this I have come to a new understanding of my career. It has taught me to have more purpose when I learn even the smallest things because to fully master something you must understand the big concepts and the small ones. When Learning you should focus on being competent on something instead of just acquiring it and moving on. Also, this is a long-term goal so don’t focus on the short term but look at it from a broader point of view where small increments can lead to bigger strides in the end. The main key to becoming a software craftsman is mentality because technical skills can only get you so far when you always must be moving forward and being able to adapt on short notice.

From the blog cs-wsu – DCO by dcastillo360 and used with permission of the author. All other rights reserved by the author.

Task 5

I found the website of Libre Food Pantry to be interesting I like the setup of the site and like the aesthetic. It looks very professional and the colors coordinate with the webpage. The section about GitLab stood out to me. It is great to be open to the public where we work on our project. It gives anyone easy access to our work without being able to edit it but look at it and give us feedback. I chose to write about this because sometimes it is hard to find the source of people’s projects but it being easy to see is very useful. In Thea’s food pantry, I found the community section the most important. This should be the first thing that should be clear to anyone working on this project. It tackles a lot of problems that may be up to interpretation but gives clear answers so nobody is confused. For me, the one that stood out the most was the definition of done. To certain people, this may be simple but in reality, it is much more complicated than it is. To be done with code can be a multi-step process. This gives importance to the expectation that everyone must reach when working on this project.

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

Working as a Front end developer

Now that I have heard about people’s experiences working on the back end, I was curious about people’s experiences working on the front end. Reading personal experiences taught me a lot about working on the back end. You can learn a lot and avoid mistakes by seeing others take similar paths. Also, it can prepare you for problems that you may face in the future. Mistakes are inevitable but being able to adapt or being able to recognize it and fix it goes a long way. Working on projects especially those that have to do with coding errors is always a step away. You can try to get a step ahead on these problems by seeing other people work and implementing it on your stuff. That is why I found an article about working as a front-end developer. These articles are very engaging and always give me a new perspective.

This article is written by Selim Enes who has done freelance work in the past but is currently working as a developer. When he first started he was working on small things like CSS edits until he proved himself. One of his major projects was a blog project where he had to create the display of the UI. He was involved in all operations after 2 months. When he proved to the team that his code wouldn’t crash the project he gained access to the company’s main project. The company’s main project entailed a webinar application that used technologies like WebSocket. One thing that made him know he was going in the right direction was being able to develop features like push-to-talk by himself. There are some negatives to his work with his boss being very hasty on projects. He believes all tasks are urgent and make some work very stressful. Plus with the recent economic regression, he doesn’t believe he will be able to get a raise anytime soon. He has learned to have a full-stack blog project for himself and has an e-commerce project his about to start working on. He is working while also building his portfolio outside of work.

Reading this article was very insightful. It made sense that when you first start working for a company they won’t give you the keys to everything just yet. They ease you up into it until you have gained their trust. Working on his portfolio outside of work motivated me to do the same too. You can sometimes become complacent at your job because you have a living but you shouldn’t. You should always try to improve and hope to find better opportunities elsewhere

https://medium.com/@sellimenes/1-year-experience-as-a-junior-front-end-developer-39766fad5c34

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

Week 15

Working inside the backend made me curious about people’s real-life experiences working in their company’s backend. I found articles about the backend but have yet to gain experience working inside it. It would be helpful to get insight into someone’s real-life experiences. By seeing others’ experiences you can learn from them and avoid any mistakes they made starting. Many beginner mistakes are big headaches when they happen, but if someone else can stop you from making them, it will be a huge lifesaver. We learn sometimes the hard way but the biggest help to prevent this is to learn from other paths. Some may think it better to go in blind I think differently. Being prepared for me is always the better option

Blessings James starts the article by advising readers that starting it may be difficult but to trust the process because the feeling after you accomplish your task is another feeling entirely. Her favorite project was working on a to-do list application with a backend using Python. It was difficult for her to work while also being data efficient. By doing research she was able to find a scalable model that worked. She also discovered some libraries including Flask-login that would do a lot of the heavy lifting. This was key for security which is often overlooked. Debugging is always a problem that comes up but she was able to gracefully fix them. API design was also a key feature wired on but swagger made it a lot easier. 

Reading this article gave me a lot of insight into someone working in the backend for a real company. There were some similarities to what were doing now including swagger. Swagger seems like the for the API design. We haven’t used all the features of Swagger but using Swagger Preview did help when doing assignments and homework. Our code was automatically able to be seen updated. One thing that interested me was Flask-login. I didn’t know you could use outside libraries but it makes sense if it is open to the public anyone can use it. It can save time by being able to use different libraries and cut your workload by half. Reading that article there was a big emphasis on security and I feel at times is overlooked. You have seen with a lot of companies when it is overlooked the outcomes are drastic. It becoming a bigger issue every day and security should be the first task on everyone’s list.

article
https://medium.com/@blessingjames1047/an-article-on-backend-ff90312c05b2

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