My recapitulation of 2020: another great year

I wrote a recapitulative in 2017, 2018 and skipped in 2019. After blogging weekly since 2011, I decided to take a hiatus with my second children’s upcoming. In 2020, I wrote a single post about my custom made desk — that’s it. However, today is different. Today, I will re-iterate the idea for the year 2020 because it is important to take a step back and appreciate all accomplishments, even if small.

January-February 2020

January 2020 was a special month: we decided to live in the United States of America. After over 6 years of hesitation, we took a leap of faith and decided to sell our real estate in Canada and to establish our family for the long term in the USA. The revelation might sound simple and is summarized by two lines but the process was heartbreaking and head-bumping on walls for days and nights. It is so hard to know which path is the right one for me for my family. Living as an immigrant, in a different culture, in a different language, and isolated from our past is a challenge.

Picture of use the day we received the key

Selling the apartment buildings and our house that contained a lot of our belonging was not an easy task. Thanks to my mother, who was acting as a legal entity who devoted many hours to get a lot of stuff done. Even more challenging than we found a house in San Jose that we loved a few weeks after taking the decision. We made an offer, won the bidding and started the renovation, and were able to settle in a few days before the Coronavirus pounce on everybody in the world.

The floor plan of the house I created to help the renovation

My wife’s father died a few days before the end of the year 2019. She could visit for the service in 2020 and come back a few hours before the lockdown. All that action faded in place when I came back to work from my parental leaves at Netflix. I was able to work for 1 week at the office before working from home since then. That period of time was stressful in terms of timing, money, and decision. The stress was mitigated with a feeling of being back on a long term track with a clear possibility to start dreaming of settling and seeing us growing in the country of our choice.

Renovator that drilled through the roof without fixing. Water went in the attic down to the living room…

The renovation was also challenging; let say that I had to do a lot more than expected, and I had to be a project manager and continually find issues along the process. I realized that even if you hire people with good references, with the average cost of all submission, it is still a business that tries to cut corners and plan with words. I’m glad the whole work was completed a few days before the lockdown, but I have a very bitter taste in my mouth. I’ve learned that nothing is well done as if you do it yourself. I will take this lesson into action in the next few months.

March-April 2020

In March, we moved to the renovated house, found someone to lease our rental house. At work, after many months off, I was productive after a few hours. I was glad to be back coding, even though I am forever grateful that Netflix has such an amazing inclusion of fathers in their parental leaves.

In March, I migrated all our house electric outlets and switches to create a Z-Wave mesh. I decided to use Hubitat as a host, and since then, I’ve been programming the house to be smart.

Most of the project I am doing that are not on a computer, I have my little helper with me

I’ll enumerate a few things I did in the house: installing a water fileting system, patching wall holes, painting the garage, installing shelves in the garage for 48 bins, replacing the leaking water behind the washing machine, installing a sink in the garage, installing a rubber floor in the garage, removing all the woods structures around the house that was infested with termite, removing a huge cement flower bed from the backward, removing 30 feet of bushes next to the foundation of the house, replacing a door that was accessing outside that was so old and unsafe with a stronger one, and a lot of smaller little home improvements.

On the technical side of my life, I released a course online on the Educative.io platform. It is a 12 hours course on TypeScript.

I also published a new edition of my Holistic TypeScript book that double the number of pages since the first edition.

I concluded one more semester at the University after taking a few semesters off when I was during parental leaves to really focus on my newborn.

May-June 2020

The house is from 1964, and there is a lot to do. The condition was fine, but I cannot stand still when I see the improvement that needs to be done. I changed all the pipe between the main water pipe and the dishwasher because it was leaking. I also changed the galvanize “y” that the washing machine was used because it was leaking. I have not many Z-Wave water sensors to warn me if something goes back wrong.

My desk under construction

May was also the month I started working in the evening and weekend on the “perfect desk for me.” That would allow working anywhere in the house without having my younger’s one pulling wires. It was my first wood project, and the finished product is exactly like I planned.

Video of the final desk

Also, during that time that I build a Raspberry server that talks to Hubitat. The goal is to have a touchscreen device next to the front door to operate the house. For example, to check if all the doors are closed or the set up the alarm system.

Prototype of the Raspberry PI 4 system that communicate with Z-Wave Hubitat hub

May was also the month I bought a chainsaw! We had bushes that were 12 feet high; now, they are at 6 feet, which will help the maintenance. I also had to buy a pick and other tools.

Lot of work around the house

In June, I also removed 48 feet square of plants to extend the garage area with bricks. I replanted all the plants elsewhere which lead me to install an automatic irrigation system.

Increase the surface to park our cars

More technically, I iterate on my desk to add more light and a camera. Suddenly, the desk was less than the original shape of a “box” idea, but the audio and video quality have drastically improved.

July-August 2020

The house is old and there was no electricity outside. I decided to install three outside and waterproof outlets around the house. I am very happy with the result and it is so helpful.

Water proof electric boxes around the house

As mentioned before, moving stuff around led me to appreciate automatizing the most that I can. There was an irrigation system but not connected. Now, all the zone are connected to a hub and detect if it is raining or not and which day of the week to water the lawn.

Piece of the motorized clothes hanger

Another project was to have a motorized suspected rack to dry clothes in the garage. The project was to have a structure that can go down to the floor and up to the ceiling to dry clothes or store light items.

Me trying to cleanup the crawlspace

I also went into the crawlspace many times to clean up, treat for insects, and take humidity snapshots to investigate if the underfloor is in good condition.

September to December

During that time, I started thinking about making Youtube Videos. I uploaded my first video about TypeScript and gRPC on July 16th, and since then, I have created around 40 videos. You can see my channel at: https://www.youtube.com/patrickdesjardins1

The house continues to take a lot of my time. I changed the fan from the bathroom that was noisy and inefficient. I isolated the garage door, installed outside lightning (now that I have electricity outside!).

We also bought a new car that will let us haul something for a next project 🙂 Because we know we will live in the USA for a long time, we can now plan ahead more projects.

Fall was slower in terms of projects. A lot of focus on Netflix programming, a lot of time working on Youtube videos, and continuing University. The time to complete 1 minute of Youtube video takes me with the code creating, recording, and post-editing for about 1 hour. I finished the year with about 40 videos of 8 minutes (about 320 minutes of content) so about 320 hours of work there. I completed the semester with an “A” and plan to start the next semester in a few weeks. It will be my 8th class of 10, the end is coming.

In terms of construction, I built a teleprompter with wood and glass and also built a living room table that rotates to have a lego table hidden.

Teleprompter that I use during meeting to have eyes-to-eyes contact but also when recording my Youtube videos

Another project was to have a light that turns on red when I am recording.

Button that activate the Arduino Http Server. Another Arduino listen to the static IP to check if the server is running or not to activate a relay to turn on/off a red bulb.

The system is built with two Arduino chips that check their status to see if they are under a recording state. It helps everyone in the family to know when I can be disrupted or that I need to focus.

Conclusion

I could have added many more pictures, many more house projects, and also many activities with my family. While writing these moments of 2020 I realize how blessed we are for all the time we are spending at the beach or to visit wonderful areas that has these huge red trees. Many moments like watching a movie outside or walking around the neighborhood. We met new people in 2020 even if we are mostly confined. We also learned to be 24h/24h the four of us. I feel so blessed to be able to work and having my wife taking care of the children full time. I can focus on my work and my children receive the best education and love from their mother. The mandated isolation because of the Coronavirus is a hardship for many people, I am blessed to have our house, my work, and the children taken care of and hope that 2021will continue like 2020 and 2019 and the years before to be great years.

Working From Home Desk

The Reason

Working from home can be challenging for many reasons. My situation is that I have a four years old and a one-year-old child. I like working from home but not confined in a small room alone. With Covid-19, I have been working from home and my old Ikea desk was flawed. I had to barricade my surrounding with cardboard boxes to prevent my little crawler to pull my wires. Also, the older one was never sure when it was fine to come to see me or not.

My Ikea desk before the creation of a new desk

I decided to plan out in Sketchup a prototype of a desk that needed to fulfill some requirements.

  • Having my wires safe and visually limited
  • Having some privacy when in meeting
  • Having a way to work seated and standing up
  • Being able to conceal my work area in a clean way
  • The laptop needs to be cooled down in some way

The Plan

The idea was to create a desk slightly larger than the Ikea desk that I had, hence getting to 4 feet but having a desk not deep with less than 2 feet. The front portion would have my laptop and an easy way to swap between my working and home laptop while the back part would hide the second monitor. The second monitor would rise and decline when needed.

Design in Sketchup after about 30 hours

The desk is built for my size. I can sit or stand without having to change the height of the desk. There is a panel in the shape of the number “7” (right side of the previous image) that can be at the top of the desk to completely close it. The same part can be moved on the floor to act as a privacy wall (pictures later). The monitor is about 27 inches wide and is a hook on a Vesa stand. The stand rolls on two industrial drawer frames and a 26 inches actuator can move the laptop into any position along its length by a rocket switch. This way, it is possible to hide the monitor, the rise it in a comfortable position when seated. or rise it high when standing up.

Open Area Challenge

I am working in my living room. I could move my desk inside the master bedroom, but I would be alone for many hours every day. Also, during the evening when I am working on my personal project, I would also be far from my wife. The idea of establishing my home office in the open area added some challenges.

The desk Closed Up

There is a 30 inches area right next to a window in the living room. The place is strategic since it is hidden from the first look when visitors come in the house, but also give a great exterior view. During the evening, I can see my wife and talk to her while she watches television. During the day I can see the kitchen, the dining room, and some life moving around the house.

Home Office in the Corner of the Living Area

The space is very open and is designed to be light in term of object. The desk needed to follow the idea. Hence, when closed, it does not seem busy. While not perfect and simplistic, the rectangle hide papers, the keyboard, mouse and monitors.

Sitting Position

Most of the time, I will be seated. I needed a desk that the height is in the right position for me to be seated with my feet flat on the ground. I desired to have surroundings to hide most of my stuff while working and also reduce the amount of noise. While being in the corner, there is still a way that my baby crawl under the desk to pull the wires.

Desk in Seated Position

The idea was to have the top of the desk removable to use as a privacy wall. However, to be manipulable, it needed not to be too big. I also wanted to work upon my feet, hence needed a way to separate the back area where the monitor resides and the front where the working area sits. The following angle shows that the back area’s top board is separated from the front. The monitor is barely noticeable. The back area has two hinges that let the monitor expands.

Desk Environment

The desk has the left area which is the main console. The laptop shelf is at the right height for when I am sitting. The desk has enough space on the right to write on a paper and enough space to have a glass of water in front of me.

My Main View

The main console has a rocket button allowing to move the monitor up and down. In the previous picture, the monitor is up in the middle of its full extension. The microphone seems to be in the way, but it does not block the view at all.

Main Console

The laptop area has the Scarlett Solo that manage the audio in and out of my laptop. In the middle, it is an AC Infinity fan controls. It is connected to two fans and a probe that detect the temperature of the laptop. It adjust the fan speed to reduce the heat. Lastly, on the right side is the rocket switch to move the monitor.

The Two Fans and the Temperature Probe

For the curious, the probe catches a temperature of 102F when the system is off while running a couple of Docker containers, 4 VSCode instances and 30 Chrome tabs. When the system is on, it reaches about 86F, there is a 16F reduction of heat.

Standing Up Position

The standing up position is a matter of placing the “7” shape on the track. The laptop can be moved manually up and the monitor must be leveled up by the switch prior to closing the desk. While it might not seem logic to hide the switch in the desk, it is the more safe way to avoid one of my children playing around the motor.

Standing Position

It is my first wood desk creation and does not close perfectly but is good enough. There is no room for my feet, so in reality I need to have the laptop a little bit closer to the edge. Nonetheless, it is possible to work standing up. In the picture, you can see a black wire. It is the only wire leaving the desk. It is from a 1/4 inch hole with the source of a powerbar.

Privacy Wall – The Box Office

The panel in shape of “7” can be turned around to close the office. It creates a box.

The Top used as Privacy Wall

In this configuration, the 4 years old knows that she cannot come talk to me. The 1 year old one does not see me or any wires. I can have video meeting without having a curious face getting in front of the camera and people can move around without fearing disturbing a recording.

Top View

Satisfaction

For a first creation and many first times like staining, cutting plywood, installing an actuator, making pocket holes, etc I am satisfied. The desk is exactly like I planned.

After using the desk for a couple of days, I can see some improvements. Some improvement concerns the aesthetic: the stain is not uniform, the bottom of the privacy wall paint wasn’t top coated properly and the wood begins to show up. Some concern the location like the headset which I had to post-cut because I was touching it with my left knee. Some are related to fragility like if the back door is not open and the monitor gets up, the motor push upward and the door does not open but cause the screws to lose. Another slight issue is the detail of the cut. It is not perfectly square and closing the desk shows the imperfection. The wires are hidden but more attaching is needed.

Like any process, the experience gets into play. I’ve learned a lot and I am glad about my work. I have learned a lot by actually doing and will be able to use that knowledge later on in the next project. Now, I am ready to work from home in an environment I like, on a desk I built from my hand with the design I had in my mind.

Book of 2019

Since few years (2018, 2017), I dress a list of books that I read. Last year, I recognized that a brief summary along the book titles would be beneficial for me and for the reader.

Machine Learning

I started the year with a few books/reading on machine learning. I took the class “Machine Learning” at Georgia Tech as being one of the required course to get the machine learning specialty on the master degree. The book in question was “Machine Learning” by Tom M. Mitchell. This book is tough to read. It is deep in the subject, and it is not written for a beginner in the field. The cost of book is very high (above 100$), but there is a second hand for about 20$ which is the option I decided to pursue. The book is a must for the master degree because of the low quality of explanation in many courses. It is unfortunate but true.

Get it Done

In parallel, I started the audiobook “Get it done” by Sam Bennett. It is a medium size reading of 6 hours 21 minutes. The book begins with the perspective that everyone is an artist and to transform fears into curiosity. There is the notion of performing something every day for 15 minutes. Procrastination is seen has three folds which are that you do not care or that the goal is a shadow goal which means that you have no joy executing. The second fold is that it might not be the right time to accomplish the task. Finally, procrastination might be a sign that the task build-up fears. I could resonate on the last point. The solution is to acknowledge the fear and to see the task as fun experimentations where failing is okay. In the end, having this attitude let you go through and most of the time success will be there. There is an allusion that most of the time small details appear more prominent than they are and to illustrate this idea the picture of looking back to something that was stressful might surprise you that what was causing the fear was more significant than it was in reality.

The book is a series of small tips to change the perspective when motivation become the culprit of moving forward. From basic idea like breaking down an idea into small chunks, to taking the time to ask “does this matter?” are proposition. There is the notion of “pure preference” which is to have only one target that might sound crazy but to keep on the list as something that we really would like to do. Comparing idea like if they were in competition one by one and assign a point to the winner until all of them are compared is another suggestion. Other suggestions are more funny at first. For example, to rename a task into something more funny which make it less boring when it is the time to execute it.

Here are a list of suggestions from the book:

  • Create a “Could do” instead of “to do” list
  • The way to present or talk about something might not be the good one
  • It is important to develop a daily habit
  • Breakdown ideas and organize them (shuffle)
  • We have a left and right brain, we can keep the part of the brain that wants to do something by doing a repetitive movement (e.g., walking, taking a shower) to have the right part of the brain use its imagination to daydream.
  • Keep track of the progress, write down all wins and learning (positive) because we have a tendency to have a bias toward negative
  • Aim for a grade of ‘C’, not ‘A’ which is probably already more than the definition of a ‘C’ for other people.
  • Ship early, once the ship sails it is easier to stop procrastinating and adding details. The example in the book is around “WordPress version 2”. It reduces the stress of delivering something perfect.
  • Create a list of all that must be done with the cost of money, the time, the return on investment and determine what is really worth it.
  • Instead of over-complicating something, ask people to find someone who already did it.
  • Write a list of all the positive words people give to you. Refer to it.
  • Always have deadlines. People have tendencies of executing on the last minute of them. People on time or early only move the deadline closer.
  • Write down 30 ways to get what you want. Might be all possible but probably one of the items is good.
  • Delegate what can be delegated
  • Set clear boundaries between phone, sms, email, work, relaxing time.
  • Un-clutter your life. This section of the book is significant and take more time that I would expect. There is few good tricks but it was not the part that touched me much. One trick was interesting which was to pretend that someone need it, would you be willing to help that person? If naturally you would without hesitation, then it might be a clue that you can let go the object.
  • Adding the word “sometime” in front of a negative feedback can help to digest the idea.

Finally, the book is good, but the last part was not interesting to me with trick about getting unclutter. However, the best advice I read was the following. “There is no shortage of success, there is no need to be jealous or to envy others”.

Influence – The psychology of persuasion

This book is from 2016 and its size is above the average of what I like to read with 10h of reading on the topic of explaining why people say “yes” more easily. The book starts with the notion of making thing simple, not simpler.

The book is packed with psychology studies and right in the first half hour I was hooked. The first advice is to stay simple. As much as possible. However, it does not mean to aim for simpler. You can do something very complex but you need to present it in a simple manner.

Giving a reason help tremendously when asking for something. The first chapter talk about some word that trigger some behavior. For example, the word “because” is very effective when desiring something.

The following notion is about “perceptual contrast” where our decisions are influenced by the former choice even if the choice was not accessible. For example, rating people while watching a movie with pretty people were causing people to rate lower if they were watching a movie with pretty people. Or, for example weighting two different objects, something that might be light will be heavy depending of the first object touched. It leads that when selling we should sell the first element first which make all the accessories future sell after. It easier because these smaller sells look very small. It was proven that people take these optional choices in higher probability in that order than if they were presented first. It also works when annoncing something. Starting with a big new will make all the subsequent information easy to swallow.

The principle of reciprocity is natural for every race, nation, time in history that when you do something nice for someone that the person will desire to do something nice. One tactic is to give something small (e.g. a flower) and expect the person to give later something of a bigger value or importance.

The principle of concession: if someone reduce what he wants in a negotiation, you will be prone to reduce also. This is why people starts with a higher bid and go down to what they really want.

The principle of consistency. Once someone is involved will suddenly be a strong defender of the idea even if a few seconds before taking the decision the person was on the edge. For example, if someone bet on a horse before a race, the person might hesitate but once the bet is settled, the person will be a fierce advocate.

We become what we do. E.g. POW that was threatened as collaborator started to behave like collaborator after a while.

People comply once they have one foot in the door more easily. E.g. Once someone accepts a small sign to be placed on their properties they had less resistance to change the sign into a big one later on.

Strategy of commitment. Once you commit to someone you do not want to break the promise hence would do more than initially planned to fulfill the engagement. E.g. Advertising a specific toy before Christmas with the plan to have kids to ask for the toy. The manufacturer does not produce a lot of toys to have parents buy another kind of toys. Then, after Christmas shows again the advertisement with abundant supply causing the kid to pressure the parent to fulfill the initial promise, hence getting the toy (additionally to the one from Christmas).

Writing something down increase commitment. Public commitment is stronger than having the decision only in your header. Human wants to look consistent.

The more it is hard to join, the more the feeling of belonging increase as well as solidarity among the people of the group. There is something around the increase of commitment. E.g. university performing hazing activity to join a student fraternity.

It is more efficient to have a very small reward for a big commitment. Motivation must be from inside the person to be strong in time. The person must feel a personal responsibility and not motivated by the reward or a consequence to behave. E.g. The kids who were saying that a teacher would be angry if they played with a particular toy. It was working until the user was substituted. The group of children who had to receive the consequence speech played with the toy above 70% while the other group who was explained why without reward or consequences played with less than 20%.

Social pressure has a big impact to motivate action. The book presents the example of a kid that does not want to swim until he plays with other kids who can do it and the example of how sect operate. The social proof is that in doubt people follow the herd. It is the concept of pluralist. However, unknown groups of people have less change to help because they are unsure of how the emergency is and people in the group do not want to look bad. The trick is to remove uncertainty. In case people are uncertain, they will copy others.

The halo effect is when one characteristic overshadows all other traits of someone. Physical trait (how beautiful is someone) is a common one but being kind is another. Similarity produces liking. A compliment works well, even if fake, even if known to be fake. People like more people that have something familiar. They will believe the person more if they can think alike or have a similar past.

The book slightly discusses the influence of seeing something much time that alter our judgment. E.g., picture flashing in sight. There is also guilt by association. E.g., a pretty girl next to a car will influence the first impression of the car from the pretty girl.

The idea of performing something kind create the feeling that the person is on the same side and hence will be willing to comply easily. E.g. if a waiter at a restaurant help you save some money on an appetizer, his tips might be bigger at the end or a future more expensive suggestion will be with a higher probability to be accepted.

The fear of losing something is bigger than the motivation to gain. However, hope is a bigger motivator than fear.

Scarcity is something that seems rare in appearance and the feeling worth more for people. It works with time as well.

The Hundred-Page Machine Learning

Another book I read is “The hundred-page machine learning book” by Andriy Burkov. I read this paperback book as a compliment for my first course. The book is short and does not cover every topic as I was expecting (for example KNN is 1 page long) but the first chapters were interesting for me. Mostly about the notation summary because some of the topics were far in my memory.

Georgia Tech Online Master Degree Review after 4 semesters

I joined Georgia Tech Master of Science in Computer Science at the end of 2017 with the idea to expand my knowledge in an area I am interested: machine learning. At the time I am writing this blog entry, I have completed four semesters with a grade of “A”, and six more remain to complete the program. At the dawn of the Summer 2019 semester, I decided to drop-out the course I had started two weeks earlier named Reinforcement Learning. The major reason is the arrival of my second children. Nonetheless, I wanted to give some insight into the online program for those who might be interested in. Complimentary to my opinion, you can find online the website OMSCentral where students write reviews on each class. I decide to write non-anonymously my genuine unsatisfaction with the program.

Your Past Drive your Present

My journey started smoothly with my first two semesters with database systems concepts and design and network security classes. I was familiar with most of the topics and took these two classes to refresh my knowledge, to get accustomed to school after 10 years of hiatus and because Georgia Tech requires to have in the first year two semesters with a grade of “B” or higher.

Why is your past driving your experience at Georgia Tech? Let’s start with my context. I have been working with databases for more than 15 years and also working with the web for 20 years. While a lot of students were expressing their difficulties with some assignments that needed database or web knowledge to accomplish the primary goal, I was fine. However, in hindsight, it should have rung a bell. To be able to spend under 15 hours per week, you need to understand at least half of the topics or master assignments technologies before debuting the semester. For example, in the network security class, one assignment was using Wireshark, the next one a MySql/PHP database/website and another one a Chrome extension in less than two months. I am not even talking about the nitty gritty details of having to know different languages (Java, Python, etc.), libraries (Pandas, Numpy, Mathplotlib) and environment (virtual machine, Ubuntu). In the database class, there was a considerable amount of the final assignment directed toward building a PHP website which is not needed to evaluate database knowledge. It was not a predicament for me, but you can foresee that it could be a burden to add on top of a lot of new theories. The factor of serendipitous knowledge to have gathered play a significant role in the grade. However, this is not the worse. The worse is that satellite knowledge plays a vital role in your success. Even fast learners will feel strain because while learning the main subject, the numerous homework, assignments, and projects on top of the exams appear as obstacles instead of learning vehicle. The rapid pace impeded a full understanding. The numerous tangential topics, not well weaved together, constitute in mixed knowledge that looks like a bag of feeble crumbs — ready to be blown away on the next gust of subject. Riding on a slight understanding and moving on and forget what you barely explored to try to catch the next train is the modus operandi.

Instructors Do Not Teach

My third class was machine learning for trading. I learned Python on top of an overview of machine learning technics. I overall liked the class but the head instructor was mostly absent with acerbic interactions. A trend that will get worse with machine learning and reinforcement learning class were instructors are answering student in a bully way. There is absolutely no way that the words used by the instructors would be accepted in any workplace I have been working. When students ask questions, you can bet to read a scathing response. An example of a reply: “You know it in your heart” is a classic of one of the instructors instead of answering. The responses disincentivize people who misconceive subjects and would like further explanation. The public humiliation of receiving a stark reply stem, in some classes, the propagation of anonymous question (which is possible with the system) or simply in my case demotivate to ask a question.

The lessons recorded could be condensed by half or with better more thorough examples. Most of the lessons are full of pleasantries which sway the main topic out of attention and also increase anxiety because you want to understand but you keep having an instructor taking the subject lightly. In some class, it’s a recording from an actual class at Georgia Tech. The recording is made from a laptop. You can imagine the sound and video quality.

Finally, the instructors refer regularly to whitepapers. Not as a complementary explanation but as a way to avoid providing a thorough explanation in the lesson. I acknowledge that delivering clear explanations require a considerable amount of preparation but I entail, by joining a top 8 University in the USA, to not be deflected constantly toward whitepapers. Swimming in new concepts and having someone referring that the remaining of the information is in a whitepaper (and insinuating that students already have read them), is a lack of professionalism and it makes student losing track of the lesson. I found not educational to stop the lesson and to jump into these scholar papers, which takes hours to read instead of taking a couple more minutes to explain the essential parts.

Interaction on the Student Forum

This is a good segway into the type of questions. Most student will ask questions in the school’s student forum called “Piazza.” Most questions are on the assignments and not on the lecture or reading. The focus is on where to get points, not to dive into the topics. Because my goal is to learn and not to get points, I asked several questions in all my classes. Most of the time, students were answering me. The instructors and TA (teaching assistant) were absent or focusing on the assignments. Many TA couldn’t respond properly, either. An example, I took the time to screen grab a portion of the lecture asking why the instructor was mentioning an increment of +1 in a formula and after more than four messages the TA was saying that I could use anything. But, when I challenged him about why the lecture was explicitly using +1 or if I can use any constant, the TA was answering me that it would be better to have decay. I still couldn’t get an answer about the +1. I understand that the ratio of TA/students is enormous, and they are overwhelmed to grade assignments, but I was expecting more. I’ll skip some frustration with the delay on getting grade which does not help to give you a pulse if you are working on the expected way. In most courses, you will get your grade for the first assignment once you have submitted your second, hence could not really apply the feedback from the former on the latter.

As briefly mentioned in this section, what astonished me the most is that questions are all related to assignment not the lecture or the books or papers to read. I interpret (and also read in some Slack discussions) that people skipped the lecture because of the reasons discussed in this blog article: people are aiming to get the grade and move on. I am on the side that I want to understand and move on.

Grading and Subjectivity

The grading is also subjective and questionable. During my machine learning semester, I jumped throughout the session between 55% and 96% in my grade giving the same amount of thoroughness. The change was different TA was grading me. Also, even if I was answering every requirement there was always a place to subjectivity about that I should have discussed furthermore on different tangential topics. I noticed similar grading fuzziness in other classes where the report has an unclear requirement. Asking clarification on the assignment does not result in iterating on the assignment requirements but to many scattered posts in the student forum which make it hard to follow. I also found that it penalizes student that was not last minute. Many time, a clarification was changing the meaning of something and I had to re-write. Furthermore, asking for re-grade is heavily skewed to make you fail even more. In two of the four class, they had a blank statement that a request to re-grade would lead to a penalty if they deem that it is not justified.

Time Invested

I finally withdraw my fifth semester because of the arrival of my new child. On the first day of the semester, my son had three days. I naively thought that I would be able to handle one class while being in parental leave. I was wrong.

So far, I spent roughly 14, 14, 18, 23 hours per week on the network security, database systems concepts and design, machine learning for trading and machine learning. However, with this fifth semester, with reinforcement learning, the first two weeks cost me 28 hours each. The difference was that after these 56 hours invested was that I was mesmerized if the assignment was really for the class I had studied or not — a complete disconnect other than few keywords.

The time invested varies depending on how you understand the topic has mentioned earlier but still there is something wrong. It is supposed to be possible to mary work and school while you have to sacrifice a lot. In the two first weeks, I had to do two homework and starting to work on the first of three projects but also to listen to several lectures of the class and the complimentary David Silver lecture. These lectures are highly recommended but because the explanation is more detailed. However, it is from another school. I was projecting a considerable investment in time because that in reinforcement learning you cannot copy the code from other students. You read it properly. The machine learning class is basically copying from previous student assignment and write a report. It is explicitly mentioned to do so in the assignments. Naively started by not doing so, and spent way too much time.

Nonetheless, in reinforcement learning, even with all that time spent studying the theory and linking all possible source of information, the reality of misunderstanding stroke: the homework and projects were so disconnected that I had little idea what to code in Python. The additional stress of not having any base to start or any clues was un-educational. I agree with struggling to learn and working hard but not to ferment in limbo waiting to salvage pieces of information from a flood of questions asked by different and lost students. What was worth the majority of the points with the growing misunderstanding of the topics stirred with the lack of sleep led me to take a break. While the time invested every week varies greatly depending on if you read and watch all the material there is also group homework that can play for a big factor to increase the charge.

Team Assignments

The value of teamwork is often undervalued, however, is inadequate for a remote master program. The outline is that people are spread across different timezone. The variance between each individual in term of skills can be considerable. The motivation of each member between wanting to perform or just getting a fast degree can add additional load on your shoulder. And, the classic burden of teamwork where half of the team is doing everything and the other half just wait is influencing quite a lot the time you will invest every week.

The first two courses I took had team works and I got lucky to have people with more or less 3 hours different timezone and also found people who were not last minute. In one of my team, one guy was almost 12 hours difference influencing my choice of also communicating with him before my daily work. Nonetheless, consolidating family, work and school is already a challenge. Teamwork is adding an additional layer of difficulty. It makes the idea of flexibility out of the equation if you are diligent in your assignments.

Flexibility

One aspect of online school is that you have control of the time you want to study. But, the reality is far from being flexible. All the course I had, so far, was giving so many homework (up to eight), with additionally many projects (up to three), with a mid-term and final exam. And, most works require prior reading; hence, when you schedule all that needs to be done you are entirely on a rigid schedule. The critical path of success is on a thin line where shifting a couple of days is possible but increase the backlog of work later.

Also, most assignments are not in a final state when delivered. I had several graded works being in a draft for several days, and then being amended during the short allowed time to perform the work. The fluctuation of requirement disrupt people who like to start ahead. I am someone who likes to start and finish as soon as possible and got bitten often by assignments that were changing throughout the weeks hence favoring people working late. The result is that you have barely any room of flexibility. Once again, if you add that you need to schedule with many teammates, then you are simply in a corset with a low room to breath.

Quality of Content

Concerning the quality of the content, it varies but mostly poor. You can see it by yourself because most are available on Youtube. The problem is, depending on the instructor, you will get a lot of low production quality classes. Audio is often poor, examples borrowed from books, calculus are skipping step making it hard to follow, many jokes that make the week lecture up to 3 hours (the recording varies between 45 minutes to 1 hour 30 minutes but if you take notes it will go up to 3 hours). My main complains is that in 2019 we have so many good quality content for free on Youtube that Georgia Tech must level up their production quality with the aim to teach instead of just covering a topic. For example, covering a critical algorithm (I already forgot the name) in less than 5 minutes video is a blasphemy. Also, there is a lot of variation on the notation used compared to the whitepapers which might be accurate but very confusing for a neophyte to decipher whitepapers.

The lecture were made not with student trying to learn in mind. For example, when the instructor is writing formula, often, they will in post-production cut the time when the instructor is writing — it fast forward into the end of the writing. It forces the student to pause the video when taking note. Thus, the lecture are most of the time taking way more time because of all the time we need to pause. In real classes, student can write at the same time of the teacher, or take time to digest the message before moving on. Not that time, this responsibility is on the student. Furthermore, in real class, you can raise your hand to ask a question, get unblocked and being able to continue to follow. With recorded lecture you can only continue to watch and ask later in the student forum, or search online. The disconnect does not seem harsh for someone who understand but for someone not getting a specific key point in the theory can cause to not master well the remaining of the lecture. I am autodidact and found myself in few situations not totally sure about what the instructor meant. If the instructor is using personal jargon then you are on yourself to find out what it really mean because Internet will not be helpful. Relevant to the format of the lecture, because they were recorded many years ago without alteration, unclear passage remains unclear. In traditional lecture, the teacher can learn from the questions of the student and clarify next time this one give the course. This natural iterative improvement is not present in Georgia Tech because they do not actively work on the content.

In two classes (network security and machine learning for trading) I had to buy a completely useless book. The former one was a hacking guide that had literally 1 useful page. The latter, a book in which the instructor was the author — 60$ for a thin hundred pages. The concent could fit under 30 pages in letter format. It was a summary of the lecture. In my perspective, it reflects the quality in the sense that there was a lack of diligence on how useful was the recommendation. But, also an absence of a neutral party to asses how self-promoting material that compensates the instructor directly.

In each class, the enormous quantity of different topics can be reduced by half in most of the time. For example, in machine learning for trading, there is an entire class on “options trading,” but it is shallow without any real use in term of machine learning. In this same class, there is a whole week on the 2008 crashes. It is not related to machine learning. Hence, a couple of week of finance could be trim to go deeper into the machine learning part. Similar in the two classes, machine learning, and reinforcement learning. In the machine learning curriculum, we touch reinforcement learning. If you take reinforcement learning, two of the lectures are copy-pasted. Instead, in the machine learning class, a better explanation of non-reinforcement learning should be approached.

Finally, in every class I took, students who completed the course suggested to watch David Silver or Andrew Ng. But why? Because Georgia Tech courses are built in a very bumpy way. The lessons start slow, with (too many) jokes and then get shallow on many topics and then dive very deep in calculus, so much that you have a hard time to grasp concepts because of all the shortcut taken and references to whitepapers to finally get back very into a totally different aspect of the main class. For example, you can have 2 hours on game theories and then 1 hour on Markov.

Fearful Approach

Not every course, but some are driven by fear of expulsion of the program. For example, sharing student notes are forbidden. Even, sharing a few lines of code is forbidden while asking for guidance. I understand to not share a whole project or homework but there is a valuable learning value to have examples. The paucity of example provided by professors/instructors in the content lead to dry land of application. Fears drive students to stop asking a question or helping others. In the end, the only benefits are the TA who are grading the same assignments every semester because they do not have to change the requirements. Once again, students pay the price of not fully spread their wings to understand but are pushed to stay alone in their corner. That being said, side “Slack” discussion that vanish a few hours later are useful and seem to be one way to avoid the circumspect law that reign.

TA/Instructors Video Interactions

I was able to assist to a single online “live” video interaction with TA and instructor. For a program driven for “online” education, it is very awkward. The time for these “live” video-chat are supposed to be a time where you can ask questions and to have a discussion but it is more driven by students asking questions in the forum (Piazza). My experience is that you cannot rely on these because the time is mostly the wrong one for your life. For example, in one class, the time was while I was at my job and the other one in my commute back home. That being said, they are recorded, so you can listen to them later with the disadvantage that you cannot ask questions or clarification. In reality, I watched twice a recorded TA/instructors video because they are a very slow pace. Usually, the modus operandi is that the lead will introduce all the TA then read the Piazza questions and try to explain something. Most of TAs do not have a microphone outside there headphone or laptop hence the quality is low. For me, the worse is that every question launch discussion that digresses the main question. 10 questions could lead to 1 hour, and as mentioned earlier, time is scarce.

Am I alone?

In most of the classes, there is some side-discussion in Slack channel where I was able to catch the pulse of panic of most people not understanding what to do. In this last class, I asked the question to the few people that were already doing homework and projects in advance on how they were able to be so productive. Their answers are that they already work in the domain, hence understand most of the theory and only need to ace the work, or it was that they had another class that was similar and could relate better what was needed. Finally, the answer is that the “grading curve is generous” meaning that I could continue to walk head down and get a low score (as 40%) and be able to get a “B”. I was astonished by this last answer but I realized that it was true: most people can get an “A” or a “B” with a very poor understanding of the topics taught.

Browsing the OMSCentral or Reddit, and you can find several people aligning with the overview I am presenting in this blog article. The problem is that there is no direct was to provide impactful feedback. I would have flag many instructors and TA as inappropriate during the semesters, but there was only a last week feedback form which does not seem to do anything because a lot of complain about some classes lectures are still the same five years later of their inception. Even worse, one of the most inappropriate interactions from Georgia Tech I witnessed lead the professor to become a dean. It is clear that the quality of teaching is not a priority.

Why is Georgia Tech not Improving?

Georgia Tech hopefully knows, but move slowly which is paradoxical for a top University in technology. In machine learning, all the assignments have the mention to “copy” from previous students. A shortcut justified by letting students focus on the analysis but it is a sign that students lack the knowledge to complete the task. Instructors decide to employ different learning shortcut instead of guiding the student from the base to ground up. The issue is that the affinity between the classes is not well defined. A well-tailored program in machine learning should guide the student into several logical and ordered classes that go from the base to something complex. Instead, each class is distinct without any relation (and can be taken in any order which is confusing). Hence, each class is shallow and opt to different technic to compensate like allowing students to copy, or to have a big grading curve, or to repeat content from class to class.

Georgia Tech online system (student portal) to register to class is similar to the website you were visiting in early 2000. While it might not be a big deal, the scarcity of guidance on which class to take cause headache. Students must rely on an external source of information built by other students. Again, Georgia Tech is a top university and should have a system that guides users to thrive instead of delegating. I already mention that Georgia Tech delegates to whitepapers for depth in concept, and to other online videos for the poor quality of their own, they delegate to other books for the limited examples provided and now they delegate how to manage student curriculum to students. I’ll cut short in the tech-infrastructure pitfalls because this could be a post on its own (they also leaked student social security number and password). There the saying that you can judge a restaurant’s kitchen by own clean is the restaurant’s restroom. Unfortunately, you can also do the same for system and infrastructure to evaluate the quality of the teaching.

Solutions exist that Georgia Tech can put in place. A process of having someone to genuinely asses the quality of each course should be in place. Instead, I witness that the institution rather close their eyes and pat themselves on the back. For example, one of the most unsparing instructor in his way to behave with student got promoted to dean recently. He has a history of being a jerk. His contribution might be stellar in the research community does but is not a prerogative to teaching and acting poorly. Georgia Tech has a feedback system only available at the end of each semester. Nothing seems to get taken seriously. Instead, an on-going feedback mechanism should be in place without feering retaliation. It should be hosted by a third-party and acknowledged by the institution.

I understand that building a course involves a considerable amount of time. However, keeping heads down for many years (sometimes more than five years) with courses that barely involves (lecture are not re-recorded for example) foster the inadequacy of the system to evolve and to have the student as the priority.

What Now?

While I may sound negative about the Georgia Tech Master of Science in Computer Science it has something good: it really forces you to not give up and to really dig to understand. However, the school is not there to teach you anything. Georgia Tech throws on the wall as many topics they can. Then, they grade you on how you catch everything before it falls on the floor.

There is a huge opportunity for other online programs to annihilated Georgia Tech here: have a program that the staffs and materials stewards students to understand with a realistic life-balance approach. For example, the course machine learning, machine learning for trading and reinforcement learning have a lot of overlap that could be avoided in favor of a better and longer time on each topic. Also, one additional flaw of the course is the level of example that is often none or a single one taken from a whitepaper or book which is merely a requirement to understand. To alleviate these problems, clearer lecture with clear materials instead of having a list of +20 white papers would help. Creating a set of examples with step by step explanation where newcomer could consult and experts could skip is not a genius idea — it is what you get when you try to understand who consume your service.

Additionally, aiming for a maximum of 10 hours per week for a neophyte and testing that assumption would make the program available for an adult with a family and a daily job. But, quality in education requires iteration of the material. Re-recording, adjusting assignments, acknowledging feedbacks and acting on it, improving exams, etc

I patron a program that is not a walk-in-the-park, but there is a limit about how impractical you can be to make a life of people hard for no beneficial reason. Teaching is the art of making topics hard easier; not to try to make it looks harder than it is. Education is to be able to put yourself into your student shoes and to mold a better future by opening these doors that spark these “Ahhhh” moments. On my side, I believe I can succeed in the reinforcement learning class once my newborn gives me more than four hours of sleep per night. However, in the end, my goal is to “master” machine learning — not to play a game of aiming for the minimum (having my grade curved up) and hanging a degree on my wall. This is where I question Georgia Tech’s motives.

How to Curl a GraphQL API?

In the last few months, I have been implementing a GraphQL server in TypeScript and NodeJS using Apollo. You can build your query with the playground and see the result immediately. At the top, a “Curl” button generates a Curl command. However, it writes the command with many options that are not required.

The generated command line has “–compressed” and “–data-binary” which might be fine for few people but in some case, these options were not available. I figure out that you do not need to provide them and still be able to invoke the GraphQL server.

curl 'http://retracted.net/playground' \ 
  -H 'Accept-Encoding: gzip, deflate, br' \
  -H 'Content-Type: application/json' \ 
  -H 'Accept: application/json' \
  -H 'Connection: keep-alive' \
  -H 'DNT: 1' \
  -H 'Origin: http://retracted.net' \
  --data-binary '{"query":"{\n  org(orgId: 0) {\n    nameLong,\n    nameShort\n  }\n}\n"}' \
  --compressed

The generated Curl command line for GraphQL has many headers that can be removed. In my case, I needed to add the authorization header because the service is private.

curl \
  -X POST \
  -H "Content-Type: application/json" \
  -H "authorization: Bearer xxx" \
  --data '{"query":"{\n  org(orgId: 0) {\n    nameLong,\n    nameShort\n  }\n}\n"}' \
  http://retracted.net/api

However, even with the additional header, the command is more straightforward. Instead of requesting the data with “–data-binary”, it is possible to query with “–data”. The compression can be removed if the “accept-encoding” is not specified. The content we will receive is of JSON type, hence we need to specify the “content-type”

In conclusion, this was a short essay on how to use Curl with GraphQL. It can be handy if you have internal tools that mimic Curl but without the more advanced options like compression or binary data.

Apollo Server Playground

Apollo comes with a handy playground. The playground is simple web portal that allows a rich experience to craft a GraphQL query against the Apollo GraphQL server. The interactive system gives autocomplete, schema discovery and display the response. It is a very valuable tool when developing because you do not need to use any external tool to test the GraphQL solution.

For the third post on the series on GraphQL we will explore the playground. Fortunately, it does not require too much work. However, I got stuck and was astonished to see that some people got in the same trouble I had to go in 2016 — two years before me. I’ll describe how I configured the playground and highlight a pitfall that seems to be common and unfixed by default.

In the previous post, we had a very limited Apollo and Express configuration like the following code.

import express, { Request, Response } from "express";
const app = express();
app.get("/healthcheck", (req: Request, res: Response) => {
    res.status(200).send("ok");
});
const server = new ApolloServer(await apolloServerConfig());
server.applyMiddleware({ app, path: endpoint, cors: true });
app.listen(endpoints.graphQlServerPort, () => {
        console.log("Up-and-running");
});

To keep the code tidy, the portion that instantiate the ApolloServer class into a server instance is extracted into a function. The result is a index.ts file more readable because we will add a few configurations to the instantiation of Apollo.

import express, { Request, Response } from "express";
const app = express();
app.get("/healthcheck", (req: Request, res: Response) => {
    res.status(200).send("ok");
});
installGraph("/api/graph", app).then(() => {
    app.listen(endpoints.graphQlServerPort, () => {
        console.log("Up-and-running");
    });
});

The installGraph function takes two parameters. The first one is the path under the GraphQL is reachable. The string can be to any URL you want. The second one is the Express server. The function contains the two lines that we had before with a small modification concerning the parameter passed to the server.

const server = new ApolloServer(await apolloServerConfig());
server.applyMiddleware({ app, path: endpoint, cors: true });

The configuration function is asynchronous, but does not need to be. I have some configuration that requires to perform a call that is async for authentication purposes. The key idea is that in a single function you will configure all you Apollo GraphQL server. The main configuration is to set the typeDefs and resolvers. For the moment, we can use some fake data for both but later we will connect to read data source like REST services and gRPC services. A simple definition can be of a book with a title and an author. The resolver can return the whol list of book.

import { gql } from "apollo-server-core";

// Type Definition
export const typeDefs = gql`
    type Book {
        title: String
        author: String
    }
    type Query {
        books: [Book]
    }
`;

// Fake data source
export const books = [
    {
        title: "Harry Potter and the Chamber of Secrets",
        author: "J.K. Rowling"
    },
    {
        title: "Jurassic Park",
        author: "Michael Crichton"
    }
];

// Resolver
export const resolvers = {
    Query: {
        books: (obj: null, args: {}, context: {}) => {
            return books;
        }
    }
};

When the resolver and the type definition are coded, you can insert them in the Apollo Server.

const serverConfig: ApolloServerConfig = {
    typeDefs,
    resolvers,
    playground: true
 };

There are few caveats with the code above. The first one is that it has a single type definition and a single resolver. The second is the lack of authentication. We also do not pass any parameter that would give the possibility to fetch a single entity instead of a full list. Finally, the context is not set hence we do not know who is making the request and cannot resolve the information for a particular user. Nevertheless, the playground is activated. By running the code and going to the endpoint passed by parameter, in my case “/api/graph” it is possible to query from any HTTP request but by going into the browser and use the playground.

Example of writing a query in the playground

Summary

This article is a little bit deceiving. Not that I lied, but that I know that few things does not work. For example, with the current implementation, the code does not scale well for GraphQL type definitions or resolvers. The playground works, but if you are using an authenticated API, it will fail. In the next article I will modify the code of this article to make it scales better to have many GraphQL type definitions and resolvers as well as bringing a strongly typed TypeScript context for authentication purposes but also to allow returning from GraphQL information that belong to only the authenticated user.

My Other GraphQL Articles

Recapitulation of 2018

In a fast-paced life, we often lose track of all accomplishments realized thorough the year. Since 2017, I have written my year review. You can consult my last year review in this post. As mentioned in the introduction of my 2017 review, since the previous five years or so, everything keeps growing and improving in my life. Thanks to all the great people and opportunities that spawn from different initiatives I have been cultivating, 2018 follows the tradition of finishing the year at a higher bar than that year before.

2017 was particular because I decided to have a monthly objective in which would set me out of my comfort zone or put me in a path that is less traditional. For 2018, I decided to be less strict. Mostly because of a more challenging situation which was the balance between my demanding work at Netflix and the significant side project of working on my master degree. The degree of freedom was narrow, but still would not be an issue to work on having a fantastic year. While being at Netflix and being successful at a master degree in a domain that is unknown to me (machine learning) is already an excellent yearly objective, I still believe that it should not be an excuse to accomplish more feats.

Let’s get started with my 2018 year in review. First of all, I have continued to the goal of reading as much as I can. Since my move to California to work for Netflix, I must drive, hence cannot read as much. Nevertheless, I keep expanding my horizon by leveraging San Jose libraries’ audiobook mobile application that allows borrowing each month a limited set of book. Not only it facilitates learning on different subjects; it increases my vocabulary and also to understand English at a faster pace. I decided to stop listening at the normal pace of 1x and moved to 1.25x this year. I relied on audio books for most of my reading, but I was able to consume paper books from school’s curriculum books and one that I wanted to read (Principles by Ray Dalio). In the end, I consult more than 25 books. The complete list is available in this blog post which lists each title.

Complete 3 semesters (3 course) in 2018

I am still working slowly my master degree in machine learning at Georgia Tech. I have completed three courses on the ten that I must complete to earn the degree. It is time-consuming and harder than anticipated. Some classes are not very well organized with late details. Others have lectures that are not tailored to teach but to through on the wall as many notions as possible. Nevertheless, I am an autodidact and can find my way around. So far, I am a straight “A” student but I plan to reduce my involvement slowly which could result in lower grades — I’m in peace with my decision. The last course was about machine learning and stock trading and it was very interesting. The curriculum of the master degree still interests me and being part of an official school force me to go way further than I would go on my own. The challenge is to fit the time between Netflix and my family.

Ended in second place in term of contribution on 967 students

On my free time, I created two public open source projects. I mostly have done the code between two school semesters and continued to contribute with unit tests, bug fixes during the following months. The main project is the Data Access Gateway, “DAG”, which is a library that helps handling redundant HTTP request, cache the response in memory or in a persistent storage (IndexDb). The second open source project is a Chrome’s extension that gives insight about how the DAG handles every request. I’m glad of this accomplishment because I never had an open source project that I started from scratch and kept improving in time. Also, the primary web application I am building at Netflix, the Netflix Partner Portal, uses the library.

In the storm of releasing the Netflix Partner Portal and finishing a semester, I had to create a 45 minutes presentation that I delivered in Croatia at Shift Conference. It was an amazing experience where a thousand people were invited. You can read the detail of the conference in my summary of my experience delivering my speech on how to increase your development velocity by using TypeScript in this blog post.

Myself on the stage presenting about TypeScript

In parallel to the presentation, I released my first TypeScript book. The book is covering all TypeScript features since the beginning up to the latest version. The reason I wrote this book was to have a single place with all the information about TypeScript. I plan to keep working on the book and to deliver future edition that will enhance the original format by adding the new features that the language offered in the future. The book will be an on-going project that I will revisit every year.

My first TypeScript book: Holistic TypeScript

Furthermore, a few months after the release of the book, I received an offer to write a guide about Typescript. Because I already had a lot of material prepared with the former book and the speech I delivered in Croatia, I decided to dive into this second writing. I have to say that it was a little bit of overreaching for me. I succeeded at the expense of some good night of sleep. Nevertheless, I am glad I published this second book on TypeScript. The third book I wrote this year is the gathering of all the blog post of 2018, something I have been doing for several years in a row. Let me tell you that this is a lot of writing for a single year and a personal record.

My second published book of 2018

Concerning Netflix, I am glad of many moments through the year. First of all, Netflix Open Connect Partner Portal got released. The version 2.0 of the application was having a hard time before I joined. I rebooted the system, and I delivered the web appliance which had many good wins. Mostly around performance where the system can accomplish several tasks in a fraction of the time. Another success is in term of easiness of use and in term of insight with the telemetry system. The latter spurred life into the whole fleet of our applications. The last year at Netflix went pretty fast, mostly because it was interesting and I had a lot of freedom to execute solutions the way I desired. The result was a strong sense of belonging which is very powerful because it increases the accountability and sense of importance.

Netflix Partner Portal: BGP Configuration

Concerning the work I produced at Netflix, the top highlights are:

  1. TypeScript is using beyond only the application I am actively working. I am glad that my teammates embraced typing their front-end code.
  2. Bringing insight to the application I am developing. Before my arrival, we were blind in term of what the user was using, or what time a particular piece of the system was taking. It was harder to debug and it was also very subjective in term of what is using. Now, it is easy to know where to invest time, or to improve the code or even just to figure out how the user achieved a bug.
  3. Performance improved quite a lot with the new code of the web application I built. I was replacing an old portal that was made in AngularJS. I decided to use TypeScript, Redux and React. I built an open source project to handle the fetching of data called Data Access Gateway. It helped to increase significantly the performance. For example, one use cases that the user was doing was taking above 1 minute 40 seconds. It takes now less than 10 seconds. Not only for particular scenarios the experience is faster, but it also improved quite a lot between the start and the end of the year. Better management of the React component, an increase of Selector (memoization) of data, and many tweaks that I already covered. Also, a smarter bundling analysis, a reduction of third-party libraries and leveraging async importation were able to reduce by 30% the number of initial downloads.
  4. Better user experience. One goal was to have our user to be self-sufficient, to reduce the number of communication we have with them. I designed a user interface that provided constant feedback with a system of “what” is going on, “why” the data is in that shape and “how” to fix or improve the condition of the data. Many descriptive popovers, a reduction of information to the bare minimum and many other changes were put in place.
  5. Finally, I am starting an initiative around GraphQL to have a better story about fetching the appropriate amount of data from the backend as well as consolidating our backend and frontend entity. This latest project will be mostly conducted next year.

This year was also the first time I was spending that much amount of time at work. I had a crazy schedule to release Netflix Open Connect Partner Portal which leads me to go beyond my strict 40 hours per week that I have been able to maintain throughout all my previous years. That being said, I was still able to contain my hours in a reasonable amount compared to the average of Silicon Valley folks. For about five months, I had to give an additional 15%. With the high amount of side project, it was challenging but I was able to handle it. My trick was to stick to a well-defined schedule. In summary, it was looking like the following: 

  • 1h Working on my master degree (mostly lecture and reading in the morning)
  • 8h work (bumped to 9h for the first 5 months)
  • 45 minutes (include morning and afternoon) commute with audio books (self-improvement)
  • 3h with the family
  • 2-3h of side project (books, open-source projects, preparation conferences) but mostly school assignments
  • 7-8h sleep

Since the release, I have been able to come back to 40 hours which is greatly appreciated for my sanity. The master degree is taking me more time that I was originally expecting. On average, I have to spend 20 hours per week which is challenging with a young kid. I can keep up without having to spend time during the weekend (most of the time) by doing everything once she sleeps. However, I had to brim over 4-5 weekends for a whole afternoon to complete assignments or to perform an exam. Thanks to my wife for these moments.

This year also was a critical one in term of deciding if my wife and I expand out family or not. We already have a daughter who was born the following year of our adventure in America. Initially, I was not thrilled with the idea of a second kid. However, my wife’s dream was to have two children, and I realized that we are doing a lot of my dreams which my wife always been very cooperative. After thinking more than three years about it, I decided that it was the best time to move forward. Thinking forever about the perfect timing would lead to stagnation. After several conversations, we decided to move forward with the plan which will be completed around May 2019.

My daughter approves the idea of having a sibling

The recapitulation of this year is mostly positive. I can highlight failures in which I should particularly scrutinize to improve. For example, I have not done any physical exercise this year. I plan to go back to a low level of training gradually next year. A second failure was that I worked more time each week than expected. I target working a more reasonable amount of hour to avoid fatigue period which leads to having my patience going downhill. While the number of hours might not be astronomically high in Silicon Valley, it is still too much to enjoy my family and all the side projects I am carrying. 

Finally, this year was awesome. Like the previous one and the one before an so on. I have been blessed and will continue to keep my options open for new challenges, opportunities, and possibilities to grow and expand my knowledge. In the last few years, I realized that having concrete dreams and aiming to jump on occasions is the key to enjoy an exceptional life.

Book of 2018

Here is the list of book I read in 2018. You can consult my list of book I read in 2017 in my 2017’s accomplishments.

Next year, I plan to write down a paragraph for each book but for this year, it will be a plain list.

Using OneNote to record online classes

I am taking online classes for my master degree in machine learning at Georgia Tech. For the first three semesters, I used Google Doc to write down all my notes during lecture. The lectures are provided by Udacity which are using videos to teach the content. After three semesters, I realized that my way of taking notes was not efficient. First, I was taking notes in Google Doc which was not great when I needed to sketch quick doodles. It was not great because I needed to come back to video to get some contexts.

Microsoft One Note allows using a pen to doodle along with typed notes. Furthermore, it allows recording audio. The problem with Microsoft One Note is the lack of possibility to choose which way to record the audio. It only records from the microphone and does not record from the computer system. There is a User Voice request for a new feature to allow choosing the source of the audio. Configuring to record the computer audio make sense for anyone who is taking notes remotely on video as I do.

Meanwhile, it is possible to record the audio of your computer with Microsoft One Notes by download a driver that will redirect the audio. It is a little bit cumbersome but it works. Here are the step.

First of all, you need to download two executable. The former is a sound driver, the second is a tool that will proxy the audio back to your speaker hence you can not only record but listen. 

The first download: VB-CABLE Virtual Audio Device.
The second download: Audio Density Demo
They are both hidden somewhere in the same page. 

Once they are installed, you need to configure to use the audio. I am using Windows 10 Home edition. Here are the screenshots of the configuration of the audio.

You will have to set to “default device” the Cable Input and Cable Output in both. The configuration is cumbersome because it requires that you swap it back to your speakers and microphone when you are not taking notes. However, that is a free option.

The last step is to configure Microsoft One Notes. I am using the 2016 version. The audio configuration is under File, Options, Audio & video. The setting must set the device to the new drive “Cable Output (VB-Audio Virtual Cable).

Microsoft One Notes Audio Recording Settings

The last step is required only when you are ready to record which is to start the Audio Density Audio. That step is needed if you want to hear the audio while it is recording. It is awkward because the tool uses an audio animation which is useless for our case, but it is mandatory. The tool will make your CPU and GPU running high. It is unfortunate and I wish I had not to use something that intensive. Here are my configuration.

Finally, you can start recording and doodling and the audio will know when you wrote or draw allowing you to quickly click the play button next to the text to hear 5 seconds before you started writing. No more need to go back to a video to listen what the teacher was mentioning!

React Ref with children caveat

Recently, I had the requirement to disable some parts of the user interface if an entity is under a specific state. I decided to create a reusable component that would blur its child and show a message to the user explaining why a section of the screen is inaccessible. You can see the final rendering in the screen capture under this paragraph. The implementation of the solution worked — except when I was refreshing the page.

Refreshing the page cause the React component to be in a different path of execution. It has to fetch the information and mount for the first time the React component. While other navigation displayed the image above, in the case of refreshing the page, the graphic was never loading. In fact, even when the appliance status was in a good status, the component was totally blank.

After a while, I realized something: the wrapper I created was the cause of the issue. The following image shows on the left the problematic arrangement of components and on the right the solution that I will explain shortly.

Left side is the wrong implementation; Right side is the good implementation

The problem was that the parent container was loading the chart component and in the render function was using the wrapper. The component was using a ref to access the DOM because the chart built with HightChart (a JavaScript not a React library). However, the introduction of the wrapper (to blur or not the chart) was in the middle of the way. The wrapper was rendering the children (the div that was hooked to Highchart) differently. When the status was good it was rendering the children directly, when the status was not good it was creating a DIV and inserting the children. Here was the problem. The difference of depth in the DOM element was breaking Highchart. In fact, it’s not the fault of Highchart, but more that the code in the component that was hooking Highchart to the DIV was suddenly rendering another DIV that had not knowledge of the modification Highchart had done. A quick fix to change the hierarchy of HTML elements fixed the issue, but it was not right.

Here is a snippet of the wrapper:

export class Wrapper extends React.Component<WrapperProps> {
    public render(): JSX.Element {
        if (this.props.isEnabled) {
            return <>{this.props.children}</>;
        }
        return (
            <>
                <div
                >
                    {this.props.children}
                </div>
            </>
        );
    }
}

The core of the problem is that the component access a ref of an element outside its own render. It accesses a reference from a child that is rendered by the wrapper. Swapping the component, like illustrated in the right column, fixed the issue and rendering the children without having to care about the hierarchy of the elements.

The explanation, for my case, was that Highchart was configured in the componentDidMount and then had the data pushed in the chart in the componentDidUpdate. However, this was done by accessing the reference of the DOM element which was changing position once rendered by the wrapper. Moving the wrapper a level up and allowing the component to have a reference of a DOM element that it owns (inside its own render) mitigate the issue because of the configuration executed on a reference that does not “move”.

I discussed with one my teammate at Netflix and we built a demo inside a live sandbox that you can find at this address: https://codesandbox.io/s/74w7nz3m2j

The sandbox contains a simplification of the behavior described. There is a parent container named “App” and a render function that render two sibling wrappers named “SameStructure” and “DifferentStructure“. The “App” has a state that changes when you click anywhere in the application. The click event changes the state to the value “false” and uses the reference to change the DOM. It simulates changes that occur to Highcharts when the parent container is updated. The “App” sets a unique string in the mount to simulate the initial configuration of Highchart on a DOM ref of a child DOM element. There are two wrappers to illustrate that one has the same structure regardless of if the flag is set to false or true. However, the second wrapper change it’s structure. The code is succinct, here are the wrappers.

export default class SameStructure extends React.Component<Props> {
  render() {
    if (this.props.flag) {
      return <div className="first">{this.props.children}</div>;
    } else {
      return <div className="second">{this.props.children}</div>;
    }
  }
}

export default class DifferentStructure extends React.Component<Props> {
  render() {
    if (this.props.flag) {
      return (
        <div className="first">
          <div>{this.props.children}</div>
        </div>
      );
    } else {
      return (
        <div className="second" style={{ color: "blue" }}>
          {this.props.children}
        </div>
      );
    }
  }
}

The result is unexpected if you are not aware of the weakness of using a reference of a child at a higher level. The output does not have the text sets in the componentDidMount for the wrapper that has a structural change. Here is the output where you can see that the “Different Structure” misses the “MountText”.

Same Structure
SameStructureMountText[appendTextOnClick][appendTextOnClick][appendTextOnClick]

Different Structure
InitialDifferentStructureText[appendTextOnClick][appendTextOnClick][appendTextOnClick]

To conclude, a React component that has a reference should only refer to DOM element that it owns. React has ways to pass down a parent reference to a children if needed. However, in this particular case, we were accessing a children from a parent which is cause unexpected behavior. The work around is to ensure the hierarchy of component is respected and avoiding having “ref” from a DOM inside element (children) of a component.