Author Archives: Vien Hua

Retrospective #2

Coming to the second sprint with a lot of achievement from the first one, I put in an objective of having both the back and front of the project working steadily. To be specific, my goal for the backend was to have the testing and the message broker work with the current code that every time they pull up a test, a data entry will be automatically created if there is no previous stored data, and the message broker to send notification once users modify a data entry. For the frontend, the goal was to make the returning form for returning users and integrate with the backend under container technology.

What have we achieved?

Repeat from last retrospective, my team has good developers who are able to complete all the issues listed in a short period of time, so we almost have every issue in review state after a week and a half. I created the testing directory to test each endpoint with the default case and it will create a temporary student data whose id is 1234567 if there was no data initially. The message broker was implemented properly to send a message into the queue every time the update endpoint is called. Our frontend has its application run on the nginx server by binding from docker-compose and partially integrate with the backend application also thanks to Docker.

Things to improve

The major problem with the backend application currently is its execution since it requires two terminals to execute asynchronously, the first one is to pull up the MongoDB database and the RabbitMQ server, then the second command will be used to run the node application, without Docker. However, the testing was created specifically for Docker to execute because the Mocha Chai framework requires all of its functions to be programmed inside the `test` directory and this directory is actually “invisible” in the terminal environment, so its .json and docker files have to be written in another directory when I wanted to put it on Docker (node execution does not require this step). Therefore, executing the backend container with nodes prevented the application from having testing features.

Besides, the registered image that the frontend has been using also needs to change to an older branch because the current pipeline builds an incomplete image due to the new code from RabbitMQ. Fixing this problem will be an epic coming to the next sprint, the point is to have Docker to bring up the application as a whole where the cycle of execution will be MongoDB and RabbitMQ -> Backend Server -> Testing in one docker execution which will make it easier to manage and to build the pipeline.


As a Scrum Master, I did not fully complete my responsibility this sprint since I could not make the team communication to be better, I was too concentrating on the backend repository that I just only had some brief conversation with the frontend team, which is not enough to keep me update to support what they need. In the next sprint, my goal is not clear yet but I would want to try to have more talking with the frontend guys.

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

Retrospective #3

Final sprint before I lose my maintainer status to the repository, this sprint objective is to clean up our workspace, fix some minor issues which have been around since last sprints, and left the next semester a decent documentation so they will not be confused like us at their first step with this repository.

To begin with this sprint, I started with an issue that I was not able to solve from last sprint, which is registering the backend application with GitLab CI. This issue was a bit painful because after we plugged in RabbitMQ, we had to modify the execution cycle. To be specific, the RabbitMQ server must be up for some seconds before the backend application and I thought that I should figure out a way to use the pipeline to build that RabbitMQ container before the backend.

I actually found out the solution for both the pipeline and the integration when we had a conversation with the Kubernetes team where they told us to have each image in a distinctive container. After that, I attempted a different approach, instead of trying to inject the RabbitMQ to the backend during pipeline, I would only build a standalone server and release it, then, the RabbitMQ container will be defined once again in frontend testing and integration consisting of necessary environment variables which will trigger the backend server properly once it is executed.

However, the server’s execution consistency is still roughed as sometimes RabbitMQ is not detected. Besides, it happens on some computers while others don’t. Specifically, it only runs on a strong computer. Therefore, we changed the assumed time to have RabbitMQ start with an environment variable so we are free to modify the runtime based on hardware.

Last but not least, I created two environments for the backend repository, one for development, one for production. The small difference but undoubtedly critical is the binding and `nodemon` execution. Binding the container to local is not visible without `nodemon` since it will restart the server for every change we made. However, the default `nodemon index.js` is not working properly on Windows operating system after bind while MacOS works like a charm. I Looked around for several days without rushing and I just found out that `nodemon -L index.js` will make it work regardless of the operating system, where `-L` is the legacy flag.

To conclude, I am proud of my team overall because at our in-person retrospective meeting of this sprint, by showing our work, the Professor said that it is almost ready to be released. Back when we began in January, we had a not working server and a vanilla JavaScript frontend, the objective initially was to fix the server and somehow pull the Vue-CLI up as soon as possible; now we have a functional page where guests can register with their information and submit to the database. I learned a lot from this experience, both technical and soft skills, and I am feeling grateful for being given a chance to work in this meaningful project.

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

Share What You Learn

To avoid frustration, I try to keep myself motivated by thinking about the feeling when I complete my task. Along with the feeling of completion, sharing information among people is some sort of motivation that I want to show off every time I learn something useful.

In my view, I am not a beginner applying this method introduced in Dave Hoover’s book since I am not feeling strange when I explain to my mates what I have learnt, instead, I actually like doing it because it is not only a way to help my mates understand the part that I have been working on but also a great opportunity to test my understanding over subject and enhance my memorization onto it.

I started feeling the benefits of sharing information with other people since high school. Back then, I mostly helped my friends when they didn’t understand some math problems in class, and every time I do it, I remember that issue much longer, and I feel more comfortable with the technique used to solve that problem. The more I “teach” them, the better my “teaching” skill and my sense of learning improves as well. As they started counting on me in these difficult tasks, I would perceive the sense of motivation to push my learning into the higher level.

We are afraid of having a conversation about a topic that we do not really comprehend. In both math and code, exchanging information, in my opinion, is an infamous problem since I have encountered lots of people who suffer from it. Coding and mathematics have a similar concept (it is like a feeling, but I cannot think of a more specific word to describe it) that once you understand the flow, solving their problems is utterly attractive. Therefore, besides the benefit of improving my apprehension, I also want to help my friends be able to comfortably debate when it comes to specialized topics.

As we grow, we have less confidence to ask other people, searching for problems online is therefore becoming a more popular approach. Hence, publishing blog posts to share my learning will be my next path to maintain my motivation and improve my understanding. Stay tuned!!

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

Concrete Skills

In approximately 6 weeks, I will become a new graduate student, and as I have not yet found an entry position for any company, it seems like I have no choice but to take any opportunity which comes first. Looking for a company makes me doubt that I am not good enough to qualify for any position and the waiting period is a bit frustrating and annoying.

An infamous reason that I heard from my friends is because I needed employers to sponsor me working authorization due to my international status. I was told that if employers see that option is on, the candidate’s document will immediately be excluded. Somewhat unfair but I will have a chance to verify it myself after earning myself working authorization and now I can be treated fairly by the applicant tracking system.

Besides, I think I made some mistakes in creating my resume initially that I did not include enough ability to show I am a good fit for the position. It is understandable that companies will not risk hiring someone who may not be able to directly contribute to the team’s workloads, even automate some simple manual tasks. Since my resume back then was poorly written, I failed to advertise myself to get the hiring manager’s intention.

Luckily, my action over the problem was kind of similar to what I read from the book, by collecting CVs from different people from the Internet and by hearing some tips and tricks from my friends on how to make my CVs better, I was able to rewrite my resume and checked it with different trusted ATS sites. Furthermore, my understanding on the subject improved considerably since then, so I can add more properties to the CVs. Comparing my initial CVs with my current one, it seems like I am now ready to reapply for every suitable position.

In conclusion, it could be tough getting to my first job, but as I started to be hired, it will be easier by then. Besides, I learned that I should put more preparation in my CVs, make a section to list every concrete skill that I have and related to the specified projects in the CVs.

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

Unleash Your Enthusiasm

Back when I was a kid (actually until now), I have been really into playing video games. It could be the reason why I chose Computer Science in order to be able to create games, a popular reason just as many of my colleagues. I somehow was able to land a spot at Ho Chi Minh City University of Technology, a flagship in technology teaching and research activities in Vietnam, after the high school graduate exam.

By the start of the school year, I had nothing but excitement, my only experience was some rough foundations of Pascal taught in high school and I barely remember anything from it. On the other hand, my colleagues were students from the very top high schools with a program concentrating in what they desire, which were mostly computers and the others had extra programming courses outside the class. Besides, the program was designed for students who already had experience with programming since the syllabus of my programming introduction class is a C++ class consisting of both functional and OOP methods with two huge projects. As a result, I was totally “destroyed” in this intro class while my colleagues, having a hard time, but managed to get through it.

Since my excitement was demolished, I had a hard time thinking about my major choice. I did not have any problem doing the required calculus, linear algebra, physics classes but my computer introduction class was a disaster. I was not able to unleash my enthusiasm, I did not know what it was, what I did at that time was grinding myself painfully to be “better”. In my opinion, we tend to be afraid of discussing or expressing something we are not familiar with, and for my case, I cannot show my professor my problem because of it.

After a few years since then, I would say that the syllabus for that intro class was still overwhelming for new students. However, for students who already had their based knowledge before taking that “intro” class, it’s a good opportunity for them to review before going into the main courses. If only I knew how to inject my excitement into my work to ask my professor about my problem, my learning would have been much better, wouldn’t it?!

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

Confront Your Ignorance

Continuing from last week, “Confront Your Ignorance” is also the next section in the book where I find some similar patterns to my current state with the context of identifying gaps in my skill set.

According to what was written

“There are tools and techniques that you need to master, but you do not know how to begin. Some of these are things that everyone around you already seems to know, and there is an expectation that you already have this knowledge”. 

The only difference is not everyone around me seems to know it, except the YouTube algorithm, but I should meet the team’s “expectation” to have my part working on time. The situation can be described as I currently have a sample to refer to my work, but I do not want to abuse it because if I do so, I learn nothing from it. It feels like I can understand everything in the sample, I’m still curious on how it was done and since the programming language is too versatile, is there other way that I can do it without “copying” the sample?! Since the sample has a good structure and is written in a comprehensive manner, I would happily learn it, but the code, I don’t think I can write it that good just by looking at the documentation.

I consider myself a competitive person and sometimes my curiosity makes me feel unsatisfied in many cases. I always want to be as good as that “person” in a particular situation and when I can’t, the feeling is quite uncomfortable. Hence, I think my biggest ignorance is trying to achieve too many things but not concentrating on a certain topic. A solution was given in the book, it’s also obviously the only way for me to get rid of my bad habit, which is to strive to learn each one, maybe in important order.

In conclusion, I think it’s not bad at all to have so many interests at the same time, but I should figure out which one I should prioritize learning it first. Back to my current problem, I think I would go over the commit history to see how it was initially done and proceed from there.

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

Retrospective 1

The First Week

On our first meeting, team formation, we missed two people due to health reasons, so I managed to get all the information that they will need in this meeting on the team discord, during class time; by that way, I can ensure that no one misses anything even if they are not showing up physically. The first week ended with no problem as everyone can gain access to the repository and have their first glance at the code that they will be working on.

The Second Week

This week started with a Sprint Planning session for my team, with my role, I attempted to initialize the conversation. By going through the code before the meeting, I was able to explain to everyone the structure of the code, separate the backend and frontend team, and the objective of the first sprint, which is fully setting up the backend and the frontend repositories. However, just going through everything verbally in class, in my view, is not enough. I even told them that we should actively push new issues if we can find them on the board. Therefore, in the evening after class, I sent a message and asked if anyone could voluntarily join me on Discord to discuss and find new issues. The result?! Only one joined me and we created up to 30 issues in total and there was no new issue created the next day.

On the standup meeting day, I explained to everyone once again about the issues board and adjusted it based on Professor’s advice and epics so by the end of the meeting, we had a decent issues board that we can start working on. Besides, during this meeting, I suggested that we should go with the branching technique that relevant issues will be put in the same branch so everyone can work on their local repository and push up with the least number of conflicts. Therefore, I also work as a Git repository manager for my team.

The Third Week

Again, I should initialize otherwise it is going to take much more time than needed to have the first version of the repository that we want. My idea for the frontend was to have a branch having the same structure with the one showed in epic, which is created by vue/cli. Hence, I installed vue/cli into my computer and add that path to the Windows environment variable and created the project with two components and one main .vue. By pushing this to a new branch in the remote repository, I added 6 new issues that 3 people in the frontend team can start working on.

On the backend side, there was no actual setup, but we had to figure out what they did last semester and move on from it. It turned out the code was a bit hard to understand, especially Docker. Since we have 3 people on the backend, one worked on the JavaScript files to put it in a microservices architecture that I created in another branch, another one worked on the API, while I was working with Docker and the pipeline.

Week 4 and Week 5

From this point, the frontend team was working fine, they only needed me to review their merge requests and some branching questions. On the backend, my teammate finished the API quickly and ran in to help me with the pipeline and docker. The final result of these weeks was this branch, where we deleted the test pipeline from the CI/CD, rewrote the Dockerfile with the understanding of the ENTRYPOINT and its script, and had the code working locally when executed with yarn.

Last Weeks

We ran into another problem in the backend, which is socket hang up if we use docker-compose, my teammate figured out that problem came from the wrong mapping of SERVER_URL, where we mapped it to 10001 on localhost but 3000 in docker-compose. Then, I finished the last endpoint that we had the backend working.


Based on what I wrote so far, my team has good programmers but in terms of initiative, especially when I made the issues, we need more talking on this for the next Sprint. Since our team meets the objective of this Sprint, I hope that everyone can carry this heat to the next Sprint where we are going to have more abstract topics to be working on. As an individual, I’ve always tried to help other team members as much as I can and complete my own task, but one person, I don’t point him out specifically, I almost hear nothing from him during this Sprint. Therefore, next Sprint, hopefully, I can manage to hear more from him to manage everyone’s task fair and effectively.

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

Expose Your Ignorance

Next week, my second Sprint will start. My team worked really well last Sprint that we met all the initial objectives; however, the context was we reimplemented something that we’ve already known or heard about, which only needs a bit more searching in order to fully commit the work. This second Sprint we are going to have lots more “abstract” topics, materials that we weren’t familiar with, so I expect we might get frustrated, overwhelmed when we come to it.

This situation might somewhat be similar to what I’ve read in the “Expose Your Ignorance” section, the only difference is that I’m not in a nine to five working environment. Per description from the book, we have been brought in some projects that we are unfamiliar with some of the required technologies; but team members believe that we can deliver because we have a deep understanding of the business domain or some other aspect of the technology stack being used in a team, or perhaps we are the only person available to do the job. In my view, learning and implementing what the team needs while carrying their expectations is difficult, especially when it is something that we have no experience in.

Finding myself falling into this issue in no time, I might consider taking the solution written in the book which is to show my teammates that the learning process is part of delivering software. Therefore, knowing how to learn the technology effectively is important because I should know which part of my current project will need this and go straight to documentation with relevant information on it. Furthermore, asking questions, instead of hiding our issues, exposes it to everyone in the team because no one will be annoyed when we show them what we cannot do, instead, not telling them that you are having problems is what keeps the team behind.

Luckily, I consider myself a bit “figurative” when it comes to asking questions since I don’t mind asking anything that I didn’t understand. Compared to myself 3 years ago, it’s a huge difference as I was that shy guy hiding my weaknesses, I find learning is much more efficient when I can ask everyone what I don’t know, of course, after a period of time thinking and testing and implementing. Having questions is a good practice, but it doesn’t mean that we should ask without already researching it.

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

The Deep End

Months ago, I found myself standing in “The Deep End” since I wasn’t able to land any internship before graduating this year. The situation was exactly the same as how they described in the book, I needed to grow more skills, my confidence, and my portfolio of successful work, I needed to challenge myself with bigger works, projects, complex tasks, and teams, etc. The YouTube algorithm even made my situation worse by showing people about my age are “better” coders than me in my opinion. I was afraid that I did not do “enough”.

 Currently, what I really felt at that time was envious, seeing people better than me virtually is rough but seeing people who I know landed works while I carried them through classes is overwhelming. My resume, my ability, my confidence, all of them were kind of irrelevant at that point. I created an invisible time limit for myself to be successful, to this point, I still think there are pros and cons to doing it, the risk could be high but I take it.

Later, exactly in how they advise the action, I should instead jump into working on projects that I did not do to create a time limit for it, I’m willing to take more work than anyone in the team and fulfill my responsibilities to not only build my portfolio but also my skills and my confidence. Then, after a while, I will analyze my set of skills fit to what role in the industry and pick the right opportunity based on it.

Besides, when this post is online, I’m currently handling an internship and a capstone project in which I volunteered to be the Scrum master that instead does not make me feel overwhelmed but motivated, as I am learning new materials every day.

In conclusion, it likes how The Deep End was described in vol. 15 of “Diary of the Wimpy Kid: The Deep End”, which follows Greg Heffley’s summer story, a dramatic summer yielded great memories, things could be tough initially, but if I keep continuing on this track, hopefully, the result will be what I aimed.

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

Find Mentors

Self-learning is one important quality of any programmer; however, self-learning is not always useful since the learner might not know what is waiting for them and if their approach is good or not. In this case, every learner needs mentors, those who already achieved what we are working on or at least, they have deeper knowledge about the topic that we are learning.

Whether a beginner starts out with a training course or is self-taught, the first step on the path to software craftsmanship is finding a craftsman to apprentice himself to”

–Pete McBreen, Software Craftsmanship, p.96

From my own experience, I find this statement can’t be more accurate as I find myself learning more productive when I have mentors to show me what I should do compared to learning by myself. However, as in the book illustrated, as an apprentice, it can be difficult to tell who is truly a master craftsman. Therefore, an apprentice should follow a set of mentors that each one will show them a bit of a huge picture. And the set of mentors here counts not only “real” people who we should have already considered them as our mentors to learn, our friends and our professor, but also the active community we could find online to exchange information with people on it.

Besides, according to what was written in the book, an apprentice shouldn’t expect their mentors to know everything and get disappointed if mentors don’t know what we are seeking for as the current mentors could be other’s apprentice, we are all walking on a long road. Because our field is huge, a person who can guide us through 10 in-built React hooks may not be able to show you how to design the API route and vice versa, these twos are completely different topics and what we probably need is to master a specific set of skills that we desired; but it’s obviously the more we know, the higher opportunities we’ll have.

In conclusion, what I learned from this chapter is that I should find a community and actively communicate with other members there. Luckily, I found myself on a discord channel of one of the biggest Vietnamese tech forums, J2Team, having a community of developers exchanging lots of quality contents.

A channel in J2Team server

Now, I should consider posting my first message here and seeing where it will lead me to. 

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