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.

Sprint 2 Retrospective

Following sprint 2, I will start off by saying what worked well. I think we are a little more comfortable with how the sprint process works. An improvement from the last sprint was that we knew what needed to be done for this sprint. We as a team decided to try and flesh out the backend and get it working before we start building the frontend. I think that we went into the sprint strong as everyone sort of picked up issues and started right away. Personally, I spent most of the sprint time working on the removeInventory endpoint and trying to wrap my head around how it would work. I had to look back on past endpoints that I worked with to try and find something to base it off of and ended up with something that made sense to me. For the most part, everyone finished their respective issues and we ended the sprint with a more structured backend.

Of course there is always room for improvement so I think we could definitely improve in terms of communication. There wasn’t much communication between class sessions, mostly reporting back to the team during the standup meetings. While it wasn’t detrimental to the workflow, it should definitely be something to keep in mind, myself included. In the second half of the sprint, we were trying to get the endpoints in one place so that inventory.js could be written and tested. There were some inconsistencies that I found between the endpoints and inventory.js so we should’ve definitely coordinated to decide on function names. We also ran into some issues trying to run the backend container so we couldn’t actually test it this sprint. For the next sprint we will need to test the backend and make it function as intended.

Based on my previous statements, we should make a point to increase communication outside of class time. During this sprint it wasn’t a major issue since we were mainly focusing on our own issues and only needed to coordinate once everything was done. That being said, we should make sure to notify teammates when we finish working on things so that we can carry on smoothly. Since we will need to get the backend working for the next sprint, I think coordination between those who worked on the endpoints will be essential. 

I will say that I am guilty of the lack of communication. I should have just sent a quick message to the discord when I had created a merge request or had an issue in need review. In this case, once the removeInventory endpoint was completed, I should’ve let Sebastian know since he was writing Inventory.js and I could’ve coordinated with him on the function names. Throughout the sprint, I essentially only worked on one issue, which was creating the endpoint. I would like to be more productive, finish issues within their set weights, and then move along with the development. I know what needs to be immediately done for the third sprint so we should be going in strong. I look forward to getting the backend tested and moving onto frontend work.

Issue #25 in the backend involved creating the removeInventory.js endpoint, where I referred to the API and existing endpoints to create.

From the blog CS@Worcester – Null Pointer by vrotimmy 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.

Learn How You Fail- blog 7

For this week, I learned a pattern called Learn How You Fail. Through this pattern, the author tells me that everyone is not perfect; and no one can avoid failure. “Failure is inevitable. It happens to everybody sooner or later”, he said. Moreover, the author also suggests to the readers how to deal with their failures or how to reduce the consequences of the next failures. First, you need to identify the reasons which might cause you fail, then instead of wasting your time to feel self-pity about those failures, you should try to resolve it. Gaining self-knowledge about “the patterns, conditions, habits, and behaviors that lead you to failure” is one the most important solutions that can help you become aware of your boundaries and limitations. When your boundaries and limits are found, you should face and accept the fact that you cannot be good at everything. There is still something you are not good at. Your awareness and your accurate self-assessment will allow you to make conscious choices to overcome your failures. There are two options suggested, that is, between working harder to push your boundaries or cutting your losses by accepting your limitations.

In my opinion, this pattern is helpful for all apprentices; because I agree with the author’s opinion that failures happen to everybody sooner or later. That means most of apprentices including myself cannot avoid failures when walking on the long road of the careers. Therefore, exposing with this pattern in advance can help me know what I should do if I fail. I should learn from my failures, learn what causes me fail, learn about where my boundaries or limitations are, learn how to assess myself accurately, learn to accept my imperfection, and eventually learn to make a decision to overcome those failures.

However, if I were asked what my decision would be if I failed, I would choose to put more effort into pushing my boundaries instead of accepting my limitations. It is not because I cannot accept my limitations, but it is because my definition of the word “failure” differs from its standard meaning. According to my own dictionary, failure means that I did not put in enough effort to achieve my goal. However, I believe that as time goes on, at some point, my own dictionary will be updated if there is a situation makes me accept that sometimes effort cannot change the result, then “cutting your losses” is a better choice.

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

Apprenticeship Pattern “The Deep End”

I decided to write a post about this section because I found very interesting. The author starts off this section with a quote from Christopher Hawkins,

“If you’ve never fallen on your face, odds are you haven’t attempted anything worth a damn.”

– Christopher Hawkins, “So You Want To Be a Software Consultant”

This quote made recall an experience I had during my freshman year of college. I was meeting with my advisor in her office, talking about how I was having difficulties learning the content in one of my classes. I was debating whether to retake that class in the following semester because I thought if I retook the class a second time, I would understand it better. My advisor advised me not to and gave me this piece of advice, even if I don’t understand everything in this class right now completely, this was fine. As I took more upper-level courses, I will gain new insight and start to understand the material in previous classes a lot better and may even learn to see it in a different light. At the time, I found that piece to be very strange because I had always thought if a course is prerequisite, you need to understand in the previous course to understand the material in the next class. Now I see in later classes, you apply the information that you learn in a previous class and by doing so, can understand the ins and outs about that topic and gain a better understanding of the topic.  

In this section, the author talks about the dangers of taking it easy and taking on only tasks that you know you can complete. He also talks about how by doing so, you will not grow because their skills will not improve and as a result, they won’t become confident in their work. Whilst it is true the author wants us to step outside of our comfort zone, he also talks about how important it is to be smart while doing it. In the short story given in the book, Enrique who was challenging himself by taking a job in Nigeria, did not blindly take a leap. Before he even made the move, he connected with people who knew were already working there and so he got himself a mentor that helped ease the transition.

I agree with the points that the author brought up. One additional point that I want to add would be the author does not say it is important to make large leaps or take on a challenging problem without a mentor, it is just easy when there is someone there to guide you.

From the blog CS@Worcester – Just a Guy Passing By by Eric Nguyen and used with permission of the author. All other rights reserved by the author.

My Second Sprint: An Improvement in the Journey

                Over the past few weeks I have once again had the opportunity to take part in developing the LibreFoodPantry software platform. From start to finish this second sprint has challenged our team in creating a solution to the question of security for this software. In this sprint we had mainly focused on how key cloak deployment would work and how we would adapt the existing web pages to utilize this security platform. We learned much throughout the sprint however we found that there was still much more to our role than just the webpages.

                Just to reiterate our goals, a group of my peers and I were tasked with creating a secure login service for LibreFoodPantry that would allow users to sign up and sign into the food pantry’s website. We had previously spent the last sprint attempting to understand how this third party software functioned and what we would need to do in order to implement it. This sprint would focus on the implementation of Keycloak and what would be the least disruptive method of doing so. The goals were as follows; create a working instance of keycloak with a front page without any containerization, understand how to create and maintain users, roles, secure each new page we added within the same login system, then transition this system to a container system such as Docker.

Getting started we first focused our efforts on everyone getting an instance of Keycloak running. After ensuring that I could get it working reliably I posted my results on Gitlab for my peers to have their own working version of Keycloak with a frontend page. We were then able to move on to our other issues. I was tasked with reviewing NPM and how to adapt existing frontend pages to Keycloak as well as ensuring that permissions and logins could be carries between different pages. Others among us worked on researching the deployment of Keycloak on a Kubernetes cluster using AWS as well as communicating with other groups to begin to synchronize and ensure we were working on features that mattered for the other groups.

                The team worked well together, and we once again made a point to meet twice a week to discuss progress and synchronize ourselves outside of normal meeting times. It was worth the extra meeting times as I was able to assist group members in ensuring that they could have Keycloak working and that their computer was set up to properly install and run Keycloak and the frontend page.

                Our main problems came about once again in properly updating our work in the issues tab and a failure to properly estimate the weight of some issues we had created. I once again found that I was stuck on a single job most of the sprint trying to adapt existing pages to utilize Keycloak. It would be apt to say that I was again immersed in my own work and communicating less than would be ideal. However unlike last sprint I was able to work past this in a shorter time frame and was able to communicate this to my groupmates. With this out of the way I had started work on adapting this system to work in containers such as those found in Docker or in a Kubernetes cluster.

                At the end we had started to make more progress quickly but by that time the sprint had come to a close. While this was not an ideal sprint, it was definitely an improvement over the last and I feel that we had done better in estimating the weight of certain issues although not solving this problem entirely. We hope to continue practicing working in the Scrum format and improving our grasp on what issues need to be created and how much weight they should carry.

From the blog CS@Worcester – George Chyoghly CS-343 by gchyoghly and used with permission of the author. All other rights reserved by the author.

Sprint 2 Retrospective

For this sprint my focus was to get the frontend and backend talking to each other. This worked well and now they are communicating and sharing data as seen from the commit below. During the sprint we like during the last one was on teams of three, three assigned to the frontend and three assigned to the backend. Like last time this team dynamic worked well as we were able to complete a lot of issues in a timely manner.  Also, I found that the new commit scheme using commitlint made commits much easier to read. Due to the way you must commit a message, it made it so much nicer and easier to read know what type of commit they were sending such as a feature, fix, etc.

During the sprint however I did think that there was an issue with the team dynamic. On the frontend we didn’t have a lot of issues for this sprint. This sprint was mainly to focus on integration and adding files to make commits and other applications work well. For this it was mainly me and Sandesh who were working on this. Brendan did some work as well, but I thought to my self what the best team dynamic as Brendan when he would finish his issue most of the other issues were already assigned. Also, during this sprint, the backend team had their hands full with issues such as rabbitmq and making sure that it integrates with no issues. They managed to get most of the issues done as their team dynamic is structured very well and they all have a passion for working on the backend. Like the last sprint, I think that if the teams changed to 2 and 4 then every group member would have things to work on as the backend team normally has many more issues to work on during a sprint then the frontend team.

Apart from the team dynamic, I found that there were no other things that could be improved as a team. From an individual standpoint, there could be some things that could improve. Like last sprint I am still experiencing issues with too many commits. It has definitely gone down but every once in a while, when I commit work, I sometimes accidentally leave my test objects in the code which if not explained to other group members could confuse them. Due to this, I find myself sending a “fix” commit to remove all these test objects. What can be done to remedy this is to read all my code again before submitting. Like if were taking an exam, double checking my answers would ensure that every test object is removed form the code before any commit is sent through. Apart from that I really enjoyed this sprint and the work that I was submitting.

Commits

Added Commitlint to frontend repository: https://gitlab.com/LibreFoodPantry/client-solutions/theas-pantry/guestinfosystem/guestinfofrontend/-/commit/6179634a126b7dadb3e2edb193a87195a9aa6281

Change frontend skema to match backend: https://gitlab.com/LibreFoodPantry/client-solutions/theas-pantry/guestinfosystem/guestinfofrontend/-/commit/cc60a90c708823c01d47e705946363d7cf94c274

Make gitlab.ci file for frontend: https://gitlab.com/LibreFoodPantry/client-solutions/theas-pantry/guestinfosystem/guestinfofrontend/-/commit/57cca658ba91a8707934a246d31912dc63f8a19d

Frontend docker container with nginx: https://gitlab.com/LibreFoodPantry/client-solutions/theas-pantry/guestinfosystem/guestinfofrontend/-/commit/5842bad96d66457b3574bd54d48096e0ad2938d7

Fix container to reload and not crash: https://gitlab.com/LibreFoodPantry/client-solutions/theas-pantry/guestinfosystem/guestinfofrontend/-/commit/59a5599f7d3440f8472c4a5adc4f8abdb7b89e24

Integrate frontend image with backend:  https://gitlab.com/LibreFoodPantry/client-solutions/theas-pantry/guestinfosystem/guestinfofrontend/-/commit/321de2c87834105dabf1ecdb185cda3e699705d0

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

CS-448 AP Blog 9 (Read Constantly) – Reading Faster Prevents Coding Disaster

When you have read deep enough into “Apprenticeship Patterns” as much as I have, you start to notice a key feature of the book: many of the practices found within it are pre-requisites or co-requisites to other practices. Similar to a tech-tree structure found in a video game, proper software programming practices go hand-in-hand – this allows one to become proficient in many skills at once.

As usual, I have found that “Reading Constantly” is actually a practice that I already engage in. However, in contrast to the book, my level of “daily reading” is much smaller; I read for about 5-10 minutes each day, and it may not necessarily be related to the programming practices I need to study on. However, the book does state that reading during down time (even standing in line) is beneficial – perhaps, in an attempt to disagree, I was corrected by my own reading. This reinforces the idea: read, read, read!

I agree with Apprenticeship Patterns, and must also state that you should have a “queue” of books lined up; as you finish one, immediately start another. Tying in with “Practice, Practice, Practice”, constantly reading will keep you well-informed and up-to-date on problems that are relevant in today’s programming era.

When it comes to professional applications, “Reading Constantly” does not simply involve reading to obtain more knowledge. It also consists of:

  • Reading to acquire new connections within the academic community
  • Reading to apply skills from previous experiences
  • Reading to non-verbally communicate the idea that we are willing to improve ourselves

So, by taking some time to read every day, I am essentially performing both a “working” and “recreational” activity. I am able to boost my workplace performance in an enjoyable manner. Similar to the ideas found in the coding dojo, reading should come at ease, with information effortlessly flowing in like a gentle stream. Forcing yourself to learn new information is both un-enjoyable and ineffective.

Overall, I think that everyone and anyone who is considering an advancement in their career to read constantly. In a way, it makes us similar to our machines – we take in new input, compute it within our brains, and create solutions as output for our audiences. It’s a beautiful cycle, and it all starts with a good book.

From the blog CS@Worcester – mpekim.code by Mike Morley (mpekim) and used with permission of the author. All other rights reserved by the author.