Category Archives: CS-348

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.

Clean Code

Week-15: 12/21/2024

It’s easy to get something functional, but is it good? The book “Clean Code” by Robert C. Martin shows how my past coding techniques were wrong. This book isn’t just about making code work; it’s about crafting code that is understandable, maintainable, and, dare I say, beautiful.

The book highlights the importance of seeing code as a kind of communication rather than simply computer instructions. It’s about creating code that’s simple to understand, alter, and, ultimately, live with. The book provides several definitions of clean code, including the following: elegant, efficient, simple, straightforward, and carefully crafted. It also covers ideas and practices including utilizing meaningful names, constructing concise functions, correct commenting, formatting, error handling, unit testing, and so on. The book depicts the transition from sloppy to tidy code. It also includes a collection of code smells or heuristics that might help you write better code. 

I chose this book because I often find myself spending more time deciphering what code does than actually adding new features. I was looking for guidance on how to avoid creating such a mess and to understand what makes code easy to work with, and the book seemed highly relevant to my goals as a student. I also appreciated the idea that code is read far more often than it is written, so making it easy to read is very important.

This book has opened my eyes, particularly to the importance of code readability. It is not enough to have code that is functional; it must also be understandable to everybody who will work with it. This is particularly crucial in collaborative efforts. The author’s description of “code sense,” a carefully developed feeling of ‘cleanliness,’ struck a chord with me. Knowing that code should be clean isn’t enough; we also need to learn how to make it clean. 

I will be putting the principles of “Clean Code” into practice by always striving to leave the code cleaner than I found it. I also plan to be more diligent in naming variables and functions, keeping functions short and focused, and implementing tests to validate and describe code. This book has taught me that clean code is more than a nice-to-have; it is an important component of becoming a professional software developer. I now recognize that “working” code is only the first step; “good” code needs ongoing attention and effort. I’m excited to implement these concepts into my future projects, not just to improve my grades but also to gain more experience programming software.

Book: Clean Code: A Handbook of Agile Software Craftsmanship by Robert Cecil Martin

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

Understanding the Software Development Life Cycle (SDLC)

In software development, having a structured plan is crucial for creating reliable and efficient software. The blog post “What Is the Software Development Life Cycle (SDLC)?” explains what the SDLC process actually is. This directly relates to our coursework, as it lays out the core stages involved in creating software that we’ve discussed in class.

Summary of the Blog Post

The post breaks the SDLC into six main phases:

1. Requirement Analysis – Figuring out what the software needs to do.

2. System Design – Mapping out how the system will work.

3. Implementation – Writing the actual code.

4. Testing – Making sure everything functions as expected.

5. Deployment – Releasing the finished product.

6. Maintenance – Keeping the software updated and fixing bugs after launch.

The post also touches on different SDLC methodologies like Waterfall, Agile, and DevOps.

Why I Picked This

I chose this post because the SDLC is something we covered in class, and I felt like I could benefit from looking into it more. This post explained things in a simple way that helped me review and learn more about the process. Plus, SDLC is something I’ll definitely encounter in any future dev job, so it feels suitable to dive deeper into it now.

Thoughts and Takeaways

This blog really helped me get a better grip on SDLC. I knew the general ideas, but breaking down the phases step by step helped me realize how important each stage is. For example, I hadn’t thought much about how critical the requirement analysis phase is. If you get that wrong, everything else suffers!

I also liked the section about Agile. I’ve heard a lot about Agile but didn’t fully get how it compares to other models like Waterfall. The idea of working in iterations and being flexible with changes makes sense, especially for real-world projects where things don’t always go as planned. I think this will be useful for group projects where feedback loops are constant.

Another thing that stood out is how much emphasis the post put on maintenance. In class and in the blog post, its been made much more clear that maintenance is actually the far lengthier phase, and sometimes never really intended to end.

Applying SDLC

Going forward, I’m going to start structuring my projects with SDLC in mind. Even on smaller assignments, I’ll try to break tasks into phases, just to get into the habit. I also want to experiment more with Agile practices in team projects since it seems to encourage collaboration and adaptability, and is mentioned in a decent amount of job posts.

Conclusion

This blog post gave me a much clearer understanding of SDLC and why it’s such a core idea of software development. It affects nearly every bit of how software comes to be, and all software developers will encounter or deal with it in one way or another!

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

Open source planning how it can be leveraged

https://increment.com/planning/open-source-planning/

From the blog CS@Worcester – My first blog by Michael and used with permission of the author. All other rights reserved by the author.