Hello! Welcome to my Internship Interview Assignment for Critical Mass's Summer 2018 Developer Internship.
This is a showcase of a few of my recent work examples
CoffeeSpots is my most recent and largest personal project to date; built using React.js, CoffeeSpots uses the Google Maps/Places APIs to find and display the hottest local coffee shops, anywhere in the world. As a personal project, I used CoffeeSpots to both learn React and push my development skills further than they've ever been pushed before. For instance, I learned the ins and outs of React's "state" feature to control the app's UI, as React's state is what allows CoffeeSpots to interactively display information. That said, I also had to apply my problem solving skills to solve the challenges that come with React's powerful state feature - in particular, whenever a component's state is updated, it re-renders. So, since I was using state to determine whether the Google Maps/Places API data (used to display the map and find the coffee shops) has been received, the map kept re-rendering as data came in. As such, I had to filter through the state changes and manually determine which ones would trigger a map re-render. Overall, despite these challenges, I'm happy with the technical decisions I made - in particular, my choice to use React allowed me to create an app with a slick UI that looks good on both desktop and mobile, all without writing code more than once.
My introductory programming course's final project was a "parking lot simulator", using the Processing Language (Java-based language with an expansive library of 2D/3D shapes/drawing tools). This parking lot simulator was a group project with a partner, with both partners acting as developers. I was the main architect behind the project, designing the general systems behind the application's core features. In particular, I designed and implemented the system to track the number of cars in the parking lot, the system to have cars randomly enter and exit the lot at different times, and the system to keep track of/calculate fares. This project taught me a lot about the challenges associated with combining animation and programming; one of Processing's core features is its draw() function, which runs sixty times per second - this is what allows for Processing apps to be animated, but draw() also causes issues because it runs 60 times per second, without fail; working around these technical limitations proved to be a great, yet rewarding challenge. This project also taught me a lot about teamwork in software development, project management, and pair programming - it's significantly different than the personal projects I'd been used to, but I worked extremely well with my partner, and exhibited strong communication skills throughout the project.
Danica is a chat bot that I built for the Discord voice/text chat platform. Danica was my first real open source contribution, built with a Node.js library called Discord.js. I chose Discord.js primarily due to my familiarity with JavaScript (it was my primary programming language at the time), and also because the library contained powerful features such as the ability to play sounds in a voice server. The bot's main features are the ability to split the users in a server into two randomized, even teams, to query the Urban Dictionary API (useful when your friends are shouting new slang at you!), and to play a handful of predefined sounds in a voice server. All of this is made much easier by the Discord.js API, which contains methods to quickly grab the data that the bot needs; for instance, when someone asks Danica Bot to play a sound, the bot can find the current voice server of the user who called the bot, join it, and play the sound. Overall, Danica Bot was a fun project built purely out of passion - and I think that's pretty cool.
This is a showcase of work that has recently inspired me
OpenAI, Elon Musk's nonprofit AI research company, showed off their DotA-playing bot late last year. DotA is a complex strategy-based video game where players have to make moves in real-time (it's not turn-based, so decisions have to be quick), and OpenAI managed to build AI that can play the game at the level of the world's best players - that's insanely impressive. What inspires me about this technically is simply how far this project pushes AI - in the past, the best AI could play turn-based board games like Chess or Go, but OpenAI managed to apply artificial intelligence to a game where decisions have to be made not only within seconds, but multiple times per second. DotA characters are constantly moving, constantly attacking and defending, and have to be able to turn on a dime; this is incredibly unlike any past game-playing AI, and even manages to be at a world-class playing level. While it may not be the most practical example, OpenAI's DotA AI represents a huge push forward for the capabilities of AI, and that's what's so inspiring - there are no limits to what software developers and computer scientists can build.
Discord, as mentioned in the projects section of this README, is a voice/text chat platform. What impresses me most about Discord is how close their iOS, Android, Web, and Desktop codebases are. Discord primarily uses JavaScript as their application language, with React as its framework - this is in the form of React Native on both mobile platforms, React.js on the web, and Electron (with React) on the desktop; their technical decision inspires me because while using JavaScript/React everywhere is inferior, performance-wise, compared to native apps (more on that in a second), it can still be really good. I use Discord on a frequent basis, and so do at least 25 million other people - it's a great platform, yet their developers can reuse a lot of code, saving thousands of hours for more interesting tasks. I find this inspiring because as a student, I don't have the time to turn my personal projects into native iOS, Android, AND web applications; modern JavaScript frameworks like React/React Native allow developers like me to save a LOT of time, meaning developers can focus on making their projects better, rather than building the same project three times. That said, there is a caveat - with Electron applications on the desktop, there is signficantly more RAM usage than a similar native app would use; even so, I believe that the pros of the framework outweigh the cons. Discord inspires me because we might finally be pushing toward that "write once, deploy anywhere" dream that programmers have always been chasing.
Google's smartphones may lag behind Samsung and Apple in terms of hardware and sales, but they are absolutely market leaders in terms of camera software - the Pixel 2's photos are stunning. Google's HDR+ algorithm was developed in partnership with Stanford University, and for me, it really showcases the future of photography. Phone cameras are limited by their small sensor size (less light can be gathered than in a bigger sensor), but Google is overcoming this with the emerging field of computational photography. From a technical perspective, this is possibly the world's best example of computer vision/image processing that currently exists. HDR+ takes around 8 photos with different light levels and stacks them together, but uses AI to stack them while taking into account the differences between areas of the photo - in particular, different areas of photos are lighter or darker than others, and the HDR+ algorithm preserves those differences while still making the photo look sharper and less grainy. What I find inspiring about this is that it represents the future of photography - smartphones are at the forefront, yet image quality isn't sacrificed. Could this technology be applied to social media applications? To video, somehow?
If I was given time and resources to build anything during an internship at Critical Mass, what would I do?
I would love to have the time and resources to build CollabList, an app to create collaborative playlists - music is best shared. Nowadays, friends (or CM coworkers) on different music streaming platforms can't really share their playlists with each other, but we're fixing that - and taking it a step further. CollabList is an app for people to create playlists, together, and share them - on any platform. From a technical perspective, the application would be a React Native application (due to my React experience) on mobile; the host would use the app to create a new playlist, and others can join in on this "playlist party" by entering a code generated by the app. From there, the app would use a music API (such as Spotify's), to allow users to search for songs to add to the playlist. This playlist would be held on a server, and this server would be a backend likely written in Python (Python is a very simple language, and the simple-ish nature of this backend means that it's likely the best tool for the job because of that reason alone). The server would take in song requests, and handle the process putting the playlist together on different streaming services - Apple Music, Spotify, Google Play, maybe even YouTube. So, by the end of it, you have a brand new playlist created by a bunch of different people, who can all listen to it regardless of whether they're on Spotify, Apple Music, or anything else.
I'd build this app for two main reasons: I would love to gain experience building a backend system, and dealing with the challenges that would come with it - for instance, I imagine querying multiple streaming service APIs will be a challenge. Another key reason I'd build the app would simply because I can see it being quite useful - similar solutions already exist, but none encompass my key vision - let people share their music with others. Music is best shared with others, and I think that teams, friends, and even strangers could become a lot closer just by collaborating on a CollabList.
This is my response to the Critical Mass code challenge: https://codepen.io/oscarwong67/pen/yvvMBV