Apprenticeship Patterns: Chapter 2 Part 2

The Deep End

As the title describes the deep end is like the deep end of the pool when you are first learning to swim. While of course you need to learn the basics before you reach the deep end, the question then becomes do you make that jump when you have the necessary skills?

The answer is yes of course, and like the deep end of the pool as a young child it can be scary sometimes. I remember when I was younger and had learned how to swim in the deep end as well. I came to another kind of deep end at a local beach by a pond. Just swimming out into the deep wasn’t enough there was a fairly high tower that you could only jump off of if you could swim in the deep end. The only way to advance further was to take that leap. I unfortunately hit my arm on the way down and had it gotten stuck it definitely would have been broken. Luckily I made it just fine with a scrape, but the fear of taking the jump again was gone. I had made a mistake that I wouldn’t make again.

This particular pattern is one that I should really utilize, often you can get to a point where you may not really know where to go next or what even to do when you jump. Placing yourself into a situation that is more difficult than you have been before is critical for improvement and certainly applies to software development. With software development though you can know what you are likely going to face when taking on a new project to grow and adapt yourself. With any problem there is the general assumption to be made about what the solution is. The real challenge is in how you’ll solve it when you arrive at problems that present themselves while you have no solution.

I don’t find myself disagreeing with anything in particular about this pattern, unlike the previous one. It summarizes a problem and gives a solution that is a common theme in life. Sometimes to improve you need to take on a bigger task or place yourself in competition against those who you know are far better than you.

As for applying it towards my career as a software developer, there really is only one thing to do. Find a deep end and go for a swim. Worst case scenario is I’ll not achieve my task, which is only another opportunity to try it again.

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.

Craftsmanship Log #6 – Craft over Art

In many crafts, an apprentice’s main goal is to gain the experience and knowledge necessary to succeed in the craft of their choosing. Whether it is art or programming, an apprentice goes through the process of learning not only what techniques exist in their craft, but also how to acquire the techniques they learnt to achieve their goals. Though I personally cannot speak about art due to having no prior experience, I can say that in the field of programming I am aware that I will often be tasked to work on creating solutions for people. What I am also aware of is that we may almost never be on the same page regarding what customers want and what I may think is best for them. Though I personally may want to give a customer a product of code that balances functionality and aesthetics, it is this focus that may hinder the development process rather than help it. This situation is an apprenticeship pattern referred to, aptly, as “Craft over Art”.

A craftsman may encounter this patterns when they are put in a situation in which they are tasked with creating a working solution for a customer, though they may use this opportunity to show off their knowledge of the craft rather than applying the appropriate skills in order to create something viable and useful. In the case of a software developer, the craftsman may choose to put more emphasis on aesthetics by implementing functionality that may look fancy rather than using the proper functionality and techniques in order to deliver a working product that meets the customer’s specifications. Some developers may fall into this pitfall because, they believe, that the quality of the product is best shown only through how “fancy” the implementation looks and not through how the final product itself performs. This pitfall may be especially evident in software development, where the product itself may have to be maintained by other developers in the long run but may struggle with by virtue of how the original developer approached the implementation in the first place.

Though I personally may want to show off my skills by making programs in a creative way or to refine an existing piece of code by implementing fancier algorithms or optimizations, I understand that there is a time and place for that, oftentimes away from the professional environment. In fact, I strongly believe that having useful code to work with as soon as possible is far more important than having code that looks fancy and intricate that fails to deliver on its specifications.

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

Nurture Your Passion

To only a fraction of the human race does God give the privilege of earning one’s bread doing what one would have gladly pursued free, for passion. I am very thankful.

—Frederick Brooks, The Mythical Man-Month

This week the blog post I want to talk about is Nurture your passion. In a broader concept, I see this pattern as an explanation of the importance that has my passion as a software developer. In my first start, I knew really well, that being a great software developer is something that will be developed over time. I also knew that this will be possible through constant practice and dedication, making a difference in some other professions.

Just like all other professions, the reason why we choose it is because we like it. We have to remember this always, not only during the time we are facing problems at school while studying it, but even later on when we will have our future job. I have always been with the idea that I want to do the job I want, and not that this job needs to be done.

The context that Frederic Brooks has given on this pattern, is that we can be “hired” as a software developers. Being honest this is the first thought I have about what the person who will hire me will think, before hiring me. And this is very understandable. He/she might be referred by the resume I will send or any of the work I will have done, but still the ability to do that job I have to show it over time and always by learning each and every day.

Is interesting how the solution that the author has given here, will help lots of software developers including me to don’t demoralize when might be faced with corporate hierarchies.  The passion for being a developer is sometimes not enough.  Otherwise, we need to take into consideration the author’s solution. Is good finding something that interests us, and identify this as something we enjoy. Also, I like the idea that we can consider putting some extra time into the work that we are not able to spare enough time for during our workday. This is a really useful statement and the pattern in itself is the most essential that will help us be prepared for any upcoming condition.

This pattern also will be so helpful for me in the future. I am also very aware that a company I will work for, will have its ups and downs. I might face a lot of problems, maybe sometimes I will have difficult situations while doing a specific task, I might have deadlines for that task, or even special requests about it. But I always have to remember that the love for what I will be doing, will help me grow more the passion I have for software development.

From the blog CS@worcester – Xhulja's Blogs by xmurati and used with permission of the author. All other rights reserved by the author.

Reflection on the Sweep the Floor Apprenticeship Pattern

This apprenticeship pattern urges apprentices who are going to be entering the workforce to take on the tasks that nobody else wants to do. The tasks on the edges of the project, like documentation or code refactoring. It explains that this is a good way to help out the team without much experience, to ingratiate yourself with your teammates, and show everyone that you are capable and a useful member of the team. It will also help you gain some humility, by doing the tasks nobody else wants to do and learning the importance of these tasks.

I think that the real strength of this pattern is in laying down expectations for apprentices about to start, or just starting their time on a real team in the real world. We have to humble ourselves and realize that when we first start at a project, we are new and we haven’t earned our chops, or shown anyone what we can really do. By choosing to take on the menial tasks that everyone else has pushed aside, we are choosing to show everyone that we are willing to get our hands dirty, dive into a new project, and prove that we can be valuable besides just as a workhorse on these tasks. Showing the team that you are ready and willing to contribute to the project in whatever way you can shows that you aren’t someone to shy away from a challenge. The pattern also warns about the pitfalls of this though, and they are good things to keep in mind so you don’t get stuck doing menial work forever. I had kind of planned on this since the beginning, I think it is vitally important to show people that you are willing to do what needs to be done, and this pattern has reinforced the need to be ready for that and reminded me that while I am willing to do it, I also need to advocate for myself and make sure that I am getting what I want as an apprentice: the opportunity to learn, and to work on something bigger.

I don’t really disagree with anything from this pattern. I honestly think that it is all just good advice, it is important to be able to earn your place as a valuable team member, and it is equally important to remember that you are valuable, and to use it as a learning experience, and as a way to show your skill. It is a valuable part of being new to a project and is a great way that we can gain experience outside the classroom, and apply what we have learned to something real and tangible.

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

Draw your Own Map Pattern

So far, I have looked through all the patterns in the book as learning patterns. This pattern is somehow different it shows not a formula for growth but a remedy against decay. It tells us of things to come in our professional lives. It warns of the possibility of professional demands that can crush one’s soul. It tells stories of individuals bravely breaking through barriers imposed by different situations in life.

This pattern may seem unwarranted to the steps we are about to take, moving in fresh to the work force, but I believe it applies just as well now as it probably will 4 or 8 years from now. With the semester coming to an end many students probably had an internship opportunity, but many more probably didn’t. Finding out what makes someone tick can be hard especially with the lack of reasonable experience in different subfields. There is a lot of opportunity out there but not all of it are the best fit. I refrain from saying good or bad because I believe these are relative qualifiers.

Knowing what you want is important and changing your mind about what you thought you wanted is part of the process too. A lot of us will start on the first opportunity that comes out. Some of us may be luckier and have a short buffer to sort through a little. None will truly know what they are handed until they take the first step. But regardless of when and which, we must know the direction we want to take. Even not so glorious opportunities can serve us well as long as there are steppingstones in the right direction. We must watch for the fool stones, and this happens a lot I can say it from personal experience. You may find yourself in a place filled with opportunities that do not apply to you only because systematically maintaining you where you are is of greater interest to your employer and believe me, they will do the dance to have you stay there as long as possible. The author warns for that specifically. I think we are at a better place than the examples the author mentions. These people where stuck for years and the longer you take to move the greater obsolescence in your skill set. We must not wait long when is time to move. Employers have their own interest, and it is perfectly fine and healthy. But so should you have your own interests at heart and if they don’t align, then perhaps it is better for the employer, as well as yourself, to part ways.

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

Sprint 2 Retrospective

For the second sprint, we tried some of the changes we talked about from the first sprint retrospective and some things turned out better than before, but we still have some things we can work on.

Our main concern from the previous sprint was communication, especially on gitlab, and we believe that we have improved because we have been commenting more on issues and stuck to approving and completing merge requests outside of meetings. Up until the last meeting, we were caught up with merge requests and dealing with them before meetings. We made a rule to have merge requests get approved by at least two people before we make the merge. Only a couple issues had to get unapproved because of some problems that some of us who approved didn’t catch, but most of them went through normally. It is also good that we were able to adapt to new technologies that we started working with when it came to test classes and issues relating to automation. Half of us mainly focused on the backend data and test classes while the other half worked on other issues for the backend and API, along with one of the sets of data and test classes. Despite the gap between meetings from before spring break and after the two cancelled classes when we came back, we were able to finish most of the issues that we had for that sprint before the review and only a couple were moved to the product backlog for the last sprint.

The big thing that was a problem for us was the gap between meetings. We were doing some communicating online to stay caught up with issues, but we can improve on that. While we were able to finish most of the issues and got credit for the weight of work, we were rushing near the end to get everything done and had those couple issues we had to push back to the backlog, and there was some disorganization because some of the issues were not being assigned to epics. We have cleaned up the boards and they are all organized now. We wanted to work more on giving better names and descriptions to some of the issues, not just for consistency, but also because some of them were vague or unclear. Lastly, we want to continue our plan with approving merge requests and then merging them outside of class, but want to stay caught up with them because the merge requests filled up for the last meeting of the second sprint and we had to go through each one like how we did before, which was using up time that could be used for other things. We want to improve upon this sprint and have the last sprint be the best one.

As for me and how I did with the sprint and team, I would say I improved from before because I was communicating more online than the first sprint, which was my main focus of improvement. I was more involved in discussions on discord about planning and issues, and I stayed the same for in person discussions because I already getting involved in person. Going forward, I want to try and comment more on gitlab issues if I have any questions.

https://gitlab.com/LibreFoodPantry/common-services/foodkeeper/foodkeeper-newbackend/-/merge_requests/13?

Making the data file for the category object that has the methods used in the category endpoints.

https://gitlab.com/LibreFoodPantry/common-services/foodkeeper/foodkeeper-newbackend/-/merge_requests/15

Making the test file for category to test the methods I made in the data file.

https://gitlab.com/LibreFoodPantry/common-services/foodkeeper/foodkeeper-newbackend/-/merge_requests/16

The endpoint name changes for the backend to maintain consistency.

https://gitlab.com/LibreFoodPantry/common-services/foodkeeper/foodkeeperapi/-/merge_requests/46

The changes for the endpoint names where they appear in the API to match the changes in the backend.

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

Sprint 2 Retrospective:

This sprint ran more smoothly than Sprint 1 did. As a result of having obtained a more detailed specification by coordinating with the goals laid out by Dr. Burge from Nassau Community College and having obtained a better understanding of the individual skill-sets of our team members, we were able to produce an OpenAPI specification that defined 8 of the 9 requested endpoint definitions. The yaml file containing these definitions was then used to write, build, and test these endpoints in our back-end container. These methods were then tested internally within the container by using the Visual Studio Code environment to launch HTTP requests from 2 files (guest.http and qs.http). “Swagger UI” was used as a VSCode extension to facilitate this process.

It was easier this sprint to distribute work among the team, because the Open-API spec was available shortly after the start of the sprint, enabling back-end code to be written and unit tested. As testing progressed, we would modify the spec as we made changes to the back-end code to fix bugs.

Although we did a better job at keeping the Git-lab Epics and Issues boards properly in place than in the prior sprint, this may have been the weakest area of our efforts. Our intention is to improve the ongoing modification of this Scrum material as we progress to sprint 3.

We improved our use and efficiency of GIT to Git-Lab coordination, were able to build semantic versioning, checked the structure of the Open-API definition with Swagger Preview, and started looking into using a secure key. This key will be coordinated as a priority in the sprint 3 effort through communication with the IAM team.

I was able to set up a fork of the NEST Android application with the intention of doing system testing of the REST API. By using Android Studio, my prior knowledge of Android development with Java, and the help of a guiding YouTube video, along with general help from stackoverflow.com community, I was able to write 6 classes in an isolated namespace to the project. This code uses an android library call Volley to facilitate REST API development. This code launches an activity from the main NEST activity which allows the user to make requests to the remote back-end MongoDB database, and returns responses, which are then displayed in a scroll-able text view component.

The layout used by this activity used a relatively new UI component called a Constraint Layout, which improves the efficiency and maintainability of its XML code with the support of a sophisticated design tool allowing “drag and drop” of components, allowing them to effectively present a user interface which will scale properly over the hundreds of different android devices, all with different screen resolutions, aspect ratios, and device sizes.

The system testing was burdened by the fact that calls from Android were producing a Timeout Error on every attempt. With the help of Dr. Wurst, I am in a better position to get these calls working by the first week of the upcoming sprint.

I was impressed with this sprint, because our team accomplished the 2 main goals of this classroom effort, the first being to improve the skill-set of the team members in a “real world” development effort, and secondly, to help with the general progress of the LibreFoodPantry work to produce a product to help those less fortunate than ourselves.

From the blog cs@worcester – (Twinstar Blogland) by Joe Barry and used with permission of the author. All other rights reserved by the author.

Retrospective 2

The second sprint for my software development capstone class was on an honest note a bumpy road. The purpose of the sprint was to start the next level implementation of creating test files using mocha and chai also making sure the API is validated and can be bundled properly. Through the first part of the sprint the team has been very productive on keeping up with the issues we made for ourselves. After Spring break, our productivity started to plummet since we did not accomplish issues the following, we did not have our class meetings. 

As for my team members and I, we have faced greats issues that we started to come across that stumbled all of us. Due to facts of, lack of knowledge, merge requests, and was not able to accomplish all our issues for the sprint. First, when it came to merge request, I admit we have gotten better on how Git operates. But when it came to approving the request assigned to us. We had a pile of request that was not merged and had to spend our class meetings to squash all of time to keep the main repository up to date as soon as possible. Secondly, our productivity has plummeted since our spring break, we did not have to work on anything which was completely optional. But the following week we did not have any class meetings, we did not put in any effort at all and treated it as another extension of spring break. Third, as we gotten more depth of the issues, we did not have any knowledge on how to tackle certain issues. Because the remaining issues were dependent on each other to complete thus since we could not complete them, we had to tackle them towards our next and final sprint. 

Our team has reached a verdict to not stagger on our productivity. Especially when the third sprint is going to be our final one for the capstone class. We decided and wanted to be more proactive and aiding each other’s workspaces when there is possibly something we don’t know or don’t understand. Talked about gathering information from our professor on any recommendations he may give to us to set us on the same page. 

In regards towards myself, I had made good achievements but of course I as could’ve made better improvements that could’ve better contributed to our team. I wanted to learn more about how to implement Mocha and Chai testing. But I chose to do more of the basic parts of the issues to get them out of the way. But for the next I will be taking at least one or two issues that we made to create a more solid test file for all the tests to pass. I will be speaking to my team member that did extensive research to see if he can aid me in how to go about fixing and implement our test files already made gave at least the experience. 

Sprint 2 Issues

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

Sprint 2 Retrospective

Our sprint went well we wanted to finalize major features on the front end and the back end in order to have the necessary fully functioning for its operation. Our group collaborated on creating sprint objectives that we all agreed were important to focus on in the sprint. We ordered our work items in order from most to least important, which was helpful in focusing on getting the most relevant work done first. This helped later tasks because the issues below were dependent upon other issues being finished first.

Learning lessons from the last sprint, we managed our code much more efficiently this time around. We created a small branch for each time we were going to make a change to the CodeBase. Each one of these branches only changed a small portion of the code or added a small feature. Once we finish this change, we will immediately submit a merge request and have it incorporated into the code as soon as possible. This minimized the amount of divergence from other branches while people were working on their code. We had large stagnant branches that diverged from the other ones in the last sprint, and merging them became incredibly difficult. This time, we did small branches in merge consistently, which kept everyone’s codebase on track. We also set up testing, which still needs further tests, but this allows us to ensure that our changes are not going to break essential features when merged into the main branch.

We had one issue that some issues were dependent on other issues to be completed first. When one individual took longer than expected on an issue that required to be finished first before others could work on theirs, it left some students unable to work on essential features. In the future, it would make sense to re-distribute those tasks to individuals who were not being challenged or add another person to the issue to get it completed more quickly.

As a team, we did a good job at roughly keeping each other member aware of the current task we were working on. In the future, I think we could improve the detail of exactly what we are working on, which would help other team members adjust the priority of which issues they should be tackling. Overall, we did have a good improvement from the first sprint in communication. In this sprint, we also worked well at updating the sprint board and tasks as we finished and moved them onto the next stage.

For the final sprint, our team should work on creating broad goals that we want to achieve and turning those into smaller tasks that individuals can work on. At the end of the next sprint, our goal is to have a working front end and backend that can be deployed within a single docker container, and this will be broken down into smaller sub-tasks that each person can focus on achieving.

As I said for the teams’ comments, I should precisely make it what I am working on more well-known. This will improve the team’s performance because students will be able to choose their tasks better accordingly. I will enhance this during our standup meetings by going into more detail about my current tasks. I did improve over the last sprint and made sure to update the issues board so that two people do not work on the same issue simultaneously.

Issues Completed During Sprint 2


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

Sprint Retrospecitve Blog 2

We have made good progress in the second sprint, which was our objective to build on top of what we already did in the previous sprint. We have seen some results, but it could have been a lot better if we had changed some of the methods. 

  1. Plan in advance what to discuss for the future sprint discuss
  2. The detailed plans for every issue,
  3. Better communication in general 
  4. Think about the big picture 
  5. Break issues into small pieces
  6. Daily stand up to need to be more prepare
  7. Documentation needs to be clear and sample.
  8. How do we use time in class more efficiently 
  9. Go to detail and ask questions related to the issues and find the solutions. 

Since we’ve agreed that we need to improve what we do and how we do it, I’ve decided to narrow it down and be more specific about what we need to do to achieve the results we want. 

This sprint focused on the effectiveness of our abilities to work as a team. Since we already had a good idea about how we wanted our platform, we wanted to focus on the mechanisms of the way to work as a team. We had so much overlapped work between one another. For example, duplicates, comments, and misdirections to interpret others’ ideas caused a massive delay, which impacted us from making meaningful progress. Identifying the cause of the problem will help us prepare for the future. There is a list of the things that we think should be implemented to make the team more efficient. 

First, clarify the vision: You must first understand what you are trying to achieve before deciding how to solve a problem. Clarification is essential for teamwork to be successful. For this reason, we should write down our vision for each sprint. Detailing the issues will help us weigh the issues properly and break them down if necessary. We will be able to tell if the steps you’re taking will help us achieve our vision and if our problem-solving efforts were successful if we write down our vision. This step will be a great advantage in resolving the issues.

Second, Define the issue. Writing a vision statement gives everyone a basic understanding of what needs to be done. but it’s more concerned with what happens after the problem is solved than with the problem itself. That’s why it’s critical to write an issue statement that clearly defines the problem. We have seen issues that had nested issues, this should be a brief statement that describes the problem and explains why it is important to solve the problem. After all, how can we solve a problem if you don’t know what it is? 

Third, defying the context of the issues. Consider whether a business problem affects multiple individuals or functions within our project as a team, or if it only affects specific issue lines that we are working on. To be able to identify how to increase the performance of our work will help us to determine the best course of action. We felt that we need to better in this type of context. Learn how to write proper issues and better execution as a team.

From the blog CS@Worcester – Site Title by proctech21 and used with permission of the author. All other rights reserved by the author.