I finished Algorithms Specialization on Coursera. It consists of four courses:
- Divide and Conquer, Sorting and Searching, and Randomized Algorithms
- Graph Search, Shortest Paths, and Data Structures
- Greedy Algorithms, Minimum Spanning Trees, and Dynamic Programming
- Shortest Paths Revisited, NP-Complete Problems and What To Do About Them
MCS-DS, Fall 2018
I took only one course so that I can try getting a job.
CS 410: Text Information Systems
I learned a lot related to text processing, like from traditional text retrieving methods to modern text mining techniques. As the course project I created Nijk, which is a Code Naming Recommender. To help programmers devise appropriate names for a certain context, Nijk analyzes, using some text mining techniques, popular open source projects and recommend names based on the analysis.
I deployed the service on GCP, using App Engine and Cloud SQL, but I shut down the project because of the maintenance cost.
MCS-DS, Summer 2018
In Summer 2018, I started Online Master of Computer Science in Data Science (MCS-DS) track at UIUC on Coursera.
CS 498: Data Visualization
I studied the theoretical background of Data Visualization and gained some experiences on its application through Tableau and D3.js.
The midterm project, I used Tableau Public and GH Archive. (demo)
The final project, I used D3.js on a kaggle dataset. (demo)
STAT 420: Statistical Modeling in R
I learned a lot about linear regression in both mathematical backgrounds and application in R. I did a group project on a kind of eSports analysis, which is not public. The following image is a sneak peak of it.
Since I started to consider programming as my lifetime work, I had been using some of the most famous note-taking apps like Evernote, OneNote, DokuWiki, etc. However, none of them fully met my particular needs. The list of such criteria is:
- The note-taking process should be seamlessly integrated into my daily editor.
- Syntax-highlighted code block must be supported. Better if code blocks are executable on the fly.
- Most notes should be publicly accessible. I want to look up notes I made from any devices. Sometimes I want to share them.
- Some notes must be private. Contents related to copyright issues or things I've done at work must not be public.
Starting to use Spacemacs and Org-mode, I had been making notes as
.org files. I put those files up to GitHub so that it could be rendered by GitHub's default markup rendering feature. With this simple strategy, I was able to meet the criteria I mentioned above.
The problem was, starting MCS-DS, math formatting had become important, which was not on the GitHub's priority list. On top of that, as the repository grew larger, I wanted more complex indexing strategies. I decided to start a customizable project that renders
.org files into
.html files and host those rendered pages.
Pages on yeonghoey.com are first rendered by Pandoc, and post-processed by python scripts based on lxml.
Although I had always been curious about modern web development, I had no experiences on that. I decided to devise a toy project which intrigues me but not complex. After a while, I realized that almost all of the bookmark services were personalized, which made it hard to access bookmarks from devices other than yours. As this restriction won't matter to most individual users, but I thought it would be great if I could share my bookmarks with others instantly.
I worked on Galpi for 3 months and though there are only core features, Galpi is online now.
Deep Learning Specialization
I finished Deep Learning Specialization by Andrew Ng on Coursera. I made notes on these courses, but I did not publish them because I'm a little bit worried about copyright issues.
To finalize MCS-DS admission, I had to get 103 on TOEFL. I developed
hew to make my English learning effective, during TOEFL preparation.
hew streamlines language learning by helping to extract some portions from media files easily. Even though the whole project is put up on GitHub and PyPI, as it is highly personalized to meet my particular needs, specifically using with Anki, it is neither published nor documented.
Durango: Wild Lands, as a DevOps Engineer at What! Studio
About several months before the release, my team was expecting over hundreds of thousands of concurrent players. We anticipated that it would not be feasible unless we automated the deployment of all the service infrastructures.
I took charge of DevOps to fully automate all the deployment process. I wrote Terraform modules for all the infrastructures used for the service, like from VPC to EC2, Aurora, ElastiCache, SQS, and so on.
On top of that, I had to reorganize the deployment process of server builds. At that time, we were naively using a local GitLab server placed in a private VPC to deploy server builds. It was not practical for a huge scale service like Durango. I researched some packaging options and decided to make the server application as a Debian package so that the deployment process did not depend on the local GitLab server.
Using Packer and dh-virtualenv, I successfully created Debian packages of server builds. With the packaged server builds, I was able to make the deployment process way faster and more flexible.
Durango: Wild Lands, as a Couchbase Administrator at What! Studio
For personal reasons, our DBA had left the team. As there was no DBA for the team, I had to take his responsibility. The service's main DB was Couchbase and since I was not so familiar with it at that time, I put a lot of effort into understanding how Couchbase works. As my understanding in Couchbase grew, I diagnosed some performance issues on Couchbase using YCSB. Based on the diagnosis, before a beta service, I predicted the required DB specs and configured all the settings, which turned out to be somewhat successful. Also, during the beta, I monitored the DB instances and prevented some problems which were expected to be caused by Couchbase.
Durango: Wild Lands, as a Server Developer at What! Studio
As my colleagues appreciated how I code-review, I became one of the core reviewers, even though I was a relatively new team member. I think this was because I enjoyed reading books related to how to write good code, like Refactoring, Writing Effectively with Legacy Code, and the like.
One of the most significant works I've done for the server codebase was refactoring the exception handling system. At that time, Durango: Wild Lands was already a 4-year-old project, and the codebase was extensive. While it was growing, 4 kinds of different exception handling systems had emerged.
My main work of the refactoring was combining these several error-handling systems into a consistent and effective one. As the refactoring work had been expected to affect almost all codebase, I put much effort not to introduce some flaw while refactoring. While I was working on this, I wrote many tests and gained a deep understanding of Python.
Although I had been working specifically on backend server programming and DevOps, I always had a passion for game development. So, during the Chuseok holidays, I decided to dabble in Unity.
dotge is a dodging game with a rhythmic fashion. I also composed the BGM on my own, using iKaossilator.
When I decided to use Spacemacs, I had already been using Vim as my primary editor for a couple of years. I had loved Vim's keystrokes and performance.
However, in some cases, like writing Scala code or something, Vim was not a good option. Every time I faced with those situations, I was frustrated and had to use common editors for those tasks reluctantly.
I had become interested in Emacs, which is known for its versatility, but infamous for its keystrokes. As I couldn't stop using Vim's keystrokes, I had to find another option. And I found Spacemacs, which is based on Emacs but mimics Vim's most core editing keystrokes.
I gave a micro-talk about Spacemacs at Nexon Developer Conference 2017 (Korean)
Durango: Wild Lands, as a Data Engineer at What! Studio
When I first joined the team, they wanted me to design a data pipeline system. Since Durango server application comprised hundreds of different server instances, collecting server logs and game would data coherently all over the server instances was crucial.
When I first took the task, I focused on the management cost. Even though Durango was a relatively large and vast scale open world game, the size of the development team was expected to be kept small.
I researched some options and made some decisions based on this requirement. For example, I picked Amazon Kinesis instead of Apache Kafka, which was more performant. It was because using Kinesis was expected to take almost zero management cost.
The final building blocks chosen were Fluentd, Amazon Kinesis, AWS Lambda, Amazon S3, Amazon Elasticsearch, Amazon EMR (Apache Spark and Apache Zeppelin). The system worked well for over 10 thousands of concurrent users during beta. Also, though I did not manage this system after the release since I left, I heard from my previous colleagues that the system worked well on the larger scale as well.
SpaceBro at What! Studio
Finishing Dodge Kim, I was tasked with the second 2-week personal project, which was to make anything fun using the server codebase and its building blocks, to familiarize myself with it. As Durango server was designed as a collection of distributed multiple-services based on ZeroMQ, I had to write something with distributed servers.
Referring to GDC talk from World of Tanks, I made SpaceBro, which was a simple online arcade game running on distributed cooperating servers, even though it was not necessary for tens of in-office players.
I can't forget the moment my colleagues enjoyed the game!
Dodge Kim at What! Studio
When I first joined What! Studio, I was given two weeks to do a personal project. There were basically no requirements; I could just do what I wanted.
At that time, I was interested in Deep Q Learning (DQN), so I decided to teach myself Deep Learning and implement an AI agent to play a simple game.
I read papers related to DQN. Specifically, I studied "Playing Atari with Deep Reinforcement Learning" several times. On top of that, I studied some materials on neural networks. Also, I read lots of open source projects implementing DQN. I worked on the project using Tensorflow and Pygame.
Two weeks were quite short. The project ended up with partial success. The video above is the trained AI agent. It might seem to work well, but it is just one of the best moves. Most of the time, it could not play like that well.
Anyhow, I enjoyed doing the project. Dabbling in Deep Learning was also a good experience.
I wondered what it was like if GitHub had a kind of project recommender system. So I decided to do a toy project using PredictionIO during a one-week transition period between jobs.
I set up some infrastructures required on AWS and I tapped starring information from GH Archive to feed one of the official PredictionIO engines, which was based on collaborative filtering.
The result was not so impressive, but I think I got a lot from working on it.
Watcha, as a RnD System Engineer at Frograms
Watcha is a movie focused social network service. The core feature of the service is to recommend movies which are expected that the user like, using machine learning techniques and ratings from users.
I joined the team as a recommender system engineer. The recommender system was implemented on Finagle, an RPC framework, in Scala.
At that time, as I was deeply interested in functional programming, I quickly became proficient in Scala. I refactored a wide range of the recommender system codebase and guided my colleagues to write efficient Scala code. Also, I arranged a Scala style guide for the team and provided a team customized code formatter.
As a side note, "Functional Programming in Scala", which I read during this period, became one of my all-time favorite computer books.
Leave of Absence
When I quit NEXON Korea, I felt burnout. During about this six months before I joined Frograms, I did nothing special; studying English, solving algorithm problems on Algospot, taking some math courses online, etc.
- https://www.algospot.com/ (algorithm online judge, Korean)
Bubble Fighter, Modularizing Matchmaking System at NEXON Korea
The matchmaking system I had made was deemed somewhat successful. The next step was to modularize the system so other game studios in the company could use it.
I rewrote the core of the matchmaking system. I wrote lots of tests using Google Test and documentation in Doxygen.
Luckily, I was supported by NEXON Korea to participate in Game Developers Conference 2015 in San Francisco. I enjoyed being there. Sessions I had attended were inspiring.
Among those sessions, I was specifically interested in a session about Anticipatory Collision Avoidance. When I came back to Korea, I tried to implement the algorithm, which led to this Walker Simulator project.
It has been written in Kivy, a Python NUI Framework.
Bubble Fighter, Internalization at NEXON Korea
As Indonesia was one of the expecting growing markets, the team decided to launch Bubble Fighter in Indonesia, renamed to Crazy Shooter.
One of the hardest problems was the inadequate network infra in Indonesia. Though there were lots of gamers, the average player in Indonesia used to play games with under 50kbps network bandwidth. To make the game run smoothly in Indonesia, almost all of the programmers on the team had to work on network optimization. I also contributed to the task. I implemented some features like UDP bypassing and redundant packet dropping.
Though the result was not so successful, it was a rare opportunity to optimize a program to meet severe requirements.
- https://youtu.be/soSNDJqkKyI (video)
Bubble Fighter, Developing Matchmaking System at NEXON Korea
Bubble Fighter is a TPS game, which is targeted to early teenagers. I joined the team as my first job.
My first challenging task as a paid programmer was to develop an intelligent matchmaking system. I researched rating algorithms like ELO, TrueSkill, etc. Unlike rating algorithms, there was no conventional way to make matches(or sessions) using calculated ratings; I had to devise one. To measure match efficiency, I developed a match simulator. I also wrote lots of both unit tests and integration tests for the system.
The matchmaking system was released as Arena System. Some old users opposed the substantial change in how the game composed game sessions, but soon, users became content with the system. And now, Arena is one of the core systems of the game.
Next year, I also gave a presentation (Korean) about the system at Nexon Developer Conference 2015.
I graduated from the university. I double-majored in Philosophy and Computer Science. When I noticed that these seemingly far different fields were closely related to AI, I thought it was really fascinating. Soon, I started to consider AI as my lifetime goal.
As a job interview process for NEXON Korea, I participated in a Game Jam with other applicants.
The topic of the game jam was "Winter". I teamed up with two game designers. They wanted to make a game inspired by Freeze Tag. At that time, since I was familiar with Cocos2d-x, I developed the game in Cocos2d-x for iPad.
I developed the game for 40 hours in a row! It was an exceptional experience.
MusTank, Super App Korea 2013
I participated in Super App Korea 2013, a 6-week hackathon. I teamed up with two art designer and a programmer. We named the team 18Moc, which means "Damn! It's still Thursday" in Korean.
We developed a local multiplayer game, which was inspired by RC Tank Toys. We thought it would be fun if the game used a Tablet PC as a game board and Bluetooth-paired smartphones as controllers.
Using Cocos2d-x and iOS SDK, we successfully implemented the planned features. I ended up winning the 4th place of the competition.
After is a simple timer app, which triggered with a single touch. As the screenshot above shows, the app was not a meaningful one. I developed this app as a practice of releasing on major App stores.
On top of that, at that time I had been reading a book named "Design for Hackers", which is about designing web and interfaces. This project was a testbed for applying design principles I had learned from the book.
Before graduating university, I tried to do a one-person indie game development. I started developing Teeto, which was similar to Fruit Ninja but intended to have some RPG features and cute characters. Although I enjoyed developing it, eventually, Teeto was not released, since I overestimated my capabilities and I burnt out.
I had been developing Teeto with Corona SDK in Lua. Also, I did all the artwork myself using Pixelmator.
I designed Ray to ask "Can you tell the existence of something without considering its context?" Thanks to its novel idea, Ray is one of the most favorite works I've done. I developed Ray in Objective C.
InfiniteSpace is my very first iOS application. It is yet another dodge game, but it uses Accelerometer for controlling the player character. My college friends enjoyed it. Written in Objective C.
I just felt sheer happiness!
Developed Some Applications, as a Technical Support Specialist at ROK Army
As it is confidential, I cannot disclose some details about what I worked during this period. I developed some Windows applications using mostly C++, Win API, and Oracle DB.
Mandatory Military Service, as a Technical Support Specialist at ROK Army
As a Korean guy, I had to join the army. I thought like "if I had to join the army, at least I need to work on what I wanted to be good at." So I decided to apply as a Technical Support Specialist. It turned out to be a good choice. I was assigned to a corps I should work on computer networks and programming.
As my last project before joining the army, I wanted to make something enjoyable. As I had always been an online gamer, I yearned to create an online game.
To make an online game, I just bought a book about TCP/IP Socket programming. Also, since I wanted to make the game look better, I tried to use DirectX 2D.
The result of several months of the effort was WinTANK. I advertised the game on Ruliweb, one of the most popular video game communities in Korea. I was elated when some other gamers liked the game.
- http://bbs.ruliweb.com/game/pc/79147/board/read/3067654 (Korean)
- http://blog.naver.com/saulrian/53101525 (my old blog, Korean)
TOBOR was developed as a successor of Survive. I tried to make the game a little fancier. I drew all the arts using MS Paint as well. Like Survive, I used nothing but Win API.
- http://blog.naver.com/saulrian/51695522 (my old blog, Korean)
Since I thought understanding the humanities would be helpful to design creative games, I started studying philosophy in university. However, while trying to acclimate myself to the new university life, I felt like I was moving away from the longtime dream, becoming a game developer. In the second year as a philosophy major, I felt a kind of disoriented about my life.
I made up my mind that I should definitely try to make a game. To do so, I decided to start learning to program again. I bought a relatively famous Win API book named Win API 정복 (Mastering Win API) right away. I studied Win API programming by myself.
There was a chapter for double buffering in the book. Finishing the chapter, I thought I could make a game. As a result, I managed to create Survive, the first game of mine.
- http://blog.naver.com/saulrian/51695368 (my old blog, Korean)
Discontinued the Journey
In the last year of middle school, I ended up winning a participation prize in the Seoul Regional Competition of Korea Olympiad in Informatics. I was no more interested in programming. Instead, I thought becoming a game designer would be better.
Korea Olympiad in Informatics
To study programming in earnest, I entered a programming academy. I started using Turbo C and preparing for Korean Olympiad in Informatics. However, unfortunately, I began to feel frustrated. As an elementary school student, algorithms were really hard. Plus, at that time, I started to think that algorithms did not seem relevant to game development, which was wrong. I was becoming disenchanted with programming.
Like many other kids, I had been intensely occupied in video games. And moreover, from this time, I started to aspire to be a game developer. Luckily, my parents decided to hire a programming tutor to support my dream, and I was able to learn to program in Turbo Pascal. I hardly remember what I did during this period. One thing that sticks out is a simple turn-based RPG game, rendered Turbo Pascal's vector graphics library.