Apprenticeship Patterns – What I Learned

For my capstone course this semester, I was assigned to read and review a book from authors Dave Hoover and Adewale Oshineye, known as Apprenticeship Patterns: Guidance for the Aspiring Software Craftsman by our professor, Karl Wurst. The intention of reading this was to ready and prepare myself for the challenge within this course, specifically about my skills in a field and how to cultivate and grow within said field, or “craft” as the book puts it.

To me, the most interesting part about this reading is how they attributed software development to craftsmanship. When I first thought about it initially when it discusses it in the first chapter, I immediately went “yeah that makes sense” but upon reading further and it digging at specific concepts like “what is craft” and “what makes an apprentice an apprentice”, it made me think a lot more about what a “craft” really is. Being an art minor, this definition was one that was important to me, as art in it of itself is synonymous to craft. Being able to compare my work when coding things and my work when I physically create artwork was an interesting turn of events and an epiphany I wasn’t expecting when dropping into this book. The individual breakdowns of each part of what makes craftsmanship what it is was very impressive and made me able to stand in the shoes of the authors.

When reading, I also felt a bit called out on bad habits that I definitely do on a daily basis. For example, the story told in Chapter 2’s introduction, discussing a cup already full, it reminded me of how I tend to get carried away when it comes to discussing what I know and want to share. This comes at, unfortunately, a disregard for the new information I would be trying to learn, much like how the analogy of the story goes. Another thing I felt was important and reflected on my own actions was Chapter 5, discussing how it is important to not use the internet as your only source of learning and information. Initially, I was quick to disagree with this point, as I do NOT enjoy reading in the first place (a.e. look at how long it took me to write this up) but then I sat down and realized that was another bad habit kicking in, as well as my ADHD. While yes, its true that written works contain many important informations regarding to one’s craft, especially in software development, one must also remember that “reading” isn’t the only way to absorb this information, you could find an audio transcript, as an example. Thus did I realize that this point was actually one that was really strong and heavily agreed with.

Overall, I feel further reading may be necessary for me, as this has changed a lot about the way I am thinking not only about this class and working on a development team, but also about myself and habits that I could be working on and improving. If you also would like to read the book, it is hosted here, for free: https://www.oreilly.com/library/view/apprenticeship-patterns/9780596806842/ch06.html

Until next time! (Which is, soon, because Ill be writing up another post right after this, haha)

From the blog CS@Worcester – You're Telling Me A Shrimp Wrote This Code?! by tempurashrimple and used with permission of the author. All other rights reserved by the author.

Sprint 1

GitLab Activity

Install npm JWT Library and handle validation on Mock FE/BE issue – created a file called checkRole.js that as of moment takes a token and decodes it, however since Keycloak is not configured yet with the backend, checkRole.js is still not setup for the verification of tokens.

Reflection on What Worked Well

This sprint, I found that my ability to collaborate effectively with my team improved. We established a structured workflow using GitLab issues and merge requests, ensuring everyone was aligned. Team meetings and project reviews were also particularly helpful in maintaining quality and catching potential issues early. Additionally, I felt more comfortable with our tech stack, which allowed me to contribute more efficiently to the project.

Reflection on What Didn’t Work Well

One of the biggest challenges during this sprint was time management and managing expectations of fellow team members. Balancing multiple tasks while delivering high-quality work proved difficult, especially when unexpected issues arose. There were also moments when communication gaps led to duplicated efforts or confusion regarding task ownership.

Additionally, an unexpected bug related to the jsonwebtoken library took longer to resolve than anticipated, impacting our overall sprint velocity. I underestimated the complexity of debugging the issue, and this resulted in delays. Moving forward, I want to improve my debugging strategies by breaking down issues systematically and identifying potential causes earlier in the process.

Another challenge was that some tasks took longer than expected due to unclear requirements. There were times when I started working on a feature only to realize later that I had misunderstood part of the implementation. This led to rework and inefficiencies that could have been avoided with better clarification upfront.

Reflection on Changes to Improve as a Team

To improve as a team, we need to refine our communication and task allocation strategies. One possible improvement is assigning issues to members with clear deadlines and deliverables. This would help eliminate the need to check in constantly about each other’s progress and give everyone enough space to focus on their designated tasks.

Additionally, we could establish clearer guidelines on documentation and issue tracking. Proper documentation would minimize misunderstandings and ensure that we have a reference point if any team member forgets certain project details. This could be as simple as maintaining a shared document with important technical decisions, dependencies, and any issues we encounter.

Reflection on Changes to Improve as an Individual

On a personal level, I need to deepen my knowledge of the technologies we are using and strengthen my overall web development skills. Additionally, I must improve my time management and prioritization strategies to ensure more efficient task completion. Allocating time for debugging and testing earlier in the sprint would help reduce last-minute stress and improve the stability of our work. I also plan to dedicate time outside of sprint tasks to learn best practices and gain a more comprehensive understanding of our tech stack. Finally, I recognize the importance of seeking help sooner when I encounter challenges, as doing so will allow me to work more efficiently and avoid unnecessary delays.

Apprenticeship Pattern: “Be the Worst”

Summary of the Pattern

The “Be the Worst” pattern suggests deliberately placing yourself in an environment where you are the least experienced or skilled person. By doing so, you expose yourself to opportunities for rapid learning and growth by observing and working with more skilled individuals. While this can be uncomfortable, it forces you to improve and challenge yourself continuously.

Why I Selected This Pattern

I chose this pattern because, during this sprint, I often felt like I was struggling to keep up with some of my teammates who had more experience with certain technologies. Instead of being discouraged, I realized that this was an opportunity to learn from them and elevate my own skills. Their feedback and insights helped me refine my practices and problem-solving approach.

How This Pattern Could Have Changed My Behavior

Had I fully embraced this pattern earlier in the sprint, I would have proactively sought out mentorship and learning opportunities rather than hesitating to ask questions. Additionally, I would have taken more initiative in tackling challenging tasks instead of sticking to what I was comfortable with. Moving forward, I plan to embrace this mindset and view my inexperience as an advantage rather than a limitation.

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

Sprint 1 Blog Retrospective

GitLab Issues

SSH Keys:

https://gitlab.com/Libre

FoodPantry/client-solutions/theas-pantry/deployment/gitlab-profile/-/issues/17

I research how to make ssh keys to make logging into the server easier. I created documentation on how and what commands to run to create the keys. Now everyone in the future can create keys to access the server in a safer manner. 

https://gitlab.com/LibreFoodPantry/client-solutions/theas-pantry/deployment/gitlab-profile/-/issues/4

Researched into how git pipelines work. I looked into the gitlab_ci.yaml files because that is what I thought we would need. But it seems we’re living in the direction of cron jobs for CI.

https://gitlab.com/LibreFoodPantry/client-solutions/theas-pantry/deployment/gitlab-profile/-/issues/5

Tested nginx serving the basic webpage on my browser from the server.

https://gitlab.com/LibreFoodPantry/client-solutions/theas-pantry/deployment/gitlab-profile/-/issues/18

Worked on trying to solve the SSL certificate problem with everyone else. 

Reflection

One of the things I think we did well as a team is making use of work class time. Often for our project we hit many roadblocks. We used the class time as a way to put all of our heads together to tackle a problem that was holding us all up. Especially in the first few weeks since I think we are all pretty new to this side of computer science. We would convene and help each understand things like docker-compose or port-mapping. Another aspect that I think we did well was our general attitude and teamwork. I think we were all willing to participate in the conversation and contribute. Though I will admit I was the quietest one. 

One thing I think we need to work on is gitlab issues. First, I think we need to split them up or maybe name them better. I think all of our issues are very broad so it’s hard to talk about what we did because there are so many layers to the issue. For instance, the SSL certificate implementation. It covers a lot of work and troubleshooting so it can be hard to talk about since work can change quickly. Maybe that’s the nature of our project, but I think it’s something we could improve on. On the same note for gitlab issues, you mention commenting on the issue so that it describes what we’ve done. I’m not sure if any of us have done that. And I’m not sure where to do it either. Some of the things I could work on for myself as an individual. I think I need to ask for help more often, either from my team or you. For when I’m stuck or I just need some direction on what to work on next. Sometimes it feels like I’m not doing enough

Pattern

The software pattern that I often talked about during the period of our spring was “Exposing Your Ignorance”. To summarize, in the software industry it is expected that we are professionals and are experienced in our area. However, that is not always the case. Especially for new apprentices like ourselves. It is important to accept that you do not know everything. So ask questions and swallow your pride to allow yourself to learn something new. I chose this pattern because I think we all were a bit inexperienced in this area, but for me especially this was very new. It felt some of this stuff I should have known or I wasn’t really all too familiar with it. Definitely never worked with it before. So very early on I had to accept that didnt much have much to learn as I went along. I read this pattern before the sprint, but I think it’s something I least thought subconsciously. I think it’s just something I incorporate into all aspects of my life. Skill and experience come from time and work. It’s impossible to know everything or understand everything at first. 

.

From the blog CS@Worcester – Code Craft by Kyle Tucker and used with permission of the author. All other rights reserved by the author.

Sprint 1 Retrospective

In my CS-448 class, we are working with the Thea’s Pantry system. I was placed on the team that looks at the automated reporting system and we have just finished our first month long sprint. During this sprint one, the first issue I worked on was the Reporting Integration set up issue which was in the backlog from the last team that worked on it (https://gitlab.com/LibreFoodPantry/client-solutions/theas-pantry/reportingsystem/reportingintegration/-/issues/27). Then, after finishing with that, I took the next available issue that we had planned for this sprint and fixed that as well (https://gitlab.com/LibreFoodPantry/client-solutions/theas-pantry/reportingsystem/reportingintegration/-/issues/29). After testing and requesting a merge for both of my issues, there wasn’t anything else that we had planned for the current sprint and I didn’t want to start on another month long sprint issue, so instead I helped my other teammates troubleshoot, checked their work, and looked into things such as how the final report file is formatted, what information it has, and how we would go about creating a file like that within the code.

I think what worked the best for us was our original plan at the start of the month so that we all knew what we needed to do and could focus on that. For the most part with most problems being from the project backlog, we didn’t work collaboratively that much as the issues were largely separate but during meetings, we would be able to teach each other about the different systems we were working on. We also were able to get all of our issues done with a little time to spare at the end that we used to further develop some of the small things we would have needed to do eventually anyways. As far as what didn’t work well, when starting to help my other teammates, I felt behind in understanding on the system they have been learning for a few weeks and had to catch me up. Fortunately, with the extra time we had, I and others were able to follow along with other’s progress and quickly gained at least a basic understanding of all parts of the system.

During the next sprint, an improvement that I hope we make as a team is to work more collaboratively, even if the problems we are working on are not directly related to development. We didn’t have much of a chance to work on direct collaboration, but for the next sprint given the opportunity now, I hope that we can progress as a team more so that specialized individual programmers. For myself individually, something that I aim to improve on is my workflow. Last sprint I would try to implement code and get it in a semi working state but then would have to go back and reference other parts of the project or research some other system that was involved. In the future I plan to approach the problems first with getting a full understanding of how the system will work when fully operational and then writing the code, rather than going back and forth between coding and learning.

For this sprint, I feel that the apprenticeship pattern that was most applicable to me was Chapter 2’s pattern of emptying the cup. The book’s author talks about this in the context of learning a new language which is somewhat true for myself as I am not very experienced in all the intricacies of how javascript coding works when developing a website. I felt that this pattern described my experience because I had to learn a lot of new systems that I hadn’t used much before. This is my first time working with RabbitMQ or MongoDB and to a lesser extent the workflow of docker and gitlab. Over time, I got better at using these applications but I had to spend time learning them without “working on” the project.

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

CS-443 Blog: Shift Down testing

 CS@Worcester CS-443

 Testing software smarter, not harder: the shift-down strategy | Ministry of Testing

The article “Testing software smarter, not harder: the shift-down strategy” by Manish Saini discusses the importance of focusing test automation efforts closer to the code. This approach, known as shift-down testing, moves away from traditional UI-centric testing to thoroughly testing core code components such as APIs, business logic, and container-based integration. By addressing issues at the code level, the strategy aims to create more reliable and maintainable test suites, ultimately improving software quality.


The shift-down approach involves using mocks for external interactions to isolate and test individual code units effectively. This ensures that potential issues are identified and resolved early in the development process, reducing the overall testing effort required. The article highlights how shift-down testing can lead to more efficient and robust test automation, ultimately resulting in better software outcomes.


I think this article was pretty helpful in explaining the benefits of shift down testing. I think the article does a good job in explaining how this method identifies potential issues early in the development process, reducing the overall testing effort and improving software quality.

From the blog George C Blog by George Chude and used with permission of the author. All other rights reserved by the author.

CS-443 Blog: Shift Down testing

 CS@Worcester CS-443

 Testing software smarter, not harder: the shift-down strategy | Ministry of Testing

The article “Testing software smarter, not harder: the shift-down strategy” by Manish Saini discusses the importance of focusing test automation efforts closer to the code. This approach, known as shift-down testing, moves away from traditional UI-centric testing to thoroughly testing core code components such as APIs, business logic, and container-based integration. By addressing issues at the code level, the strategy aims to create more reliable and maintainable test suites, ultimately improving software quality.


The shift-down approach involves using mocks for external interactions to isolate and test individual code units effectively. This ensures that potential issues are identified and resolved early in the development process, reducing the overall testing effort required. The article highlights how shift-down testing can lead to more efficient and robust test automation, ultimately resulting in better software outcomes.


I think this article was pretty helpful in explaining the benefits of shift down testing. I think the article does a good job in explaining how this method identifies potential issues early in the development process, reducing the overall testing effort and improving software quality.

From the blog George C Blog by George Chude and used with permission of the author. All other rights reserved by the author.

CS-443 Blog: Shift Down testing

 CS@Worcester CS-443

 Testing software smarter, not harder: the shift-down strategy | Ministry of Testing

The article “Testing software smarter, not harder: the shift-down strategy” by Manish Saini discusses the importance of focusing test automation efforts closer to the code. This approach, known as shift-down testing, moves away from traditional UI-centric testing to thoroughly testing core code components such as APIs, business logic, and container-based integration. By addressing issues at the code level, the strategy aims to create more reliable and maintainable test suites, ultimately improving software quality.


The shift-down approach involves using mocks for external interactions to isolate and test individual code units effectively. This ensures that potential issues are identified and resolved early in the development process, reducing the overall testing effort required. The article highlights how shift-down testing can lead to more efficient and robust test automation, ultimately resulting in better software outcomes.


I think this article was pretty helpful in explaining the benefits of shift down testing. I think the article does a good job in explaining how this method identifies potential issues early in the development process, reducing the overall testing effort and improving software quality.

From the blog George C Blog by George Chude and used with permission of the author. All other rights reserved by the author.

CS-443 Blog: Shift Down testing

 CS@Worcester CS-443

 Testing software smarter, not harder: the shift-down strategy | Ministry of Testing

The article “Testing software smarter, not harder: the shift-down strategy” by Manish Saini discusses the importance of focusing test automation efforts closer to the code. This approach, known as shift-down testing, moves away from traditional UI-centric testing to thoroughly testing core code components such as APIs, business logic, and container-based integration. By addressing issues at the code level, the strategy aims to create more reliable and maintainable test suites, ultimately improving software quality.


The shift-down approach involves using mocks for external interactions to isolate and test individual code units effectively. This ensures that potential issues are identified and resolved early in the development process, reducing the overall testing effort required. The article highlights how shift-down testing can lead to more efficient and robust test automation, ultimately resulting in better software outcomes.


I think this article was pretty helpful in explaining the benefits of shift down testing. I think the article does a good job in explaining how this method identifies potential issues early in the development process, reducing the overall testing effort and improving software quality.

From the blog George C Blog by George Chude and used with permission of the author. All other rights reserved by the author.

CS-443 Blog: Shift Down testing

 CS@Worcester CS-443

 Testing software smarter, not harder: the shift-down strategy | Ministry of Testing

The article “Testing software smarter, not harder: the shift-down strategy” by Manish Saini discusses the importance of focusing test automation efforts closer to the code. This approach, known as shift-down testing, moves away from traditional UI-centric testing to thoroughly testing core code components such as APIs, business logic, and container-based integration. By addressing issues at the code level, the strategy aims to create more reliable and maintainable test suites, ultimately improving software quality.


The shift-down approach involves using mocks for external interactions to isolate and test individual code units effectively. This ensures that potential issues are identified and resolved early in the development process, reducing the overall testing effort required. The article highlights how shift-down testing can lead to more efficient and robust test automation, ultimately resulting in better software outcomes.


I think this article was pretty helpful in explaining the benefits of shift down testing. I think the article does a good job in explaining how this method identifies potential issues early in the development process, reducing the overall testing effort and improving software quality.

From the blog George C Blog by George Chude and used with permission of the author. All other rights reserved by the author.

CS-443 Blog: Shift Down testing

 CS@Worcester CS-443

 Testing software smarter, not harder: the shift-down strategy | Ministry of Testing

The article “Testing software smarter, not harder: the shift-down strategy” by Manish Saini discusses the importance of focusing test automation efforts closer to the code. This approach, known as shift-down testing, moves away from traditional UI-centric testing to thoroughly testing core code components such as APIs, business logic, and container-based integration. By addressing issues at the code level, the strategy aims to create more reliable and maintainable test suites, ultimately improving software quality.


The shift-down approach involves using mocks for external interactions to isolate and test individual code units effectively. This ensures that potential issues are identified and resolved early in the development process, reducing the overall testing effort required. The article highlights how shift-down testing can lead to more efficient and robust test automation, ultimately resulting in better software outcomes.


I think this article was pretty helpful in explaining the benefits of shift down testing. I think the article does a good job in explaining how this method identifies potential issues early in the development process, reducing the overall testing effort and improving software quality.

From the blog George C Blog by George Chude and used with permission of the author. All other rights reserved by the author.