Introduction

Hello! I’m Vu Hien, a software engineer intern with the Bucketeer team in the Developer-Productivity division at CyberAgent. This internship has been an exciting and valuable part of my career. I joined the company eager to take on new challenges and improve my skills. While my team worked from Tokyo and I was based at the Hanoi DevCenter, the mentorship, opportunities, and experiences I received went far beyond my expectations.

In this blog, I’ll share highlights from my internship: working on an open-source project, learning more about software development practices, problem solving, and connecting with a fantastic team of engineers.

Why I joined CyberAgent!

Before joining CyberAgent, I had been working on several projects, building backend systems with Golang and Python. While I was steadily improving my coding and technical skills, I often struggled with decision-making and system design. It was challenging to determine which solutions were best suited for the system and the overall project. This lack of guidance really slowed down my growing process and because of that, I decided to find a new chance that can help me understand more about the software industry and improve my mindset.

Luckily, I found CyberAgent Hanoi DevCenter was forming and the internship program requirements really matched my skills. I studied more about the company and found some interesting projects like ABEMA, PipeCD and Bucketeer so I gave it a try. During the recruitment process, I had the chance to talk to some experienced engineers and the result was very positive. I know I would find my answer here as the culture in CyberAgent is to push employees to learn and grow more everyday, which is exactly my main target.

Exploring Open Source with Bucketeer

The product I was working on during my internship is Bucketeer, an open-source feature flag management platform. Being part of an open-source project not only exposed me to high-quality codebases but also emphasized the importance of collaboration and community. My main tasks in Bucketeer were involved in backend development using Golang, including system design, implementation, automation testing and problem solving. I also have the chance to learn more about software development practices like end-to-end testing, canary and blue green release.

One of memorable challenge

One memorable challenge I tackled was related to an incorrect action triggerer in the audit log and this was found by my mentor during our 1on1 meeting, which was really random and interesting. Audit logs in Bucketeer is a feature to store the history of changes that users made to objects (like create/edit feature flags or accounts). To trigger create or update action, we need to login to the admin console or call public API by using the API key. Bucketeer retrieves the user information who triggered the action (we call it the “editor”) by using the Bearer JWT (JSON Web Token) when the editor logs in and the web server is using gRPC protocol.

Problem

Public API gateway service expose APIs like a proxy by calling the web service using the internal generated service token and the problem appears when that token is binding to the internal service account. We didn’t have any mechanisms to save the maintainer of API keys or to know which API key was being used, so the editor was always the internal service account.

Solution

Overall flow to save the API key maintainer to audit log and retrieve it as the editor, red color means those are new flows that need to be implemented.
Public API data flow for saving and retrieving editor

I had the chance to solve this problem and came up with a simple solution by taking the advantage of go context to share the information of the API key with the web service. 

First I save the one that creates or maintains the API key in the database and update the function to get that extra information. Then API gateway can get the user that creates or maintains the key and embed it inside the context before forwarding it to Web service again. Web service when trying to get the editor in context, it can find the correct API that triggers the action and overwrite the editor before publishing the event, waiting to be consumed to save into the database for audit log. For more details, this is the document to my proposed solution if you are interested.

Solving this problem not only improves the output of the audit log feature but also helps me have a better understanding about Bucketeer components and business logic

Mentorship and Collaboration

Working with a team in Tokyo while being based in the Hanoi office is not really an issue. Despite the distance, my mentor consistently made time to guide me through the project, offering valuable feedback and support to help me take advantage of my strength.

“What if” and “Why” questions are also things that I usually received during work. It is very important to delve into things to have a better understanding and form a product mindset to evolve into a more comprehensive engineer. I started to form a habit of thinking more about those questions myself and also do the same thing when cross reviewing other teammates’ works.

Of course, difficulties are also unavoidable, and I need to cope with them. However, I see these challenges as opportunities to show how I approach and resolve problems. I can spend some time analyzing the situation to find the root cause and potential solutions, but sometimes I can reach a dead end or those solutions are still not suitable. If I still can’t make progress after some reasonable time, I actively seek input from my teammates or mentors. Their fresh perspectives often bring new ideas to the table.

These experiences taught me that effective teamwork relies on trust and good communication. I also became more confident working on my own and with others. I learned a lot from people at CyberAgent and believe I contributed something valuable that others could learn from me too. Sharing and learning from each other made the whole experience very rewarding.

Life in the Hanoi Office

The Hanoi DevCenter office is a wonderful and enjoyable place to work. There are many fun activities that make it special, like weekly intern lunches, BBQ parties, and casual hangouts. These events made the atmosphere very friendly and welcoming, helping everyone feel comfortable and connected.

Hanoi DevCenter Year end party

One of the best parts was how these activities gave me the chance to get to know other interns and engineers better. Spending time together outside of work allowed us to build strong bonds, and this made my internship experience even more memorable and enjoyable.

What really impressed me was how open and supportive the experienced engineers were, even though we are not working on the same project. They were always willing to share their advice and knowledge. Whenever I had a question or faced a challenge, they were happy to help and guide me. They gave me useful tips for my daily tasks and helped me think about better ways to solve technical problems.

Another highlight was participating in study sessions, both in the Hanoi office and within the Developer-Productivity division. These sessions delved into technical topics like how Go Channels slow down with more CPUs or Aurora Limitless Database (this one was really hard). We discussed a lot in every session and helped me build a more comprehensive thinking in Go philosophy or software engineer in general, how simplicity is achieved and why simplicity is complicated.

I also had the chance to present on API design and system design with the Developer-Productivity division, sharing my experiences while receiving thought-provoking questions and constructive feedback. These discussions helped me refine my knowledge and introduced me to new perspectives.

Overall, the combination of a fun environment and helpful teammates made my time at the Hanoi DevCenter and Developer-Productivity division truly rewarding. It wasn’t just about work but also about learning, growing, and connecting with people.

Conclusion

Reflecting on my time at CyberAgent, I realize how much I’ve grown – both technically and personally. Working with Bucketeer and solving challenging problems, this internship has been a journey of constant learning and self-discovery.

I’m incredibly grateful to my mentor, the Bucketeer team and Developer-Productivity division, and everyone at CyberAgent Hanoi DevCenter for creating such a great environment.