Category Archives: CS-348

Git Learning

Git is a strong version control system that allows collaboration, monitors changes, and ensures project integrity. The Atlassian Git course explains key techniques like branching, merging, and maintaining a clean commit history, which are critical for effective development workflows. It describes how teams can work independently on feature development using branches without interfering with the main codebase, and how merging techniques guarantee that changes are seamlessly integrated. In order to show how Git can manage intricate projects with several contributors, advanced techniques like rebasing and resolving merge conflicts are also discussed. These ideas are supported by the official Git documentation, which offers comprehensive instructions on topics including marking releases, stashing changes, and fixing errors. I selected these resources because they offer a comprehensive grasp of Git’s features, which are essential for contemporary software development. They provide useful insights into how Git might improve team operations and avoid common development problems, building on the version control system lessons we covered in class. The focus on crafting relevant commit messages, for instance, relates to our lessons on preserving traceability and clarity in software projects. Their emphasis on bridging the gap between complex workflows like conflict resolution and cherry-picking modifications and beginner-friendly techniques like basic commits and branching is another factor in the selection of these resources. These guidelines have demonstrated to me that Git is about more than just code storage; it’s also about fostering teamwork, accountability, and transparency. 

One idea that struck a deep chord was that of “atomic commits.” Atomic commits highlight how crucial it is to organize changes into logical chunks so that each commit embodies a single, coherent concept. Debugging, tracking project history, and undoing particular changes without causing unexpected consequences are all made simpler by this procedure. Changing my perspective has had a big impact on how I handle version control. For instance, I now make extra effort to commit often and make sure that the context and goal of the modifications are explained in detail in my commit messages. In order to eliminate extraneous noise in the project history, I have also begun utilizing Git’s interactive staging functionality to include only pertinent changes in each commit. I want to apply these Git best practices into every project I work on going forward. For example, I’ll employ branching more methodically, making sure that experiments, bug fixes, and features are separated for simpler testing and evaluation. In order to find areas for improvement and keep the repository clear and understandable, I also plan to make it a practice to routinely review the commit history. In order to maintain uniformity and cooperation, I will also urge team members to adhere to the same procedures. By doing this, I hope to enhance both individual productivity and productive teamwork by producing high-quality code and establishing a clear, stable, and future-proof project history.

From the blog CS@Worcester – A Bostonians Blogs by Abdulhafeedh Sotunbo and used with permission of the author. All other rights reserved by the author.

Agileeeee

Agile methods emphasize flexibility, collaboration, and iterative development to deliver high-quality software efficiently. The Scrum Guide explores core practices like sprint planning, daily stand-ups, and retrospective meetings, which help teams adapt to changing requirements and ensure continuous improvement. It highlights the importance of clear roles, such as the Product Owner, Scrum Master, and Development Team, to maintain focus and accountability. Similarly, the Agile Manifesto underscores values like prioritizing individuals and interactions, working software, and customer collaboration over rigid processes. Together, these resources demonstrate how Agile methodologies foster an environment of transparency and adaptability while driving innovation and customer satisfaction. 

I selected these resources because they offer a thorough comprehension of Agile principles, which are critical to contemporary software development. They enhance our classroom instruction on iterative processes and team dynamics, which has made it easier for me to understand how Agile promotes productivity in practical settings. These tools were chosen in part because they emphasize useful strategies like prioritizing client input and dividing work into digestible chunks. These guidelines are particularly helpful for keeping projects moving forward and avoiding the problems associated with strict, long-term planning. For instance, I had trouble with scope creep and late deliverables in earlier projects. Following my study of these materials, I came to understand how Agile frameworks, such as Scrum and Kanban, might lessen these problems by encouraging gradual development and frequent review cycles.

One concept that resonated deeply was the principle of “embracing change.” Rather than viewing changing requirements as a hindrance, Agile promotes adapting to them as a competitive advantage. This mindset has changed how I approach project management. I now see flexibility as an integral part of the development process rather than a disruption. Moving forward, I plan to integrate Agile practices like iterative development and regular retrospectives into my work. By doing so, I aim to create workflows that are not only efficient and adaptive but also aligned with customer needs and evolving goals.

Moving forward, I plan to integrate Agile practices like iterative development, regular retrospectives, and active stakeholder involvement into my work. To guarantee that all stakeholders are included and that input is consistently implemented, for example, I try to include user stories and sprint reviews. In order to increase focus and productivity, I also plan to implement the timeboxing concept. By doing this, I hope to develop processes that are not only effective and flexible but also in line with changing objectives and client needs. In addition, I want to create a cooperative atmosphere where candid communication and mutual responsibility propel the project ahead. By using these techniques, I will be able to provide not only functional software but also long-lasting solutions that genuinely satisfy user needs.

From the blog CS@Worcester – A Bostonians Blogs by Abdulhafeedh Sotunbo and used with permission of the author. All other rights reserved by the author.

The new partnership between GitLab and Amazon Q

A brand new partnership was just created between GitLab and Amazon Q. It has revolutionized the traditional flow of software development with its new AI capabilities. Now with the help of Amazon Q’s ai driven assistant developers now can get help in complex tasks including feature development, code reviews, and even codebase upgrades. Developers can use Amazon Q with simple commands in GitLab, which can streamline their workflow and boost productivity. The partnership offers capabilities like automated code generation, assisted code reviews, and legacy code upgrades, all inside of GitLab. This helps developers be able to focus their time on other tasks required for development rather than coding in order to enhance their productivity. 

The reason I chose this specific resource was because throughout the entire semester we mainly used GitLab and I believed that it had a lot to do with the majority of what we learned in class. Not only this, but because ai is one of the biggest topics and technologies in the world right now and I believed that this new partnership with GitLab was going to make every aspect of it much easier and make it much more efficient and efficiency in coding is another topic we went over in class a lot as well, with Scrum and Agile principles. I also believed that this would be not only important for me to learn, but others as well since this new program helps with many of the slowest parts of coding. I believed that it was a tool that would serve not only me, but everyone else who is majoring in computer science very well. This new information has also changed the way I think about software development as it shows that ai is not just some popular, interesting and controversial media topic, but now it is a useful tool that is being included into the daily process of developers. It is clear that anyone who wants to one day be a software developer must be able to not only code well, but also know how to use ai in the most efficient way possible. 

I plan on using this in the future by using AI more to be able to assist me in generating code, but also to stay mindful on a good balance between ai and my own ideas in order to make sure my coding is the most efficient it can possibly be and to keep the quality of my code as high as I can.

Link: https://aws.amazon.com/blogs/aws/introducing-gitlab-duo-with-amazon-q/

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

The cost of Software development

In this class we have talked about the process of building software many times, but we never really looked into how much this software might cost to create and some different factors that would make a difference in it. I personally found this part of coding the one I kept wondering about so I found a blog post by Kacper Rafalski to learn more about it since if we are spending so much time on the creation of software it would be useful to know all the different aspects of its pricing including project size, complexity, team composition, and technology choices. 

First he explains the cost depending on the software type. The cost of software development depends a lot on the type of software being built. If the project is based on web development it can range from affordable prices to more expensive ones, while if you are creating a mobile app it becomes way more complicated and costs a lot more due to problems that arise where you need to support multiple operating systems for multiple types of phones. Meanwhile custom software development, which involves creating different solutions depending on the case, also varies in price based on the features required to create it and specialized fields like cloud computing and embedded systems are often very flexible and seen as better, but often makes the program cost much more expensive since it is a lot more complex than the other systems. He then explains that a project’s size including its features makes a big impact on its size, but also it has a lot to do with the diversity of its functions. A small company that wants a basic software might have to pay $100,000 meanwhile a bigger company that wants a more complex software will get a starting range of around $600,000. Pricing also depends on the developers. Developers that have much more experience will require much higher rates due to them being much quicker at working as well as being able to handle much more complex projects. There are also some hidden costs like maintenance that will be charged and system integration. The post talks about common pricing models in software development, like the Fixed Price, Time-and-Materials, and Dedicated Team models. Each model has its advantages and is suited for different project types and client needs. Overall the post recommends carefully planning your projects to budget well using different strategies to remain cost effective. 

Overall I believe that I learned a lot from this post and from now on I plan on approaching different projects with a more realistic and cost effective approach. I also learned that creating projects isn’t just about how well you can code, but also about planning strategically and managing my resources and budget as well as I can in order to be a better team player.

Link: https://www.netguru.com/blog/software-development-cost

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

Software Licenses

Role of Software Licenses in Protecting Your Code

Software licenses are essential tools for developers, companies, and organizations that create digital products. These licenses set the boundaries under which software can be used, edited, or shared, ensuring that the rights and responsibilities of creators and users are clearly outlined. By setting these boundaries, software licenses protect intellectual property, foster trust, and encourage innovation. They encourage more people to want to put out their work into the world for it to be utilized by everyone. Whether you’re an independent developer or part of a large organization, understanding and implementing the right license can make or break the success of your software.

Licenses are not just legal jargon—they’re critical to the security and success of your software. Without a license, your work may be misused, copied without acknowledgment, or exploited without your consent. By clearly defining permissions and restrictions, licenses empower creators to protect their investments while allowing others to contribute in ways that respect the owners’ visions for their software.

Real-World Example: SatixFy’s Landmark Licensing Agreement with MDA Space

link: https://news.satnews.com/2024/10/23/satixfy-signs-million-software-development-license-agreement-with-mda-space/

On October 23, 2024, SatixFy, a leader in satellite communication technology, announced a multi-million-dollar software development license agreement with MDA Space. This deal grants MDA Space access to SatixFy’s advanced software solutions for use in their satellite systems, setting the stage for groundbreaking collaboration. The agreement reflects the importance of licensing in facilitating partnerships that push technological boundaries, especially in fields as innovative and demanding as space exploration. This encourages new discoveries and developments to be made in space exploration showing the impact that this license can have.

The SatixFy-MDA agreement exemplifies how software licenses can drive collaboration and innovation. By granting controlled access to its proprietary software, SatixFy ensures its intellectual property is protected while enabling MDA Space to use cutting-edge solutions to make out-of-this-world collaborations. This approach benefits both parties, fostering trust and creating opportunities to develop next-generation satellite systems. Licensing agreements like this pave the way for advancements that could redefine how we approach space communication and exploration.

The success of software can a lot of the times solely depend on how it’s licensed. A well-chosen license can protect against people using the product and possibly distributing it while misconstruing the purpose of it and at the same time enabling growth and fostering trust among users and collaborators. Open-source licenses may help establish a community around your software, while proprietary licenses can ensure you retain control over commercial applications. On the other hand, poor or unclear licensing can lead to legal disputes, misuse, or a loss of control over your work. Overall, licenses are a big help in allowing software to succeed as well as setting the path for further innovation and collaboration.

From the blog CS@Worcester – coding.upcoming by Simran Kaur and used with permission of the author. All other rights reserved by the author.

Literature in computer science

To really boost your understanding, it’s better to dive into academic computer science papers instead of just watching tutorial videos. This approach helps build a solid foundation and explore future trends in the field. The article shares the journey of the “Papers We Love” team—Zeeshan Lakhani, Darren Newton, and David Ashby—who, even without formal training in computer science, explored key papers to expand their knowledge. Their experience shows how academic papers can shed light on the development of programming ideas and spark new ways to tackle problems.

The blog also recommends four key papers for anyone curious about computer science research, such as:

  • “Communicating Sequential Processes” by Tony Hoare
  • “Dynamo: Amazon’s Highly Available Key-value Store”
  • “A Unified Theory of Garbage Collection”
  • “Out of the Tar Pit”

Getting into literature can really help programmers grasp the theory behind their tools and methods, which can lead to smarter and more efficient software development.

I picked this blog because I think computer science is more than just watching tutorial videos. A lot of folks get stuck in “tutorial hell,” just binge-watching without really getting the deep understanding they need. This blog points out that diving into academic computer science papers can help break that cycle. By engaging with the core literature, you can expand your knowledge and discover insights that tutorials might miss. Checking out research papers allows programmers to really grasp concepts better and come up with more creative and informed solutions.

Reading academic papers in computer science is, in my view, an essential practice for individuals aiming to enhance their knowledge of the discipline. Such papers frequently lay the groundwork for subsequent innovations and offer perspectives that are not typically addressed in conventional resources or tutorials. Although the terminology may occasionally be complex, the endeavor to comprehend these documents is rewarding, as it cultivates a more thorough understanding of emerging technologies and theoretical progressions. By immersing themselves in academic literature, both developers and researchers can remain at the forefront of trends, improve their analytical abilities, and make significant contributions to the wider technology community.

Blog: https://stackoverflow.blog/2022/12/30/you-should-be-reading-academic-computer-science-papers/

From the blog CS@Worcester – Matchaman10 by tam nguyen and used with permission of the author. All other rights reserved by the author.

Agile: Continued

Quick recap of the first post, Miriam Posner saw an Agile team working and as an outsider decided to research more about the process. The article started with the defining of programmers as software engineers, an attempt to add structure to the confusing new field. From there was the “waterfall” development process, a term coined as a joke that was picked up by the management and used until the inflexible nature nature caused one too many projects headaches. A new movement was made by 17 managers who wrote the “Agile Manifesto” in February 2001.

Picking up from there Miriam goes into a little more detail on “waterfall” shortcomings as developers see it, the largest of which appears to be that any slowdown was seen as a ‘deviation from management’s careful plan’ because software development was inherently stable, at least from management’s pov. Agile was supposed to be about removing long-term, higher level plans set in stone in favor of short-term, quick-paced goals that would give more flexibility for developers. Remove useless meetings about every little thing so developers can actually fix the problems at hand. Miriam notes that at this time there were few qualified devs, so they had all the power and could have asked for unions or complete IP ownership. Instead they asked for more efficient working conditions so they could do their jobs.

While this sentiment from coders culminated in the 2001 manifesto, according to the Agile consultants Planview it took until 2012-2015 for more than 50% of active development teams to characterize themselves as “Agile”. So that was it right, new mindset and all’s hunky-dory. Except it wasn’t.

In a cruel twist of fate, Miriam noticed a flaw in that Agile team that she had been watching be so efficient and intriguing. They didn’t seem to be getting much work done. What had happened was that due to throwing out the top-down approach to project management, no one on the coder’s side had a solid concept of the project in its completed form. They had thrown out the baby with the bath water. Add on to the fact that, while definitely anti-management Agile was in a way very pro-corporate. The entire mindset was let developers put their all into the project, which in turn is believed to have contributed to the recently seen burnout rate increases. On top of this is the issue that, due to Agile’s inherently non-structured nature as a mindset, there’s no one thing someone can point to to say “this is not good we need to change it.” Since nothing is actually defined in Agile, everything is subjective and thus at the whim of whatever the company decides.

From this article I have come to see that flexibility in my future work is necessary, don’t try to plan every part from day one. However it is equally important to try to start with a skeleton, something that I can add my features to so that I know both where my projects are at as well as what it can become. Hopefully this adjusted mindset will allow me to continue doing what I love for a long, long time.

Link:
https://logicmag.io/clouds/agile-and-the-long-crisis-of-software/

From the blog CS@Worcester – Coder's First Steps by amoulton2 and used with permission of the author. All other rights reserved by the author.

Versatile of IDE in Development Environment

Integrated Development Environment, commonly shorten as IDE, is something that exists among the modern Development Environment today. Imagine the common text editors software such as Notepad on Windows, or TextEdit on Mac, we can theoretically write the code and save it as the correct extension file, such as *.py, *.java, etc.. However, this requires us to learn every syntax of the code, as well as time consuming in terms of managing the working directory in the project. Therefore, the blog article “Understanding Modern Development Environments: A Complete Guide” by Matthew LeRay, will help us how to easily manage the development environment process in terms of the versatility.

In summary, the blog article gives us the basic introduction surrounding the definition of Development Environment. It is about comprehensive setup of hardware and software tools that software developers use to create and maintain software systems, along with other elements such as Developing, Testing, Staging, and Production Environments. The article highlights how IDE compared to traditional text editors process, which what we know today are syntax highlighting and code completion, and more highlights on the point of time consuming, enhancement of developer proficiency, and customization tools. And lastly, the article highlights the importance of development environment, where the goal is for enhancing developer productivity and ensuring high-quality software output.

I choose this blog article personally due to my own curiosity of “What if I try using a text editor software on my computer to write code?” The article did give a basic introduction in terms of the long evolution where IDE is formed from the traditional use of Text Editors. Reflecting on what I’ve learned using VS Code, it is not just basic functionality such as code completion and syntax highlighting, the versatility of IDE expands to the advanced features, such as integrated version control, and collaboration tools, in order to catch up with time management process as the complexity of the project grows over time. Overall, this blog article helps me learn that I can’t simply just rely on the text editors software, such as Notepad or TextEdit, as mentioned from the introduction of this blog post. And the reasons for why not can be seen as I started to get touch on the higher complicated project, where using an IDE such as VS Code would reduce the time process, as well as further advantages such as working with collaborations team, compared to solo development.

In my opinion, it’s easy get familiar with advanced, and modern Development Environments, where I think collaboration and time management could reduce the complexity of managing the project in the real world. Hence, trying to setup the crucial elements such as the right IDE, Version Control System, can be the good start when working with the modern Development Environment, to expand my versatility when working on with necessary tools to enhance the development proficiency, and for the overall production enhancement.

Blog Article: https://speedscale.com/blog/modern-development-environments/

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

Why Clean Code is so Important for Workflow

When coding there are a lot of factors to consider, the time complexity of your algorithms, the space complexity as well, and even power efficiency can all affect the decisions you make and the flow of your program. It’s a complicated task and with constant distractions in our ever-growing busier and busier lives the need to make the coding process as quick and easy as possible is constantly present (of course it almost never is quick and easy).

One way that we can optimize our time effectiveness is clean code. What is clean code? As Thiraphat Phutson puts it in his blog, “The Art of Clean Code: Writing Code that Lasts“, it’s code that’s easy to understand, maintain, and extend.

There are plenty of aspects to writing clean code such as using good naming schemes for variables and functions, proper spacing, consistent indentation and bracket use, the list goes on and on. And just like there’s many aspects of clean code there’s plenty more attributed to “messy” coding.

So how does clean code apply to me? As a major in computer science the ability to code is almost the entire point of my degree. Learning how to keep my code clean and organized, making it easier for myself to understand if I ever need to come back to it as well as fellow team members and coworkers is incredibly important.

As I’ve mentioned my honors project in my past few posts, I’ll mention it again here. Although as I’m writing this my project has been submitted and is officially done in terms of what my professor will see for now, I’m not done with it. In fact, I’ve barely begun. Most of my honors project was geared around performing my own sprint for a product I’ve chosen to create. In the first sprint I completed almost no coding got done, most of it was setting up to be able to start programming the project.

This is where I can take the clean code skills I’ve acquired, and make sure that as I’m coding what I can only imagine is going to be a very complex project I’m keeping it organized and efficient. As Phutson mentions, clean code allows for maintainability, scalability, and efficiency, all things I’ll need for my project. He also mentions collaboration which is another fantastic aspect of writing clean code, but it doesn’t apply as much to my case with me being the only developer.

Clean code is an incredibly important skill to have in the computer science world and I’m grateful to have had not only an introduction to it but some practice with it as well. I will be sure to keep it ever-present in my mind as I code not just my current project but any project in the future.

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

Reliability in Development Environments

This week, the blog that caught my attention was “How to Make Your Development Environment More Reliable” by Shlomi Ratsabbi and David Gang from the Lightricks Tech Blog. This work highlights common challenges encountered in software development and provides actionable solutions — specifically, how to optimize development environments. The insights offered in this blog align perfectly with our coursework, as we have continuously learned about and worked within our own development environments. This post emphasizes the importance of ensuring consistency and reliability when creating these environments, offering practical advice to achieve this goal.

The writers begin by outlining the necessity of development environments, describing the challenges that arise during software releases. These challenges include discrepancies between local and production configurations, mismatched data, permission conflicts, and system interaction issues. While creating a shared development environment may seem like the obvious solution, the authors point out that this approach introduces its own set of problems, such as debugging difficulties due to parallel testing, interruptions caused by developer collisions, and divergence between shared and production environments.

To address these challenges, the authors advocate for the implementation of branch environments. Branch environments are independent, isolated setups for developing and testing specific features or issues. These environments, when paired with tools like Terraform, Argo CD, and Helm, enable integration with Infrastructure as Code (IaC) and GitOps, automate infrastructure management, and ensure automatic cleanup of unused resources. This approach promotes consistent documentation of dependencies and application details within version control systems like GitHub. The blog includes a clear diagram and code snippets that effectively demonstrate how to set up branch environments using these tools, making it accessible and actionable for readers.

Branch environments offer several key advantages. By isolating changes, they ensure that all updates are properly tracked, simplifying debugging and maintaining consistency across development efforts. This isolation also eliminates conflicts inherent in shared environments, reducing the risk of outdated configurations or data interfering with new testing and development efforts. Tools like Terraform and Argo CD further enhance this process by automating repetitive tasks such as infrastructure provisioning and application deployment, saving developers time and reducing the likelihood of human error.

Additionally, branch environments improve resource efficiency. Since these environments are ephemeral, they are cleaned up automatically when no longer needed, freeing up valuable system resources and lowering costs. The inclusion of tools like Helm simplifies configuration management, even for complex architectures, ensuring a streamlined, manageable workflow.

Overall, this blog provides a thorough and practical framework for tackling one of the most common challenges in software development: creating reliable and consistent environments. The adoption of branch environments combined with IaC and GitOps principles enhances scalability, collaboration, and efficiency. As I continue to develop my own projects, I plan to incorporate these strategies and tools to build environments that are both robust and resource-efficient.

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