Category Archives: CS448

Software Craftsmanship

 Hello!

 I’ve had a bit of assigned reading to do for my capstone course, ans as such, I thought it would go the way of most readings of that ilk; incredibly dry and ungodly boring. But surprisingly I had a pretty good time with Apprenticeship Patterns by Dave Hoover and Adewale Oshineye. 


The text captures something that I find to be incredibly important to the process of becoming a career programmer, the ability to be flexible. Much of my time spent learning to program has consisted of how to do things, but never why or when we should do them. Sometimes it feels like I have a fairly full toolbox, but I don’t have the required knowledge to apply my tools in ways they weren’t explained to me in. I’ll admit, this is more of a personal failing I feel, but the point still stands. 


Chapter 1 and the introductory paragraphs to Chapter 4 really stood out to me the most, as Chapter 1 goes into detail about what it means to be a craftsman, and an apprentice. It highlights the experiences one might go through, and what one might expect to get out of an apprenticeship, but the most compelling out of that chapter was the focus on the need to continue learning. In order to be a good apprentice, and get anything meaningful out of the experience, it takes a want to learn how to become a master, and the willingness to continue to developing your craft, and focusing on how you can improve your mindset and workflow. Chapter 4 stood out to me with it’s anecdote about Dave’s experience with certifications, and his discarding of them as he learned from a group of Perl hackers. Not only was it quite amusing, it highlights ths importance of a flexible mindset. None of us are ever done learning, and in order to ever become a master, you cannot be satisfied with jist maintaining the status quo.

 

Overall I found the selected chapters to be genuinely pretty inspiring, and it put into perspective where my head is at in terms of my software development journey, and how I might go about improving them. This might be optimistic, but this book might end up being one I read in my off time, a rare feat for an assigned reading of this nature.

 

 

 

From the blog Camille's Cluttered Closet by Camille and used with permission of the author. All other rights reserved by the author.

Software Craftsmanship

 Hello!

 I’ve had a bit of assigned reading to do for my capstone course, ans as such, I thought it would go the way of most readings of that ilk; incredibly dry and ungodly boring. But surprisingly I had a pretty good time with Apprenticeship Patterns by Dave Hoover and Adewale Oshineye. 


The text captures something that I find to be incredibly important to the process of becoming a career programmer, the ability to be flexible. Much of my time spent learning to program has consisted of how to do things, but never why or when we should do them. Sometimes it feels like I have a fairly full toolbox, but I don’t have the required knowledge to apply my tools in ways they weren’t explained to me in. I’ll admit, this is more of a personal failing I feel, but the point still stands. 


Chapter 1 and the introductory paragraphs to Chapter 4 really stood out to me the most, as Chapter 1 goes into detail about what it means to be a craftsman, and an apprentice. It highlights the experiences one might go through, and what one might expect to get out of an apprenticeship, but the most compelling out of that chapter was the focus on the need to continue learning. In order to be a good apprentice, and get anything meaningful out of the experience, it takes a want to learn how to become a master, and the willingness to continue to developing your craft, and focusing on how you can improve your mindset and workflow. Chapter 4 stood out to me with it’s anecdote about Dave’s experience with certifications, and his discarding of them as he learned from a group of Perl hackers. Not only was it quite amusing, it highlights ths importance of a flexible mindset. None of us are ever done learning, and in order to ever become a master, you cannot be satisfied with jist maintaining the status quo.

 

Overall I found the selected chapters to be genuinely pretty inspiring, and it put into perspective where my head is at in terms of my software development journey, and how I might go about improving them. This might be optimistic, but this book might end up being one I read in my off time, a rare feat for an assigned reading of this nature.

 

 

 

From the blog Camille's Cluttered Closet by Camille and used with permission of the author. All other rights reserved by the author.

Software Craftsmanship

 Hello!

 I’ve had a bit of assigned reading to do for my capstone course, ans as such, I thought it would go the way of most readings of that ilk; incredibly dry and ungodly boring. But surprisingly I had a pretty good time with Apprenticeship Patterns by Dave Hoover and Adewale Oshineye. 


The text captures something that I find to be incredibly important to the process of becoming a career programmer, the ability to be flexible. Much of my time spent learning to program has consisted of how to do things, but never why or when we should do them. Sometimes it feels like I have a fairly full toolbox, but I don’t have the required knowledge to apply my tools in ways they weren’t explained to me in. I’ll admit, this is more of a personal failing I feel, but the point still stands. 


Chapter 1 and the introductory paragraphs to Chapter 4 really stood out to me the most, as Chapter 1 goes into detail about what it means to be a craftsman, and an apprentice. It highlights the experiences one might go through, and what one might expect to get out of an apprenticeship, but the most compelling out of that chapter was the focus on the need to continue learning. In order to be a good apprentice, and get anything meaningful out of the experience, it takes a want to learn how to become a master, and the willingness to continue to developing your craft, and focusing on how you can improve your mindset and workflow. Chapter 4 stood out to me with it’s anecdote about Dave’s experience with certifications, and his discarding of them as he learned from a group of Perl hackers. Not only was it quite amusing, it highlights ths importance of a flexible mindset. None of us are ever done learning, and in order to ever become a master, you cannot be satisfied with jist maintaining the status quo.

 

Overall I found the selected chapters to be genuinely pretty inspiring, and it put into perspective where my head is at in terms of my software development journey, and how I might go about improving them. This might be optimistic, but this book might end up being one I read in my off time, a rare feat for an assigned reading of this nature.

 

 

 

From the blog Camille's Cluttered Closet by Camille and used with permission of the author. All other rights reserved by the author.

Software Craftsmanship

 Hello!

 I’ve had a bit of assigned reading to do for my capstone course, ans as such, I thought it would go the way of most readings of that ilk; incredibly dry and ungodly boring. But surprisingly I had a pretty good time with Apprenticeship Patterns by Dave Hoover and Adewale Oshineye. 


The text captures something that I find to be incredibly important to the process of becoming a career programmer, the ability to be flexible. Much of my time spent learning to program has consisted of how to do things, but never why or when we should do them. Sometimes it feels like I have a fairly full toolbox, but I don’t have the required knowledge to apply my tools in ways they weren’t explained to me in. I’ll admit, this is more of a personal failing I feel, but the point still stands. 


Chapter 1 and the introductory paragraphs to Chapter 4 really stood out to me the most, as Chapter 1 goes into detail about what it means to be a craftsman, and an apprentice. It highlights the experiences one might go through, and what one might expect to get out of an apprenticeship, but the most compelling out of that chapter was the focus on the need to continue learning. In order to be a good apprentice, and get anything meaningful out of the experience, it takes a want to learn how to become a master, and the willingness to continue to developing your craft, and focusing on how you can improve your mindset and workflow. Chapter 4 stood out to me with it’s anecdote about Dave’s experience with certifications, and his discarding of them as he learned from a group of Perl hackers. Not only was it quite amusing, it highlights ths importance of a flexible mindset. None of us are ever done learning, and in order to ever become a master, you cannot be satisfied with jist maintaining the status quo.

 

Overall I found the selected chapters to be genuinely pretty inspiring, and it put into perspective where my head is at in terms of my software development journey, and how I might go about improving them. This might be optimistic, but this book might end up being one I read in my off time, a rare feat for an assigned reading of this nature.

 

 

 

From the blog Camille's Cluttered Closet by Camille and used with permission of the author. All other rights reserved by the author.

Software Craftsmanship

 Hello!

 I’ve had a bit of assigned reading to do for my capstone course, ans as such, I thought it would go the way of most readings of that ilk; incredibly dry and ungodly boring. But surprisingly I had a pretty good time with Apprenticeship Patterns by Dave Hoover and Adewale Oshineye. 


The text captures something that I find to be incredibly important to the process of becoming a career programmer, the ability to be flexible. Much of my time spent learning to program has consisted of how to do things, but never why or when we should do them. Sometimes it feels like I have a fairly full toolbox, but I don’t have the required knowledge to apply my tools in ways they weren’t explained to me in. I’ll admit, this is more of a personal failing I feel, but the point still stands. 


Chapter 1 and the introductory paragraphs to Chapter 4 really stood out to me the most, as Chapter 1 goes into detail about what it means to be a craftsman, and an apprentice. It highlights the experiences one might go through, and what one might expect to get out of an apprenticeship, but the most compelling out of that chapter was the focus on the need to continue learning. In order to be a good apprentice, and get anything meaningful out of the experience, it takes a want to learn how to become a master, and the willingness to continue to developing your craft, and focusing on how you can improve your mindset and workflow. Chapter 4 stood out to me with it’s anecdote about Dave’s experience with certifications, and his discarding of them as he learned from a group of Perl hackers. Not only was it quite amusing, it highlights ths importance of a flexible mindset. None of us are ever done learning, and in order to ever become a master, you cannot be satisfied with jist maintaining the status quo.

 

Overall I found the selected chapters to be genuinely pretty inspiring, and it put into perspective where my head is at in terms of my software development journey, and how I might go about improving them. This might be optimistic, but this book might end up being one I read in my off time, a rare feat for an assigned reading of this nature.

 

 

 

From the blog Camille's Cluttered Closet by Camille and used with permission of the author. All other rights reserved by the author.

Dig Deeper

“Dig Deeper” highlights the importance of acquiring in-depth knowledge of tools, technologies, and techniques in software development that help software developers to tackle complex problems effectively. Many software developers get trapped in a stagnant growth pattern and are content with a shallow understanding of their field.

The problem with this mindset is that a shallow understanding often results in challenges when faced with complex issues or unexpected bugs. This shallow understanding also often leads to frustration and hinders the ability of developers to provide meaningful contributions to their projects.

The solution then is to invest time and effort in acquiring a deeper understanding of the tools and technologies used in software development. Rather than merely skimming the surface, developers are encouraged to understand concepts such as concurrency models, type theory, and network protocols which equips individuals with the knowledge to tackle a wide range of challenges and contribute meaningfully to projects.

Moreover, deep knowledge of the field enables developers to explain complex systems, debug effectively, and make informed decisions about technology selection and implementation. This depth of knowledge enables developers to navigate complex problems with confidence and make informed decisions.

It is also important to research information from primary sources, such as specifications and original research papers, rather than relying on secondary or paraphrased sources. By learning more about the original context of ideas and understanding the problems they were designed to solve, developers gain a deeper understanding and can apply their knowledge more effectively.

In addition to looking at the source, software developers are encouraged to engage in activities that deepen their understanding of key concepts and technologies. This may involve implementing solutions from scratch, critically evaluating existing frameworks or libraries, or even keeping a record of their learning journey. By documenting their learning journey through blog posts or other means, developers can reflect on their progress and share insights with others.

As an undergraduate learning to become a software developer in school, I certainly sometimes a mindset more focused on “passing” rather than “succeeding”. I find myself often learning only just enough to earn that “A” instead of really diving deep into the material being taught. This mindset may get me past my academic career, but it will not get me far in my professional career. I will definitely need to devote more time studying about the deeper side of Computer Science, especially the subjects that I feel weaker in, such as Networking and Frontend work.

In summary, the pattern “Dig Deeper” motivates developers to have a deeper knowledge in software development. By investing time and effort in understanding the underlying principles and design considerations, developers can enhance their problem-solving abilities, contribute meaningfully to projects, and ultimately, lead them closer to perfection in their craft.

From Chapter Six, “Dig Deeper” in Apprenticeship Patterns by Dave Hoover and Adewale Oshineye

From the blog Stories by Namson Nguyen on Medium by Namson Nguyen and used with permission of the author. All other rights reserved by the author.

Record What You Learn

The Apprenticeship Pattern “Record What You Learn” emphasizes the importance of documenting the journey and lessons that a software developer has learned to enhance personal and professional growth. This pattern addresses the common issue that many developers share of repeatedly encountering similar tasks or problems without retaining valuable insights. By maintaining a record of experiences in a journal, personal wiki, or blog, individuals can create a chronological account of the lessons they’ve learned, serving as both inspiration and a valuable resource.

Recording the solutions made to problems encountered along the software journey involves actively documenting experiences, insights, and solutions encountered. The primary problem of not documenting lessons learned is that it causes a lack of learning from past experiences, leading to repetition and inefficiency. Without a record of lessons learned, individuals may find themselves continuously getting slowed down by the same challenges without making much progress.

Maintaining a record of experiences offers several benefits. Firstly, it enables individuals to mentor others by making their journey explicit, sharing insights, and providing guidance based on past learnings. Additionally, it makes it easier to reflect, allowing individuals to identify patterns, make connections, and discover new insights.

To avoid falling into the trap of forgetting valuable lessons, individuals are encouraged to regularly revisit and review their records. By engaging in this process, they can prevent stagnation, identify areas for improvement, and continue evolving. Moreover, have access to and using both internal and external feedback allows the developer to receive more accurate self-assessment which motivates continuous learning and growth.

There are several examples in Apprenticeship Patterns that illustrate how individuals can implement this pattern in practice. For example, maintaining two instances of the same wiki — one for private thoughts and the other for shared lessons — allows for effective self-reflection. Similarly, transcribing ideas that shaped one’s learning into a text file allows it to be kept as a valuable resource for future reference and inspiration.

I believe that recording one’s learning progress it super important to any skill. So often I find myself making the same mistakes over and over again, but then I remember to look at my notes and the past resources I’ve logged for myself, and I find them super helpful in guiding my work to be more efficient and effective.

In conclusion, “Record What You Learn” encourages proactive documentation of experiences and insights to help developers apply what they’ve learned to everyday problems they may face. By methodically recording and reflecting on the lessons learned, programmers can discover valuable insights, avoid repeating past mistakes, and progress on their journey towards mastery.

From Chapter Five, “Record What You Learn” in Apprenticeship Patterns by Dave Hoover and Adewale Oshineye

From the blog Stories by Namson Nguyen on Medium by Namson Nguyen and used with permission of the author. All other rights reserved by the author.

Sprint 3 Retrospective Blog

With new experience gained from both Spring 1 and Sprint 2, Sprint 3 began without delay as I and my team worked to finish up all our loose ends before the coming end of the semester.

As a team, we all worked very well together in all stages of the final sprint. There was good communication through Discord and SMS to coordinate meeting times both in person and online, through which we collaborated to find solutions to the backlog issues. We were able to effectively work this way, evident through the team’s ability to complete eighteen out of the twenty-one weight we planned at the beginning of the Sprint. Some of the loose ends we needed to wrap were: 1) to get the frontend working, 2) to implement the buttons, 3) to update the Add Inventory Frontend documentation.

Because of the limited time we had, the team was not able to start implementing the new Add Inventory Frontend wireframe design which had been added in Sprint 2. However, we were able to get the frontend to run which we based off the code from Guest Info Frontend. This fix included adding a developer mode which allows for changes made in the code to be automatically updated to the frontend without needing to stop and restart. In addition, my team implemented the original button design and updated the documentation to reflect the new frontend features listed above.

My team and I decided that because there was not enough time to implement the Add Inventory Frontend wirefram design, it would be best to let the next Capstone class pick up where we left off. Firstly, the current layout is not the one represented by the wireframe. This would need to be updated. Secondly, the already created buttons would need to be linked to the backend using the appropriate endpoint call. Both of these are already issues in the backlog and can be used by the next team.

Seeing this sprint and the semester coming to an end, I feel accomplished with the work my team and I were able to get done. I personally learned a lot about the GitLab working environment, linters and how to use them through pipelines, designing frontend frameworks through Vue and HTML, and most importantly, meeting with a team to plan the backlog, collaborating to solve our issues, reviewing code solutions, and presenting our work to the professor at the end of each Sprint and to the entire class at the end of the semester.

Overall, this Capstone class was a growing experience through which I increased my ability to adapt to unfamiliar situations and became more comfortable with taking the initiative at certain times, especially when I was Scrum Master in the first Sprint. I am happy with the progress I and my team were able to make together this Sprint and throughout the entire semester.

Activity links:

Fix Frontend Build: https://gitlab.com/LibreFoodPantry/client-solutions/theas-pantry/inventorysystem/addinventoryfrontend/-/issues/49
Description: Redesigned how Add Inventory Frontend is build, implementing the developer build allowing for live change updates.

Update Frontend Wireframe: https://gitlab.com/LibreFoodPantry/client-solutions/theas-pantry/documentation/-/issues/12
Description: Updated the frontend wireframe in Add Inventory Frontend which had not been merged in Sprint 2.

Update Documentation: https://gitlab.com/LibreFoodPantry/client-solutions/theas-pantry/inventorysystem/addinventoryfrontend/-/issues/46
Description: Updated the Documentation in Add Inventory Frontend to reflect the new features added in all three Sprints.

From the blog Stories by Namson Nguyen on Medium by Namson Nguyen and used with permission of the author. All other rights reserved by the author.

Practice, Practice, Practice

Mastery in any skill requires a love for practice and continuous improvement. Practice and improvement can be done through deliberate practice sessions which involves structured exercises tailored to hone specific skills.

One such form of exercise is code katas, inspired by martial arts but applied to software development, which emphasizes the importance of practice, fluidity, speed, and control. Coding katas are short programming exercises where developers solve specific problems or implement algorithms within a set time frame, typically ranging from a few minutes to an hour. Participants work individually or in small groups to write clean, efficient, and maintainable code. The goal is to encourage deliberate practice, enhance problem-solving skills, and promote continuous learning in software development.

Coder’s dojos, provide a supportive environment for practicing code katas in a group setting. These sessions, which are free from stress and interruptions, are crucial for skill development. Short feedback loops ensure that participants receive timely input to avoid developing bad habits.

Practicing different exercises helps discover nuances in skills and prevents stagnation. It’s essential to choose challenging exercises from fundamental computer science books to keep practice sessions interesting and educational. Some recommended books from Hoover and Oshineye, the author of Apprenticeship Patterns is “Programming Pearls” and “Etudes for Programmers.”

It’s often personally difficult to motivate myself to practice coding, though the idea itself is very logically sound. In my spare time, I like to learn new languages like Japanese or Chinese, and these languages, like any language, require lots of focus and practice. Programming is like a language applied to problem solving, so it too requires focus and practice. I should add coding katas to my routine to ensure that I don’t grow rusty on certain areas of my coding knowledge and instead, am constantly growing as a software developer.

In short, taking action is crucial. A software developer needs to find or devise challenging exercises, solve them weekly, observe their progress, and adapt accordingly. This iterative process helps identify strengths and weaknesses, enabling targeted improvement. By embracing practice and seeking constant growth, such as through coding katas, individuals can advance their skills and strive towards mastery in software craftsmanship.

From Chapter Five, “Practice, Practice, Practice” in Apprenticeship Patterns by Dave Hoover and Adewale Oshineye

From the blog Stories by Namson Nguyen on Medium by Namson Nguyen and used with permission of the author. All other rights reserved by the author.

Find Mentors

Finding mentors is essential for aspiring software craftsmen, as they provide guidance and support in navigating the complexities of the field. Of course, software developers should strive to be hard-working and growing apprentices to eventually become masters at their craft. However, finding an ideal mentor is rare, especially in today’s world.

The process of finding mentors can be challenging, as mentors may not always be readily available or possess the desired expertise. For this reason, most real-world apprentices often seek guidance from multiple mentors with varying degrees of expertise.

Additionally, reaching out and asking for mentorship can be intimidating. However, the potential benefits far outweigh the risks, and even informal advice from experienced developers can be invaluable. Apprentices also have a role to play in mentorship by being willing to share knowledge and provide guidance to others. Passing on lessons learned from mentors contributes to personal growth and development as a craftsman.

Lastly, it is crucial that apprentices be active in approaching mentors, to learn more about them and gain their attention and help. For example, apprentices can sign up for active mailing lists related to software development, they can observe, and identify patient teachers within the community, and seek informal advice from potential mentors at conferences.

As an introvert, I often find myself struggling to take action in the networking aspect of my career, even though I realize how important it is for my success. There is a lot of fear and anxiety that comes with putting yourself out in the open and asking for help. However, if I learned one thing from my internship last summer, it is that I cannot afford to be afraid to ask questions! By asking questions and showing my weakness, yet still in a spirit of curiosity and willingness to learn, I found myself growing faster than I could have ever imagined under the mentorship of my advisor, who was patient and helped me to improve little by little.

In conclusion, mentors play a vital role in shaping the development of aspiring software craftsmen. Actively seeking mentorship and being open to providing mentorship to others are essential components of the journey toward mastery of one’s craft. By embracing mentorship, apprentices can gain valuable insights, overcome challenges, and ultimately achieve their goals in the field of software development.

From Chapter Four, “Find Mentors” in Apprenticeship Patterns by Dave Hoover and Adewale Oshineye

From the blog Stories by Namson Nguyen on Medium by Namson Nguyen and used with permission of the author. All other rights reserved by the author.