Category Archives: CS-448

CS-448 Week 14 Breakable Toys

The “Breakable Toys” pattern offers a solution to a common problem faced by software developers, which is the lack of opportunities to learn from failure in a professional setting. The purpose of this pattern is to create a safe environment where developers can experiment, make mistakes, and learn without fear of repercussions. By building toy systems that mimic real-world settings but with reduced scope and complexity, developers can gain valuable experience and develop their skills more effectively.

The intriguing thing about this pattern is its emphasis on the importance of failure in the learning process. In many industries, including software development, there’s often a stigma attached to failure, which leads to a culture where taking risks is discouraged. However, this pattern changes that mindset by suggesting that failure is not only acceptable but also a necessary step toward growth and improvement.

As someone whose goal is to become a software developer, this pattern has certainly changed my perspective on my approach toward learning and skill development. It highlights the value of creating a learning environment that prioritizes experimentation and iteration over perfection. This helps get rid of the fear of failing and being afraid to make mistakes, and now I see them more as opportunities to grow and learn.

One of the aspects of the pattern that resonates with me is the idea of “budgeting for failure”. By allocating time and resources to build and experiment with breakable toys, developers can proactively invest in their own professional development. This proactive approach to learning is essential in this industry due to the continued growth and evolution, where adaptability and continuous improvement are key to success.

While I do like this style of thinking, I can also see potential challenges in implementing this pattern in a corporate environment that may prioritize productivity and efficiency over learning and experimentation. Convincing management or team leaders of the benefits of breakable toys may require a shift in mindset and a willingness to embrace a culture of learning and innovation.

Overall, the Breakable Toys pattern offers a refreshing perspective on how to approach learning and skill development in software development. By creating a safe space for experimentation and failure, developers can cultivate a growth mindset and become more resilient and adaptable in the face of challenges.

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.

Expose Your Ignorance

In this week’s blog post, I will be discussing the “Expose Your Ignorance” pattern discussed in chapter 2 of “Apprenticeship Patterns: Guidance for the Aspiring Software Craftsman” by Dave Hoover and Adewale Oshineye. This week, I chose this topic for my blog post because I think being able to show that you don’t know everything and can have confidence in learning is essential to growth, both professionally and personally.

This section of the chapter discusses that learning is an essential part of the development process. “Show the people who are depending on you that the learning process is part of delivering software. Let them see you grow. According to research by the social psychologist Carol Dweck, the need to appear competent is ingrained into people of most industrialized societies. These societies are increasingly dependent on your competence as a developer, as software creeps ever-deeper into our everyday lives. Yet because of your inexperience, you have many zones of ignorance. You are in a bind. The people around you—your manager, your client, your colleagues, not to mention yourself—are all under tremendous pressure to deliver software. You can see the need for confidence in people’s eyes when they ask you how long feature X will take you to finish. There can be tremendous pressure to pacify them, to reassure them that you know precisely what they want, how you’re going to give it to them, and when.” The need to appear completely in control and competent when you are new is a very difficult instinct to let go of, but it is essential to free yourself of it if you want to progress.

You must be honest with your colleagues and clients, don’ just tell them what they want to hear because what they want to happen might be impossible. “Software craftsmen build their reputations through strong relationships with their clients and colleagues. Conceding to unspoken pressures and telling people what they want to hear is not a good way to build strong relationships. Tell people the truth. Let them know that you’re starting to understand what they want and you’re in the process of learning how to give it to them. If you reassure them, reassure them with your ability to learn, not by pretending to know something you don’t. In this way, your reputation will be built upon your learning ability rather than what you already know.”

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.

Concrete Skills

In this week’s blog post, I will be discussing the “Concrete Skills” pattern discussed in chapter 2 of “Apprenticeship Patterns: Guidance for the Aspiring Software Craftsman” by Dave Hoover and Adewale Oshineye. This week, I chose this topic for my blog post because I think being able to supplement your knowledge with practical abilities will show to future development teams that you can be a helpful addition to the teams.

The first part of this section talks about how some of the first concrete skills that you will learn will mostly entail navigating HR and team assignments, and being able to assure your team mates that you won’t need constant supervision. “Acquire and maintain concrete skills. Even though one of the things that an apprentice brings to a team is an ability to learn quickly, the possession of discrete and demonstrable ability with specific tools and technologies increases the likelihood that you will be trusted to contribute indirectly until you start to gain stature. Some of the concrete skills you should acquire will be little more than mechanisms to get you past crude HR filters and managers who construct teams by playing buzzword bingo. Others will reassure your prospective team members that you can be put to good use and will not require “day care” (Organizational Patterns of Agile Software Development, p. 88). Examples of concrete skills include writing build files in various popular languages, knowledge of various popular open source frameworks like Hibernate and Struts, basic web design, JavaScript, and the standard libraries in your language of choice.” Being able to show your fellow developers that you can stand on your own with development is a very important aspect of joining new development teams, but you must be able and willing to ask for help when you need it. The next section mentions something briefly that I think is incredible important, being able to quickly and effectively show an interviewer your concrete skills.

Being able to quickly and succinctly describe your concrete skills in a technical interview is essential. “The point is that you will often require hiring managers to take a leap of faith in choosing you. Concrete skills (which are ideally discrete enough that you can bring toy implementations to an interview) allow you to meet them halfway. The concrete skills you possess are your answer to the question: “If we hire you today, what can you do on Monday morning that will benefit us?” A deep understanding of Your First Language will help establish your credibility and should prove to be extremely useful to your team.”

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.

Unleash Your Enthusiasm

In this week’s blog post, I will be discussing the “Unleash Your Enthusiasm” pattern discussed in chapter 2 of “Apprenticeship Patterns: Guidance for the Aspiring Software Craftsman” by Dave Hoover and Adewale Oshineye. This week, I chose this topic for my blog post because I think being able to properly and effectively hone your energy to be the most productive is an important skill.

The article first discusses how a new hire’s enthusiasm can be unintentionally forced down by the new hire in order to try to fit in with the development team. “Despite (and because of!) your inexperience, you bring some unique attributes to your team, including an infectious enthusiasm. Do not allow anyone to dampen your excitement for the craft—it is a precious commodity and will accelerate your learning. As a software developer, you will inevitably work as part of a team. In any group setting, there is a tendency to conform to the norm, particularly for newcomers. Most teams are not hyper-passionate or overly enthusiastic about technology. Predictably, they are focused on delivering the next project or improving on the aspects of the development life cycle that are causing them pain. Therefore, enthusiastic apprentices can often succumb to the urge to fly under the radar. They either repress their enthusiasm altogether, or allow it to manifest only outside of their day jobs.” While this is a natural reaction, it is important to be able to know when to show some of this passion to your team because, your passion is infectuous and may be able to help with team morale.

You must be careful however, depending on the team showing too much passion may work against you. “There are certainly risks involved in unleashing your enthusiasm on an established team. If morale is low or if the team is not welcoming of newcomers, you will likely get some eye-rolling behind your back. You could certainly make a poor impression on people who value competence more than learning ability, particularly when you expose your ignorance. Like any pattern, this one should not be applied blindly. Team dynamics should always be considered. If you find yourself on a team that does not accept your excitement, you will need to find ways to nurture your passion. “

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.

Walking the Long Road:

The Problem of Short-Term Thinking

In today’s fast-paced world, there’s immense pressure to pursue high-paying jobs and quick promotions. The allure of immediate rewards often overshadows the value of long-term growth and expertise. Many aspiring software developers find themselves torn between the desire for mastery and societal expectations.

The Solution: Embrace the Long Road

The path to mastery in software development is not a sprint but a marathon. It requires dedication, patience, and a willingness to prioritize learning over short-term gains. Embracing the long road means understanding that mastery is a lifelong journey, not a destination.

Planning for the Journey

To embark on the long road to mastery, one must be prepared for the challenges and rewards that lie ahead. It involves valuing learning opportunities and skill development over immediate financial gains. Ron Jeffries et al. emphasized that becoming truly good at programming is an ongoing enterprise of learning and practicing.

The Joy of the Journey

While the road to mastery may seem daunting, it offers a rich tapestry of experiences and opportunities for growth. As an apprentice, one learns to wield knowledge and technology like a seasoned samurai, mastering the art of problem-solving and building strong relationships with customers.

The Role of Self-Assessment

Accurate self-assessment is crucial on this journey. It involves recognizing one’s strengths and weaknesses, understanding the depth of one’s knowledge, and constantly striving for improvement. Transitioning from apprentice to journeyman is just the beginning of the path to mastery.

The Ever-Evolving Craft

Software development is a complex and dynamic field, constantly evolving with new technologies and challenges. While the tools and platforms may change, the deeper truths of the craft remain constant. The long road teaches craftsmen to transcend specific technologies and focus on solving fundamental problems.

Charting Your Course

To navigate the long road to mastery, one must envision their future and plan accordingly. By imagining the strangest possible roles and experiences they could have in the next few decades, aspiring craftsmen can chart a course for their career that aligns with their long-term goals.

Conclusion

In conclusion, the long road to mastery in software development is not for the faint of heart. It requires dedication, perseverance, and a love for the journey itself. By embracing mastery as a lifelong endeavor, software developers can unlock their full potential and leave a lasting impact on the world of technology.

From the blog CS@Worcester – CS: Start to Finish by mrjfatal and used with permission of the author. All other rights reserved by the author.

Jumping in at the Deep End

Many of us have found ourselves in a comfortable routine, doing work that we’ve mastered but no longer find challenging. It’s easy to stay in this comfort zone, but it often leads to stagnation and a lack of fulfillment. Christopher Hawkins once said, “If you’ve never fallen on your face, odds are you haven’t attempted anything worth a damn.” This sentiment captures the essence of why we need to push ourselves out of our comfort zones and into the deep end.

The Problem with Comfort

Staying in our comfort zones might feel safe, but it’s a surefire way to stunt our growth. We might become proficient at what we do, but without new challenges, our skills plateau, and we risk becoming stagnant. The real danger lies in mistaking this plateau for progress; in reality, it’s a rut that leads to mediocrity.

The Solution: Embrace the Challenge

To truly grow and excel, we need to embrace challenges that push us beyond our current capabilities. This could mean taking on bigger projects, joining larger teams, tackling complex tasks, or exploring new domains. When an opportunity presents itself, grab it with both hands, even if it feels daunting.

Taking the Plunge

Jumping in at the deep end means taking calculated risks and being willing to fail. It’s about accepting challenges that may seem overwhelming and being prepared to learn from setbacks. Enrique Comba Riepenhausen’s experience illustrates this perfectly. When offered a consulting opportunity in Nigeria, he was initially apprehensive due to the perceived dangers. However, he took the leap, and it transformed his career. What was supposed to be a three-month contract turned into nearly two years of valuable experience in West Africa.

Navigating the Deep Waters

While taking risks is essential for growth, it’s crucial to do so responsibly. Having mentors and seeking support from colleagues can provide invaluable guidance when facing challenging situations. Creating feedback loops ensures that if things start to go awry, we can course-correct before it’s too late.

Putting Theory into Practice

To apply this approach, assess your past projects in terms of complexity and impact. What was the most significant project you’ve worked on, and how did it contribute to your growth? By charting your projects, you can gain insight into your career trajectory and make informed choices about future opportunities.

In conclusion, jumping in at the deep end is not about recklessness; it’s about embracing challenges that push us to grow. By stepping out of our comfort zones and taking calculated risks, we can unlock our full potential and achieve remarkable success.

From the blog CS@Worcester – CS: Start to Finish by mrjfatal and used with permission of the author. All other rights reserved by the author.

The Wisdom of the White Belt

The “White Belt” pattern resonates with me on a personal level, as it summarizes the mark of maintaining a beginner’s mindset, a quality that I believe is crucial for continuous growth and learning in any field, especially in the realm of software development.
One interesting aspect of this pattern is the acknowledgment that expertise and mastery can sometimes become a double-edged sword. While we try to have proficiency in our field, there is a risk of becoming proud or developing a fixed mindset, where we rely too heavily on our existing knowledge and fail to embrace new perspectives or paradigms.
The analogy of “wearing the white belt” serves as a sad reminder that true mastery is not in holding to what we already know but in building a mindset of humility and openness to learning. It challenges us to overlook our assumptions and approach new challenges with a fresh and curious mindset, to a beginner’s eagerness to explore and discover.
What particularly resonates with me is the idea of “unlearning what we have learned,” as emphasized in the quote from “The Empire Strikes Back.” (Favorite movie haha) This concept challenges the work that our knowledge is lively and pushes us to question our assumptions and be willing to adapt and evolve our thinking as we meet new contexts or technologies.
Furthermore, the pattern’s point on approaching new domains with respect and curiosity, rather than assuming expertise, is rather more of a debate. The reason I say so is because it reminds us that true understanding often comes from collaborating with others and acknowledging the unique perspectives and realities they bring to the table.
One interesting aspect I find compelling is the idea of questioning how veterans in the field approached coding in the past versus how we approach it now. While we may be tempted to dismiss older methodologies or technologies as outdated, there is value in understanding the historical context and the challenges that shaped those approaches. By adopting a beginner’s mindset, we can explore these historical perspectives with an open mind, potentially uncovering insights or principles that remain relevant today.
In spirit, the “White Belt” pattern encourages us to have a mindset of continuous learning, humility, and adaptability – qualities that are essential for being advanced in the landscape of software development. It reminds us that true mastery is not a destination but a lifelong journey of growth and exploration, where we must be willing to use our preconceptions and embrace the wisdom of a beginner’s mind.

andicuni
May 5, 2024

From the blog CS@Worcester – A Day in the Life as a CS Blogger by andicuni and used with permission of the author. All other rights reserved by the author.

Sprint 3: A Candid Look at Our Sprint Journey

Sprint Retrospective
Reflection on what worked well:
Hey Everyone! During this sprint, our team demonstrated effective communication and productive collaboration. We were able to complete our assigned issues on time, and each team member contributed by conducting individual research. The meeting with the professor provided valuable insights and guidance, particularly regarding the challenges we faced with Docker Compose and the startup process involving RabbitMQ.
One aspect that worked well in our favor was our ability to divide tasks and responsibilities based on individual strengths and interests. This allowed us to support each team member’s expertise and ensure that the workload was distributed evenly. Additionally, our regular check-ins and progress updates made the ideal coordination and helped identify potential obstacles early on.
Reflection on what didn’t work well:
Despite our best efforts, we encountered some difficulties with Docker Compose and the startup process involving RabbitMQ. Configuring the containers to communicate effectively and ensuring proper dependency management proved to be a great challenge. However, these obstacles presented valuable learning opportunities for our team, and we gained a better understanding of the areas that require further improvement.
Another area that could have been improved was our initial planning and estimation process. While we successfully completed our assigned tasks, there were instances where we underestimated the difficulty of certain issues, leading to potential time crunch or scope.
Reflection on what changes could be made to improve as a team:
To enhance our team’s performance, we could explore more effective ways to share and combine our research findings. By creating a collective repository or doing regular knowledge-sharing sessions, we can ensure that everyone is up-to-date with the latest ideas and techniques. This would not only help grow a collaborative learning environment but also prevent duplication of efforts and assist a mutual learning affair within the team.
Reflection on what changes could be made to improve as an individual:
As an individual, I could focus on improving my expertise in JavaScript linter tools and debugging utilities. By focusing time to hands-on practice and exploring more advanced features of the tools we’ve identified, I can better contribute to the project’s code quality and debugging efforts. This would not only enhance my technical skills but also position me as a valuable resource for the team, capable of providing guidance and support when needed.
Furthermore, I could enhance my documentation skills to ensure that my research findings and insights are effectively communicated to the rest of the team, clear the way for helpful information and collaboration. Clear and brief documentation can serve as a valuable reference for future sprints and aid in onboarding new team members.
We have provided a broad overview of our research on JavaScript linters tools and debugging utilities, which will be a valuable resource for future teams who tackle this. The dedication to exploring various options and understanding the strengths and weaknesses is what we want to leave our mark on.
Overall, I would say for Sprint 3 as a cleanup and research Sprint, it allowed our team to identify areas for improvement and gain a valuable experience into the challenges we faced. By implementing the suggested changes and continuing to collaborate effectively, we can enhance our productivity and deliver high-quality results in future sprints. Open communication, continuous learning, and the strive to move forward will be key to our success as a team.

andicuni
May 5, 2024
https://gitlab.com/LibreFoodPantry/client-solutions/theas-pantry/guestinfosystem/experiments/guest-info-backend-java-script-linter-testing-debugging-fork/-/issues/1 One of the issues I worked on was the JS Linters research.

From the blog CS@Worcester – A Day in the Life as a CS Blogger by andicuni and used with permission of the author. All other rights reserved by the author.

Perpetual Learning: Break Your Toys


   Last week I started diving into the perpetual learning section of the
Apprenticeship patterns book, beginning with the expand your bandwidth
section. I talked about how I want to learn more about my field and explore
new discoveries in the industry. This time however I read up on the “Break
Your Toys” section from the book. This section covers the need to fail in
order to improve, and how to set up an environment where you can sort of
fail on purpose.

I am no stranger to failing and struggling when it comes to computer
programming, as I am sure we all are familiar with it. This section makes a
case for using a pet project, or a “toy program” as they put it, to test and
break to your heart’s content. This is supposed to allow you an environment
in which to practice whatever programming you desire, and most importantly
an environment to fail in. Failure in your job usually leads to you losing
the respect of your peers at best, or losing your job at worst. This is not
an environment where you can make mistakes comfortably, and mistakes are
necessary for growth. 

So basically the section is telling us to make a side project where we can
mess up all we want, and learn from it. Pretty basic advice, but it can go a
long way to making you a better programmer. In fact, it is a piece of advice
I have already implemented in other parts of my life. As a hobby, I build
and paint plastic miniatures, and use them in tabletop games. Recently I
have become much more focused on improving my painting skills. As a result,
I have taken up several side projects where I can experiment with different
painting techniques. I even keep around spare models to use as test
subjects. Not all of these projects pan as I would like them to, but that is
part of what makes them appealing to me. It allows me to fool around and try
new things, without the risk of failure being an impediment. Back in the
book they suggest maintaining a wiki as a way to practice without worry.
Personally, I am thinking of fooling around in some game engines as a way to
practice.

From the blog CS@Worcester Alejandro Professional Blog by amontesdeoca and used with permission of the author. All other rights reserved by the author.

Perpetual Learning: Break Your Toys


   Last week I started diving into the perpetual learning section of the
Apprenticeship patterns book, beginning with the expand your bandwidth
section. I talked about how I want to learn more about my field and explore
new discoveries in the industry. This time however I read up on the “Break
Your Toys” section from the book. This section covers the need to fail in
order to improve, and how to set up an environment where you can sort of
fail on purpose.

I am no stranger to failing and struggling when it comes to computer
programming, as I am sure we all are familiar with it. This section makes a
case for using a pet project, or a “toy program” as they put it, to test and
break to your heart’s content. This is supposed to allow you an environment
in which to practice whatever programming you desire, and most importantly
an environment to fail in. Failure in your job usually leads to you losing
the respect of your peers at best, or losing your job at worst. This is not
an environment where you can make mistakes comfortably, and mistakes are
necessary for growth. 

So basically the section is telling us to make a side project where we can
mess up all we want, and learn from it. Pretty basic advice, but it can go a
long way to making you a better programmer. In fact, it is a piece of advice
I have already implemented in other parts of my life. As a hobby, I build
and paint plastic miniatures, and use them in tabletop games. Recently I
have become much more focused on improving my painting skills. As a result,
I have taken up several side projects where I can experiment with different
painting techniques. I even keep around spare models to use as test
subjects. Not all of these projects pan as I would like them to, but that is
part of what makes them appealing to me. It allows me to fool around and try
new things, without the risk of failure being an impediment. Back in the
book they suggest maintaining a wiki as a way to practice without worry.
Personally, I am thinking of fooling around in some game engines as a way to
practice.

From the blog CS@Worcester Alejandro Professional Blog by amontesdeoca and used with permission of the author. All other rights reserved by the author.