Category Archives: CS-448

Apprenticeship Patterns: Chapter 5

Breakable Toys

Success is often a tool used to measure how effective you are as a programmer, but this isn’t quite true. Failure is often referred to as the great teacher, as learning from mistakes that you make is great for improving yourself. The idea behind this is that if everything you make is bound to succeed every time then the process behind it might not haven hard. Things that don’t challenge you are not going to fail for you, but at the same time you are not going to learn anything from it.

This pattern is to take something, try to build it, and learn from your failure. You can be skilled and incredibly proficient in your strong suits but if you are not failing as you proceed you might not be challenging yourself. You might stagnate in your skill, and while you can be incredibly good at it, you still are not learning anything that is challenging you.

This particular pattern I agree with. Learning through adversity is often a great motivator. For some, time is an incredible motivator and through procrastination you have a literal time limit challenging you. For some, something new is an incredible motivator as it’s something utterly foreign and waiting to be explored. You should try something new to learn how your own skills are developing. Failure at first can deter you but taking this approach will teach you how failure will motivate you. You couldn’t succeed, but it doesn’t mean you cannot. You’ll find yourself thinking endlessly on that failure and seeing how others have succeeded where you failed will motivate you to think it has to be done. After all someone else has done it or likely created something like it. Take on a new library, build something that you never have before and let it break apart in your hands. Take the pieces and try building it again. In a sense you are letting yourself be broken by your broken project. Just challenging yourself will not be enough you have to learn from failure and learn how to fail. This pattern honestly should be called Breakable Self, as the learning portion isn’t the failed build, but rather using that failure to break a common mindset to succeed where you once failed.

From the blog CS@Worcester – A Boolean Not An Or by Julion DeVincentis and used with permission of the author. All other rights reserved by the author.

Dig Deeper

While reading the “Dig Deeper” pattern, all I could think of was how the authors had just blown-up whatever spot I thought I was hiding in. As a student, I typically would study or pay attention to the things I needed to work on in terms of meeting an assignment deadline or just getting an assignment to work somewhat as specified. Recently, while working on my final robotics project, I ran into a multitude of issues that didn’t allow me to complete the project how I intended. While trying to understand the vast amount of literature the internet had to offer on C++ programming, I just couldn’t overcome every issue I ran into. The main problem I encountered was the same one that’s defined in the book. Cutting corners during tutorials, and simplifying complex issues took an immense toll on my understanding of the language and the structures it had to offer in solving my problem.

The suggestion in the solution is something that I want to include in my arsenal for the future. To be able to dive into the depths of material and find out why things are made how they are is a more desirable trait than complaining or feeling flustered that certain things are too difficult or complex to understand. Digging deeper into tools and technologies that I’ve worked with might also make future interviewers more interested in me as potential candidate for a job. For example, during the entirety of the semester I was in a group that worked on building an application for people who want to prepare for their U.S. citizenship test. I wasn’t apart of every part that was developed but being able to learn and reiterate what my teammates did and why they did what they did is just as important as the work that I contributed to the project.

This pattern is the blueprint for the type of knowledge for the types of skills I desire to have. Instead of wondering why people decided to build things their way and replicating their choices, I want to be able to build technologies of my own and be able to make my own informed decisions along the way as I craft my own software or technology.

From the blog CS@Worcester – You have reached the upper bound by cloudtech360 and used with permission of the author. All other rights reserved by the author.

Learn To Fail

“Learning How You Fail” is all about realizing that you’ve grown in mastery but at the same time remain stagnant in other areas. Rather than trying to overcompensate for shortcomings, taking the same effort and seeking introspection instead seems to be more worthwhile. When I think about it that way it makes sense, although breaking out of the habits I’ve already formed will prove to be difficult.

I do agree with the sentiment of this pattern, but the thought of someone’s natural ability to either be great at something or bad at something comes to mind. Is it worth the energy to be less bad at a certain thing when you can excel elsewhere? At the end of the day, I guess that answer varies from person to person. But there is something admirable to say about someone who you’ve watched improve at something they were originally horrible at.

The “Learn How You Fail” pattern seems to be a preemptive strike of some sort. Figuring out how you will fail doing something allows you to do your best to steer clear of the pitfalls that lead you to your failure. Throughout my life, I have been one to make the same mistakes repeatedly. I’ve always said that I’m just persistent, and I am. But I would probably gain a lot more from my persistence if chose to analyze what had gone wrong, rather than to try and brute force my way through certain things.

The scenario painted in this pattern is to write some code that performs a binary search in a simple text editor and continue to fix the code until we believe it’s perfect. Once the code has reached our level of satisfaction, we also write test code from scratch. I think the point of this exercise is to realize that we ourselves may not be as perfect as we think we are. While I feel like this pattern can be applied to software apprenticeship, I feel like it’s more suitable “life advice”. Perhaps I’m not opening my mind enough and that’s a failure I could learn to learn more about.

From the blog CS@Worcester – You have reached the upper bound by cloudtech360 and used with permission of the author. All other rights reserved by the author.

Kindred Spirits

During the job interview that I have had. There is one question that I ask most recruiters which I believe is essential for job seekers who are looking for their first job. Deciding whether to work at that company, the question about the culture of a company is important. I think that if a company with a toxic culture and working environment, it would discourage the employees. There is this saying by Paul Graham “Nothing is more powerful than a community of talented people working on related problems”. In this “Kindred Spirits”, the author thinks that organizations’ cultures that encourage software craftsmanship are rare which I also think is true. Every day, tech workers complain about the working culture in big tech, that it’s not how they think it was when they first applied for the jobs, and that their jobs demand more time than just 9 to 5. So, I think that having a good culture is not only good for employees but also makes sure having better productivity.
The solution for those people who work in toxic culture is to be in frequent contact with people who are walking a similar road. Therefore, we should be able to seek out people like ourselves who are also looking to excel. The long road is not a road that anyone walks alone and especially in our early career, we should have a mentor. On the other hand, the culture encourages a safe environment for exploration and learning, a culture that does not limit its employees in what they should learn and that they can feel free to show each other what they’re learning to tend to attract more talents. Having no obligation to follow others’ lead would interest workers to explore and not be afraid of risk-taking. However, despite the benefits of a community of like-minded folk, we should be aware of groupthink. Avoid the questions that shock our community. Try to be respectful and use intellectual thinking to keep the community healthy. The culture and the community around us can be measured in the way it reacts to new ideas. Whether it embrace the idea after the intensive debate and experimentation? Or the ideas are quickly rejected? The most value we can provide service is defending it against those who believe that marching in lockstep is the price of membership.
To be able to do so we need to join the community where the people we work with, the blog we read, and the ideas we are intrigued by are respected. We can create our community but don’t be too strict on the ideas and topics too early. Advertise anywhere that software developers in our area might see it. Over time, these would pay off, as the group becomes larger and energetic enough, it will sustain itself even when we are not there. That’s when we have a community, good culture, and a non-toxic environment.

From the blog CS@Worcester – Hung Nguyen by hpnguyen27 and used with permission of the author. All other rights reserved by the author.

“Practice, Practice, Practice”

From the blog cs@worcester – Dahwal Dev by Dahwal Charles and used with permission of the author. All other rights reserved by the author.

Practice, Practice, Practice…

Summary:

The pattern is about emphasizing the importance of practicing our skills, coding in this scenario, to become the master in that particular skill set. The pattern states that we need to keep practicing every time we try to master a new skill. The pattern also recognizes that our work life balance does not provide a safe or stable enough environment for us to keep practicing. The solution provided by the pattern is that we organize our days. To join people, face to face or online, and to practice coding or other skills as part of a community. The pattern also points out that we need to make time and create safe & stress-free environment, because if we are not in a relaxed state then we will not be able to learn from our practice.

Why this pattern?

From the first year to last year, I have been using and writing codes in Java language. Entire semesters have been dedicated to learn and practice Java concepts. However, in a span of few months, I had to learn languages like python, R, JavaScript; frameworks like Junit, mocha, and many other things like VS code, Node.js, docker, R studio, Jupiter notebooks, etc. Therefore, I may not have mastered Java completely, but I am definitely far more confident and competent in Java than any of the things I have learned in the last year. Its like Bruce Lee said,” Practice makes perfect. After a long time of practicing our work will become natural, skillful, swift, and steady.”

Where I disagree:

To put the practice of practicing over and over is far easier said than done. Over the last few months, I have been swamped. Unless I start polishing my skills when I am eating and using the restroom, I do not see a way I can manage a time schedule where I can successfully complete my workload and carve time out for practicing.

The problem with community practicing or group learning is that every has their own schedules. It is next to impossible to co-ordinate meet times and even if that some how works out, different people want to work on different set of skills.

The point where I disagree the most is that while working in this safe and personal environment, we have almost no help or oversight. If we are stuck on some problem, it will be difficult to find help; or worse we keep practicing the wrong way without anyone there to correct us and now we have wasted all this precious time.

From the blog CS@worcester – Towards Tech by murtazan and used with permission of the author. All other rights reserved by the author.

Apprenticeship Patterns: Sustainable Motivations

The ‘sustainable motivations’ apprenticeship pattern discusses the realities of beginning a career in software engineering. In the process of developing your skills, you may be stuck working on projects with obscure specifications and fickle clients. This work can be, as Hoover and Oshineye describe, “rigorous, sometimes tedious, sometimes exhausting, often frustrating, and frequently overly chaotic or constraining,” and it may start to wane on your motivations. The trick is to not become wrapped up in your motivations; you should recognize that some days will be harder than others. You should not be driven by a single desire; if you are motivated only by money or a desire to build your reputation, you might burn out and lose that motivation. Your motivation should also come from wanting to master your craft

I thought that this apprenticeship pattern was really interesting. I think it highlights how easy it can be to become disheartened with your work, especially if you are not properly motivated. It can be devastating to invest time and money into a career you wind up losing interest in, and it is helpful to see advice on avoiding this.

I like the suggestion to have multiple motivations for working; obviously, if more factors are motivating you, you are less likely to lose interest in your work. The suggestion to, in addition to your other motivations, be motivated by mastery to avoid stagnating your skillset seems very useful. I also like the advice in this apprenticeship pattern to maintain a good balance between your work and your life. I think a healthy work-life balance is so important; your work should not demand so much of you that you are unable to enjoy other parts of your life.

I don’t agree with the first example discussed in the ‘solution’ section of this apprenticeship pattern. The person in this example hates the programming that their job requires, but they like the money and the reputation. The solution to this example is that they endure the job until it improves. I think this solution sounds absolutely miserable. I realize this is not as realistic a suggestion as it should be, but you should probably switch professions if you hate performing the main task your profession requires.

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

Concrete Skills

In concrete skills, the main topic discussed is establishing discrete, provable skills with specific technology. By developing concrete talents, this elevates your values as a potential member of the team, increasing your chances of receiving an offer. The patterns explains, to obtain an offer, developers should showcase their specific skills such as certain languages.

This pattern is a great tool to develop. My personal skills (besides languages) are vast but I would say for me personally I still have the fear that my skill level is still not up to par with some of my fellow competitors. Constantly comparing myself to them when I should be focused on my own skill set and become the best at those skills while then taking on other areas that I may be weak in or want to learn more of in the future. Being able to scale each company on what they are looking for is what concrete skills have helped me understand.

Each semester I would take on a new language of skill framework to become better in that area to be able to have a variety of skills to bring to the table. I’ve become skilled at languages such as JAVA, Python, C+, MySQL and many others. Using tools such as Android Studio to create applications, GIT and AWS. By concentrating on become proficient or even an expert level at these skills, I will be able to showcase my skills to any professional team if such skills are required. This is better than reaching at skills that you haven’t gotten a clue on where to begin.

To better sell yourself, utilize the Breakable Toys pattern. The developer exhibits their talents in a distinct, particular and demonstrable context by creating personal, low-stakes projects. This shows the employer what your skill level is and what you can offer to the company.

From the blog CS@Worcester – The Dive by gonzalezwsu22 and used with permission of the author. All other rights reserved by the author.

Apprenticeship Patterns – Unleash your Enthusiasm

In opposition to my personal experience with almost every other pattern, this is one that I very much struggle with. I have enthusiasm for certain things, but I find my motivation and discipline to be very shaky in my average lifestyle. This might have to do with personal mental health struggles and general disposition, and to be fair I’m still young enough to be unfamiliar with a passion I could truly want to pursue.  

To be completely honest, I believe this is the most difficult pattern for me to grapple with. I’ve certainly been involved with different types of projects where I was more enthusiastic compared to my other teammates, but they are few and far between. However, something that I can aspire to learn is the freedom of my enthusiasm as a “responsibility of the apprentice.” I find this line to be profoundly interesting, as I would have originally thought that the more experienced veterans embodied this type of archetype. Upon reflection though, I realize how mistaken I was, as innovators can’t be pigeonholed into time spent in an industry; rather the fresh ideas that emerge from newly aspiring minds are the most important part of the process. Regardless, I’ve learned that despite age or experience, a person who’s passionate about whatever they’re working on has (somewhat) the inherent obligation to innovate in the industry they work in. 

Unfortunately, I’m of the mindset that one should do the bare minimum to pass as a competent employee; I don’t know if this is because I’ve worked enough minimum wage jobs to understand the dynamic, or if I’m a lazy person inherently. Not to say that going above and beyond is a bad thing, but that raising the expectations eventually leads to a standard for most people that is unfair and not an expected level of engagement with the job. 

Anyways, with the last portion of the “Action” section, I see a true position where I’m lacking in my work ethic. I’ve certainly been in the place where I’ve declined to present an idea that may or may not be applicable to the project in question. It’s not that I’m reluctant to share, but more so I’m not inclined to add an argument/idea where it’s not necessarily necessary. I absolutely contribute where I think an idea may be beneficial, but in my experience it’s not worth the hassle to say something that could be thrown out with a disregard to the necessity of the point being made. Regardless, I’m certainly going to take this advice to heart and implement it in the future.

From the blog CS@worcester – Dummies that Code by howbrash and used with permission of the author. All other rights reserved by the author.

Retrospective #3

Final sprint before I lose my maintainer status to the repository, this sprint objective is to clean up our workspace, fix some minor issues which have been around since last sprints, and left the next semester a decent documentation so they will not be confused like us at their first step with this repository.

To begin with this sprint, I started with an issue that I was not able to solve from last sprint, which is registering the backend application with GitLab CI. This issue was a bit painful because after we plugged in RabbitMQ, we had to modify the execution cycle. To be specific, the RabbitMQ server must be up for some seconds before the backend application and I thought that I should figure out a way to use the pipeline to build that RabbitMQ container before the backend.

I actually found out the solution for both the pipeline and the integration when we had a conversation with the Kubernetes team where they told us to have each image in a distinctive container. After that, I attempted a different approach, instead of trying to inject the RabbitMQ to the backend during pipeline, I would only build a standalone server and release it, then, the RabbitMQ container will be defined once again in frontend testing and integration consisting of necessary environment variables which will trigger the backend server properly once it is executed.

However, the server’s execution consistency is still roughed as sometimes RabbitMQ is not detected. Besides, it happens on some computers while others don’t. Specifically, it only runs on a strong computer. Therefore, we changed the assumed time to have RabbitMQ start with an environment variable so we are free to modify the runtime based on hardware.

Last but not least, I created two environments for the backend repository, one for development, one for production. The small difference but undoubtedly critical is the binding and `nodemon` execution. Binding the container to local is not visible without `nodemon` since it will restart the server for every change we made. However, the default `nodemon index.js` is not working properly on Windows operating system after bind while MacOS works like a charm. I Looked around for several days without rushing and I just found out that `nodemon -L index.js` will make it work regardless of the operating system, where `-L` is the legacy flag.

To conclude, I am proud of my team overall because at our in-person retrospective meeting of this sprint, by showing our work, the Professor said that it is almost ready to be released. Back when we began in January, we had a not working server and a vanilla JavaScript frontend, the objective initially was to fix the server and somehow pull the Vue-CLI up as soon as possible; now we have a functional page where guests can register with their information and submit to the database. I learned a lot from this experience, both technical and soft skills, and I am feeling grateful for being given a chance to work in this meaningful project.

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