Sprint 1 Retrospective

The outcome of the sprint was excellent. We wanted to get a working frontend and a working backend, and we had to familiarize ourselves with the code from last semester. The state of the project did not have a fully functioning frontend, and the backend was not working at all. The goal of this sprint was to clean up the existing code and make the current features work as they should. The nature of this sprint was to set up the GuestInfoSystem front end and back end, and we did well on that. We added several features, but a majority of it was refactoring existing code.

One of the workflows we struggled with was managing branches while we programmed. Because there were three people on the front end and three people on the backend, multiple people worked on the same area of code. The workflow that emerged, especially on the backend, was creating many branches from other branches. The effect of this was that we had a diverging codebase that was difficult to merge and maintain coherence. For example, a branch created from the main branch was to add JSDoc. Then we needed to update an API path, and a branch was created from JSDoc. An individual continued to work on the JSDoc branch while someone else worked on a new branch from this one. Creating a new branches from an existing branchx continued a few times, and updates to the code were scattered. New code was mixed with old code in each different branch.

To not have this issue reoccur, we will be changing our workflow for managing branches. What we will do for the next sprint is make a single branch for each issue and merge it into the main branch following it has been reviewed. If a significant feature needs adding, we will create a branch for this, and multiple people can work on it at once. If there are multiple active branches, we will ensure that one branch does not modify the area of code in another branch. By working on small features and performing common merging, we will make sure code is not lost and each member is working on the most up-to-date code at all times. It was difficult to do this during our initial sprint due to the amount of code that needed to be rewritten to get the backend working. In the next sprint, we will follow this improved workflow.

A change that I will make in the next sprint is to improve the issue creation process. The issues that I made for this sprint were overly broad, and the weight did not fully capture the issue’s headline. For example, ‘Add JSDoc’ has a weight of three, but it sounds like something that could be done in one class period. This issue actually required defining the type for each variable used in the backend, defining function input and output types, and creating object types for each object in the backend. This process involves studying the code, assessing the proper type for each instance, typing each file, and ensuring the types selected do not throw errors between files. What I could have done to improve my issues by creating smaller issues for each of these steps. Each one of these issues could have been done in the same JSDoc branch, but each small issue clearly defines what is being worked on. Following the closure of JSDoc related issues, the branch could be merged into main.

Issues Completed During Sprint 1


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.

Craft over Art

This apprenticeship pattern discusses how software developers should prioritize placing their desire to give useful products to customers over their desire to create novel and fantastic code. Given the choice between using a simpler, proven solution and taking the opportunity to create something innovative and artistic, software developers should always choose the latter. This is because if software developers are to be considered craftsmen, then they need to focus on the craft. If a software developer loses their job because they keep creating beautiful code that customers simply do not find useful, then they have left the craft. This does not mean that the software products developed can not be beautiful, they can be, but they also must be useful and provide value to the customer. This apprenticeship pattern is about how software developers should develop the ability to sacrifice beatify for utility when it is necessary.

However, this apprenticeship pattern is not only about sacrificing art for craft, but it also encompasses the idea that the craft should always maintain a certain level of quality. Every piece of software produced should meet a set of standards. Being able to hold on to these standards will ultimately help develop an understanding that beauty and utility are not opposites, but interdependent. The more important a piece of software is, the more important that the software be of high quality. To achieve quality work, software developers must constantly make tradeoffs between beauty and utility. However, the tradeoffs we make might not always be the right ones, and so learning how properly refactor and repair code is essential to fixing our mistakes and correcting the balance that is desired.

I think this is an important apprenticeship pattern to learn because every software developer needs to have the skill of being able to strike a balance between beauty and utility in their code if they wish to be craftsmen in the craft of software development. I personally never gave much thought about striking a balance when writing code before reading this pattern. However, from now on I will start reconsidering how I should prioritize my desires when writing code to try and strike the right balance between usefulness and art.

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

Reporting System Sprint #1 In Review

Today I’m taking a break from writing about software apprenticeship to post a quick overview of my progress in the first of three sprints I’m doing as part of a scrum team working on the Thea’s Pantry reporting system. This is my first time on a scrum team as well as my first time working with most of the tech stack involved here, so if it seems sort of unfocused, that’s why.

Here are the links to the commits I wrote during the last sprint:

https://gitlab.com/LibreFoodPantry/client-solutions/theas-pantry/reportingsystem/reportingdocumentation/-/commit/fd8292deb31063912468f51b2fd343218a155b48

Here I fixed a typo. I also made the repo and wrote a very bare bones readme file that this commit was addressing.

https://gitlab.com/LibreFoodPantry/client-solutions/theas-pantry/reportingsystem/generatewcfbreportfrontend/-/commit/b9696c0951535f3200c49d8fce7de2dcd4c70929

Here I copied some boilerplate from an example project.

https://gitlab.com/LibreFoodPantry/client-solutions/theas-pantry/reportingsystem/generatewcfbreportfrontend/-/commit/b55ec4d296b4159258d51279a5ae0aee678ea2f2

Here I added scripts that make it easier to use docker-compose.

https://gitlab.com/LibreFoodPantry/client-solutions/theas-pantry/reportingsystem/generatewcfbreportfrontend/-/commit/7916ee242ca4cff7ff645f455986fd564ab68c52

I copied some things from an example readme to the frontend readme.

https://gitlab.com/LibreFoodPantry/client-solutions/theas-pantry/reportingsystem/generatewcfbreportfrontend/-/commit/3cdc0c6a7b049b2a1d1462bb28991487954a4861

I went back and changed the title of that readme to actually be relevant to the project.

https://gitlab.com/LibreFoodPantry/client-solutions/theas-pantry/reportingsystem/reportingbackend/-/commit/aac29a2161460b7ef832387c50d144221ae3a23b

I deleted a random file that I think someone was using for testing purposes.

https://gitlab.com/LibreFoodPantry/client-solutions/theas-pantry/reportingsystem/reportingbackend/-/commit/251b4a5088f3998de0bda28ef4f83c68ca69e9bd

This commit contains the bulk of the actual work I did. That being said, I didn’t really know what I was doing, and mostly just thoughtlessly copied stuff over for the sake of getting something out there. I noticed there were dependencies at the top of the file, and that they needed to be either removed from the file or added to the project in order for the code to actually work, although for the sake of time and for the sake of keeping the history clear I decided to just leave them in as they were. After the retrospective meeting, I think there’s really no good reason to keep the validator around when NPM serves the same purpose, although we might still put the logger to use.

So, the problem that has been burning in my mind the most was that I just kind of threw things together, being so unfamiliar with the system that I really didn’t even test to see whether my code worked. A big part of that is that we don’t really have anything functioning yet, but it’s also because in the specific area I was working on (the backend) I actually was a little rusty on how. I am from a background where I’m used to just having an executable file with a call stack that I can look at at any time, and the way this project is spread across multiple machines is something I find somewhat confusing.

We also didn’t take creating issues as seriously as we should have, in my opinion. We kind of threw it all on a few people. We should probably have discussed them for more than just the one class session, and the discussion should have been put in writing on GitLab so that there would be evidence of everyone having participated (a lesson I learned the hard way).

I think many issues were too granular. Many of the above commits were two-weight issues, which our department is using to mean that the task should take about one week. I did most of them back to back in one session, except for the last one, which took another session (in other words, it all added up to one single two-weight issue).

I feel like as a team we’re pretty good at putting the effort in, which is in my opinion the hardest part of anything. I think our biggest struggle is in communication, and I think that’s due in part to unfamiliarity with the project. Something we could try as a team is to pick five areas to research and assign one to each person. Something I could do personally is see if I can get the whole system running so that I can test it out and know what everything is for and what everything is supposed to do.

One final thing I’m going to do is proofread everything I write in this project, because a pretty significant number of commits up there are just fixing typos. I actually noticed another one as I was writing this post, which I’ll probably fix as soon as I post this. I don’t really understand why I made all these errors, since it’s not something I usually do. I suspect it may be because I was panicking when I did most of the work here. That’s definitely something to avoid in the future, since I feel it’s not conducive to programming.

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

First Sprint Retrospective

Reflection on what worked well and didn’t work well
After having the Sprint Retrospective meeting with my group overall, I would say things went pretty well. The workflow of the group was simple and smooth, and both the frontend and backend development teams were able to make a lot of progress towards the project. Overall, we were able to get everything done besides 3 items on our issue board. The only issue we really had was our branches. While working on the project, we ended up making a lot of branches for different things we were working on. For example, in the backend we had a API branch, a jsdoc branch, and a test branch. Per the Product Owner, he said that this is fine, but we should be merging the branches to the main branch and delete the branches once they get deleted. This will prevent future errors as other developers work on this project and add more things to it.

Reflection on what changes could be made to improve as a team
The team worked pretty well. We divided the project up into two teams, backend and frontend. This allowed everyone to work where they were most comfortable with. From how the meeting went, everyone was able to communicate any problems they had with one another, and no one was ever afraid to ask questions when they needed help. Something that the team can improve on is probably be more vocal. Sometimes there may be a problem that a member has, and everyone is silent until one of the more vocal members speak up. It may be, because some of the members may not know the answer but overall, just being more vocal is what the team could improve on. Instead of saying “I’m done, here’s what I did”. Maybe they can elaborate on what they did, like if they had any problems that they had to fix on their own.

Reflection on what changes could be made to improve as an individual
From my perspective, the sprint went well. I was able to complete me task with very little difficulties. I will attach the work I did on the project at the end with a description. Since what I worked on was mostly what I learned from last semester it was relatively easy and straight forward. Only problem I had was when I had to figure out how to connect certain files. This was mostly because of how the previously team worked on the project. What I can improve on is probably be more active with other team members. What I mean by this is to give input on when they are having any issues or any type of problems.  

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

Sprint Retrospective Blog Posts

Our team was assigned to create an app for  Naturalization Interview Confidence Environment. In this project, we have six team members. We had divided into a group of two to facilitate and make the project a lot faster and smoother. We have decided to create tasks and prioritize them based on the requirement of the job. We started with six epics and produced 40 issues for the first sprint. To better understand the basic functionalities of the app, we decided to create some basic demos as a test that will serve as a blueprint and what will be the best approach for implementation.

As each group got ready to take their responsibilities to work on certain specific tasks, it was essential for us to map several demos such as react native, ionic framework, and flutter.

Individual requirement.

I had a chance to work on the Ionic framework, which I shared with another student to develop a strategy to create a user-friendly app. As Apprenticeship Patterns describes in several chapters, learning new technologies requires a lot of wisdom. I had to pretend that I was not a Computer Science Major because I never had an opportunity to be exposed to that type of technology in the past. I had to spend hours on youtube to watch videos and then tried to connect the dots on my own demo ionic framework project. I was not sure what I was doing, but, unfortunately, it never ended up working and put a full stop to it.

What is Ionic, and where does it fit in our project?

Ionic is a mobile app development framework for HTML5 that focuses on hybrid apps. Small websites operating in a browser shell in an app with access to the native platform layer are known as hybrid apps. Hybrid apps have several advantages over pure native apps, including platform support, development speed, and access to third-party code.

Consider Ionic to be the front-end UI framework that takes care of your app’s overall look and feel as well as UI interactions. Like “Bootstrap for Native,” but with support for a wide range of native mobile components, smooth animations, and attractive design.

Ionic, unlike a responsive framework, comes with native-style mobile UI elements and layouts that you’d find in a native SDK on iOS or Android but didn’t exist on the web before. Ionic also provides some unique yet powerful techniques to create mobile apps that outperform standard HTML5 development frameworks.

Because Ionic is an HTML5 framework, it requires a native wrapper such as Cordova or PhoneGap to execute natively. We strongly advise you to use Cordova for your apps, and the Ionic tools will also use Cordova.

However, I could not get it working on the OS model, which was a big problem for our design since all types of users will need to access the application through either android or os. Even though I had to stop working on that demo, I have learned a lot of new tools that helped create that demo app. Overall, we decided to go with react native demo because it gives us the ability to connect to both android and os models. This sprint helps us lay out the basic principle of the project and how to move forward to the next one.

https://ionicframework.com/docs/v1/guide/

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

Sprint-1 Retrospective blog

For the first sprint, our team, team 1, have focused on working with 4 projects which are ReportingDocumentation, ReportingBackend, GenerateWCFBReportFrontend, and ReportingAPI. ReportingAPI and ReportingDocumentation are the two new projects created in this sprint. For ReportingDocumentation, we based on the description of the epic called “Create Documentation repository” to add all the necessary files and write the README.md to describe about the ReportingSytem in detail. In README.md, we depicted the role of each project created in the ReportingSytem; we also added the user story, the architecture, and technology sections related to Reporting system from Theas Pantry’s Documentation. ReportingDocumentation is completed as we expected in the first sprint, but we will update more information about each project in the Reporting System if any changes are made in the next sprint.

For the ReportingAPI, we separated the given API from the ReportingBackend into its own repository just like the example API that we have learned from last semester. Based on the example API, we added all the required files to the ReportingAPI. The src folder which includes the paths, responses, schemas, and index.yaml is the only folder that we have edited to create API for the ReportingSystem. This is a simple API, so we finished the ReportingAPI repository in the first sprint without any issues.

The API is similar to the blueprint for ReportingSystem which tells us what should be done in the backend. Based on the API, we know that Get /WCFB/report is the only request that needs to be implemented in the backend. However, the backend of ReportingSystem was made by another group with no instructions for running it. We tried many ways to test the backend and found some bugs in docker-compos.yaml that caused the images and containers to be built incorrectly. Although we fixed those, the backend was not working as expected. We also tried to refactor some of the .js files in the backend to make them look more understandable with the new style. However, since we still have not found a way to check if the old code is working correctly, we got confused when we refactored the backend. So, I think those missions should be redone in the next sprint. For this sprint, our team has not finished the backend yet, we just tried to test the old code of the backend, but we failed many times. So, the backend will be the only project we will focus to work on in the next sprint.

For the frontend, GenerateWCFBReportFrontend, we also based on the example frontend that we have learned from previous semester to create a similar frontend. We added all necessary files like the example; and the src folder is the only folder that we have edited to create the frontend for ReportingSystem. The frontend is still in progress as it is waiting for the backend to be completed. When we finish the backend, we will attach the http request to the method section in the getReport.vue to complete the frontend.

In summary, for the first sprint, we worked with the 4 projects in the ReportingSystem which are ReportingDocumentation, ReportingBackend, GenerateWCFBReportFrontend, and ReportingAPI. We have completed the ReportingAPI and ReportingDocumentation, but we will keep track on and update these two projects if there are any changes in other subsequent sprints. The ReportingBackend and GenerateWCFBReportFrontend are still in progress, but they are planned to be finished in the next sprint.

For the teamwork, I think we worked well as a team but the only change that I would suggest for the next sprint is that we should focus on solving the issues established in the sprint backlog before focusing on anything else. Our team focused too much on working with the backend, which consumed a lot of time with no results, and forgot what should have been done in this sprint. Although we completed all issues in the sprint backlog of the first sprint in time, the work was not evenly distributed among the team members. So, I think that is the point we need to notice to improve for the next sprint. On the other hand, as a member of group 1, I think I should communicate more with the whole team to figure out how to work as a team more effectively.

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 Patterns: Using Your Title

                When entering the workforce, one aspect that can cause a great deal of frustration is the job title you are given. Many software focused companies will have different titles to differentiate developers of various skill and seniority. Junior developer, developer, senior developer all carry with them an expectation of skill. Depending on which title you are given, it can have an adverse effect on how you view yourself and your skill level.

                ‘Apprenticeship Patterns’ delves into this explaining the common reactions to situations involving being given a seemingly improper title. Those who are given titles such as ‘senior’ or ‘lead’ developer may find themselves frustrated in the fact that they themselves do not feel worthy of such a title. Or on the other side, a person may far surpass their peers in skill and yet be given the same title as them.
Dave Hoover and Adewale Oshineye reflect upon this stating that a title is merely a distraction from the improvement of one’s own skill. Those with a high position of authority should refrain from becoming complacent and those with an unimpressive title must not let fact cloud their judgment.  

The authors explain that the conundrum of titles is a sign that “our industry has a problem” and should be used as a point of judgement for the organization rather than yourself (Hoover, Oshineye pg 51) . Being given a title that seems to be above your skill is often a byproduct of a “shortage of craftsmen in our industry” (Hoover, Oshineye pg51). Being given a title below your skill level can be frustrating but must not distract from your goal as an apprentice. Hoover and Oshineye mention keeping connections with your Mentors (See Last week’s post) and kindred spirits will help keep you grounded in reality.

                I myself have felt at times that my contributions at my old workplace far outpace my current job title. As stated in this pattern, I used this as a measurement of the organization I worked for which clearly did not recognize the skills of those lower in the ladder. Others may feel that their current title implies they are capable of more than they are currently feeling anxious of living up to such a title. All of this comes down to a matter of proper recognition and belonging which is sadly pushed aside in todays fast paced work environments. There is no way to change the industry overnight but having mentors who can reassure you in times such as these goes a long way in ensuring you remain focused on your goals of improvement as an apprentice.

Bibliography

Hoover, Dave H., and Adewale Oshineye. Apprenticeship Patterns: Guidance for the Aspiring Software Craftsman. O’Reilly, 2010.

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.

Post #1 for Individual Apprenticeship Patterns

Perpetual Learning Pattern: Expand your Bandwidth

This pattern is a very interesting to me. I worked as a software developer from 1980 – 2015. During this time, I found it necessary to take advantage of many resources. Some of these resources were offered to me by the companies I worked for, but more often, it was necessary for me to discover information on my own. I work for over 30 companies. In this 35-year span, I worked as an employee for 15 years, and as a contractor/consultant for the other 20. The employers were usually really generous about paying for tuition reimbursement, computer related conferences, and in-house training. As a contractor, more often I was required to pay for any career advancement benefits myself.

I really didn’t mind this, since they generally paid better, and there is far less politics involved in being a consultant. I was expected to be able to do the work I was hired for, and that usually sufficed.

I was lucky in the sense that I was really motivated to learn new technologies as they came out, and as a result I spend many hours outside of work reading over 100 textbooks, trade journals, attending conferences, and developing my own products.

I managed to gain a large skill-set learning for my own personal development efforts, and this knowledge, along with all I learned “on the job” was parlayed into knowledge, as well as resume entries, making myself more valuable, and allowing my career to “ride the wave” of progress in software as it occurred.

Yes, it is great to expand your skill-set, but if I have any word of caution to those seeking this path, make sure you study a skill as deeply as you can, so as to avoid being a “jack of all trades and a master of none”. I found the best balance to be found in trying to stay with a project for at least a year, but less than 4. In this range, you get deep enough into the peripheral skills they require, as well as sharpening your primary skills.

I worked as a mainframe developer in the 80’s and migrated to being a windows developer by buying my own equipment, teaching myself C and the Windows SDK (with a lot of help from the Boston Computer Society). I made a similar jump in 2008 from C#.NET enterprise level development to becoming an Android developer by jumping at the chance to develop an Android application by my company, but this was only possible because I had already developed the skill-set on my own.

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

Apprenticeship Pattern “Confront Your Ignorance”

In this first apprenticeship pattern, it talks about how a person may have realized they have gaps in their skill set and walks us through ways we can resolve this issue. I decided to do this apprenticeship pattern as my first one because I feel like I relate to this topic. Throughout my undergraduate career, I bounced around from major to major mostly because I am an indecisive person, but also because I am a person who has very diverse interests. I wanted to learn and do everything despite how unrealistic that may all seem. I often took classes out of order so that they would all fit in my schedule. As a result, for some of my classes, I felt like I was always playing catch up because I did not take the previous class that the class was built off or was either taking that class concurrently or at a later date. Because I was taking the classes out of order, I was always trying to learn things that I already should have known before taking the class. This left gaps in my knowledge because I wasn’t always sure that I learned everything that I needed to learn for the class.

One of the topics that the author talks about in this apprenticeship pattern is that often times when a person identifies the fact that they have gaps in their knowledge they don’t know where to start. This was how I felt sometimes when I realized I had a gap in class. In the book, it talks about how everyone learns differently and how we just need to find a way that works best for ourselves. For others it may be going online and reading a lot of articles and working through problems. For me, when I get stuck, I find myself staying late after class or going to my professor’s office hours and working through problems step-by-step with others. One thing that I found really interesting about this section is the topic of finding a balance between trying to hone your skills to confront your ignorance and fulfilling the needs of the team. I found this topic to be interesting because it was something that I never really thought about before. It is important for a person to confront their ignorance and hone their skills because that will make them a better programmer, but it is also just as important that you are mindful of others that you work with because in whilst in the process of honing your skills, you may inadvertently drag your team down. This made me realize this is something I need to think more about and work on in the future.

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.

Your First Language

No matter the area, everyone must start from somewhere. In Apprenticeship Patterns, the author addresses this concern for learning to program in his patten “Your First Language.” Your first language will determine your career direction, and it is essential to make sure your initial language aligns with your desired career path. For instance, an individual who aspires to be a Game developer should learn C++, whereas someone interested in data science should learn python as their first language. For someone who wants to be a software developer, their first language is flexible and can solve as many problems as possible that their work demands. The author also suggests that tests should be used frequently while learning your first language to check your understanding of the language over time.

While reading this pattern, I reflected on how I learned my first language, JavaScript, using NodeJS. I personally related to the pattern’s recommendations. This pattern is beneficial for individuals who have yet to learn a programming language or are still on the fence about which one to dive into deeper. I found it interesting the pattern recommends focusing on learning testing libraries to check your knowledge of the language while you are also learning to program in it.

Doing this would be challenging at first but prove to be beneficial in the long-term because of how necessary testing is in the software world. I have created software in the past while completely excluding testing from the project, and I did this from lack of knowledge of how to test and not understanding the importance of testing long-term. If I had known this pattern earlier, I would have incorporated testing into my process of learning my first language.

I slightly disagree with the pattern’s suggestion that you choose your first language based on whether you have someone in your network who can act as a teacher to guide you with learning that language. I think it would be beneficial in some situations, but if someone cannot network with a person who knows about the language they want to learn, I do not think this should be a limiting factor. There are many online resources and forms that can act as learning opportunities that can stand in place of a single person who can act as a teacher or a guide.

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.