My Internship in GovTech

Original article was published by Bill Chee on Artificial Intelligence on Medium


Introduction

Hi everyone! I am Bill, a second-year Computer Science student from National University of Singapore (NUS), and I have just recently completed my work-from-home internship at GovTech’s Data Science & Artificial Intelligence Division (DSAID). During the three-month internship, I was attached to the Artificial Intelligence Platforms team and was tasked to work on a text analytics product. I hope that this post will shed some light on what it is like to work at DSAID, and encourage those who share a passion in building AI-powered products to join!

First Steps

My internship began with me trying to understand the code base. As I did not have much experience in backend development, it was a lot to take in at first. Thankfully, my mentor, Charlton, helped me understand the fundamental concepts of server development (JWTs, REST etc). This method of coaching exceeded my expectations, as I understand that on-the-job training with minimal guidance was the norm in many workplaces. I am grateful that while DSAID cared about getting the job done, they also showed concern and interest about my personal growth as a Software Engineer.

Here are some of the things I learned at the start.

For Flask, I understood and familiarised myself with the third party libraries required to run the server, such as:

  • Object-Relational Mapping via SQLAlchemy,
  • SerDe via Marshmallow,
  • Dependency Injection via Flask injector,
  • API First Strategy with Connexion

For Docker, I understood

  • How Dockerfile is written,
  • The process of multi-stage builds,
  • How deployment, staging and production environment differs from one another,
  • The infrastructure of Docker Swarm in the production environment, and
  • How the microservice architecture works as a whole.

Working on the smaller and lower priority issues also helped me to gain confidence to tackle and solve the harder ones.

Internship Progression

Fig 1. Sample CodeFresh pipeline (image from CodeFresh)

I have learned a lot of technical skills throughout this internship. After I was familiar enough with the backend development process, I was able to practice and contribute to the backend repository by setting up a CI pipeline on CodeFresh. The process of setting up CodeFresh using YAML script really helped me better read and understand the documentations, be familiarised with the syntax, as well as how to properly plan and write a pipeline.

After implementing the pipeline, I moved on to research on Alembic as a database migration feature for the Flask framework. Once again, implementing a new feature put my skills to the test and trained me to justify why I chose to implement the feature in a certain way. In this case, I was able to use the auto-generate feature of Alembic to auto-generate the schema based on the declarative base implementation of SQLAlchemy. These plans were done on my own local repository first, hence giving me the freedom to try out many things and make mistakes, which really helped in my learning.

My next task after Alembic was to actually manually test it by deploying my server and running the migration script on AWS. I would say that this was the most interesting phase of my internship because I had just finished my computer networking module in school, and I could appreciate the application of these concepts in the industry. I explored on Terraform and Ansible as automation tools, and learned how companies automated their deployment. Setting the cloud infrastructure was not a trivial task as there were many factors to consider (e.g. security groups, NACL, internet gateway, routing), but the huge pool of online resources really made my life easier.

Fig 2. How to use JWTs (image from SoftwareSecured)

During my last few weeks in the internship, I worked on the backend by implementing new features for the core repo. I understood how JWT and authentication works, and implemented JWT authentication such that the access token from the user could be decoded by calling the auth repo and fetching the public key. I truly appreciated how computer security worked by working on these cool stuff.

DSAID Culture

Fun Loving

I feel that DSAID placed good emphasis on work-life balance and they held interesting events from time to time. There were times when we hosted games after sprint retrospective, which was done once every 2 weeks, where we all got to play online games together as a team. These moments were very fun as they were super casual and made me feel closer to, and more welcomed, in the team.

Continuous Learning

Another highlight was the monthly engineering sharing which was really educational for me as I learned a lot over the span of 2 hours (per session). The best sharing I had experienced was on React and the best practices which came along with setting up such a project.

Freedom

In GovTech, we (as interns) were truly able to explore our interests and our concerns were always being heard and addressed. When I received my internship offer, my recruiter gave me a choice between a software engineering role and a data science role, and I was amazed at how flexible the division was and that they were willing to accommodate my needs. Even after accepting my software engineering role, I was given the freedom to choose what I would like to work on and I was grateful that my suggestions were heard. I expressed my interest in continuous integration and I got to set up the CodeFresh pipeline, and my suggestion to test out my database migration on the cloud was also approved. This highlights how conducive it was to work at GovTech where everyone’s suggestions were always being heard.

Friendly Community

When I was involved in setting up the cloud infrastructure on AWS, I encountered many intricacies in networking that made the deployment process difficult. For example, I had to learn how to set up a Docker Swarm overlay network in AWS, with DNS resolution from the Docker containers to the internet. However, thanks to our selfless DSAID community, there were many people who offered to help me with my issue, and taught me how to debug my code.

Conclusion

My internship in GovTech was an enriching one as there were many things that I managed to explore and work on. I learned important technical skills (Flask, Docker, Terraform, CodeFresh) which broadened my exposure to backend development and deployment. At the same time, I also picked up other soft skills, like how to communicate with colleagues. If you are looking for a fulfilling technical internship, I would definitely recommend that you consider giving GovTech a shot.