Category Archives: Week 3

Concrete Skills – Building a Solid Foundation

Summary of Concrete Skills:

In the world of software development, it’s easy to get caught up in the latest technologies and trends. However, the Concrete Skills pattern reminds us of the importance of building a solid foundation of fundamental skills.

Key points of the pattern include:

  1. Mastering Fundamentals: Instead of chasing after every shiny new tool or framework, focus on mastering the fundamental skills that underpin software development. This includes things like algorithms, data structures, and design principles.
  2. Practical Application: Don’t just learn theory for the sake of it – apply your knowledge in practical ways. Whether it’s through coding exercises, personal projects, or internships, practical experience is essential for solidifying your skills.
  3. Continuous Improvement: Learning is a lifelong journey, and it’s important to continually strive for improvement. Seek out opportunities for learning and growth, and never become complacent with your current level of skill.
  4. Balanced Learning: While it’s important to focus on concrete skills, don’t neglect other aspects of your development, such as communication skills, teamwork, and domain knowledge.

My Reaction:

The Concrete Skills pattern really struck a chord with me because it reinforced something I’ve been realizing lately: the importance of mastering the basics. In a field that’s constantly evolving, it’s easy to feel overwhelmed by the sheer volume of information out there. However, this pattern reminded me that by focusing on mastering fundamental skills, I can build a strong foundation that will serve me well throughout my career.

One aspect of the pattern that particularly resonated with me is the emphasis on practical application. I’ve always been a hands-on learner, so I appreciate the importance of applying theoretical knowledge in real-world scenarios. Whether it’s through coding challenges or personal projects, I’ve found that practical experience not only reinforces my understanding but also helps me discover new areas for growth.

That being said, I do have a slight disagreement with the pattern when it comes to balancing learning. While I agree that it’s important to focus on concrete skills, I also believe that soft skills such as communication and teamwork are equally important. In today’s collaborative work environment, being able to effectively communicate and collaborate with others is essential for success.

In conclusion, the Concrete Skills pattern has reinforced my belief in the importance of mastering the fundamentals and continually seeking opportunities for growth. By focusing on building a solid foundation of skills, I’m confident that I’ll be well-equipped to tackle whatever challenges come my way in my journey as a software craftsman.

From the blog CS@Worcester – Hieu Tran Blog by Trung Hiếu and used with permission of the author. All other rights reserved by the author.

retreat into competence

This is one of those patterns that I feels important to apply to everything in your life, honestly. It’s a well-known phenomena that the more you learn in a field, the more you know that you don’t know much. It’s a sort of complicated sentence, but it rings true: You realize the gaps in your knowledge the more you progress. I find it interesting to approach this problem by doing something you know well, but limiting yourself in doing that in order to not stay stuck and comfortable with what you know already. It makes sense as a solution in that you sort of look back and realize all the progress you’ve made, but don’t stay in that mindstate for too long because it will end in the stagnation of your learning.

I personally feel the imposter syndrome very strongly, not just in programming but also in music and other hobbies that I enjoy. I think this pattern would really help with those who, like me, have a tendency to notice the things we don’t know. The one thing is that I don’t necessarily think that this solution is a “one size fits all.”

I usually take breaks when I feel like this, or just brute force through it. The reason I do this is because, in all honesty, I don’t really like assigning myself work that doesn’t need to be done. It feels as though I’m repeating myself if I go back and do something that I already know how to do when it’s not even an important job. Granted, if I were allotted an opportunity where there is work that needs to be done with something I’m very comfortable with, I’m obviously ready and willing to do it, especially in that mindstate.

That being said, if I weren’t so stubborn about spending my time the way I do, I think this would be a great way to ease that sort of dread regarding the possibility that you don’t know very much despite all the time that you’ve spent. I think it’s definitely a good thing to look back at the work you’ve done and say “you know what, I have gotten better over time,” comparing past self to your current self feels a lot better and more productive than comparing yourself to others, because you can actually see where you’ve grown and what that you are, in some sense, competent.

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.

Indiv. Apprenticeship Pattern: “Expose Your Ignorance”

Between sprint tasks, I continued reading Apprenticeship Patterns: Guidance for the Aspiring Software Craftsman by Dave Hoover and Adewale Oshineye for Software Capstone course this week, focusing on the “Expose Your Ignorance” strategy. In professional environments, software developers are often expected to have a deep understanding of the various tools and technologies they work with, but it’s common to encounter unfamiliar domains/situations.

This strategy approaches these situations by being transparent with employers/teammates about their learning process rather than pretending to already know unfamiliar content – even if the individual is able to self-teach the content to be able to follow through. In reality, they will need to learn the new technologies/skills regardless, and transparency on this allows employers and peers to also see your learning skills and personal growth over the course of a project. 

In doing so, software developers are approaching their situation from an honest angle which is far better for building professional relationships and management expectation. In a manager role, I would much rather hear 

‘well, this API is new to me but I’m making headway in learning and implementing it. I hit an obstacle, which may delay me.’

Over an employee claiming they are an expert and then failing to deliver on time.

As a part of this, the text also differentiates between an “expert” and a “craftsman”.  While experts focus on mastering specific platforms or domains, craftsmen are driven to continually learn and adapt by broadening their knowledge base. Naturally, the craftsman can’t become a master in every topic, but master craftsmen have developed in-depth knowledge of a few separate areas of technology throughout their career and ‘apprenticeship’. So, while they may not be the absolute expert on any given topic, they will have the skills to learn, adapt and overcome challenges involving almost anything.

I appreciated this differentiation and definition of what it means to be a craftsman. Earlier this week, I had a conversation with Professor Meunier in CS497 where he described similar concepts as they relate to graduates and job applicants. As an interviewer, he/others understand that graduates will not have deep knowledge in several areas yet but looks for a wide breadth of concepts/tools we’re at least familiar with and at least one area in which we have a deep knowledge. This could be visualized as a “T” shape – wide topped with one deep portion, but master craftsmen develop a knowledge structure more like an “M”, with a wide breadth of topics and a few with deep knowledge.

Sources: Hoover, Dave, and Adewale Oshineye. “Apprenticeship Patterns: Guidance for the Aspiring Software Craftsman.” O’Reilly Media, 2009.

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.

The White Belt

The White Belt pattern is about adopting a beginner’s mindset when approaching new challenges, even if you’re an expert in a particular field. It encourages setting aside previous knowledge to embrace learning opportunities fully. This mindset shift is crucial for personal and professional growth, allowing people to discover new perspectives, solutions, and approaches. The White Belt pattern offers insights into the process of continuous learning and personal development. It talks about the importance of humility, curiosity, and openness to new experiences, which are important qualities for success in any job. Encourage people to step out of their comfort zones and embrace the unknown.

Something I thought was interesting is the aspect of the pattern and its application beyond programming languages. It has many examples from the field of software development, the principles can be applied to any job or profession. The idea of challenging misconceptions and learning from diverse perspectives is interesting. Also, the emphasis on adopting new skills and approaches to problem-solving is relevant in today’s world since it’s rapidly changing. 

This pattern has caused me to reflect on my approach to learning and problem-solving in my job. It has strengthened the importance of staying adaptable and continuously seeking new knowledge and experiences. Also, it has challenged me to be more open-minded and willing to embrace anything I’m uncertain about and discomfort as part of the learning process. While the White Belt pattern is about adopting a beginner’s mindset, it may overlook the existing expertise in certain situations. While it’s important to go for new challenges with modesty, it’s also important to recognize the strengths and knowledge that come from previous experiences. Keeping a balance of openness to new ideas with confidence in one’s skills is essential for effective learning and growth. In conclusion, the White Belt pattern offers great insights into the process of continuous learning and personal development. By embracing a beginner’s mindset, people can unlock new opportunities for growth and change in their personal and professional lives. However, it’s important to strike a balance between modesty and confidence, recognizing the value of both new perspectives and existing expertise.

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.

Sustainable Motivations

For this week’s blog post, I covered the design pattern “Sustainable Motivations” from chapter three of “Apprenticeship Patterns” by Dave Hoover and Adewale Oshineye. I chose “Sustainable Motivations” for this week’s pattern because I think that maintaining your motivations for your career is one of the most important things you can do for your mental health regarding software development. This chapter discusses why sustainable motivations are essential.

A section of this chapter that stuck with me was when the author says that there will be days when you are surprised that you are paid to write software and how happy you are with what you are working on. The author then mentions that those days are few and far between. “There will be days, weeks, and months when you love your job. You’ll chuckle to yourself, in awe that you actually get paid to develop software. The software you write will flow effortlessly from your mind through your fingertips, beautiful to behold in function and design. These are good and extraordinary days. In other words, they are not your ordinary days.” This was not a massive revelation for me, and I am well aware that most of my time working will be just that, working. I am not necessarily working somewhere because I love what I am developing, though I hope I do love what I am working on. That is the goal, after all.

The authors also go into some detail about what challenges a developer would face in the field. “As Paul Graham so rightly says, the typical programming job will put you face-to-face with tedious, vaguely defined, and needlessly complex problems. Nasty, wicked problems. What’s more, you may also be faced with bureaucracy, difficult personalities, and spotty leadership. There will be days, weeks, and months when you question your commitment to the craft. When you are confronted with such problems, it is crucial that your motivations to program are aligned with walking The Long Road.” Thankfully, with my experiences so far through my education, I feel prepared for the challenges that come from the work itself. From living life, I think that I can navigate bureaucratic and interpersonal issues reasonably well.

From the blog CS@Worcester – P. McManus Worcester State CS Blog by patrickmcmanus1 and used with permission of the author. All other rights reserved by the author.

Week 3 Blog

  This week I chose a blog post that covers the difference between black box and white box testing. In general, testing a program is a vital pillar in producing reliable software to customers. Testing helps uncover and mitigate defects in programs. Blackbox testing refers to the testing technique where the tester has zero knowledge of how the internal source code works. This technique involves the tester executing the code and analyzing the behavior and functionality. The reason why this practice is referred to as “black box testing” is because you can’t see in the box, similar to the tester not having access to the code. The benefit of black box testing is anyone can be a tester. Since the tester does not need knowledge of the internal code, there is not limit to who can be a tester. Non-programmers can execute the code and verify the results. A major disadvantage of this testing is the inability to pin point what caused the error. Since the tester has zero access to the internals, the only thing they know is the program doesn’t function as intended.

  White box testing, also referred to as clear box testing, is a testing method that involves having access to the internal workings of the code while testing it. This testing method requires the tester to have prior knowledge about programming to analyze the source code. White box testing focuses on the internal logic, code structure, and execution paths. This method of testing allows testers to pin point where the program failed, unlike black box. White box testing excels in scenarios where the accuracy and function of the program is crucial, because developers can easily debug. The main disadvantage to white box testing is it can be time consuming, since testers have to first understand the code’s intended function and analyze each line.

  This information is very useful to know when we cover and simulate each type of testing method in class. It’s crucial to know the disadvantages and advantages to a testing technique before deciding the most suitable one. For example, if you’re testing the user experience of a website, white box testing wouldn’t be the best option because the user isn’t going to access your websites source code. Black box testing would be the most effective technique because it focuses on the functionality of the website. Both of these testing techniques help developers and organizations deliver software that is reliable, meets user expectations, and complies with industry standards and regulations.

Blog Post: https://www.bairesdev.com/blog/black-box-vs-white-box-testing/

From the blog CS@Worcester – Computer Science Through a Junior by Winston Luu and used with permission of the author. All other rights reserved by the author.

Structural Testing

https://unstop.com/blog/structural-testing

  Structural testing is one of many types of software testing, although structural testing is directly testing the internal structure of the code which means it is important that the individual performing structural tests is very familiar with the language used for the code. This type of testing uses white box testing techniques and it is more concerned with how a system is running rather than its functionality which is the more common reason for testing. There are four different types of structural testing which are mutation, data flow, control flow and slice-based testing. Mutation testing is a type of structural testing which relies on changing small parts of the code’s structure in order to test for errors, there are different types of mutation testing which are based on changing different parts of the code’s structure in order to find possible errors. Data flow testing is used to analyze how data flows through a program and control flow is used to show the order in which statements will be executed. Slice-based testing takes a portion of statements which may affect the final value of a variable and uses those slices to test the change. There are three different techniques used while doing structural testing which are called statement, branch and path coverage. Some common open source tools for structural testing include Cucumber, JBehave, Cfix and JUnit.

  I found this article interesting as it not only gives an in-depth explanation on structural testing but it also provides you with both techniques and tools which can be used to perform such testing. The advantages and disadvantages section particularly piqued my interest as one of the first advantages listed is that early defects can be easily identified which I would infer is due to the direct testing of the code structure versus testing its sole functionality. The cost of this type of testing however is a huge disadvantage as the time and money it takes to go through all of the testing necessary is much more than other types of testing. This article did teach me a lot about structural testing as most of the testing I have personally done has been testing what inputs get a certain output and testing direct implementation of a body of code versus actually testing the structure and being able to see how a piece of data flows through code which is a very important aspect of testing even if this testing is very expensive.

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 vs White Box Testing

Black box testing is a testing methodology that focuses on the end-user experience without delving into the internal design. White box testing is a testing methodology that focusses on the internal code, design, and structure of an application. In the article ” Black box vs White box testing” the author talks about the differences among them and when & why we should use these test methods.

The primary key differences the two software testing methods have

The primary differences between both testing methods are the process, techniques, and the operations. When it comes to the “process” the black box method begins with a clear understanding of the software’s functional requirements. The testers will rely on external specifications to formulate test cases, while the white box method requires a comprehensive understanding of the internal code, design, and structure of the software. The testers will need access to the source code. When it come to the “techniques” the black box method use a techniques called “equivalence class partitioning (ECP)”, this technique calls for the input values for the application or system to be classified based on outcome similarity. The white box method uses a technique called “Statement coverage” where all statements are at least once executed at the source code level in this method. Finally, when it comes to the ” operations “ the black box testing method main goal is to ensure the system works flawlessly for the end user, while the white box methods main goal is to ensure that an application’s code scores high in quality and integrity.

Why did I pick this Article?

The reason why I picked this article is because it was clear in explaining the many concepts of Black box and White box testing. As a student taking this course this article was very helpful and gave me a greater understanding of both these test methods and their differences.

Personal Reflection

The content of this article really increased my understanding of the software test methods, Black box and White box. Understanding Black box and White box testing is essential in the world of software development and quality assurance. This newfound knowledge will help me to make better choices in the future when I am dealing with test methods.

The full Article is Here: https://www.spiceworks.com/tech/devops/articles/black-box-vs-white-box-testing/

From the blog CS@Worcester – In's and Out's of Software Testing by Jaylon Brodie and used with permission of the author. All other rights reserved by the author.

Introduction to Becoming a Better Performance Tester:

After getting through a couple weeks of my classes, and looking through blogs online about testing, I found the stickyminds blog. In my first week I was given setup tasks for CS-443 Software Quality Assurance and Testing, and one of those tasks was to discover blogs and podcasts related to the course content. I used this blog for my setup tasks, and found it a useful compendium of resources. While searching through stickyminds, I focused on the area around ‘new to testing’, and found a specific article about how to improve your skills as a performance tester quite interesting. The article’s title is How to Become a Better Performance Tester 101 by Jun Zhuang.

The blog begins with a small piece of advice based on segmenting code for testing. While some people might argue that you should test and optimize after large portions of the code are complete, this blog argues instead for doing performance testing while it is still incomplete. It is also advised to learn performance testing under someone who is very experienced in the topic, as many performance testers don’t understand or know which questions they should be asking. This is why shadowing is very important, as it allows a new performance tester to pick things up quicker, and gather an understanding of the tools used more effectively. Jun Zhuang discusses Agile software development teams that are commonly used in industry. He describes them as being used to handle performance testing responsibilities. These teams use strategies such as getting developers involved in capturing performance issues early, communication between teams and testers, and holding critical team meetings more frequently. They still face occasional struggles to meet deadlines when performance issues arise, but these teams are overall described as efficient and useful. The latter half of the blog explains the importance of performance testing, and why you should put this effort into doing it. By exploring these components like applications, or databases testers can better design tests and diagnose issues. The blog also shares some personal accounts of testers utilizing their knowledge in programming to speed up testing processes, by writing stubs and generating test data. It stresses the importance that individuals with diverse technological backgrounds, even if less experienced in performance testing, can bring valuable insights and problem-solving skills to the role.

I chose this blog because I am very interested in improving my skills at all times. When I discovered the Stickyminds blog, I was excited by the amount of information it presented. This blog on performance testing I discovered in the new to testing section, which has a lot of very useful articles to help you improve your skills. Even small pieces of advice and tactics can make the difference when it comes to coding and testing especially. A personal weakness with testing in my own projects I had, was that I was worried my code was not optimized enough, and what I learned through this blog is something I will apply to improving optimization, especially seeking out someone experienced to work with and improve my skills. 

Source:

https://www.stickyminds.com/article/how-become-better-performance-tester-101

From the blog CS@Worcester – WSU CS Blog: Ben Gelineau by Ben Gelineau and used with permission of the author. All other rights reserved by the author.

Unit Testing

For this week’s blog post, I have chosen to discuss the blog “An Overview of Unit Testing” by Kayode Adeniyi; this article discusses the importance of unit testing, what it is, the stages of the unit testing process, as well as discusses some differences between automated and manual unit testing. I chose this topic for this week’s blog post because unit testing fits well within the issues we are discussing in this class; I also like how the author discusses the differences between manual and automatic testing.

The first topic the blog discusses is what unit testing is. “Unit testing is a testing method in software development where each individual part (unit) of an application is tested to analyze its proper working. This approach is pretty common and used by most development teams to verify the accuracy of each software component.” In my opinion, understanding what unit testing is is imperative, especially understanding that each test tests a part of a system, not the whole system.

The blog then mentions some key aspects of unit testing, which are, in part, why they are so helpful for developers in all fields of software development. The key aspects mentioned are debugging errors from the root, having reliable testing procedures, repeatability at every stage, and simplicity over complexity. The article also mentions that separating each part of a program makes it much easier to find and correct errors that appear as you are working on a project. The blog also discusses the steps in developing unit tests.

The first step of the test development process is planning the test. The blog describes this first step as “… [T]he developer defines the objective and scope of the testing. Once the unit of application is identified, the developer also defines the criteria for testing it. Critical thinking and effective planning is needed at this stage to ensure focused testing.” Due to this step’s importance in determining the functionality of the final test, it is one of the most essential parts of the test development process.

The next phase of creating unit tests is the creation of test cases. The blog describes test cases as scenarios where the units’ functionality is being tested. The blog also discusses edge cases or scenarios in which an unlikely event is to occur but still needs to be tested in the event where this unlikely event happens. The article defines an edge case as “… an occurrence of an extreme scenario during the normal expected working of any software. They are often the rare events that can happen when a user uses the software application.” While these events are unlikely to occur, if your project will be used by many people over a long enough period of time, these edge cases are an inevitability.

Blog: https://blog.logrocket.com/product-management/unit-testing-guide/

From the blog CS@Worcester – P. McManus Worcester State CS Blog by patrickmcmanus1 and used with permission of the author. All other rights reserved by the author.