1 October 2020
Today is my official 2nd year anniversary of working at GovTech! Time really flies, and I wanted to document this journey before I forget all the things I’ve done and learnt in these 2 years.
So it all started in 2017, when I started to think about what kind of job I wanted to do after graduating from SUTD ISTD (Information Systems Technology and Design, basically the computer science/ information systems equivalent in other unis). I figured that with my skills and interests, data analytics or software development roles would be the best fit. While looking for potential companies to apply to, I listed down everything I could think of that I wanted in my ideal job, and ranked them. This was my list:
ideal job (ranked from most to least important)
- most of the day spent programming (not in meetings/ talking to people)
- have to learn new skills for different projects
- casual attire pls
- decent work-life balance
- work is sufficiently challenging
- medium-sized company (around 100s-1000s of employees?) - big enough to have some breadth/ room to rotate around, but small enough that things are still personal and what i do makes an impact
- accessible managers, not overly rigid company structure/ top-down culture
- varied and interesting projects, be exposed to different parts of the business
- i am actually interested in the product/service as a consumer
- some autonomy over what i do/ how i do things
- office at reasonably convenient location
- good salary (not a priority)
- top tech company brand name (eg. google)
- long-term career progression (can see myself working there for 10+ years)
GovTech was a pretty new agency at that time, and I had gone for an office visit to its Hive office at Sandcrawler during an outreach program in uni. From what I could tell, it seemed like a cool place with a meaningful mission, and pretty much fit all the points on my list! So I applied for its graduate programme, which is called Tech Associate Programme (aka TAP).
Quick background: GovTech has 5 “capability centres”, which correspond to the 5 tech domains that you can indicate your interest for when applying for TAP. I chose Application Development, and Data Science & AI.
I forgot most of the details of the selection process already, but I distinctly remember the first round online programming test. It had some compulsory general programming questions, plus optional sections corresponding to each tech domain - so you’re just supposed to do the ones that you indicated interest in. But me being kaypoh, I wanted to see what was tested for all the domains 😆 and went to try out all the sections for fun. I discovered that I knew very little about cyber security, IoT (internet of things), and ICT infrastructure 😖
Anyway, fast forward 2 interviews (first one with a senior engineer, and second one with senior management which I remember was surprisingly quite lighthearted and fun!). I got accepted!! But with one big question mark - HR told me that they intended to put me in the Sensors & IoT (SIOT) team?? Although I didn’t choose it as my preferred tech domain and I’m pretty sure I flunked the IoT part of the online test. And I thought IoT is like mostly hardware-related work? So I had no idea what I could do in an IoT team.
I wrote an email to the director of SIOT, YB, who had been one of my interviewers, and he invited me to his office to talk in person. He explained to me that while IoT does involve physical hardware components, building a successful IoT system also requires significant software effort, in order to do things like managing devices, sending data from devices to the cloud, and processing/ storing/ analysing/ visualizing all these data. He also introduced me to some of his other team members, and I talked to my SUTD senior Andrew who was in the team. Not sure if I was totally convinced at that point, but I guess I got a good enough vibe from the office visit and decided to accept the job!
1 Oct 2018 was my first day of work at SIOT, and there was a senior developer who also joined the team on the same day and became my desk-mate. I didn’t know it then, but this guy was going to be my boss and team lead, and someone whom I would come to respect a lot, not just for his technical knowledge, but also for his dedication to his work and the team.
As a benefit of TAP, within my first few weeks of work, I got to attend Stack, GovTech’s first developer conference. To be honest, I was pretty lost for most of it xD but I learnt a bit about the various projects in the organization.
I started off working on a few small, proof-of-concept type of projects together with other colleagues:
A web dashboard for “smart lampposts”, written using React. I also set up a simple Express backend which received data through MQTT, stored it in a PostgreSQL database, and served APIs for the frontend. The 2nd picture, from an article about us in zaobao, shows one of the test lampposts in our office.
A web-based video conference system based on mediasoup, for ActiveSG virtual coaching proof-of-concept. The above photo is a trial we did, with SIOT and ActiveSG staff doing a mass workout together over video call! A cool feature we implemented is the ability for the coach to adjust the angle of other participants’ cameras during the call, in case they move out of view.
A proof-of-concept IoT system for monitoring of work sites. I held meetings with MOM and other stakeholders to discuss and agree on the format and method for sending data from their existing system to ours. For this project, I started using DECADA, our IoT platform. At this time, our team’s software development practices were not established, and we did deployments by SSH-ing into our DigitalOcean server, pulling the code from git, and manually restarting the applications.
Along the way, I was tasked by YB to organize a few team bonding events! (The team also grew rapidly, from <20 when I joined, to close to 50 now.)
After less than a year, I took on an intern! With no experience managing people previously, I was unsure of what to do and a little nervous about whether I could supervise and guide him well. Fortunately, working together over his 3-month internship was smooth-sailing. Together with another more experienced developer in SIOT, we built a RFID inventory management system for an agency, so that its staff could quickly and easily record and check the stocks of their merchandise. Working with RFID was something totally new to all three of us. However, with some experimentation, we identified suitable RFID tags and scanner models that we could interface with. In this project, I learnt to develop and use a GraphQL API, and code a mobile application (the RFID scanner runs Android) using Qt. My intern and I also had lots of fun playing foosball together in office 😆
Up till this point, all the projects I’d worked on were proof-of-concept implementations. Although it was fun and I got to learn new stuff, they kind of felt like doing one-off school projects, and not ~real, important projects~. The second half of 2019 was when things started to get real!
For an intense few months, I worked full-time on the Personal Alert Button project with 2 colleagues. The learning curve was really steep as we took over a code base that had been written a pilot run of the system, and had to speedily get familiar with it. After the pilot, the agency wanted to roll out the system on a much larger scale and with additional requirements. Working within a tight timeline, we made significant enhancements to the system for the increased project scope. From this project, I learnt a lot about:
In 2020, after the alert button project had stabilized and was fully operational, things went back to a more relaxed pace. I worked on a smart office dashboard, for the agency’s staff to check availability of meeting rooms in real time. The dashboard also generates reports on meeting room utilization for the month or year, for the management to see how well-utilized each meeting room is.
At this point, we had a number of projects in the pipeline and needed to grow the team. My boss, aka team lead of the software team in SIOT, designated me as the frontend/UI lead, and hired another frontend developer who would report to me. We also converted an intern, who had worked with me on the smart office dashboard, to a full-time staff under me too. When my boss discussed these plans with me, I was honestly really surprised! I definitely had not expected that I would be someone’s boss so soon after starting work. But I readily took on the opportunity, to challenge myself and grow in this aspect of work. This book The Making of a Manager: What to Do When Everyone Looks to You by Julie Zhuo, was a super helpful introduction and guide to what being a manager is about.
Many of our projects, especially proof-of-concept ones, have rather similar requirements for the dashboard - eg. see locations of all the sensors/devices on a map, view data from the sensors as a time series line chart, and view images captured from cameras. Hence, to speed up our dashboard-building capacity, we decided to build a React “widgets” library for these common components. Each widget would handle fetching data from our IoT platform, and rendering the map/ chart/ image/ etc, so that for dashboards with standard requirements, we can build them very quickly by just importing and using these widgets.
I found that for every project, I was spending time setting up the same things to start off the repo every time. Hence, I created a “react-starter” repo containing a create-react-app
app, plus the standard dependencies that we use (the widget library, antd, tailwindcss), Jenkins & Docker config files, my favourite prettier
code formatter as a pre-commit hook, and a basic folder structure. As of now, this repo has been forked 10 times by me and my team!
2020 April was when we started working from home full time, due to the COVID-19 circuit-breaker and subsequent measures. My work-from-home lifestyle was going great for the first month, but in May, half of my department was suddenly told to de-prioritize all other projects, and focus on developing the TraceTogether Token.
The token is a keychain-like device for contact tracing, which works by exchanging Bluetooth signals with other tokens and TraceTogether mobile apps nearby. Initially when the token was first announced, it was introduced as a “wearable” device. This gave people the impression of being an electronic tracker, and led to a huge privacy outcry. I was also pretty apprehensive about working on this device, which could potentially be used by the government to track citizens’ movements and interactions. However, as more details were confirmed, it was clarified that the token would only use Bluetooth Low Energy, and would not have any GPS chip, wifi or cellular capability. This greatly reduces the potential for abuse and gave me more peace of mind!
Despite the actual token being a physical hardware device, there is still a lot of software that needs to be written and run alongside it. In this project, I am primarily responsible for a backend service that processes the data retrieved from a token (this data retrieval only happens if the token’s owner tests positive for covid), and the web applications (such as a distribution statistics dashboard, for PA and the policy makers to track how many tokens have been distributed over time). I worked with my colleague on the mobile app for data retrieval as well, and it was really tough and confusing working with Bluetooth initially.
I’ve also been heavily involved in liaising with other systems that we interface with, such as the TraceTogether mobile app, and SupplyAlly, the app used for token distribution in CCs. These teams helped us a lot, especially with Bluetooth, testing, and distribution ops, and I learnt a lot from working with them.
Different versions of the token in different colours!
Currently, distribution of TT tokens is ongoing at some CCs in Singapore. Overall, it has been many late nights, a couple of scares due to mistakes and bugs, and constant headaches over the changing requirements and timelines. But in spite of these, I’m glad we stepped up to deliver this system, and I’m proud to have worked on this project! (Although with Singapore doing so well with keeping the virus under control, I’m not sure if the token will ever prove to be useful LOL 😅)
One of the “CCAs” (stuff outside of normal work) that tech associates have to do is to help to organize events - eg. for GovTech’s outreach to younger students, and for new fresh grads who join GovTech. Together with a few colleagues, I’ve planned and conducted Arduino/IoT workshops for these events. I also recently participated in some fireside chats, to share with university students about my work and life in GovTech. As an introvert and person who gets nervous about public speaking, I equally dread these events and am grateful for them as opportunities to practise.
Another thing I’ve been trying to improve on is my interviewing skills. Despite being a relatively junior developer by number of years, I’ve been involved in conducting some interviews for my team, especially for frontend candidates. After sitting in on a few interviews and helping to conduct a few, I realised that our interviews were very unstructured and inconsistent, and was somewhat based on the interviewer’s intuition instead of a proper, thorough assessment. So I did some research on good interview practices - would recommend this article and this one. Then I initiated a discussion with the other main interviewers to set out our assessment criteria & interview structure, and start a standard questions pool, and write an email to candidates telling them what to expect (inspired by this article).
This concludes my first 2 years of work at GovTech! If you’ve read all the way till here, you deserve a 🍪 and some 🍦!! I’ve learnt a lot during this time, and am forever grateful to my boss J, and all my colleagues/interns for your help and trust and for making work fun 😁