Category Archives: CS-348

Remote Work

     Ever since the pandemic, the modern workplace has gone through many shifts. The realization that workers can still be effective members of the company from their home has changed a lot of people’s perspective on the corporate work environment. Many workers have pushed for remote work to become a staple of the modern job market. It is easy to see the appeal of remote work: No commute, stuffy office, or even stuffier dress code sounds very appealing to me. I personally enjoy the ease of access to one’s job right in their own home. All of that said, the infrastructure for remote work has been in the works for longer than we realized that there was a need for it. In the modern era, cloud computing has become a necessity for almost any job regardless of whether it is remote or not. Services such as AWS, Azure, and Git hub/lab has supplemented developers with the tools to contribute to their workplace from anywhere on the globe. Now teams can be comprised of any developer within the company and can pull from about any talent pool. This comes with its own set of unique challenges though, as remote work moves developers from a singular office space to their respective homes. Balancing time zones, long-distance communication between team members, increased risk to cybersecurity and more come with the territory of all your developers working from their house. Fortunately, Cloud computing answers some of these problems by providing more security and reliability to development teams. Azure and AWS provide secure repositories for teams and reliable access to their work wherever they are. Then there are Applications such as Zoom, which provides communication between team members and can even facilitate daily scrum meetings if needed. Developers have been using git for a long time, and it has served to supplement collaboration in software development. While the pandemic is over and most companies have tried to push their employees to go back to the office, remote work has become a fixture in the modern work landscape. For some companies, it is an economic option since it is cheaper to subscribe to several cloud services than to rent an entire office space. For other companies, it is simply the efficient option. I believe companies should incorporate these innovative technologies to expand their reach, and to shift society further down the path of better work life balance. The past few years have shown us that the old ninetofive has become outdated, and possibly unsustainable.  

https://socpub.com/articles/how-can-cloud-computing-enable-remote-teams-work-more-productively-17895

https://aws.amazon.com/application-hosting/benefits/

https://azure.microsoft.com/en-us/resources/cloud-computing-dictionary/what-is-azure

From the blog CS@Worcester Alejandro Professional Blog by amontesdeoca and used with permission of the author. All other rights reserved by the author.

Remote Work

     Ever since the pandemic, the modern workplace has gone through many shifts. The realization that workers can still be effective members of the company from their home has changed a lot of people’s perspective on the corporate work environment. Many workers have pushed for remote work to become a staple of the modern job market. It is easy to see the appeal of remote work: No commute, stuffy office, or even stuffier dress code sounds very appealing to me. I personally enjoy the ease of access to one’s job right in their own home. All of that said, the infrastructure for remote work has been in the works for longer than we realized that there was a need for it. In the modern era, cloud computing has become a necessity for almost any job regardless of whether it is remote or not. Services such as AWS, Azure, and Git hub/lab has supplemented developers with the tools to contribute to their workplace from anywhere on the globe. Now teams can be comprised of any developer within the company and can pull from about any talent pool. This comes with its own set of unique challenges though, as remote work moves developers from a singular office space to their respective homes. Balancing time zones, long-distance communication between team members, increased risk to cybersecurity and more come with the territory of all your developers working from their house. Fortunately, Cloud computing answers some of these problems by providing more security and reliability to development teams. Azure and AWS provide secure repositories for teams and reliable access to their work wherever they are. Then there are Applications such as Zoom, which provides communication between team members and can even facilitate daily scrum meetings if needed. Developers have been using git for a long time, and it has served to supplement collaboration in software development. While the pandemic is over and most companies have tried to push their employees to go back to the office, remote work has become a fixture in the modern work landscape. For some companies, it is an economic option since it is cheaper to subscribe to several cloud services than to rent an entire office space. For other companies, it is simply the efficient option. I believe companies should incorporate these innovative technologies to expand their reach, and to shift society further down the path of better work life balance. The past few years have shown us that the old ninetofive has become outdated, and possibly unsustainable.  

https://socpub.com/articles/how-can-cloud-computing-enable-remote-teams-work-more-productively-17895

https://aws.amazon.com/application-hosting/benefits/

https://azure.microsoft.com/en-us/resources/cloud-computing-dictionary/what-is-azure

From the blog CS@Worcester Alejandro Professional Blog by amontesdeoca and used with permission of the author. All other rights reserved by the author.

Late-Night Coding: Personal Experience Tips & Tricks.

As final’s week approaches I find myself coding through the night more and more accompanied by my two best friends, my IDE, and the lo-fi girl(if you know you know). Late-night coding sessions are practically a rite of passage in the computer science world as the thrill of solving problems and watching your code come to life is extremely rewarding. However, the toll it takes on your physical and mental health is also extremely undeniable. This semester I have had the privilege of sleeping most mornings as my classes and part-time jobs are in the afternoon or past that, so sleeping late at night has not bothered me as much as it would have if I had early-morning obligations. Even though I’m getting around 5-7 hours of sleep, the irregular sleep patterns and long hours in front of my computer bring challenges that are worthy of discussion.

  1. Irregular Sleep Patterns:
    Late-night coding more than often leads to irregular sleep patterns which disrupt the circadian rhythm, this results in fatigue and creates difficulties in concentrating let alone long-term health issues.
  2. Sedentary Lifestyle:
    Long periods of coding mean long periods of sitting. The sedentary lifestyle created as a result can contribute to health problems like obesity(my excuse for getting a beer belly at 20), back pain, and even cardiovascular issues. This can also decrease your stamina to the point that even going through 2 flights of stairs can cause you to have short breath.
  3. Mental Burnout:
    When you keep pushing yourself too hard for extended periods of time the only thing you’re gonna end up with is having mental burnout. Have you ever gone to class and could not remember how to write a for loop? That’s exactly what mental burnout is. The lack of motivation, increased stress, and plunged creativity are just a couple of the symptoms that can throw all your hours of coding into the trash bin.

Even though these challenges might seem harsh at first, there are some practices you could follow that ease the strain on your body during this hard work.
Creating a consistent sleep routine will lead to better health. You can sleep even during “unconventional” hours, it just matters that it remains consistent and your body will thank you for the predictability.
Taking regular breaks can combat the negative effects of prolonged work sessions. The most popular practice is the 20-20-20 rule in which every 20 minutes you look at something 20 feet away for 20 seconds to reduce eye strain. Personally, I have never liked this rule as getting away from work every 20 minutes really disrupts my workflow and most of the time it distracts me from solving particular problems that I may have been working on, so I came up with my own method. Every 50 minutes, I give myself 20 minutes of break time dedicated to anything else besides sitting in front of the computer. Stand up, do some stretching, grab a bottle of water, grab a snack, open up a window, and just stare outside. If you’re at the 50-minute mark but don’t feel like disrupting your workflow? Continue working but when the time to take the breaks comes again give yourself 5 extra minutes for every 10 minutes you kept working.
Doing something physical during the break time is even better. You can do simple exercises that do not require much room or any equipment. My personal favorites:Toe touches, that thing you do where you pretend you’re a sea lion(I forget the name of the stretch), and push-ups.

In one of my previous blog entries “Scruming through the semester”, I mentioned that breaking the work into smaller more manageable tasks helps in productivity, that advice is valuable here again as this not only makes your work more achievable but it also prevents burnouts.

What’s more important is to know when to stop. Start recognizing the burnout signs and know when to step away. Good work comes from a healthy mind and more than often the best solution to a hard problem is some good quality sleep. It’s easy to prioritize code over your well-being in the fast-paced world of computer science. However, keeping your mental well-being and physical health is a crucial step to sustain success in this field. Incorporating good and healthy habits into your coding routines can ensure that your overnight sessions are productive and sustainable in the long run. As one of my good professors has said: “You can save your code and work on it later, you can’t save your health and load it when you get sick.”.

Ano out.

From the blog CS@Worcester – Anairdo's WSU Computer Science Blog by anairdoduri and used with permission of the author. All other rights reserved by the author.

The Effects of AI on the Human Workforce

Automation is an often-overlooked concept when it comes to the study of how human civilization has evolved, which, is a shame, since it has had such a crucial role in making the modern world. The invention of farm equipment meant agriculture required less labor, allowing people to focus their lives on education. These people would go on to create further innovations, creating a cycle in which people create new technologies that give subsequent generations more opportunities to design their own creations.

The automotive industry is a great modern example. Several decades ago, car production plants employed millions, while now, these same factories almost exclusively use robots for the manual labor tasks previously delegated to humans. On the one hand, this has many benefits. Cars are now easily affordable to the regular person and production is now streamlined and faster. On the other hand, however, those jobs working on the factory line are gone, and those previously working on them are left without work.

As artificial intelligence explodes into the modern world, this same process is already beginning to take place. According to Yahoo Finance, as of July 2023, almost a quarter million employees working in the tech sector have been laid off due to being replaced by AI. The idea of replacing expensive employees with comparatively free AI labor is an extremely enticing opportunity for business executives. Just as robots replaced human workers on assembly lines, AI programs have begun to replace human workers sitting in the office.

This is not a phenomenon exclusive to the tech sector either. If you’ve ever had to talk on the phone with customer service for any large company, the voice you first hear after dialing often is no longer a human, but rather a computer. By using voice-to-text software powered by machine learning, calls can be filtered by issue type, and automatically directed to the proper department, where a human can address the caller as required. Sometimes, you won’t even talk to a person at all.

For the sake of clarity; the advancement of machine learning will not lead to artificial intelligence replacing the entire human workforce. Remember back to the previous point about how automation led to the loss of jobs in the automotive industry? This also led to new jobs being created, from designing and programming robots to assemble cars, to technicians maintaining these robots when they inevitably break. The same can be said for artificial intelligence. While self-driving cars may some day replace taxi drivers, this would also lead to job openings in developing and maintaining the software behind them.

The idea that AI will replace humans completely is a scary pitfall to get into, however, this isn’t a situation that humans haven’t experienced before. As technology grows and develops, so does society. Usually for the better.

Works Cited

Bizouati-Kennedy, Yael. “How AI Is Already Causing Layoffs in the Tech Industry.” Yahoo Finance, Yahoo, 7 July 2023, finance.yahoo.com/news/ai-already-causing-layoffs-tech-181221028.html?guccounter=1&guce_referrer=aHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS8&guce_referrer_sig=AQAAAJAmzoKggZHQoJa3SOThKQQJGXifMZImGxyqNzN0QuSfct2VP3Hogm4jAVSBaWYVCO3qG2EFiZ3w9vvVmynD1s7Z-Azpd6vHXVAQGqJzbb8F49e13O-O_d13SdyEm5vAzsdi3hQ3Pni6tJrWmh3Y64m4Fzd_igLHjv54uf8kMykf.

Kothari, Jash. “Artificial Intelligence: Cause of Unemployment.” GeeksforGeeks, 16 Aug. 2019, http://www.geeksforgeeks.org/artificial-intelligence-cause-of-unemployment/.

“Will AI Replace Humans in Customer Service?” Www.ultimate.ai, http://www.ultimate.ai/blog/customer-experience/will-ai-replace-humans-in-customer-service#:~:text=It.

From the blog Butler Software Construction, Design, and Architecture by Griffin Butler and used with permission of the author. All other rights reserved by the author.

Week 11 Choosing a programing Language

I was thinking about our recent classwork activities and our own project and thought about what goes into selecting a programming language. I always assumed it was a preference but sometimes some languages have more benefits than others that can help you in the long run instead of choosing one you prefer. In addition, you gain more knowledge not sticking to one but being able to adapt to others. That is why I decided to find an article about choosing a programming language for your specific project.

This article uses a perfect analogy of how building a house is like choosing your programming language. For example the specifications of the house, what materials will you use, and where you want to build your house. You need to ask yourself similar questions like what kind of project, the development budget, and the complexity of the project. My main takeaway was to have a main objective of your project and have a clear definition of what you intend to do so you may pinpoint the type of application you want to create. Every language has a main focused application purpose like Front End Development: JavaScript, HTML, and CSS, 2D Game Development: JavaScript or C#, and 3D Game Development: C# or C++. There is a large list but being able to envision your project will prevent mistakes from occuring. For this specific project, I believe the article makes a valid point that the development time limit is a great concern in choosing a programming language. With a deadline, you can’t just slack around or try to learn a new programming language with the time constraints so choose wisely. 

Reading this article allowed me to open my eyes to each programming language’s specific uses. I knew that some languages were best suited for different things but allowing me to see the variety was eye-opening. After reading this article I am now able to choose what programming language I will use for my project more efficiently. I know it isn’t the main focus of the project but it’s a step forward. In addition made me think about the small things like security, performance, and maintainability. You may not think about these things as soon as you start but may become big concerns later down the line without the proper planning ahead. For example, performance will only be taken into account late into the project after there has been ample time placed on the project. Maybe the specific application you making doesn’t work efficiently this will hurt meeting your deadline without proper precaution.     

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

Managing your Licenses

When it comes to sharing your work publicly, there are certain things you have to do in order to protect it, and you. Whether the work is a form of art, product, or even code, you have to put a license on it. The creator can put software licenses on their code to allow users to use it in certain ways, according to the license agreement. 

Software licenses are categorized into types, which are ranked from least restrictive to most restrictive. The least is the public domain license, which has no restrictions on your code, meaning anyone can do anything with it. Next is the permissive license, similar to the public domain one, except it has some restrictions on how users can use, modify and redistribute the code. The next one is the copyleft license, which also has restrictions on how to use, modify and redistribute the code, but it also states users must distribute the source code with it. The most restrictive is the proprietary license, which only allows users to use the code if they agree to an agreement, and does not allow them to modify or redistribute the code. Under each of these types, there are licenses that have their own extra requirements, so it is important to look at each one to determine which is a good fit for your code.

In this blog post, Ibrahim Ogunbiyi gives us 7 practices that can help with license management. Step one is documenting your procurement process, document where you purchased software, who did it, when, and other important details. Having documentation on software purchases is important for when you need to look back for information. Step 2, having a central list of all software licenses. If there are multiple departments in your organization, having a central list containing all software licenses is good to have. Step 3, understanding all software license agreements, reading through and understanding the agreements. Step 4, implementing a software license management tool. Having a tool to manage your licenses, tracking use, and optimizing use is really nice to have. This can also knock out step 5, regularly tracking license use, and step 6, keeping licenses accurate and up to date. The tool can do that for you, but sometimes, doing it yourself is nice. Step 7 is training employees about license management, which is important for an organization. Having everyone follow the same methods of management promotes uniformity, which makes things easier.

Although I may not belong to an organization that purchases software, I feel knowing these steps is good. Software licenses, or licenses in general, are scary and confusing. It’s not something you are taught in school, so having learned it in class was nice. I can’t quite relate to this just yet, but it is important to know management tips so that when the time comes, I will be ready. In the future, I know I will be coming back to refresh my mind on it.

From the blog CS@Worcester – Cao's Thoughts by antcao and used with permission of the author. All other rights reserved by the author.

choosing the right software development mythology: Agile, or Waterfall?

Whether you’re embarking on a new project or contemplating a shift in your development approach, deciding between Agile and Waterfall methodologies can be challenging. Selecting the right approach is crucial for the successful development of your project. In this blog, we will analyze the specifics of Agile and Waterfall methodologies to help you make an informed decision tailored to your project’s needs.

Understanding Agile

Ever wondered about the magic behind Agile Software Development? I have recently come across a blog on Agile development by Martin Fowler, a British software developer, author, and international public speaker on software development, who specializes in object-oriented analysis and design, UML, patterns, and agile software development methodologies, including extreme programming. The blog “Agile Software Guide” by Mr. Fowler takes you on a journey through its beginnings and the core ideas that makes Agile work. Written by someone who was there from the start, this blog unravels the secrets of Agile development. The author shares early memories of Extreme Programming and co-authoring the Manifesto for Agile Software Development that sets the stage for an insightful tour through the world of Agile, coming from a credible source who has seen it from its beginnings. The blog dives into the key concepts of Agile thinking, emphasizing how it differs from traditional software engineering. It breaks it down into two main points: being adaptable instead of sticking to plans, and focusing on people rather than processes. A simple breakdown that makes the essence of Agile clear. Mr. Fowler also talks about Agile plans being like a flexible baseline, changing as the project progresses. Unlike traditional plans that demand sticking to a set path, Agile plans are adjusted based on what’s happening. Success in Agile is all about the value the software brings, not just following a rigid plan. However, with all its advantages, the blog doesn’t pretend Agile is perfect. It talks about the challenges, like some practices being called “Agile” when they really aren’t. This honesty adds a dose of reality, reminding everyone to keep an eye on how Agile is actually being used. Agile methodology is often praised for its customer-centric, and flexible approach to software development. In Agile, projects are divided into small increments with minimal planning, and teams work in short cycles, known as iterations or sprints. The methodology emphasizes collaboration, customer feedback, and the flexibility to adapt to changing requirements in which results in continuous delivery of functional software, close collaboration between cross-functional teams, stakeholders, and the customers.

understanding Waterfall

Unlike Agile, the Waterfall methodology follows a linear and step-by-step approach. the project is divided into distinct stages where each stage build’s upon the previous one. The development process flows steadily downwards similar to an actual waterfall, through stages like requirements, design, implementation, testing, deployment, and maintenance. Each stage must be completed before the next one begins, and changes are discouraged once a phase is underway.

How to choose the right methodology? 

The choice depends on several factors, such as project requirements, team expertise, and customer involvement in your development process. If project requirements are clearly defined from the beginning, and changes won’t be necessary during the development process, then the Waterfall methodology could be the right choice for you. However, I personally believe that Agile methodology is usually the right choice for most projects.

In today’s world of constant change, adaptability is crucial in any developmental process. Additionally, based on my experience in various customer service jobs, I’ve realized that customers often don’t know exactly what they want. Therefore, having the ability to adapt if the customers’ needs changes’ slightly is incredibly important.

Agile Software Development: A Concise Overview. (2023). Retrieved from https://martinfowler.com/agile.html

From the blog CS@Worcester – The Bits & Bytes Universe by skarkonan and used with permission of the author. All other rights reserved by the author.

software testing

I’ve been coding since around 2017, when I took my first Computer Science course in high school. Since then, I’ve worked on plenty of school projects and a couple of personal projects as well. Software testing had never been a thing I really bothered with meaningfully in this timespan, which is kind of fair considering that most of these projects and assignments weren’t really too complex. I would just print out results for each bit of code as I went along to make sure that the code I just wrote actually works, but I didn’t really go and write actual automated tests.

This semester, I had some exposure to standardized software testing when I worked on a homework assignment in my Software Design and Construction course that required me to adjust some code along with the tests that make sure the code works as intended with intended output. At first, I was sort of confused considering I had never worked with test files, but I appreciated the streamlined nature of this testing. We also had to read up on some software testing methods for a Scrum developer homework assignment we did for this class, Software Process Management.

Today, I wanted to research some software testing basics, and came across a post on IBM’s blog. The post goes over some reasons to software test (the importance of quality control for businesses, what testing even is, etc.) along with types of software tests and practices.

The different types of software tests are fairly easy to understand, and I’ve come across all of them in some capacity before. Acceptance tests ensure the system as a whole functions as intended, integration tests ensure that software components work as intended, and unit tests ensure the smallest testable snippets work as intended. Performance tests evaluate how well software works on different hardware, and stress tests check how much load the software can take without breaking. Regression tests see if new features harm the software at large, and usability tests evaluate how effective the software is for end-users.

Some good testing practices listed in the article are continuous testing, bug tracking, and service virtualization. Continuous testing is the practice of testing each build as soon as it’s available, fairly simple. Bug tracking is, well, bug tracking. The post mentions automated monitoring tools for tracking defects, but I sort of think of this in the sense of keeping an issues list on a git repository, as that’s what I’m more familiar with. Service virtualization is a little more complicated, it simulates functionality that hasn’t been implemented yet to reduce dependencies and test sooner.

What I’m mostly interested in is the applications of these practices, and I’ll likely look into it further at a later time. I understand these concepts fairly well, but the idea of automating tests, at least at my current understanding of it, sounds a bit daunting. I’m sure it saves a lot of time on larger-scale projects, where testing each piece of your code manually for multiple cases will take a lot of time. I’m interested to see what this looks like in an example.

From the blog CS@Worcester – V's CompSCi Blog by V and used with permission of the author. All other rights reserved by the author.

copyright licenses

We’ve covered software licenses a fair amount in our Software Process Management course. The MIT license, Apache License, and GNU GPL were the most notable for different reasons, but I figure that there are far more licenses that we haven’t necessarily gone over directly in class. I wanted to take the time to familiarize myself with some of these licenses.

Starting off with a CopyLeft license (a type of license I find myself fairly sympathetic to for the sake of keeping software open source), the Mozilla Public License, or MPL, is a weak sort of CopyLeft. According to this post on fossa.org, this means that users must disclose changes, but for a much narrower set of code for each change, file-based for short. When compared to the LGPL, a notable weak copyleft license, the MPL allows users to sublicense as an additional permission. Notable uses of this license are, of course, Firefox and Thunderbird, along with LibreOffice. I do like the idea of having a middle ground between being completely permissive and also wanting to “spread” open-source.

BSD Licenses are permissive licenses that generally have no restrictions. This license seems to fall in line with the big permissive licenses (like MIT) and doesn’t have a viral effect, but requires a copy of the license and a disclaimer of liability. According to a post on AppMaster, the differences between the MIT licenses and the BSD licenses is there being no requirement for a liability disclaimer for the MIT license, no requirement for patent protection on the BSD license, the BSD license being compatible with GPL, and the MIT license requiring a permission notice. I don’t like the lack of patent protection with this one, I know that’s been a fairly annoying issue in the past for various projects.

Lastly, I took a look into the OpenSSL license, as it was on the front page of tldrLegal. Funnily enough, it’s a license styled off of the BSD license, with the express purpose of being used with the OpenSSL project. On the aforementioned tldrLegal page for the license, it mentions in the summary that the license has a special advertising clause, which means that ads mentioning the software in any way must acknowledge the use of OpenSSL. The takeaway, for me, is that if you know exactly what you need with your license, and one that exists has everything you’d like except for one specific requirement or permission, you can build off of that license with that added requirement or permission (assuming that you have a legal expert of some sort write it, I’m assuming).

Overall, I really appreciate the work that has been done to ensure that we have a variety of different ways to license our software depending on what we want done with it. It’s definitely an important aspect of open-source development, and having the resources to find licenses that are closest to the project’s vision is an excellent way to focus on the development and not have to worry about the legal stuff.

From the blog CS@Worcester – V's CompSCi Blog by V and used with permission of the author. All other rights reserved by the author.

Git and Game Development

     A subject that has always been near and dear to my heart is video games. Throughout my life I have always been deeply enamored with games and the process of their creation, from the intricacies of 3d modeling to the various game engines in use. Despite that, I would not say I am an expert in modern game development by any means. As my classes have progressed however, I have begun to understand more about the inner workings of software development and how teams are managed. This led me to investigate how game developers use these tools to manage projects and keep everything orderly. After doing some research, I found that many game engines are compatible with git and have no issue being stored on GitHub. Not only that but prominent game engines like Unreal Engine even have their source code up on GitHub, available for anyone to fork and clone. This was done to allow developers to modify the game engine itself, for whatever purposes they need. Godot is a free open-source engine that uses the MIT license and is also entirely up on GitHub. Of course, even if an engine does not have their code on GitHub or Gitlab that does not mean you cannot just host your code in an online repository. Thanks to what I have learned this semester, I can now make use of GitHub in the creation of repositories for any game projects I have. 

  It is not enough to learn about how game developers make use of git, project management is also a vital tool for game development. In terms of project frameworks, agile methodologies have seen widespread use within various industries, including the video game industry. Scrum is the most prominent of these methodologies and has been adopted by various companies. Due to the nature of video game development, there is a greater need for cross-disciplined teams comprised of developers versed in various skills. Game development can be effectively chopped up into tasks that fit nicely into each increment, for the medium itself necessitates a functioning step by step pipeline. Level designers cannot do anything without the assets created by artists and so on and so forth. The first couple sprints would work on creating functional assets like 3D models, textures, and game mechanics. The goal of each subsequent sprint would be to create a functional game section by section. I hope to one day make use of scrum and help create a game of my own.

https://www.unrealengine.com/en-US/ue-on-github

https://www.gamedeveloper.com/production/agile-game-development-with-scrum-teams

https://starloopstudios.com/best-agile-practices-in-game-development/

From the blog CS@Worcester Alejandro Professional Blog by amontesdeoca and used with permission of the author. All other rights reserved by the author.