Category Archives: Week 7

Stay in the Trenches: Nurturing Your Passion for Software Development

In a world where promotions often signal success, it’s crucial to consider whether ascending the corporate ladder aligns with your true passions. George Leonard, in his book “Mastery,” cautions against succumbing to the allure of quick-fixes, urging us to stay committed to our craft despite the tempting promises of managerial roles.

Summary of the Pattern

“Stay in the Trenches” challenges the conventional notion that climbing the organizational ladder is the only path to success. It emphasizes the importance of remaining immersed in the technical aspects of your profession, particularly in software development, rather than transitioning into managerial roles prematurely. By prioritizing hands-on experience and continuous learning, individuals can sustain their passion for their craft and avoid the erosion of their expertise.

Reaction to the Pattern

This pattern resonates deeply with me as a software developer. It underscores the significance of staying true to one’s passion for programming, even in the face of enticing promotions. The idea that mastery diminishes when one veers away from practice serves as a powerful reminder of the value of continuous engagement with technical challenges.

The pattern prompts me to reconsider traditional notions of career advancement and success within my profession. It encourages a shift in perspective towards recognizing the intrinsic satisfaction derived from honing in on one’s skills, rather than solely pursuing external markers of achievement.

Furthermore, “Stay in the Trenches” has prompted me to reflect on the role of leadership and influence within technical domains. It highlights the potential for experienced practitioners to advocate for environments that facilitate ongoing learning and growth, not just for themselves but for their colleagues as well.

Disagreements with the Pattern

While I largely agree with the principles outlined in this pattern, I acknowledge the complexity of navigating career trajectories within different organizational contexts. While staying in the trenches may be an ideal scenario for some, it may not always be feasible or conducive to professional growth in every situation. In some organizations, the pathways for technical advancement may be limited, and promotions into management roles may be unavoidable for those seeking career progression. Additionally, the pattern’s emphasis on rejecting promotions may not align with everyone’s career aspirations or financial needs.

In conclusion, “Stay in the Trenches” serves as an important reminder of the importance of nurturing one’s passion for software development amidst the attraction of managerial positions. By prioritizing technical excellence and continuous learning, individuals can navigate their career paths with intentionality and authenticity, ultimately fostering a deeper sense of fulfillment in their professional challenges.

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

Week 7: CS-448

Concrete Skills

For this post, I read about the Concrete Skills pattern. This pattern is about when seeking a new role on a development team, the team may not want to risk the possibility that one may you be able to contribute to the team. They may think this because you may not have much concrete work to show your skillset and prove to teams you are able to contribute. The solution to this problem according to the text, is to acquire and maintain concrete skills. In order to do this, the text suggests collecting CVs of people whose skills you respect. Collecting CVs helps give an idea to what skills are useful and looked for when joining these teams. After learning these skills, then build a project using them to demonstrate that you can apply those newly learned skills.

I found this pattern to be useful because I am currently in the process of applying to jobs, so this pattern is very prevalent to me. Collecting CVs of those already in the industry, or those with more experience is something I had not thought of. However I believe it is a good way to find skills that you may be missing. Collecting a list of skills is also useful in the sense that common buzzwords used among CVs can be noted to help get past HR filters and managers who construct teams based off of those buzzwords.

I found the statement that describes hiring managers requiring to take a leap of faith on choosing who they hire, and having concrete work allows you to meet them halfway to be interesting. I found this to be interesting because it changes my perspective on the hiring process.

This pattern has changed the way I go about looking for new skills to learn. When learning new skills, I sometimes plateau and get overwhelmed with what I should be looking into. Now after reading this pattern, going into the future I will start collecting CVs because having a list of skills will be useful to direct my focus in the skills I should be learning.

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

CS-448 Week 7 Learn How you Fail

The pattern being examined is “Learn How to Fail” and it emphasizes the inevitability of failure in everyone’s life. It also suggests that failure is not a sign of incompetence but rather an opportunity for growth and self-awareness. This encourages individuals to analyze their failures, understand the underlying patterns, and address them effectively without dwelling on past mistakes or striving for perfection.

This pattern resonates deeply with me due to the universal nature of failure and brings light to the fact it is a natural part of the learning process. I am one that values continuous self-improvement and find the idea of embracing failure as a catalyst for personal growth both empowering and liberating. Instead of viewing failure as inadequate, it is seen as an invaluable source of feedback that can inform my future decisions and actions.

One of the more interesting and useful aspects of this pattern is its emphasis on self-reflection and self-awareness. The pattern provides a practical framework for introspection and self-discovery by encouraging individuals to identify recurring patterns, habits, and behaviors that contribute to their failures. This will help individuals to make more informed choices and develop strategies to lessen their weaknesses effectively.

This pattern has certainly influenced the way I think about my intended profession and how I approach my work. Failure is now viewed as an opportunity for learning and development rather than a setback or source of shame. I intend to face challenges and setbacks during my career path and handle them with resilience, knowing that they will contribute to my overall growth and success.

While I do not disagree with the general message of this pattern, there can be cause for concern given how you might handle failure. It is important to acknowledge and learn from failure, it is just as important to celebrate successes and achievements. Failure can provide valuable lessons but can also overshadow or diminish one’s accomplishments in the search of self-improvement. Balancing both self-reflection and self-affirmation is crucial for maintaining a healthy mindset and sustained motivation.

In conclusion, the pattern underscores the importance of embracing failure as a steppingstone to personal and professional growth. By cultivating self-awareness, learning from mistakes, and approaching challenges with resilience, individuals can navigate their professional journeys with confidence and adaptability.

5. Perpetual Learning | Apprenticeship Patterns (oreilly.com)

From the blog CS@Worcester – Jason Lee Computer Science Blog by jlee3811 and used with permission of the author. All other rights reserved by the author.

Another Look at Boundary Value Analysis and Equivalence Class Partitioning

Recently in CS443 – Software Quality Assurance and Testing we’ve been learning some of the conceptual aspects of code testing that are required to identify the relevant points of programs to test as likely break points. We’ve primarily learned about Boundary Value and Equivalence Class testing strategies, so I decided to find a blog to learn more about each of these from a third-party perspective. I landed upon a (relatively) recent blog on TestSigma – a (automatic) testing platform – from June 2023.

The post discusses the overall importance of software testing in ensuring functionality and reliability of software products focusing on the defining aspects of the two methods we’ve been learning: ‘Bound. Value Analysis’ (BVA) and ‘Equiv. Class Partitioning’ (ECP). BVA concentrates on testing the boundaries of a system to identify vulnerabilities, while ECP groups similar items into equivalence classes, helping testers target specific areas with a higher likelihood of containing bugs.

Benefits of applying BVA and ECP in software testing include improved understanding of the system, simplified test design, better test coverage, prioritization, and risk management. The applications of these techniques extend to various scenarios, such as database testing, network testing, hardware testing, time-based functionality, and UI testing. An interesting point that the article emphasizes is that BVA and ECP are often used together, providing an example of testing a form that accepts age as a number. It suggests partitioning the age range into groups for more effective testing while also considering likely break points.

Common challenges discussed to avoid when using BVA and ECP include restricting testing to input values alone, making assumptions about limits and classes, ignoring user behavior, over-relying on these techniques, and neglecting edge cases. The post concludes by comparing BVA and ECP, highlighting their differences in testing approaches and summarizing them as thought processes that enhance testers’ understanding of the system, leading to improved test coverage and strategy.

Test automation for BVA and ECP using tools like TestSigma (or other softwares) is also discussed, highlighting the potential benefits of saving time, ensuring accuracy, and achieving better test coverage. However, the decision to automate tests should be made considering the cost and benefit of automation and set-up.

Overall, this post taught me some interesting differences between BVA and ECP as well as reinforcing the benefits and basics we learned in class. One interesting aspect of this blog that I noticed in review is that it was written by author Apoorva Ram, a non-white woman in the computer science and specifically software engineering industry. This demographic represents a sparse minority in the computer science field and worth recognizing alongside their contribution with this and other blogs.

Sources:

https://testsigma.com/blog/boundary-value-analysis-and-equivalence-class-partitioning

From the blog CS@Worcester – Tech. Worth Talking About by jelbirt and used with permission of the author. All other rights reserved by the author.

Mastering Advanced Unit Testing: Test Doubles and Code Coverage for Beginners

As developers, writing robust, reliable code is a top priority. And when it comes to ensuring the quality of our codebase, unit testing plays a pivotal role. However, as we delve deeper into the realm of unit testing, we encounter advanced concepts like test doubles and code coverage, which might seem intimidating at first glance. But fear not, for in this beginner’s guide, we’ll demystify these concepts and explore why they are essential for writing high-quality code.

Understanding Test Doubles

Test doubles, also known as mocks, stubs, or fakes, are objects used in place of real dependencies in unit tests. They simulate the behavior of these dependencies, allowing us to isolate the code under test and verify its interactions with its collaborators.

For instance, imagine you’re testing a class that relies on an external API. Instead of making actual API calls, you can use a test double to mimic the API’s responses, ensuring your tests run swiftly and independently of external factors.

Test doubles help in:

  1. Isolation: By replacing real dependencies with test doubles, we can focus solely on testing the behavior of the unit under scrutiny without worrying about the intricacies of its collaborators.
  2. Speed: Since test doubles operate in-memory and don’t involve external resources, tests run faster, contributing to quicker feedback loops during development.
  3. Determinism: Test doubles allow us to create predictable test scenarios, ensuring consistent and reliable test results across different environments.

Code Coverage

Code coverage measures the proportion of a codebase that is exercised by automated tests. It provides insights into areas of code that lack sufficient test coverage, enabling developers to identify potential bugs and improve overall code quality.

While achieving 100% code coverage doesn’t guarantee bug-free software, it serves as a valuable metric for assessing the thoroughness of our test suite.

Code coverage aids in:

  1. Identifying Untested Code: It highlights parts of the codebase that lack test coverage, prompting developers to write additional tests for those areas, thus reducing the likelihood of undetected bugs.
  2. Improving Confidence: Higher code coverage instills confidence in the codebase, indicating that most critical paths and edge cases are adequately tested, thereby reducing the risk of regressions.
  3. Refactoring Safely: With comprehensive test coverage, developers can refactor code with confidence, knowing that any unintended changes are likely to be caught by existing tests.

In conclusion, mastering advanced unit testing techniques like test doubles and code coverage is crucial for any developer striving to deliver high-quality software. By leveraging test doubles, we can isolate units under test, while code coverage empowers us to assess the thoroughness of our test suite. Incorporating these practices into our development workflow not only enhances code quality but also fosters a culture of test-driven development, ultimately leading to more robust and maintainable software.

For further reading, check out this article from Christian Findlay on writing testable code and its importance in software development. Happy testing!

From the blog Discoveries in CS world by mgl1990 and used with permission of the author. All other rights reserved by the author.

‘Find Your Mentors’ Pattern

The ‘Find Your Mentors’ pattern is about the idea of “apprenticing” yourself to someone who is more experienced than you are within your field of expertise. While this pattern should be considered for many different professions it should especially be considered for software development as having a mentor can be very helpful especially when you are trying to find your place in the huge world of software. One of the main ideas attached to this pattern is that you will have the realization that you are not the first person to start out being a software developer with little experience professionally as everyone that is currently in the field had to start at the same spot you are currently at and their knowledge can be beneficial to you in order to shape your own career and practices. The solution provided for this pattern is finding a master craftsmen in order to be supervised by them and have the proposed master shape your understanding of the field and your career, but it is also said that with computer science being a relatively ‘young’ field it is hard to find a true master as their are not many people that have ‘mastered’ all of computer science but that there are many people who may have mastered parts of computer science and you should seek out different people in order to increase your understanding of what each mentor you obtain has mastered in their time in the field.

I feel as though this pattern is very important because computer science is younger than many other fields and mentors can be hard to come by in fields which have many ‘masters’ nevermind fields which have very few like computer science. Explaining that it is ok and completely acceptable for a software developer to have many mentors throughout their professional journey in the different disciplines of computer science helps students such as myself realize that you can continue to explore further and further into the field without having to necessarily pick a specific discipline and settle to work on only that discipline for our entire careers but instead that we should feel encouraged to gain more knowledge as knowledge on other disciplines can help us to gain understanding within whichever discipline we are currently working within.

From the blog CS@Worcester – Dylan Brown Computer Science by dylanbrowncs and used with permission of the author. All other rights reserved by the author.

Black Box Testing

https://www.practitest.com/resource-center/article/black-box-vs-white-box-testing/#:~:text=The%20Black%20Box%20Test%20is,is%20carried%20out%20by%20tester.

Black box testing is a genre of testing which does not take a codes functionality into consideration, in other words the internal workings of the code are not known to the test and the tests are formed strictly by external workings. This is very different from white box testing as white box testing operates under the idea that the ‘tester’ has extensive knowledge of how a system was created along with its inner workings. Some of the differences between black and white box testing are black box testing is carried out by ‘tester’ while white box testing is left to software developers, black box testing is considered behavior testing while white box testing is considered logic testing and black box testing is typically used in system testing while white box testing is used in unit testing. There are also ways in which these two types of testing are similar which is mainly their purpose which is to ensure that a system is working correctly and that you have the best version of the software available.

I chose this article because I liked how it not only explained black box testing but it also compares black box testing to white box testing in order to allow a deeper understanding of the relationship between the two types of testing. I am very interested in seeing how different methods of black box testing work as for the most part we have been practicing with white box testing methods in class so far this semester so the concept of testing without extensive knowledge of a system or without access to the systems internal workings and code seems both interesting and challenging to me. 

With there being a large gap in knowledge of a system between the two different types of testing it seems as though black box testing is something that is done by others not necessarily full blown software developers as developers are expected to spend their time on white box testing so It makes me wonder how exactly these tests are written and how specific results may be measured for success compared to the more straightforward nature of white box testing. Since black box testing can be used for just about every type of testing, even some of the sames types of testing white box is used for it would be nice to see and compare how tests are carried out for both types of testing on a similar component of a system in order to differentiate the information used by each type.

From the blog CS@Worcester – Dylan Brown Computer Science by dylanbrowncs and used with permission of the author. All other rights reserved by the author.

The Logic of Software Testing

Hello everyone,

Although we have been studying software testing for a few weeks, I still want to talk about the “logic” of software testing. Because I think it’s important, to test software comprehensively, we must understand the “logic” of testing. So I want to share a blog with you today:

“What is the Underlying Logic of the Software Testing? ”

by ZenTao 3

Link: https://www.zentao.pm/blog/underlying-logic-of-the-software-testing-1-1249.html

As a student new to software testing, I find the topic of test logic particularly interesting. Recognizing its critical role in ensuring software reliability and functionality, I sought out some resources that could help me develop an understanding of the underlying logic behind the testing process. This blog post does a great job of explaining this to me, providing insight into the complex mechanisms that support effective software testing.

In the first chapter of the article, we learned about the basic requirements for software testing:

  • Software testing is to verify whether the functional characteristics of software meet the requirements;
  • Software testing is to find the defects in the software;
  • Software testing includes static testing – requirement, design, and code review
  • Software testing is to systematically and completely evaluate the quality of software products and provide quality information;
  • Software testing is to expose and reveal product quality risks;
  • Software testing is not only a technical activity but also a comprehensive social and psychological activity;
  • Software testing is to greatly reduce the cost of poor quality by investing in quality assurance costs.

These guidelines will play an important role in our future software testing path. All our testing will be conducted based on these guidelines. Also, article mentioned “based on the understanding of the real needs of users, to obtain the true and comprehensive quality information of software products through various means.” If we become professional software testers in the future, during the testing process, we must Always ask yourself if you are being comprehensive.

What impressed me most was the second chapter in the blog: The Underlying Logic of the Software Testing. And its three questions:

  • Why?
  • What?
  • How?

Why: Because humans are not machines, even machines can make mistakes, so human work will inevitably lead to errors and imperfections due to some reasons (personal habits, time, abilities, etc.).

What: Be clear about the goals, scope, and specific data of the test. Prioritize your testing and do not do tests that are not relevant to your goals.

How: Sometimes obtaining existing test data will help us speed up and improve the efficiency of testing.

Overall, this blog is a great foundation for software testing. During our testing process, we need to ask ourselves whether the above problems have been solved.

From the blog CS@Worcester – Ty-Blog by Tianyuan Wang and used with permission of the author. All other rights reserved by the author.

Walking The Long Road To Mastery

In our modern world, the journey to mastery is often overlooked in the software development field. Traditional notions of career advancement can cloud our vision as aspiring programmers, leading us away from the path of true craftsmanship. The Long Road pattern is a reflection on our journey of becoming masters in the field and emphasizes the importance of lifelong learning and growth. 

Reflecting on The Long Road pattern, I found myself in agreement with its core message, while also grappling with the implications it holds for my own career path. The pattern’s emphasis on mastery as a lifelong journey stood out to me, serving as a reminder of the importance of patience and persistence in the pursuit of excellence and success. 

The pattern also presents an analogy to martial artists attempting to receive the black belt and connecting it to software development. This highlighted the discipline, patience, and perseverance required to master any craft. Additionally, we should embrace our path, rather than just fixating on the destination. This reminded me that we should appreciate the process of learning and growth, rather than being solely focused on achieving immediate success. 

The Long Road has challenged me to essentially reassess my approach in the field. Instead of chasing after quick promotions or higher paying positions, I now see value in prioritizing long-term growth and development, and measuring progress based on understanding and my quality of work. Therefore, encouraging me to adopt a more patient and deliberate approach to my career, knowing that mastery is a process that’ll unfold over time. 

While I agree with the message expressed in the pattern, I couldn’t help but wrestle its implications with our rapidly changing industry. Today, new languages, methodologies, and frameworks evolve and emerge by the daily. The notion of dedicating a lifetime to master a single craft could seem unreasonable. While I value the importance of patience in honing my skills, I believe there is merit in adaptability and versatility. As developers, we must remain agile and responsive to change, continuously evolving our skill set to meet the demands of the evolving industry. Therefore, while I understand the message, I believe it’s equally important to embrace flexibility in our journey. 

This pattern has left a mark on my perspective as an aspiring craftsman. It has challenged me to embrace this journey of mastery with patience and perseverance, even when faced with uncertainty. As I continue to grow and walk down this path, I am committed to the principles of lifelong learning and growth, knowing that eventually reaching true mastery is a destination worth striving for. 

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

Code Reviews

Reviewing your code is important, it makes sure that the code is correct and functions the way you want it to. Code review helps cover so many areas of your code. You want to make sure that your code is understandable for anybody else who looks at it and that it’s clear, by reviewing your code you can go back and fix anything that could be making your code more complicated. Code reviewing is important when working with a team, your team should understand what your code is trying to execute without being confused. When it comes to coding so much of your work can change throughout the process which is normal but with so many changes happening it can get confusing. Code reviewing comes with so many different solutions when it comes to writing code it nitpicks what parts are important or not. It’s a helpful tool that helps coders make sure they have clean code and that when working with a team everyone’s comments are heard and changes are made.

Code reviews can be tough if the team isn’t together so questions and comments can’t be answered. Another thing is that the code could be overlapping, and missing a team meeting could affect the code and confuse team members about what they should be writing ending up in similar code. If that happens the next person reviewing the code will find duplicate code and will end up pushing the team’s work behind. Making sure your team communicates will help prevent more code from having to be fixed and reviewed even though you don’t want to add more work on top of what you already have. Code review makes sure your work is good quality and organized. Having sloppy issues and mistakes doesn’t look good for you, your team, and your job. Code review is about making sure your work is organized and clean, you want to make sure you put out good work without having a lot of issues. Especially as a team you want to meet those standards and follow them. Always make sure to review your code because there could be small errors or even confusing comments that will make your code more complicated than it needs to be.

https://blog.pragmaticengineer.com/good-code-reviews-better-code-reviews/

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