My name is Natalie and I am currently a student in the Bachelor of Computer Science (BCS) Second Degree
program at the University of British Columbia. In 2014, I graduated with a Bachelor of Arts degree in
Psychology and Family Studies. After having worked for 4 years at a telecommunications company as a wireless
sales associate and getting hands-on experience with the latest tech, I realized that my passion lies in
creating technology that people can enjoy without frustration. Since then I've set off on a journey to combine
my background in psychology and new interest in computer science to bring user-friendly technologies into the
world.
Outside of coding, I'm a fashion photographer and an avid motorcycle rider (I own a black Yamaha R6). Some say
I'm crazy for riding a motorcycle, but I love a good adventure, which is why I've decided to join the tech
industry!
Since beginning my journey in Computer Science in 2016, I've had the great opportunity to intern at SAP
Vancouver and twice at Google in Sunnyvale, California. These experiences have further confirmed my
love for software development, and gave me extremely valuable insights into developing scalable and inclusive
products for everyone.
This website showcases my thoughts and reflections on some of the personal projects I've created out of pure
curiosity as I explored the mysterious world of software development and computer science.
With a looming housing crisis in Vancouver, I created RentMe with the goal of providing more insight into
the housing rental prices in the different regions across the lower mainland. RentMe allows users to
provide a housing property address in Vancouver to find the average rental price for that property.
The project is a work in progress, consisting of front- and back-end applications to power the service.
The back-end is an API service, written in Python using Flask, that takes in HTTP requests with the
address and other optional housing information (such as sqft, number of bedrooms, number of bathrooms),
provides other analysis on the address (i.e., distance from nearest transit stop), and returns the average
monthly rental price for that address. The price predictor is a linear regression model trained using the
Python Scikit-learn library. To procure the data used to train the model, I implemented a web crawler
using Scrapy to parse from Vancouver rental listings/ads and convert the data into quantifiable
information in CSV format.
A lot of work went into designing processing the features of the model and data preprocessing to create an
accurate price predictor. I developed a pipeline that processes the raw data, which is usually qualitative
and descriptive, into a quantitative value that can be used to train the model. For example, descriptions
of washer/dryer in housing unit is translated to 3 points, whereas no washers/dryer in unit is translated
to 1 point. The biggest challenge in data preprocessing was figuring out how to convert the rental
listing's address (or approximate lat/lon if exact address was not available) into a quantitative feature.
To overcome the challenge, I implemented a pipeline system for the web crawler which, upon parsing,
distributes rental listings into different CSV files for different regions of Vancouver based on the
address's postal code (using Google's Geocoding API to convert lat/lon to address where needed) and create
a linear regression model for each region.
I'm currently designing the front-end application for RentMe, which will include data visualization. Check
out my GitHub for updates!
Quicklist is a JavaScript library that provides an Java-like arraylist implementation with amortized O(1)
shift and unshift. Quicklist provides users with more control over when to expand/shrink the size of array
by providing an adjustable resize threshold.
The inspiration for Quicklist comes from doing Leetcode challenges, where figuring out the optimal
solution is key. I found it quite silly that adding/removing from the front of an array requires O(n) time
just because of the need to shift each subsequent element, so I created a solution that doesn't require
all that shuffling around... at least most of the time.
The experience of implementing Quicklist was fun and educational. I learned the nitty-gritty of how to
keep tabs on array elements, as well as implementing my own version of foreach, map, reduce functions. As
simple as arrays seem, it was extremely enlightening to realize how much goes on underneath in its
implementation!
Aside from software development, photography is my greatest passion; what better way to combine
my two loves than to create a website that showcases both?
During my internship at SAP Vancouver, I first heard and learned about the React-Redux architecture.
Wanting to get hands-on experience outside of work, I decided to convert my exising photography portfolio
site to use React-Redux and ES6. To incorporate responsive design, I created a custom navigation bar
component that monitors the state of the browser's width and converts into a hamburger menu for smaller
device, as well as a Pinterest-style gallery that reflows into single lane of images for narrow screen
sizes. Using Redux, I created a lightbox component that updates the interface when the user selects/
deselects an image.
Through this project, I learned about webpack and code-splitting techniques such as asset caching and
chunking to optimize webpage load time.
After having completed my first semester in BCS, I wanted gain more experience with using Java by creating
a Tic Tac Toe game. The biggest challenge of this project was implementing the logic behind the computer
player, where I used the minimax algorithm to generate and evaluate all possible game moves to find the
best course of action for the computer opponent. I've also implemented 3 levels of difficulty, which is
done by changing the search depth of the tree.
Initially the game was developed with minimal UI to play on the command line. I later developed an
interest in learning Android development, so I convert the game into an Android app with a simple and
colourful graphical components to enhance the game experience using Android studio.
Available on Google Play: https://goo.gl/aUFdhP
I'm thankful to have had the opportunity to participate in the MSFTHacks by Microsoft, which took place at
UBC. In a small team of 4, we developed a Facebook messenger chatbot that recommends cooking recipes based
on user-uploaded images of grocery items. The purpose of the project is to encourage young professionals
to cook at home to help minimize spending on restaurants and takeouts.
The entire project was written using Node.js, and services Microsoft Bot Framework and Microsoft Azure to
develop the conversation stream between the bot and user. For image recognition, we used the Microsoft
Cognitive Services Computer Vision API. We also experimented with several recipe APIs, such as
Spoonacular, to deliver recipes for our users.
Once the user uploads a photo, ReciperBot confirms with the user on the item in the photo by providing the
name of the item. After gathering more information from the user about their dietary preferences (e.g.,
food allergies), ReciperBot presents a few recipes that uses the food item in the chat.
My task in this project involved implementing the conversation stream and prompts by ReciperBot. I also
wrote the code that uses Computer Vision API and parses the resulting JSON object from the API response to
determine what grocery item was detected in the uploaded image.
The theme for this hackathon was Diversity, so in a team of 4, we created a web app that promotes cultural
diversity through food. The Two Can Dine WebApp is designed for people to connect with each other to swap
homemade meals. For this project, we used HTML, CSS, JavaScript, and the Bootstrap Framework.
My task for this project involved creating the "Meal Form", where users can fill out the details about the
meal they cooked. I also developed the page where users can browse for meals posted by other users.
This project came from my first Hackathon. The prompt for the hackathon was to create a project using open
data provided by the City of New Westminster. My project partner and I (a tiny team of 2!) wanted to solve
a problem that the city had experienced recently in 2015: traffic congestions during severe weather
conditions. We used the city's open data on neighbourhood zones, bus routes, and traffic volume to map the
potentially high traffic routes and see how traffic may be affected when disasters strike.
The Community Helping Hub allows residents to exchange help during severe weather conditions and
emergencies. With a little design inspiration from AirBnb, we created a linked map-and-list UI using
JavaScript, HTML, CSS and Bootstrap: when users click on a "help-wanted" posting, the map updates with a
flag to show the location of the posting. The map also updates with a warning flag to indicate traffic
blockage reported by users.
Best of all, We won third place in the hackathon! :)