Category Archives: Week 9

Apprenticeship pattern: The Long Road

For this week, I decided to read on chapter 3, “The Long Road” which talks about the reality of software and the reasons that should be behind it. Many people probably have their own vision of computer science, and most of them are about getting the highest-paying job, just like the chapter describes it.

One thing that we need to understand with technology is that it evolves all the time and changes. We need to understand that the more technology constantly changes, the more our knowledge needs to be increased and developed. Technology/computer science is about adaptation, change, learning all the time because it will never stop improving and increasing, so should be our brains.

When the author says, “You should be prepared for the length of this journey”, it means that we should always keep in mind that as software developer, the expectation of working, learning everyday should be part of us. That is something that I learned while being a computer science major; that it’s an everyday school even for those who are done and those who are still in schools. When we aspire to become a master software craftsman, we need to understand the work taht is behind it and the devotion, dedication and time we need to invest in them. We need to value long-term growth opportunities and be open to new knowledge because that will be the only way to become better at what we do and improve the skills we already have and also, gain new ones. It’s a lot of work and will take time, but at the end, it’s our reward from working hard and giving everything we could to become great software developer. Success is part of it, and all the benefits taht come with the hard work, btu we should not think of them as the main motivation as apprentice.

From the blog CS@Worcester – Gracia's Blog (Computer Science Major) by gkitenge and used with permission of the author. All other rights reserved by the author.

Concrete Skills

In approximately 6 weeks, I will become a new graduate student, and as I have not yet found an entry position for any company, it seems like I have no choice but to take any opportunity which comes first. Looking for a company makes me doubt that I am not good enough to qualify for any position and the waiting period is a bit frustrating and annoying.

An infamous reason that I heard from my friends is because I needed employers to sponsor me working authorization due to my international status. I was told that if employers see that option is on, the candidate’s document will immediately be excluded. Somewhat unfair but I will have a chance to verify it myself after earning myself working authorization and now I can be treated fairly by the applicant tracking system.

Besides, I think I made some mistakes in creating my resume initially that I did not include enough ability to show I am a good fit for the position. It is understandable that companies will not risk hiring someone who may not be able to directly contribute to the team’s workloads, even automate some simple manual tasks. Since my resume back then was poorly written, I failed to advertise myself to get the hiring manager’s intention.

Luckily, my action over the problem was kind of similar to what I read from the book, by collecting CVs from different people from the Internet and by hearing some tips and tricks from my friends on how to make my CVs better, I was able to rewrite my resume and checked it with different trusted ATS sites. Furthermore, my understanding on the subject improved considerably since then, so I can add more properties to the CVs. Comparing my initial CVs with my current one, it seems like I am now ready to reapply for every suitable position.

In conclusion, it could be tough getting to my first job, but as I started to be hired, it will be easier by then. Besides, I learned that I should put more preparation in my CVs, make a section to list every concrete skill that I have and related to the specified projects in the CVs.

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.

Apprenticeship Patterns: Chapter 2

Confront Your Ignorance

This pattern specifically covers an area of your skill-set or knowledge that you are not well-versed in. It challenges you to take the thing you are ignorant of that is relevant to your work or perhaps relevant to future work and invest your time to master it. The roundabout way of doing so is, as it describes, to pick the skill-set or technique and fill those gaps.

Seems simple enough but I felt as if this pattern is missing a bit of useful advice. Your personal growth when confronting your ignorance is more than organizational as the actions describes. It’s a matter of personal reflection and recognition. It’s definitely easier to say, “hey I know nothing about network communication”, and harder to recognize your own competency in network communication. The pattern does cover a bit of this, but it seems to focus far more in directly confronting easier problems.

I picked this specific pattern as it directly impacted how I worked during this semester’s sprints. In specific I applied this pattern unknowingly when I was thinking about working on a specific issue that related to using html. I have seen html code and references to it plenty of times during my college career but have never really used it before. I also overhead fellow classmates speak about it on rare occasions and mention building a custom resume styled website using html and other tools. I have had plenty of introductions and chances to learn something that is common in computer science, yet I have never taken the chance to learn it. At the start of the first sprint, I finally confronted my own ignorance around html and put myself into a situation where I would have to learn it in order to complete the issue. While I could have done this at any time it seemed prudent to place myself in a position to succeed at and implement to help motivate me to fill my gap in knowledge. This is why I felt like this pattern should describe learning how to identify your weaknesses a bit more as just knowing your weakness is quite different as confronting it is. One is merely a slight acknowledgement and the other lets you learn how to continually find your gaps.

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.

Learn How You Fail

This apprenticeship pattern talks about how software developers should learn about how they fail. It specifically discusses how apprentices should seek to identify the ways in which they tend to fail and attempt to resolve those that they think are worth fixing. It should be noted that this apprenticeship pattern is not about dwelling on past mistakes nor is about seeking perfection. Rather, the goal is to get a better understanding of yourself and your behaviors, habits, patterns, and conditions that lead you down the path of failure. With the knowledge gained of yourself, you will have an awareness of your boundaries and limitations. This awareness could also help you make conscious decisions about your actions, goals, and career as well as temper the tendency towards idealism.

By becoming conscious of the things that lead you to failure, you permit yourself the choice between working to fix them or cutting your losses. It is important to accept that there will some things that you are either not good at or simply require you to invest too much time and effort to make a small improvement. This will feed into your accurate self-assessment, but it also allows you to set realistic limitations on your goals. It is impossible to be good at everything, and accepting your limitations is important because it forces you to consciously acknowledge distractions and focus on your goals.

I personally think that learning how you fail is an incredibly valuable skill to gain. Failure is inevitable, and everybody at some point or another is going to experience it. If somebody does not experience failure, then that means they either have not pushed their abilities to their limits or they have learned a way to overlook their mistakes. Learning to recognize your failures, what led you to fail, as well as what you can learn from your mistakes is all vital to growth. It also helps software developer apprentices like myself have the ability to make better career decisions when drawing career maps for ourselves because learning how we fail allows us to be aware of our limitations and boundaries.

From the blog CS@Worcester – Fadi Akram by Fadi Akram and used with permission of the author. All other rights reserved by the author.

Craftsmanship Log #5 – Learning how I fail

               I mentioned in a previous post that, essentially, failure is as much an important factor of the learning process, at least for those who use the mistakes they make as an opportunity to reflect and properly understand the new knowledge that they may have gained. This means that our learning process has helped us, in a way, adapt our way that we approach problem solving so that we may avoid falling into any pitfalls depending on what we are needed to work on or properly utilize any techniques that we may have picked up for the right situation. However, no matter how diligent we are in our learning, we all have certain strengths and weaknesses that play a major role in each individual apprentice’s learning process. This situation is elaborated in the pattern titled “Learn how you fail”.

               Now, it is important to understand what is really means to “fail” in this case. This patter is not about an apprentice being unsuccessful in their craft and giving up without putting the proper amount of work to improve. Rather, it is about an apprentice’s acknowledgment of where their weaknesses related to their craft lie, which weaknesses does one feel they are worth working towards mending, as well as how to approach their craft in such ways that their weaknesses do not interfere. When one needs to learn how to fail, what they are really learning is developing the self-awareness that is needed to further hone their craft. While being an expert on a specific concept may be convenient, turning into a one-trick pony because one is complacent in what they are good at and do not feel like taking the risks necessary to improve their craft will do an apprentice more harm than good in the long run. An example from my own experience (though not CompSci related) that comes to mind is from my job as a tutor; while I am familiar with all the mathematics courses I am expected to know, I am aware of my weaknesses in the way I tend to communicate certain concepts to others. Through experience, I learned how exactly that weakness manifested so that I would make sure to change the way I would communicate my knowledge to others.

               Though gauging how far we have progressed in our learning process based on the number of our successes may help us in building up confidence to continue honing our craft, it is important to acknowledge and admit our weaknesses, as well as knowing which weaknesses are worth improving or avoiding provided we take the necessary risks.  

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

Apprenticeship Patterns: Breakable Toys

The breakable toys design pattern proposes a solution to working in an environment that does not welcome failure. Since failure is such a huge part of the learning process, it is important to create a private space outside of work where failure will not damage anything. Hoover and Oshineye recomend building a simple system that is relevant to your work and easy to build upon. For example, you could build your own wiki and use it to learn HTTP, databases, and web design. You should enjoy the thing you are building so that you are motivated to keep building and breaking it.

I think this design pattern is really interesting. I can see how it would be useful to have a private project to mess around with and not have to worry about breaking it. This seems like a very good way to build up your confidence in an area while also being able to experiment with new skillsets. I also think it is useful to build a project you are personally interested in. If you are interested in the project you are using to learn, you are more likely to keep experimenting with it.

I probably will wind up adopting this design pattern once I enter my professional career. I like the idea of having a private project to experiment with; it would be nice to have the chance to get more comfortable with concepts I’m less familiar with in an environment where failure has few consequences. I am specifically interested in the example the book mentions of creating breakable games. Especially if it’s a project I’m interested in and enjoy working on, I think it would be easy to keep myself interested in working on it.

I do disagree with this being the solution to a work environment that doesn’t allow for failure. I think any work environment should be able to tolerate failure; if your work expects you to succeed all the time, you should not be working there. Rather than taking on extra work in an effort to avoid failure, you should find a healthier work environment.

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.

Sustainable Motivations

Sustainable Motivations is an apprenticeship pattern that touches on the idea that despite loving programming issues such as frustration, lack of motivation, and in extreme instances burnout are still very possible. This apprenticeship pattern discusses how to deal with issues and attempt to mitigate them before they even really begin. One way to go about this is to make sure you keep a healthy balance between your work life and personal life. The apprenticeship pattern also gives anecdotes about times other developers dealt with an issue regarding a loss of motivation or uncertainty about what direction they want to take their careers.

To be honest this apprenticeship pattern did not click with me as well as the other ones I have read about so far. While I agree with the overall statement that you need to keep your ambitions and work in check to ensure you can maintain a steady level of motivation, it doesn’t really go into too much detail on how to go about it. The example I mentioned in my initial paragraph is one of very few where the authors actually talk about ways to manage this issue. They do reference another apprenticeship pattern called walking the long road, which discusses similar issues; but as an over all approach to trying to solve the specific problem they presented in this pattern the solutions given were mostly abstract and anecdotal. There is not too much that I can clearly take away from this pattern. Regardless there is still some lessons that I think are valuable, mainly the example I mentioned earlier regarding balancing time.

In my own life I have struggled with healthy balance of time. I tend to fluctuate between two extremes, either over focusing on work and sacrificing my personal life, or over focusing on my personal life and having my work suffer. Given this I can understand what this pattern is trying to say in that regard. While I was aware of this balancing issue in my life and have improved on it over time, reading through this pattern emphasized the importance of a good work life balance through anecdotal examples of issues other developers have also gone through.

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.

CS 448 Post #4

I moved on to chapter 4 for this post and wanted to start with the first problem for it, Be the Worst. The problem is here when you learned all you can about a certain skill or skillset and cannot grow any more at your current position, with the solution to this problem being to move on to another position and group where you are the worst at what is being worked on. That way, you will have plenty of room to grow and you have help for when you make mistakes. It’s a case of starting from the bottom and working your way to the top. I can see how effective this can be and it has been successful for others, but I also agree with the possible risks that may come from this tactic, such as bringing the team down, not catching up, and possible self esteem issues. It can lead to problems not just for you, but for your team. However, you can deal with these risks by joining teams that are open to this mindset, and/or checking in with the team on your progress to make sure you are not falling behind.

Some people prefer working with others and can improve faster than they would if they were alone. I usually work with other people that I have similar skill levels with, so I don’t have that many examples of teams that I have been in where I or someone else was the “worst”. I do have examples where I was having some trouble and was worried about falling behind, and I would talk with the other members for tips or to get help on what I was working on. However, I do usually try to figure things out on my own because I sometimes think I may be bothering my teammates. This has led to some issues where I came close to falling behind, but I was able to deal with it before it became a problem.

Collaborating with others is a very effective way at working and improving yourself, and the idea of being the worst in a group and working your way up over time is a successful path, but does come with risks that you will need to be able handle.

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

Rubbing Elbows

The context of this pattern is that although there are many people teaching you about coding, when it comes to actually developing software, it will be all in your hands. However, the problem is that your productivity has reached a plateau. One of the solution for this is to pair up with another software developer and accomplish a hands-on task together, side by side. Of course, it will be much better if the developer is better than you or has more experience. While pair programming can be an excellent technique for learning, it is a complex activity and is not always an inherently positive experience. However, when used effectively, it is one of the most powerful ways to learn, particularly from mentors. But how do we know that we are improving when pair programming? One of the way to know is that you will feel lost or behind with all the work/knowledge. At first, it feels like you are failing, but it isn’t always the case. It simply means you need to either slow thing down by asking questions, or endure the feeling of being lost and try to pick up the bits that you do understand. The action part of this pattern is to find an open source project to work with your pair programmer. Spend some time working on it each week together on the project. If you lose motivation for a long time, then it is time to change your partner.

When it comes to pair programming, I have done nothing but leetcode together with a programmer for like a week or so. Although I have never done pair programming for a long time, I do always surround myself with better developers than me. But that does not mean it breaks my plateau. I do learn new things here and there, but I have not actually done a project with that knowledge. Now comparing to our capstone project, I am learning new things with this group and project. All the programmer in my team seems they are better than me, so while I am doing my part of the issue for the project, I am also learning what the others did and how it connects with my issue. The problem with me is that I lack to have a vision of a finished project, but with this team and this project I can clearly see what our finished project will be at the end.

From the blog cs@worcester – Dream to Reality by tamusandesh99 and used with permission of the author. All other rights reserved by the author.

“Read Constantly” Apprenticeship Pattern

Summary:

This pattern arises when a programmer is aloof by deeper concepts of a topic, even based on one that he may know, such as a programming language. One of the best ways to solve this issue is digging deep by reading books constantly. Books can offer a huge amount of information about one or more topics, and should be prioritized over blogs as a main source of knowledge.

Branching from the “Unleashed Your Enthusiasm” pattern, this pattern is one of the most important I’ve come across. Even if you are enthusiastic about learning, or are proficient in a skill and or a programming language, the ability to sit down and read to grow your knowledge is what I believe to be the most important skill and behavior. Even someone that is not enthusiastic, or does not know a language, or does not know a tool, if he can make himself sit down and read to learn more about a topic, he has far greater potential than he who doesn’t read.

As such, I strongly agree with this pattern. It also is a strong reminder for me to start reading more, and I tend to not read books to learn more. While I strongly agree with this pattern, I also want to add a note that does not run contradictory to it. Sometimes not reading and getting familiar with something is also beneficial. Reading is extremely important, but getting an intuitive understanding of a tool, like driving a car, is also an important task that should be done concurrently to reading constantly.

As I’ve mentioned before, I am competent with the C++ programming language, and I’m able to use it confidently without having to constantly look things up online or in a book. However, this pattern has me thinking about what I should start reading. One of the things I understand the least of in C++ are Move Semantics. Move Semantics involve utilizing rvalues and rvalue references to avoid creating unnecessary copies of an instance. An rvalue tends to be an immutable value that tends to be on the right of an assignment operator, such as an equal sign (hence rvalue). How this works aloofs me, and I believe this can be a good starting point for me to begin my habit of reading books since I understand the context of its existence.

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