An approachable and culturally-sensitive individual who has the ability to critically evaluate and think outside the box to come up with innovative solutions to problems.
I would consider myself a true all-rounder as my work history will show. I’ve been a C++ developer writing mission-critical CCTV software, a full-stack developer for a bespoke software digital agency. My current role at Sundog Media Toolkit is a culmination of all my experience. I develop industry-first AI tools, work on the full stack and develop services on AWS.
I have a solid understanding of how complex, and often, multi-threaded and networked systems work together. I have written bespoke algorithms including custom AI. I can pick up new languages and frameworks quickly (so a skills keywords bingo is completely irrelevant) while also making legacy software continue to work, and introduced DevOps practices at my workplaces.
Machine & Deep Learning Cloud Developer (April 2018—present)
Polyglot developer writing various tools to automate post-processing of films for the film & TV industry (Disney Pixar, BBC, etc.) in the cloud.
Detect UUIDs and edit rate of the audio in a film by converting the sync track sine waves into binary and reconstructing the UUID.
Complex subtitle rendering such as East Asian languages and PNGs by tree parsing subtitle XML files and rendering to HTML. Wrote a bespoke algorithm for automated placement and smoothing of 3D subtitles in the Z-axis. This is currently a manual process done by subtitle artists who must watch the film and visually adjust the subtitle placement.
Developed an industry-first product – DubSafe, utilising machine learning for anonymisation of sensitive pre-release content. It obscures the content while leaving the faces visible so dubbing artists can see characters’ expressions in order to guide their vocal performance. This product is currently being trialled by the main film studios. I wrote the modules scene cut detection, custom face detection of cartoon and non-human faces, speech detection.
AWS-sation of various tools using multi-threading and queues, dealing with source files 100’s of GB in size. Deployment of machine learning pipelines onto AWS.
Software Engineer (July 2016—March 2018)
Actively involved in the whole software lifecycle from conception – requirements gathering, time estimation, architecture and development. Also audited prospective software projects to take over and helped with writing proposals.
Wrote Node.js classes for ffmpeg and Windows Expression Encoder to record from A/V devices and broadcast at the same time. Had to write a C# wrapper to Windows Expression Encoder to be controlled from Node its libraries rely on Visual Studio languages. This exports an .exe which communicates via stdin, stdout and stderr.
Developed PHP MVC sites using our custom CMS framework, CoBe (built on top of PHP yii). Used TypeScript, Angular JS, CSS LESS front-end.
Implemented new features in a classifieds site to enable users to post listings with a paid subscription/one-off payment.
Wrote custom Magento plugins to create new functionality to feature related products in a blog post and in the main product page and wrote A/B tests for Google Analytics.
Became the expert in server configuration, debugging and troubleshooting due to my interest and the expertise gained in supporting a mission-critical Linux system in my previous job.
Created a Jenkins build environment by spinning up Docker containers on-demand to build a Symfony application that depends on Microsoft SQL Server. Configured this MSSQL Server to run in a Docker container, removing the need to host it externally with a webhosting provider and saved on Microsoft licensing fees.
Installed and configured HAProxy on a server to enable hot-swapping of site mirrors without waiting for DNS to propagate.
Graduate Software Engineer (November 2014—June 2016)
Served as the main developer for a mission-critical piece of software that is part of a larger system used by Transport of London to view and control cameras on their streets and tunnels. It receives commands for controlling cameras from the subsystem and passes the commands onto various cameras. It is a multi-threaded networked C++ application. It has to communicate with three other components in the system and be able to handle real-time events such as camera controls, database updates and subsystems going offline; asynchronously to avoid bottlenecks as there are up to 700 cameras enabled, several of which may be under control each time. Had to implement various control protocols in SOAP, REST and serial (by packaging the serial commands and sending them to an encoder that will unpack them and send serial messages to serial cameras) according to the spec provided by the camera manufacturers. This software has brought over £ 500k revenue for the company over the past year from development work for new features and maintenance.
Wrote shell scripts for extracting data from large log files, cleaning up the data and putting them into a database to identify faulty cameras early. Wrote a Python script to perform statistical analysis on the output to identify new occurrences, repeat offenders and worst offenders. This was compiled into a report for the client.
Wrote Python scripts to decode and parse camera protocols into human readable-format for debugging. Implemented propriety camera protocols in Docklight, a software tool for simulating serial devices.
TCP/IP network analysis using Wireshark and its command line version to debug communications between subsystems and cameras by tracing the sequence of events and inspecting the packet contents.
Developed in Java for the other subsystems used by Transport for London such as the Operator’s Interface where the camera operators can select cameras from a map and control them a using joystick.
Wrote SQL queries to query a large audit database containing 100 000’s of entries to find out what events and errors occurred during a given time period.
Created a portable virtual environment in Docker to enable quick set-up a legacy development environment on CentOS 5 that can run on any Windows/Mac/Unix host. This is so that the developer does not need to boot into CentOS and manually install software, libraries and perform configuration steps. A manual setup process that takes 3 hours now takes 30 mins. Any change can be easily rolled back by rebuilding the virtual environment.
Was on-call out-of-hours to diagnose and fix faults on critical live systems working with tight resolution deadlines of 3 hours.
Liased with the camera manufacturer to make sure that their implementation of a proprietary protocol, ONVIF was correct.
Appointed as the ‘social secretary’ for the software department to organise and coordinate nights out. Suggested various events and nights out to promote team-building. Planned events and chose a venue that catered to the team’s preferences and availability.
Full-stack Developer (January 2015)
Temped for two weeks at this startup who write bespoke software for truckers and suppliers. Integrated Google Maps and Google Calendar into their system. Created and populated new SQL tables. Wrote APIs for interfacing with their contacts and inventory websites. Did front-end design on a website to call the APIs. Used Python with Flask web server and deployed sites onto the Google App Engine.
MSc Advanced Computing – Machine Learning, Data Mining and High-Performance Computing (September 2013—January 2015)
Units taken: Introduction to Machine Learning, Cloud Computing, Learning in Autonomous Systems, High-Performance Computing, Uncertainty Modelling for Intelligent Systems, Computational Genomics and Bioinformatics algorithms, Robotic Systems, Server Software, Research Skills, Statistical Pattern Recognition.
Postgraduate member from the Computer Science department of the Engineering FQET (Faculty Quality Enhancement Team). Attended meetings and took part in visits to other schools to assure the quality of teaching, learning and assessments.
Required to guide a ‘captured’ robot from an unknown position to a given target position. This coursework for Robotic Systems had high uncertainty due to the discrepancy between the ‘perfect’ conditions of the simulator and a noisy real-world environment with uneven walls made out of taped-together cardboard boxes. This was dealt with by simulating noise in the particle filter used for estimating the location and orientation of the robot in the maze. A grid-based A* pathfinding search algorithm was used to guide the robot to its target position.
A machine learning algorithm that can separate non-linearly separable data by mapping it into a higher dimension. This is much faster than a Support Vector Machine while having similar accuracy.
Classifies emails as spam or non-spam after training on thousands of test emails. Made use of advanced text pre-processing methods such as removing stop words to increase accuracy.
The Lattice-Boltzmann algorithm is used to simulate the flow of liquids around a particle. Identified areas in the code for optimization and used different parallel programming libraries OpenMP, MPI and OpenCL. The original algorithm took a minute and the best parallelisation, using OpenCL ran in under 0.5 s.
BSc Computer Science (March 2010—November 2012)
Subjects of note: Network and Systems Development, Discrete Mathematics, Project Management, Theory of Computation, Advanced Programming, Image Processing, Intelligent Systems, Introductory Microeconomics, Contemporary Television Studies.
Written in Java with a GUI using an open-source image processing library. Offering a free alternative to commercial programs (e.g. Saatva Descreen and scientific imaging software) aimed at home users who cannot afford commercial software. More effective than built-In filters in Adobe Photoshop such as Median filter, smart blur, and unsharp mask.
Coursework for Intelligent Systems. Auto-correct sentences based on prior probabilities and edit distance. Predicts the probability of the next word in a sentence based on the probabilities of words occurring together. Works like the auto-predict keyboard in smartphones.
As my time is precious (and pricey!), I do one-off things for free and aim to make the people I help become self-sufficient.
English (Native proficiency), Malay (Bilingual), Hokkien dialect (Mother tongue), Mandarin (Basic spoken), Spanish (Basic speaking and writing)