Monday, July 15, 2019

My Take on The 10X Engineer Myth

Lately the tech landscape is discussing a lot about the 10X engineer myth. It has always been a very interesting point to discuss. What makes a 10X engineer and where to find them? What’s my take on what makes a 10X engineer? Let’s see in details how I see it.

No I don’t see Rambo as the ideal 10X Engineer.

Based on my own experience, a 10X engineer is that team member that is able to perform to his maximum abilities. The engineer enables other team members to be as effective as possible in unlocking the team’s value. Here are some values that describes a 10X engineer.

First, the engineer understands what he knows well and is well aware of the areas he needs to improve. The engineer should be able to understand the problems he’s trying to solve by applying his knowledge or by asking the right questions to gain as thorough understanding of the problem. A good understanding of the problem will leads to a more effective problem solving.

Second, the engineer is able to apply the right amount of solution to the problem. Start with the simplest approach that solves the problem. Let the more complex solution comes later when needed. The first draft should solve it first. This way, the engineer does not over-engineer a solution. Instead, use that extra engineering bandwidth on other things that needs solving.

Third, the engineer has a high sense of ownership to the problem he’s solving. This way, the engineer will pay attention to the big picture as well as the details of the problem. Edge cases are often identified early by the engineer. The engineer will do things that are needed, not simply following instructions.

Fourth, the engineer is able to understand how his teammates think. Let’s face it, engineering is a team sport. When you understand how your teammate thinks, each one of you knows each other’s hindsight and can cover one another. This way, a thorough solution to a product is crafted.

Fifth, the engineer is not selfish and thinks for the good of the product and the team. If you can’t work in a team, you have a harder chance to succeed nowadays. I’m not saying that if you’re a solitary rockstar then you can’t be successful. All I am saying is working good in a team will make a product better. The goal is always how we solve the problem better. That way the user wins. It’s not about whose code is better, it should always be about how we provide the best solution. It’s nothing personal, it’s just business. The best engineers in my team are those that acts as enablers, thinking for the good of the team and the product.

Sixth, the engineer is always curious. A curious engineer will be able to always make his code better and will always strive to expand knowledge and hone the problem solving skills. When you stop being curious is usually when you think that you know better than anyone else and you’ll start going downhill from there. As engineers you will always need that technical knowledge and you always have to try to make it better. After all, engineering is a technical job.

These are the six qualities that I think is very important in achieving that 10X myth. Let me know what you think are the qualities that makes up a 10X engineers.


follow @femmerling on twitter
visit my website

It’s Been 3 Years

It’s been 3 years since I last wrote something in this blog. Why? I’ve been really busy and I’ve been learning about a lot of things.

I’ll try to start writing at least once a month moving forward. I believe I have a bunch of things I can share with all of you. As usual, it can be both life lessons of tech stuff.

Hope it’ll  be useful for all of you to learn.

Anyways, here’s to start writing again.



follow @femmerling on twitter
visit my website

Saturday, June 18, 2016

MotherNature: A Framework-Agnostic Python Environment Variables Manager

In today's fast-paced tech startup environment you need to ship things fast. This makes way to the blossoming continuous integration and code promotion system.
Continuous integration and code promotion have several requirements. One of it is environment variables management. This will enable your code promotion easier. Change your environments and you still get the correct values. 
In python world there are tools for this but most of it are tailored to certain frameworks. Take Flask-Environments and Django-Environ. These solutions does not always work everywhere.
About 4 months ago, the app I worked on requires me to use Apache Thrift. The public facing API is using Flask. I can use Flask-Environments. But, the micro-services are build using standard Thrift Servers. These babies do not have any environment variables manager. This was when I decided that I should write my own.
Enter MotherNature, a framework agnostic python environment variables manager. It comes with several functionalities that are battle tested.
To install it you need to run:
easy_install mothernature
Or if you prefer pip:
pip install mothernature
To use it you need to define a .yaml file with the following structure:

And then in your code, all you need is:

With this, when you start your app simply run:
python [desired env]
You can also define default environments. Simply set the optional environment parameter int the constructor so it becomes

With the second approach, when you start the app without the desired environment argument it will use the default environment.

I made this with simplicity in mind. Just like MotherNature takes care of the environment, so does this library. MotherNature is designed to make environment management easy using a single .yaml file.

Hope this can help you manage your environment variables better. The GitHub repo is at Feel free to post issues or submit pull requests there.



follow @femmerling on twitter
visit my website

Monday, August 31, 2015

Thank You Traveloka

If you read my blog you'll notice that I joined Traveloka around 9 months ago. It was my first time working for a product company and it was a great experience. I've always worked for a service company before that.

Traveloka is an amazing company and the growth is staggering. I learned a lot about working with app at scale and the mobile app landscape. The experience gained is invaluable.

Around 4 years ago I had this idea about a social shopping app called nawaran. I built it in 3 months and launched it but the ecosystem wasn't ready. So I decided to shut it down.

A few months back I had a chat with some friends with a similar idea. They are building something similar and I thought that it's about time I chase that dream. This is when I decide that it's time to move on and so I joined them. Fast forward a couple of months and here we are, on my last day as a Traveloka employee.

Thank you Traveloka, for giving me the chance to get exposed more to the product side of things. You guys are the most critical tech crowd I've been in  and I'm proud to be one of the alumnee.

Now, it's time for a new adventure. The end of a journey is a beginning of a new one.



follow @femmerling on twitter
visit my website

Monday, May 11, 2015

Everything Happens For A Reason

Everything happens for a reason. I know it sounds cliche but it's true. You may not realize what the reason is now. But there's a big chance that you'll know it later.
I've always dreamed of being a pilot as a kid. I grew up with that dream and took a good care of my eyes. When I was 18 and about to graduate from highschool, my Mother disapproves of my dream. So, I moved on and took computer science. One thing stayed. I always take a good care of my eyes, until this day.

I got married when I was 24, had my daughter when I was 25 and had my son when I was almost 27. Now I had a second daughter at 31. When my son was about 1 year old, we realized that something wasn't right with his right eye. We went to the doctor for diagnosis and teatment. The doctor said that we'd have to wait until he's 2 years old for futher treatment. The diagnosis was Strabismus.

When he was 2, we went to the ophthalmologist. He had his first pair of glasses because his right eye had a bad eyesight. That condition is impacting his left eye as well. We went for another check last weekend. This was about 2 years after the first check. His right eye condition was not getting any better. So he had his retina photographed. I could tell from the doctor's face that something was wrong. My son had Toxoplasmosis attack when he was still a fetus. It affected his right eye but he survived. That left a scar that prevented the propper nerves to form. The scar is near the center of his eyesight. This is why his right eye is not getting any better.

The doctor said that there is currently no cure for this condition. This is when I realized why I have a good pair of eyes. Anyone reading this please mark this promise I made to my self. I'll take a good care of my eyes until 2035. By that time I'll be 51 and have seen a lot of this world with my own eyes. By then, I'll be giving both of my eyes to my Son and took his eyes. He'll still have a lot of adventure by that time and I want him to see it with a better eye sight. I'm hoping that he'll be happy to see it through my eyes. I love you my son.



Thursday, January 29, 2015

Android TDD Using JUnit, Robolectric and Mockito

Android now supports unit testing. Android unit testing runs on devices or emulators that adds extra time during development. I'm a big fan of TDD and the way android testing is done does not help me much.


Thanks to Robolectric, headless testing is now possible by leveraging gradle. I wrote this post as a result of trying out several different approaches that confused me. Hopefully this one will help you set it up better.


First, current common Android development projects are tightly coupled. Most stuffs are done in the Activity or Fragment, blame the tutorials. This makes it hard for us to actually do unit testing since a unit test should be isolated. The tight coupling makes unit testing impossible.

Then, come this approach called Model - View - Presenter (MVP). MVP aims at separating concerns.
The three components involved handles different concerns:


This component groups all data related concerns. This component handles data queries (be it via SharedPreference or SQLite) and network connections. The Model will be the provider of data for the Presenter. The presenter will then sends the data to the View.


Just like the name suggests, the View handles all the presentation layers. You change the views, texts and contents in this component including navigation. The View should not handle view state and logic.


This component handles the logic of the view and maintains the view state. The presenter will be the one communicating with the models and updates the view when data is retrieved.

The MVP components are created using interfaces that standardize it. This separates concerns from each layers. The components communicates via the interfaces and does not connect directly to the implementations. This removes tight coupling of each layers. You pose no effect to other layers when you subsitute your implementation.

For more references on MVP implementation try reading this blog post by Antonio Leiva.

Setting Unit Test on Android Studio Project

We need a special gradle plugin to set the environment for unit testing on Android. I use the Robojava gradle plugin by Gautam Korlam. It is simple and easy to set.

The first step you need to do is to create another module on your android project.

Make sure that you select the Java Library module.

After the module is created, delete all other files except the build.gradle so it looks like this

I named my library tests.

Now we need to tweak the gradle settings.

Make sure that your new library is listed in the settings.gradle file.
Mine looks like this:
include ':app', ':tests'
After that, we need to change the root build.gradle. That is the one on the root of your project.
Mine looks like this:

The next thing you need to change is the build.gradle of your main app. Make sure you list all the dependencies in this file and make sure that you set the test source to src/androidTest. Mine looks like this:

Then, finally you need to change the test module's build.gradle. This is to make sure that the test are executed in the right source and can be done headlessly. Mine looks like this:

And there you go, it's ready.

Anytime you wish to create a test, simply create a test on the presenter class, make sure it's a JUnit 4 test case and it's placed in the androidTest/ directory.

Anytime you wish to run the test go to the command line, cd to your project root folder and run:

$ ./gradlew test

If it is successful you should see something like this:

Robolectric tests can also be run for integration tests. You can also use this for continuous integration. Simply run:

$ ./gradlew build

Gradle will build and run tests. If any of the tests failed the build will fail.

I have the full example of this project on github. However, the project does not demonstrate the use of dependency injection as suggested by Antonio Leiva.

Feel free to comment or ask me.



follow @femmerling on twitter
visit my website

Thursday, November 20, 2014

Minimalist Distraction Free Setup

I got a new MacBook air at the new company I work at.

Unlike my previous MacBook air, this one only runs i5, 4GB Memory and 128 SSD which means I have to preserve a lot of space to have a nice coding rig.

I have to be able to code android and iOS on this one. Plus, I should be able to hack stuffs on it for my personal fun as well.

So how do I deal with that?

I need to reserve around 9GB for XCode, 7 GB for Android Studio + SDK and around 20 GB for basic OSX stuffs. Plus I have to reserve the iWork and iLife stuff since this is a company laptop and someone else who's gonna use it later after me.

I'm a big fan of music and movies, and the space limits it. So how do I deal with it? Use the cloud. I put all my old codes in a private git repo. I stream all my music using deezer and put all my favorite movies on my Google Drive account.

Now I can still have it while I run on a minimal setup.

As a comparison, now I have 83.59GB of free space out of 128GB on the new machine compared to around 60GB of free space out of 256GB on my old machine.

Another thing that I am currently trying is to minimize distractions. I don't have any social media app installed on my coding rig other than Slack, which is the company's official app. No Skype, no Twitter, none whatsoever even on my browser. I use all of it on my phone, which I randomly check. I can focus more because of that.

Try out a minimal setup, you'll be surprised at how it increases your productivity.



follow @femmerling on twitter
visit my website

Sunday, November 9, 2014

Thank You IceHouse

Last Friday was my graduation day from IceHouse University. It was a wonderful 2 years journey and I consider it as a university since I learned a lot more stuffs there compared to my previous 7 years in the tech industry. 

Not only that, I met a lot of interesting people there. I met the team who rose from being laid off by Yahoo!, and they're truly inspirational people to work with. I met an unknown guy from Singapore who became my best friend at IceHouse and now became a CTO at bridestory. I met one of the most prominent geek in Indonesia who now leads an RnD lab. I also met a travelling designer, a cool frontend guy who likes to go to beer garden, a tech guy who refuses his parent's wish to be a government guy just because he thinks it's not geeky enough, a really smart geek who comes from no man's land and become the first winner of code of the week at IceHouse, a developer evangelist turned engineering lead, a photonic science master degree graduated from Germany turned into QA lead, finally got a mentor who graduated from MIT and most of all, I met with the brightest minds in Indonesia that I'm sure will be the future tech leaders in Indonesia.

However, the show must go on. Starting tomorrow, I am starting my new career at Traveloka, a cool young company in the travel tech industry. A lot of people are asking me why. I've always followed Traveloka since their first launch. I like how the company is run and I like the idea that they want to do different things with the industry, most of them I can't disclose here.

Thank you IceHouse, for giving me the chance to get exposed more to the edge of technology. You guys are the geekiest crowd ever and I'm proud to be one of the alumnee. I now follow the vision of IceHouse to create future leaders of the Indonesian tech scene.

Here's to a wonderful 2 years at IceHouse and to an exciting step forward with Traveloka!



follow @femmerling on twitter
visit my website