2016 Annual Review

Tue Dec 27 2016

2016 has been a long year and it's hard to keep track of all the things I've done. I started this blog (I think it's more of a diary really) for the express purpose of keeping track of what I have been doing.

Calendar of events 2016

This diary/blog has been a great help in remembering the things that I've done this past year.

Month What I did
Jan Nothing of note
Feb Nothing of note
Mar Nothing of note
Apr Started this blog, approached IDA
May Started teaching at Ulu Pandan Stars
Jun Ran a pilot course of Python Titans at IDA.
Jul Started work on the WITS project (Automated transaction tracker)
Aug Continued working on WITS project, started Co{de}llective
Sep Finished WITS project, Built Charge Bot
Oct Started on MOOCs
Nov Started building CodeGL (CPU visualisation)
Dec Holiday with family, built Co{de}llective website

Things I have succeeded at

Gaining programming skill

This year I've focused on improving my technical skill. I feel that I have learned a lot but there's still a billion things to learn.

My focus this year has been on the Web and I don't think that's a bad thing per se because the Web is so ubiquitous after all. However, after taking CS50 and doing some C, I realise that it can be a lot of fun. I think I want to move away from building websites as it has become somewhat trivial with the advent of excellent front-end frameworks like Bootstrap.

I still enjoy game and app development and am likely to continue pursuing it in the future but after dipping my toes in CS50 I think I would like to explore the more technical/ computer science aspect of development. That means ML/NN/AI/compilers? instead of web development.

I will run through this year's projects each in chronological order:

This blog

What it is


What I learned:

  1. Github Pages
  2. Jekyll,
  3. Buying a domain name
  4. Configuring DNS settings

The first technical project of 2016. Building a website was not new to me but using frameworks and build tools to build a website was.

For the longest time my approach to building a site was to whack index.html and style.css files (have been doing it since Sec One), and they've never been hosted under a custom domain name.

Automated transaction tracker

What it is

An app built during NS for WITS made to solve the problem of overdue loans. It is basically a digital 12-11 record/digital loan book that tracks who made what loans and sends SMS messages to them.

The system supports user auth and multiple stores. Supervisors can create stores and invite storemen users to contribute to that store. Only invited users can see and modify transactions of a store.

I built a front-end UI for users to access through their phones.

Unfortunately nobody wanted to use it as it was simply extra work (but I still got Silver).

What I learned:

  1. Building a REST app
  2. React
  3. ExpressJS
  4. MongoDB and Mongoose
  5. Deploying on DigitalOcean
  6. Twilio API and how to send SMSes
  7. User authentication (token-based)
  8. JSON Web Tokens (JWT)
  9. Hashing and salting passwords
  10. General back-end concepts

This was the largest project of 2016! It was an extremely ambitious and extremely tiring project. I had a lot of trouble with it although now, looking back, it seems pretty trivial. (More on this phenomenon next time.)

Doing all the Express routers/routes was hard, the MongoDB database queries even harder, and the React UI hardest of all! It was this project that made me realise that back-end is actually not hard and much more fun than the front-end. This was a watershed moment as previously the back-end was something extremely mysterious and inaccessible to me; I remember in 2015 I had no idea what Dae Koon was doing when we were doing the Smart Gallery app.

Charge Bot

What it is

A telegram bot that allows two players to play the childhood game of Charge. It is basically a while loop running on a Heroku instance that long polls the Telegram server for updates. (it is not a server, it is a client)

What I learned:

  1. Telegram Bot API
  2. Long polling
  3. More REST practice
  4. Deploying on Heroku

I built this simple Telegram bot a couple months after the Bot API was released. The moment the Bot API was announced CKY and I immediately discussed building a bot.

An extremely simple Telegram bot that took a deceptively long time to do. I must admit that the concept of long polling gave me a lot of grief: I had initially implemented my long polling function recursively but that caused a stack overflow after some time. (Can you figure out how to write a long polling function in a non-recursive manner?)

CodeGL, or a failed Shenzhen I/O knockoff

What it is

A "game" that allows you to input assembler commands into an extremely rudimentary text box. These commands are fed into a virtual machine (built by Mark) and run.

I built a display showing the values of the 16 32-bit registers so you can draw very rudimentary images.

I am currently working on a display for RAM as well as extending the parser/language.

What I learned:

  1. C++
  2. SDL
  3. Minimal knowledge of how a CPU works

Although this incomplete project has not been touched for more than a month, I learned a lot from it. It was my first time writing C++ code and my first time doing anything graphics library related (I used SDL). I was quite happy to actually be writing a graphical application because I always had this impression that writing graphics stuff was incredibly difficult.

In fact, it would have been incredibly difficult had I not taken the CS50 course, which introduced me to C. Otherwise I'm sorry to say that the unfamiliar syntax would have scared me off (not to mention make and cmake!)

Things I have failed at

Going to the gym consistently

I have made gains, but I could have made more had I been more disciplined and less lazy.

Am still looking into a routine for 2017.


I took a 500 dollar course with Marc and realised that a) accountancy is not for me and b) my interest and comparative advantage lies elsewhere.

Therefore, I have decided to abandon this track indefinitely.

However, Marc (or rather Marc's dad) told me that an ACCA qualification is useful for going into finance into the future.

Swimming 1.5km

After getting a couple of bad sunburns and falling sick I stopped swimming with Wei Liang. I can swim freestyle much more comfortably than I could before I started swimming this year but my stroke is still poor and there's a long way to go.

I do not like swimming in public pools because they are crowded and gross.

Perhaps I will pick this up in the future as a hobby and to get tan but I don't foresee swimming becoming a part of my life anytime soon.

Learning to drive

Did not learn to drive. I had better things to do.

I will definitely have to learn sooner or later... am thinking of learning it in May after my internship.

Things that are neither here nor there

Reading 50 books in a year

I have actually succeeded in this endeavour (47 books--close enough) but I am parking this here as I do not feel that this was a good use of my time.

Don't get me wrong -- I love books -- but I didn't feel like I really got anything from them. Because

  1. For skills like programming, reading books is not as useful as doing and reading articles/code examples online. There are of course excellent books like the Gang of Four's Design Patterns or JS: The Good Parts but these books are meant more as reference guides, so in what sense can you say to have "finished" them?

  2. Low retention. Looking at the book list I kept for this entire year, I realise that I have forgotten most of the content of the books. I did not use to have this problem because I would reread books again and again until I had internalised completely the concepts of the books. But this year, in an effort to hit the completely arbitrary number 50 (and also because I like buying new books), I did not do this.

    • Is there anything that can be done to remedy this? I read that you are not supposed to read non-fiction books the same way you read fiction books -- that is, from cover to cover, page 1 to end. Instead you should selectively skim the book for information and actively summarise/take notes while reading. I did not do this and do not like doing this largely because it feels too much like *work* but I may have to give this method a try in the future. I did make some attempt at taking down notes but they were largely perfunctory and shit.

Teaching at Ulu Pandan Stars

Truth be told, I did not very much enjoy the front part of teaching where I was preparing them for the CodeXtreme hackathon. Many of the kids were simply not able to learn any substantial programming concepts. I became much happier and far more excited when I was able to pull out the four kids and try out my own curriculum.

The fact that we have a clear goal for the kids -- prepping them for DSA -- is also extremely motivating. I am an extremely goal-oriented person and it helps me greatly in my week-to-week planning if I have something in the future to look forward to.

I have filed this under "neither here nor there" because although the kids have already learned a lot, I have not delivered results yet.

Co-founding Co{de}llective

I will reserve judgement/comment on this as it's too early to say anything about it right now.

Areas for improvement

Time management

I think that I did a lot of things this year but not very efficiently.

I have improved greatly in that I do not slack off as much.

But there is another subtle time-wasting bad habit I am guilty of and that is my constant multitasking on the computer. It's much more insidious because you think that you're being productive and doing a lot of work but in reality you haven't established the Csikszentmihalyi-an "flow state" or "deep work" or "intense focus" or whatever you want to call it.

I have had extremely occasional states whereby I was completely focused on the task, be it reading a book or writing blog posts/code. Code is a little bit harder because it necessitates a lot of SO and asking people for hep and that inherently breaks one's rhythm. But there is no excuse for reading a book because I frequently got distracted by small things like looking a word up on Pleco only to start replying to Telegram messages, then going on Reddit... and even if the distraction lasts only a few seconds, the flow state has been broken and productivity takes a nosedive.

Completionist streak

It is important to finish what you started and don't be bantuerfei but I have found that such one-dimensional thinking is not entirely accurate either. Yes, I used to have (and still do have) the problem of starting things or having goals and then not completing them. I identified this tendency early and made it my goal to drive this habit out of my life by any means possible.

But I realised after talking with Mark and reading some stuff online like Prof Guo and this Freakonomics podcast that a single-minded focus on trying to complete something that's honestly not worth your time is actually counterproductive.

When I was doing the course CS50 I complained to Mark that although the front few lessons were very educational, the later webdev lessons were not as they covered ground that I already know. Mark told me that there's no need to finish the course, just like there's no need to finish reading books or textbooks. The most important thing is to get the information and learn as much as you can from the resource; it isn't important at all if you "finish" it.

So I have had a change in thinking and am no longer adamant about finishing the CS50 course. However, I will still do Problem Set 8 and the Final project because I think those two problem sets are educational for me.

I think the challenge is in being able to identify which goals are not worth pursuing or completing because I don't learn from them, and which goals I don't feel like completing because they are boring, difficult or hard to measure progress toward. It's still very important to be able to "finish strong" (Prof Guo's words, not mine), of course, and this grit is a quality that I have to continue to cultivate.


I am happy with the way 2016 went. I have been productive and I have achieved the goals I care most about.

Also just as important is the fact that I have tried new things and quit them when I realised that I did not care about them at all.

At the risk of this blog post sounding like an Oscar acceptance speech:

I am extremely grateful to Mark, without whom all the aforementioned technical projects would be impossible to complete. He has gotten me unstuck more times than I can count and possesses an incredible patience for putting up with my incessant questions. Also, for hosting me at his house many times. (The same goes for Wei Heng, minus the hosting me at his house part).

I am grateful to CKY for being my best friend and being the only person I can bounce my silly game design/writing/business ideas off of. I also admire him greatly for being extremely prolific and driven in his field of game design and development and I hope that some of that productivity will rub off on me.

Ariel has helped me a lot as an enthusiastic and responsive sounding-board for my ideas. More than anyone else I have shared with her my ideas and concerns about the Co{de}llective and Python Titans projects and she has always given me good advice and honest feedback. She also spent two weekends of her time to help me run the nerve-wracking pilot program at IDA (on extremely short notice, no less). I cannot thank her enough.

I have Ming Shi to thank for introducing me to Ulu Pandan Stars and Mrs Hauw and I owe him a meal. And speaking of Mrs Hauw, I must also be grateful to her for giving me so much free rein with the C4C P5 class and for giving me the opportunity to intern at her company.

Thanks to Sean, for helping me do my WITS poster despite his NS commitments.

I have thanked all these people for their contribution to my goals but I'd also like to point out that I enjoy their company greatly and am grateful for that, too. To that end, I'd like to thank all of my friends for being patient with my flaws, honest with their feedback, and liberal with their company.

Here's to 2017!