Monthly Archives: April 2022

Blog Post #7 – Confront (and Expose) your Ignorance  

I am combining these two patterns because I think that one without the other will make for an improper balance of skills. This quote [1] by Carl Rogers in his book, on Becoming a Person [2] is very inspirational to me. I have made a career habit out of trying to be unique, self-directed, and perform self-directed learning.

I am also aware of the importance of being able to admit gaps in my knowledge to others. I will be the first to admit that I don’t understand something, or that someone else has a better idea than I do, especially when I think I can leverage this knowledge to improving my skills, and my personal development efforts.

Throughout my career, I have always had home-based software projects in play. The two most noticeable were Guitar Companion, (a Windows C++/MFC turned C#.NET utility program for guitarists which contained components for a notation editor, metronome, tuning fork, band manager, and video guitar lessons), and Guitar Chords, an Android app using MIDI, speech recognition, and swiping techniques to display an intuitive, pleasant looking, and efficient way to show and play any chord.

Although these efforts didn’t make huge sums of money, they did have the intended benefit of ramping up my skills in different areas, allowing me to learn from my home office, and then use this knowledge when needed at companies I worked for. The reverse effect also occurred. I was able to learn techniques at client sites, and then parlay this knowledge back to my personal efforts.

If I had not been willing to “expose my ignorance”, I would not have been able to learn many techniques from other developers. If I had been too focused on “confronting my ignorance”, I would not have done well at sharing back the knowledge I had attained on my own. This process was truly a win-win experience.

It is beneficial that as one grows in their career, they become progressively less concerned about others thinking they are not adequately qualified, because they have gained enough information to both learn and teach. This will lead to salary increases, better projects, better interviews, better companies, and ultimately to a happier career.

References:

1.“If we value independence, if we are disturbed by the growing conformity of knowledge, of values, of attitudes, which our present system induces, then we may wish to set up conditions of learning which make for uniqueness, for self-direction, and for self-initiated learning.”

2. Chicago. Rogers, Carl R. 1995. On Becoming a Person. 2nd ed. Boston, MA: Houghton Mifflin (Trade).

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 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.