Introduction

As the first batch of students to benefit from the partnership between the Government Technology Agency of Singapore (GovTech) and Singapore Polytechnic (SP), instead of the normal curriculum of a final-year student - a 6 months internship programme and a final-year project, I took part in a year-long internship programme to work on real-world industry projects.

As I reflect on my first-ever internship, I am glad to say that it was an extremely fruitful experience. I am also thankful that I was able to learn about this opportunity from the then Head of the Young Talent Office - Ksther, through the GovTech GeekOut Hackaton in late 2019. I still remember how glad I was to choose to study at SP when I heard that the programme was the first of its kind and only offered to SP students for the start.

Selection Process

After the interview and coding challenges, I was offered the opportunity to be one of the three students in my cohort to take part in the year-long internship under GovTech Singapore.

As the first batch of students to benefit from this programme, we were invited to the Memorandum of Understanding (MOU) signing ceremony that was held at the Singapore Polytechnic Graduates' Guild.

https://cdn.sanity.io/images/9poqf6md/production/f8010b9201d8127c6be322a33d4676ff84c57334-900x501.jpg

Start of Internship

The first day of my internship was exactly five days after WHO declared COVID-19 a pandemic. As strict measures were implemented in response to the pandemic, companies shifted to remote work arrangements. This includes GovTech, and I started the first day of my internship without physically meeting anyone in the team other than my supervisor - Salihan, at a cafe to collect the company laptop and for a short introduction before heading home for a year-long remote internship.

Main Takeaways

Throughout the internship, I worked across the full spectrum of software engineering – from infrastructure and server administration to implementing features to satisfy business requirements by writing client and server-side code.

Agile

I learnt about the ‘Agile’ approach to project management and software development. Using the Scrum Framework, I worked in ‘Sprints’ to deliver the features on a regular cadence. On top of that, I learnt from the Scrum Master and hosted the 'Sprint Ceremonies', such as the Standups, Sprint Planning, Sprint Review and Sprint Retrospective sessions.

Gitflow and CICD

As the project has a scheduled release cycle and follows the DevOps best practices of continuous delivery, I noticed that the team adopts a git workflow that I have not learnt in school. Upon some research, I learnt that this is the Gitflow workflow and it assigns very specific roles to different branches. For example, for each task in the sprint, developers will create feature branches, and will only merge them to the development branch once the feature is completed and tested. Aside from the feature branches, the project has two main individual branches - the master branch and the development branch.

The team uses Teamcity for CICD and we have pipelines built for testing and merging the branches. Only after the development branch has passed all the tests, then it will be automatically merged into the Master branch for more tests on another environment for quality assurance.

Automation

During my internship, I learnt to use software/infrastructure provisioning tools such as Ansible and Terraform. I used Ansible to automate the onboarding installation and setup process which greatly reduced the effort of onboarding new developers.

Other examples of what I worked on includes using a combination of Ansible and Packer I automated the creation of an Amazon Machine Image for our TeamCity agents.

I made use of the knowledge I have learnt and automated the process of deploying new servers for the maintenance team, with this new build on TeamCity that I have created, the team no longer needs to ask DevOps personnel to launch a server for them. Instead, they can launch and terminate the server using the TeamCity build that I have created.

Lastly, I used Terraform to store the Infrastructure as Code and used it to manage a fleet of servers used for development, continuous integration and quality assurance (QA).

DevOps

Although I was an intern as a Software Engineer, I expressed my interest in the field of DevOps to my mentor, and I was offered the opportunity to work on various DevOps tasks such as provisioning servers, configuring web servers such as Nginx and Apache, patching servers, fixing deployment issues, etc.

On top of these skills that I have attained, I was able to guide new developers on performing these tasks, and daily, I was able to help the developers to resolve issues such as SSH login errors and TeamCity build errors.

https://cdn.sanity.io/images/9poqf6md/production/3327a8b8405d04e776175ebbab8a28e1f5b2d678-1785x1010.svg

Closing Note

Throughout my internship journey, I found it to be incredibly fulfilling. Although the pandemic disrupted my original plans of working in the office and meeting other developers from various projects, I made the most of the situation by actively seeking more work to do and learning on the go. This experience also helped me realize the importance of keeping up with industry trends and continuously equipping myself with a wide range of tools and software. Most importantly, I was able to work on meaningful projects that served the citizens and gained a lot of relevant work experience in software engineering and DevOps.