Category Archives: CS-448

Apprenticeship Patterns: Reading List

The ‘reading list’ apprenticeship pattern supposes a solution to a situation where you are finding books you want to read faster than you can get through them. There are lots of really good resources available for programming, and reading them is a great way to help you improve your programming skills. However, with such an abundance of resources, it becomes difficult to manage everything you want to read. The solution is, as is suggested by the name of the apprenticeship pattern, to maintain a reading list. This list should store both books you want to read and books you have already read. Hoover and Oshineye recommend storing your reading list somewhere public so that other people can see and learn from your list. Keeping a list like this for several years will allow you to analyze your reading habits and pick out spots where there might be gaps in your knowledge. As you work through your list, you can use the bibliographies of the books you read to add new books to your reading list. This can also help you narrow your research down into an area you take interest in.

I think this apprenticeship pattern is interesting, and I think it’s a great way to keep track of what you want to read. I think the advice to read books included in the bibliographies of books you thought were useful is really useful. I also really like the idea of being able to monitor your progress as you work through your reading list. I already kind of do this, just not exclusively with programming resources. I use a website to keep track of the books I want to read and the books I’ve already read. I like being able to see all of the books I have or want to read, because I know if I didn’t store that information somewhere I would forget all about it. It’s also really interesting to be able to analyze my own reading statistics like what genres I tend to read and what days I read more. I use it mostly for pleasure reading, but I think it would be useful to dedicate a section of my existing list to programming resources.

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.

Sprint Retrospective #3

As the third and final sprint for the semester, and with that my involvement with the N.I.C.E project, has come to an end, it is time to reflect on the progress that has been made, as well as what has changed with respect to team and personal work compared to the previous two sprints. The difference between this and the previous two sprints is that this sprint was the proper beginning of actual implementation of the features that we had been brainstorming as a team over the previous two sprints. With this being the case, we were no longer at the stage where we struggled to find some footing regarding the project’s infrastructure; we had actually begun laying the foundation that this project will be based on. In simpler terms, this is the sprint where we were no longer working on spike solutions, but actual source code. This meant that we were overall working with a more hands on approach to this project.

Though admittedly not perfect, this sprint proved to be the most productive sprint both in terms of actual productivity, given how we had to work over 42 issues, and well as individual and team growth. During this sprint we as a team had a much clearer direction in what we thought needed to be implemented, as well as how we would approach said implementation. This meant that members of both the Docker and the Source Code groups were more independent, which helped make some very good progress. That is not to say that all team members were working in complete isolation – on the contrary, there was by far more communication taking place across both Gitlab and Discord between team members during this sprint. This was especially prevalent in the Source Code team, which I was part of, as I made time to meet independently with my fellow team members to discuss or collaborate on certain issues. In my case, I was assigned to work on the following issues:

1) Implement file parsing to implement a question into a card component
2) Implement a method to make multiple copies of the single question preview component
3) Implement the component that contains a single question preview
4) Build a page that shows previews of the questions for the interview
5) Fix the visuals for the card components on the question previews

Sadly, we did not manage to implement certain issues exactly as we had envisioned them either due to bugs occurring or due to lack of time, though we still managed to make some satisfactory progress despite it all. Moreover, unlike the second sprint, there has also been improvement with respect to time management during meetings, something that we had reflected on and had problems with in earlier sprints. Though there were still cases were the conversation would veer off topic, we as a team were more conscious and thus put more effort into returning to our topic of discussion. This was also affected by our documentation; given that we begun to put more effort into documenting the development process into the appropriate issues on Gitlab, it has been easier for team members to be on the loop and communicate any misunderstandings outside of meetings. Moreover, I feel like my own working process has improved as a result, especially my weakness in properly gauging an issue’s proper weight. During this sprint, I feel like I have improved in taking the proper care to dissect and break down a goal into smaller goals so that implementing a feature is easier in terms of what steps need to be taken towards implementation, as well as seeing how my issue could be connected to another team member’s issue. Thus, instead of panicking to implement a vague issue, I noticed that I made better progress by implementing smaller and clearer issues.

As I mentioned, this sprint was by far the most productive sprint for the course. Though there may have been some occasional flaws or problems in productivity, these flaws were not as significant when compared to the second sprint. Overall, as a team we have noticed that we had finally gotten on a steady and clear path.

Direct links to issues:
1) Implement file parsing to implement a question into a card component: https://gitlab.com/worcester/cs/naturalization-interview-confidence-environment/demo-react/-/issues/42
2) Implement a method to make multiple copies of the single question preview component: https://gitlab.com/worcester/cs/naturalization-interview-confidence-environment/demo-react/-/issues/41
3) Implement the component that contains a single question preview: https://gitlab.com/worcester/cs/naturalization-interview-confidence-environment/demo-react/-/issues/39
4) Build a page that shows previews of the questions for the interview: https://gitlab.com/worcester/cs/naturalization-interview-confidence-environment/demo-react/-/issues/28
5) Fix the visuals for the card components on the question previews: https://gitlab.com/worcester/cs/naturalization-interview-confidence-environment/demo-react/-/issues/48

From the blog CS@Worcester – CompSci Log by sohoda and used with permission of the author. All other rights reserved by the author.

Find Mentors

Find Mentors is an apprenticeship pattern that talks about the importance of having someone that you can directly go to for help or ask questions in order to further your own understanding about the subject matter. This pattern talks about the importance of having a mentor, and the difficulty associated with finding a good one. Mentors can give you insights that you might not otherwise be able to figure out on your own, and guide you in a direction that will be the most beneficial for you. The main issue is finding a mentor who is not only competent in what they do but also willing and able to take the time to help you.

In my internship I was fortunate enough to be part of a small company with a tightly knit culture. As a result I was able to get to know a lot of the people in the engineering department and likewise I was able to pick their brains for new knowledge. I was also fortunate to have a very competent programmer manage me, as I was able to frequently ask them for questions or assistance with certain tasks that I otherwise would have taken much more time and effort trying to figure out on my own. They were essentially my mentor for the span of the internship, even going out of their way to recommend resources for me to look into on my own time that they believed would be beneficial to me. As a result of this experience I whole heatedly agree with this apprenticeship pattern, and I believe that if possible everyone should try to find someone to mentor them. This however brings up the issue mentioned in the initial paragraph, and that is finding good and willing mentors.

After my internship ended it became difficult for me to ask that same engineer for advice, and since then I haven’t really had anyone on the same level as them to directly mentor me. This is why I believe that it can be an issue trying to find a mentor outside of work. When you’re in the office its easy to get in touch with people smarter than you and get help, however outside of that environment its difficulty to find someone who is willing to give up some of their time to help what in many cases is a stranger. The authors do give some advice on how to go about this, and I believe that it is good advice that may eventually lead to a connection. But it still boils down to finding someone that wants to and has the time to help you.

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

Apprenticeship Pattern – Concrete Skills

Concrete Skills

This pattern is something I’m personally invested in, as the feeling of imposter syndrome is incredibly hard to shake. Depending on the career path I eventually go down, I plan to get as familiar with whatever basic techniques and software that the project will be using. I’ll undoubtedly be inexperienced and unprepared, but to demonstrate a basic level of competency with the most basic of the workload, I want to be as proficient as possible with the fundamentals. My biggest fear would be what the pattern refers to as “day care,” as I would loathe to be babysat in such a professional setting. On top of this, I thought the comment that one’s concrete skills are basically what get your foot in the door was quite insightful for someone like me lacking any sort of hiring experience. I’m also very grateful that the pattern lists a few of the concrete skills with examples like understanding of open source frameworks or basic web design. 

In addition to stressing the importance of the concrete fundamentals, the pattern also goes on to explain how your reputation can be based on the credibility of your portfolio. As you grow from being the new guy into a successful developer, your work will speak for itself and shatter that initial requirement for consistent fundamentals. While the former is still important, you won’t have to work nearly as hard to prove your utility to a team.

For the Action portion of this pattern, I’m certainly on board and will implement this in my future job searches. While considering a few different professionals, there may be consistently noted discrete skills in the CVs, so that could be a great skill to implement regardless of the career path. On the other hand, some of those skills may be niche, but hyper specific to the type of job you’d like to apply to in the future. The pattern recommends regularly examining your own CV and implementing a similar kind of honed skill set for the specific position you may be applying to. On top of this, I would say that engaging with professionals or colleagues in this manner would work to bolster professional relationships, which could lead to advances down the road if they reflect on your tenacity. 

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

Practice Practice Practice

Practice Practice Practice is an apprenticeship pattern that focuses on the idea that deliberate practice is the best and most efficient way to learn and master a craft. This apprenticeship pattern is similar to breakable toys, but it is more focused on the actual act of practicing rather than the consequence free ability to make mistakes. The pattern talks about doing challenging tasks repeatedly, and noting on what improvements and takeaways you have each time you complete the task. The authors liken it to a sort of programming dojo, similar to that of a martial arts studio, where repetition of motions without opponents is essential to excel in the martial art.

I absolutely agree with this apprenticeship pattern, and believe that practice is realistically the best way to actually learn to become a better programmer. While lectures at school are useful to learn about the subject matter, to truly understand it and begin to master it you need to be able to apply it yourself. I have first hand experience with this thanks to the internship I did last summer. While I do learn a lot in school, lectures and assignments only go so far. Being exposed to real world code and having to learn a lot on the job taught me a lot of practical skills that I otherwise would not have quickly learned. I was also surprised by how quickly I picked up on these things, and that even a little bit of repetition managed to ingrain new information into my head.

While I agree that this apprenticeship pattern is very useful, it can be hard for me to implement in my own life. If I am directed and given tasks to do then I will happily do them and learn new things in the process. The issue comes in when I need to self direct, and that can be difficult for me at times, especially with projects or activities that don’t necessarily peak my interest. For example, in order to practice for interviews I did leetcode questions as often as I could. While I did learn new things through the repetition that came from that, as time went on it became more of a chore and less of something I wanted to do and as such I began to do it less often. I hope to improve on this over time, and be able to stick to repetition for the sake of practice and improvement. Because while I can learn a lot at work, Ill have a harder time improving quickly if I also don’t practice on my own time.

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

Apprenticeship Pattern – Sweep the Floor

This pattern really focused on the idea of your value as the new guy in a fresh team environment. Each party has no idea about the other’s techniques, patterns, thought processes, or communication abilities. While you’ll naturally get acclimated to the team through experience, it’s always a good technique to pick up some of the menail, but important work. It should show the team that you’re willing to pitch in, and if you take your time to make that menial work look stellar, then that’s an even better indicator of your talent and value to the team. It warns of becoming the team’s “gopher,” which I would say is a valid caveat; I guess I would prefer to think that most people are more professional than that.

For the majority of the pattern, I wholeheartedly agreed with this advice. It should garner comradery with your peers, and an improved understanding of the project – I would apply this to any sort of team effort in general, because if the members operate in good faith then it should promote the team to be a more effective unit (theoretically).  The only thing that I have a bit of a disagreement with is the assertion that you might be relegated to that menial work by default, after trying to sweep the floor for too long. I’d say as long as you engage with teammates about where they are on the project, ask questions, and actually learn from those conversations, you should be at least relatively qualified to work on more challenging tasks. On top of your understanding of the different project parts, I’m confident your peers will recognize your engagement and welcome you to cooperate with different or more challenging content.   

Finally, I can understand the sentiment that one won’t appreciate the bigger picture of the project, or would get uncomfortable attempting new types of work outside of their comfort zone. These are very different problems, and require a good amount of introspection to address in my opinion. I’m going to look at the referenced patterns near the bottom to see if he elaborates further.

I think the most important lesson I got from this pattern is not to make yourself useful initially, but make everything that you tinker with is as close to your best work as you can get it. Who knows who’ll be impressed?

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

Apprenticeship Patterns: Chapter 3 Part 3

A Different Road

You find yourself tired and bored of your work. You have some personal projects to advance your skills that keeps you busy, but you find yourself needing to take a break. To diverge from the road you are on to either just rest for a while or to just see where it goes. Your career as a software developer is not what ultimately defines you. A Different Road describes a scenario where the road you have been traveling on in your programming career is not the road you want to travel along anymore. You might wish to spend more time at home and with your family. You might desire to train for a marathon. You could buy a bit of land, build a barn and become a farmer.

The road of your software development career never truly ends until you decide to end it and even if you do, you can always start back on it again. Just like riding a bicycle you never really forget something that you practiced frequently. So, take the break that you need. Buy that farm and become a farmer. Your career is not what really defines you, and maybe whatever you try will need some kind of optimization that your skill-set can solve.

Ultimately this pattern speaks to the idea of breaking the stubborn mindset most people find themselves in. It’s this mindset of having a path and having no other choice. The path paid your bills and you enjoy it to a degree. It’s hard to accept the idea that this thing you have been spending your time on isn’t right for you. To align with the road analogy, the road you have been traveling has been well paved and barely has any traffic. As you travel further and further you might find it gets even easier and has even more lanes and less traffic. You might also find that this road has potholes and traffic has only gotten worse and worse.

Recognizing when that road isn’t worth traveling on is easy to think about, but harder to act on even when it’s right in front of you. But unlike the road analogy, your skills and motivation are not a car. You can’t sell it and lose it, it can’t be stolen from you, and even if you don’t use it for a while it doesn’t mean it can’t start back up again. The thing to take to heart is do what you want to do, but also stop doing the thing you don’t want to do just because it’s your career.

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.

CS 448 Post #6

I finished the patterns I wanted to write about from chapter 4 and moved on to chapter 5, Perpetual Learning. Like the last few chapters, I to post about the first pattern of the chapter and then one of the last ones, so this post will be about Expand your Bandwidth. The focus of the chapter is on the topic of the lifelong journey of learning that is taken when you are an apprentice transitioning into a journeyman, which is a concept that was brought up in the first chapter.

The first pattern is an effective start to the chapter, as it is about how you can move on from lower level problems to higher level ones, and how you can expand your learning ability. The solution given to the problem is to find different ways to learn more than you may not have been using before, such as blogs, books, and other online resources. Because of how much technology there is in the world today, there are plenty of ways to find information online, and use different avenues of learning. I have found a lot of information online by either looking things up when I had questions or issues, or just by reading blogs and articles. I have looked online plenty of times when I needed help on something, especially computer science projects. I would search based on the error codes I was getting and try different sites to see if I could find a solution that worked for me. Using online resources have been very helpful to me for my work related to computer science, along with some other courses and activities.

I agree with the last paragraph of the solution that talks about deciding when you should start expanding, because while it is good to have all this information to learn from, you still want time to put that learning to use at software craftsmanship. You want to make time to continue working and improving yourself so that everything you are reading about and learning is beneficial to your work. I like that this problem brought more attention to the topic of this being a lifelong journey with continuous learning and development, while pointing out potential problems with obsessing over learning.

From the blog Jeffery Neal's Blog by jneal44 and used with permission of the author. All other rights reserved by the author.

The Long Road

For this week’s additional blog post, I have decided to look at the apprenticeship pattern “The Long Road”. In this chapter you, are aspiring to become a master software developer. However, your aspiration conflicts with what people expect from you. Conventional wisdom tells you to take the highest-paying job and the first promotion you can get your hands on, to stop programming and get onto more important work rather than slowly building up your skills. In this chapter it is advised that you should focus on the long-term. Value learning and long-term growth opportunities over salary and traditional notions of leadership. No one is so far ahead that you can’t match their skill level given the decades you will have to hone your craft. No business or technical domain is closed to you. According to Dave H. Hoover & Adewale Oshineye, the authors of the book, they say on this,

“This pattern is not for people aspiring to become CIOs or project managers, or filthy rich. Along the way, it is not unlikely that you will take on roles of power and responsibility or find yourself quite wealthy. However, these roles and benefits are not the main motivation of the successful apprentice—they are merely by-products of a lifelong journey. And rather than counting the days to retirement, the craftsman will willingly and joyfully work into her final decades. We don’t want to give the impression that everyone must follow a single road (see Draw Your Own Map) or that this is the right road for every software developer (see A Different Road). Some people leave development permanently and become executives, testers, salespeople, or project managers”. (Dave H. Hoover & Adewale Oshineye).

This chapter was an interesting one to read. I liked how it talked about how this is a unique profession, and you will be doing it for some time if the passion is there. I also liked how it talked about how you shouldn’t jump ship right away if there is an opportunity away from software development. I don’t think that this chapter will stick with me out in the real world, however. I feel as though this chapter is geared towards people with a mind set of already leaving this profession.

From the blog CS@worcester – Michale Friedrich by mikefriedrich1 and used with permission of the author. All other rights reserved by the author.

Find Mentor

There is always a good teacher behind a good student and a good engineer needs a good mentor who will help sharpen the skills and knowledge of that person. There is a saying “if you want to go fast, go alone. If you want to go far, go together”. Together with the mentorship, the engineer will become skilled at his job and has solid fundamental knowledge in this field.

By learning from the best, we learn how to become one of them. The apprenticeship will be supervised by a series of mentors who possess varying degrees of mastery. Every master used to be a student and no one is perfect. So keeping in mind that a master must be perfect is a misconception. It can be tempting to feel that way because they know so much more than we do. We must resist the temptation because we would not want to disillusion our mentor’s inevitable weaknesses.

The story about Dave finding his mentor shows us his journey. By sending out a random email to his mentor, Wyatt, he initially did not expect Wyatt’s response however Wyatt did. The effort was a payoff and he earned himself a mentor. What we could learn from this story is that we should not afraid to ask for help because sometimes what the other is waiting for is us asking.

Good mentors are not easy to find and not everyone is willing to open their arms and welcome us as amateurs. Plus, reaching out to someone that we do not know feels intimidating. However, the risk of being rejected is low but the payoff would be huge. Even though that person does not want to become our master but if we are consistent enough, what we could get back is a good friend. Besides taking in, passing along what we have learned from our mentors is one of the ways in which we can begin the transition to journeyman status.

How could we do that? One must wonder

Choose a tool, library, or community that has an active mailing list. Start small by signing up for the list but do not post any messages yet. Gradually, we will understand the values of the community and learn which of the subscribers are patient teachers. Seek out the members of this list the next time we see them and ask if they would be interested in providing us with some advice about the lesson they have learned. As I said above, we might get rejected but the valuable gift that one might earn is a good friend.

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