Category Archives: Career

Book Review

Well, I am back into my writing mood now, so I will go quickly through a list of books that I read. This is very personal, and everybody has their own priorities about what books are good.

Here is my list:

  • It must be engaging. Yes, it has to be. Fun is a plus
  • A little bit of story telling and some fact, research supported fact. Story supports your emotion, and helps you to link with the people, and remember what you read longer. However, too much story seems to focus on details and fail to abstract a lesson from then.
  • It offers new content and knowledge in each chapter. There are good books with amazing beginning chapters, but then it goes on and on about the same topic or concept. “I got it, thanks”, and move on.

Some kinds of books I love reading on:

  • Technology books. Definitely. Well, it is always awesome to read old and new technology books. They taught us new mindset, new tricks and new process.
  • Psychology and Sociology books. I actually want to touch into the people’s emotion and feeling, rather than just learning management. I think learning management offers lots of value, but I enjoy psychology and Sociology more.
  • Management, Process and Leadership
  • Design, UI & UX
  • Law
  • Sales

In the next post, I would review many of the books I read, hope that it can help others to find out what they should learn


URL Design

The url has become an important part of lives, when it is shared around. You want to have a Get, not a Post, and the url has to include text for the SEO, but should be easy for human to make mistakes.

I love Stack Overflow’s URLs. Here’s an example:

The only thing that matters there is the 6380. Try it or also works. SO will even support this!

Great post here with Scott Hanselman:

Xamarin Migration Journey (Part 2 – Architecture)

In part 1, we discuss about some steps that we have to take when experimenting with Xamarin. In this part, we will discuss about architecture between iOS and Android.

In the normal process, iOS and Android will share some similar architecture styles. Both will have UI layer, Model Logic layer and Database Layer. Before trying to use Xamarin, we need to make sure that both of our code platform will share similar architecture.

So, the first step was to try bring both our platform into a V.I.P.E.R architecture and share the same code process. VIPER is more commonly used in iOS and there are not many resources for Android, but we still have to force the Android codebase to use VIPER. You can read more about VIPER here.

With this architecture, we hope to reuse our Interactor (Business and Controller Logic), Presenter (View Logic), Worker (Data Logic) and Models as much as possible. Any code that is different between iOS and Android will be integrated at runtime using a Protocol / Interface approach.

We take this as a first step, because if we fail to use Xamarin, we can still have a nice codebase and a familiar structure between iOS and Android. This allows us to port code from iOS to Android easily in the future

Xamarin Migration Journey (Part 1 – Introduction)

We are trying Xamarin as our cross platform approach. And we have learnt many things along the way, some of them were the old approach of Static Library, the API definition and how the code structure and the API design of Xamarin and iOS are somehow different.

We have quite a big codebase (more than 100 thousand lines of code) in iOS and Android in native, mainly because we deal mostly with Video Processing and some native features. We use frameworks a lot to share code between different apps. I have been looking for ways to port the code from iOS to Android in a smooth and cost saving way.

There are multiple steps that I plan to go through when adapting Cross Platform:

– Same or similar architecture between iOS and Android codebase

– Prepare the library in correct format to be reused in the Cross Platform

– Prepare the Binding

– Prepare the team with C# knowledge to migrate the codebase

– Design the module and how best the app will be separated between Shared Module and iOS Module

Experience, bad and good

Just congratulated my 26th birthday. I have got 6 years of working experience under my belt, but now I always have a big question: Am I 6 years more experience than my 20 years old, or just 1 year of experience repeated 5 times. And do I have a 6 years of shit assumption, bad software, customer and internal development practice. Sometimes, it is hard to tell huh :)) A reflection of what I became after 6 years is truly crucial. When I was in university, I saw myself as a software architecture or a computer science researcher. However, working my first job opens my eyes about the startup world, the comfort zone, the up and down of a software startup. This, together with the realization that I am not a good fit for an academic research role, changes my career path. It shows an important lesson for me that it would always be good to set out a plan, try your best and willing to adapt or change to a new environment for a new challenge

The good thing about the IT career is that it is always changing fast.  Experience can become old, like my iOS 3 and 4 experience would not be used any more. Even experience with iOS5 and 6 can become obsolete soon. New thing like Swift can change the landscape fast.

Unfortunately, it can become hard for me when I need to manage people or develop a program. It might be a lot easier for me to give a clear guidance to others based on my old experience and people will just follow and do that quickly. But then, they won’t be able to find out a new way of doing that thing. People surprised me all the time about their different way of thinking, which reminds me to be humble and patient to listen to their idea

The Generalist and Specialist Approach

Learning is a lifelong and continuous process in anyone’s career. A common question from the newbie and the college students is what areas they should focus their efforts on to move fast. I share the same feeling with their ambition to go fast and change the world. However, in my opinion, the first few years of college and career should be on learning their most favourite subjects. It is fine to not earn much money at first as long as you are building up your background.

Choosing the first job

Some people would claim that the first internship and job is the most crucial one in his career. This was far from the truth. A career is a 40-50 year (yes, they are extending retirement age to 70) marathon which allows you to make a few mistakes here and there and still achieve the greatness. The key strategy is to always move forward, always expand beyond your comfort zone. I would encourage new students to try different career paths if they are still unsure about what they want: the startup life, the small and medium enterprise and the multinational companies. These offer different skills and experience to people.

The learning curve

To learn some fundamental concepts about a new topic does not take much amount of time.  The pareto principle (The Pareto Principle states that 80% of outcomes come from 20% of causes.) on learning new concept would say you will understand and know 80% of a subject by spending 20% of the time. This part of 80% will not qualify you as a great specialist in the area, but it is enough for you to apply it in your current speciality.

A good example would be that a developer learns about UI/UX development. The first few hundreds of hours of learning and applying it will not make him a UX specialist, but that would be enough for him to apply it into his software development. This will guarantee that the UI/UX of his app/website would be at least at an acceptable level.

Work to learn or work to earn money?

A very important concept for newbie is to know their value, or to put a dollar amount into his work. The one who would say he can work for me for free will not make me impressed. The one who would say that his salary would be a specific amount of A $ because of these reasons, will be the one I feel good about. He would show me that he spends a significant amount of time to research about different companies, about my company to know how much his contribution is worth. He would still have to seek for learning and improving himself over the future period of time, and it would be good for him to show me that plan and how he would stick to it.

The altitude is always valuable for most employers, but you better show that you have the knowledge and skills to make that altitude become valuable.

Dealing with customers

Written Contract

Written Contract

Dealing with customers is always a hard topic. This blog post will not summarise some of my experience before working for my current company. Communication with customers require both art and discipline to make sure that nothing could possibly go wrong. Here is a quick list of errors I have been making throughout my working life. :

– Not thinking through each of the small details the customers may want to add later.

For example, if the customers want his websites to work on mobile device, it would be wrong to assume that he meant iPhone. 

– Don’t have a specific, fixed requirement document.

It could go wrong if both sides did not agree on a specific set of requirement before the project starts. I think I may need to understand more about Agile development

Agree on a verbal basic: this is one of the hard lesson that I learnt when working outsourcing. Everything needs to be at least written and agreed on the email and not just chat or voice call.

Not thinking through small details

This is what is hard with software estimation when all the devils are in the details. When customers say they want their app to work on iphone, they really think of all iphone versions, and they probably assume that it works on android as well unless you tell them. It is good to be clear upfront and think through all cases.

Another example is that customer do not understand how important security is, and they just want it to work. But while they are testing, they may find the security issue and blame us all for bad practice of coding and testing.

Don’t have a specific, fixed requirement document.

Customers may want us to change the graphics 2 to 3 times and that are lots of back and froth emails and demonstration with the client. It will also extend the deadline of the project as we may need to wait for them most of the time.

Agree on a verbal basic

Everything should be at least in a written form. This was the key lesson I learnt during the early days of doing business. Everything needs to be agreed again over email. Even if you trust someone, or have a good memory, it is important to remind both of us what we said. It could be as simple as the client wanted to change the graphics and then later on, they completely forgot. It would be troublesome if clients wanted to change the requirement, then to extend deadline and the budget but they regretted it later. A written document would be helpful, or at least an email. I am not a lawyer but I found this book (22 Legal Mistakes you don’t need to make) helpful for new people.

When you write something down and let the other side read through it once, you can confirm that both sides share the same idea and clear all the miscommunication. This proves to be effective when you work on project requirement.

What is your tip? Please share it in the comment.


Time Management for Software Project

Time, quality and cost

 The basic of project management is a balance between time, quality and cost. Pick 2 of them. And then we start discussing about how to estimate the time when we have fixed the quality and cost (just kidding, you can pick quality and time as well).


Time Cost Quality

Time Cost Quality – Pick 2

 In projects I have done over last 5 years, each always contains lots of unknown and challenges, as I have worked in most of the latest technology and sometimes I come to new project without any experience

 Main problems in estimating projects can be listed as below:

   – Miscommunication

   – Overestimate the team competency

   – Task breakdown not done carefully.

   – Underestimate integration between models

   – Technical unknown

   – Requirement changes


This normally happens with outsourcing companies or when teams are spread between different locations. When I chat with clients or teammates, people are lazy to chat so they tend to chat short. It leads to lots of assumptions and miscommunications between people. Voice chat on skype suck energy really fast, and require both sides to communicate synchronously. It could be the miscommunication between clients and your teams or inside your team. You definitely don’t want after 3 months, you come back and the clients’ feeling is like the figure below….


Well, a famous and familiar figure huh?

Overestimate team competency

I pick my team members really hard, and I also have strong belief in my people. That is why I overestimate my team member most of the time. Belief and overestimate should be separated from each other. “Keep a cold mind and a warm heart”. That means you should keep a strong feeling in your members and encourage them to do a good work, but when evaluate them for specific project, be careful to estimate.

Task breakdown & integration

These are the 2 most underestimated when managing any projects. It is easy to look at the whole and say that it would take 3 days to finish all of them. However, if you actually break it down, and allow time for writing the code, debugging, testing and fixing bugs again,the total time could be 10 days. Oh, I forgot to mention about integrating between tasks or modules. Sometimes, we assume that if task A is done, and task B is done, combining them would be easy. Poor us, it is not usually the case. The combination between module A and module B can generate a whole new level of bugs that need fixing. The bug may only happen due to specific conditions of module A and B. It is important to run lots of tests and allocate debugging time for this phase, as shown in the following figure.

Work Breadown Structure

Work Breadown Structure

Technical Unknown

The risk level of the project depends on how many unknown stuff in your project. Some of them is that the requirement is unclear, or the technical solution is not yet known or implemented by any people in the team. It requires an expert with sharp eye to know which areas are unknown and needs to allocate time for it. The problem is people don’t know what is unknown…

One cool example that strikes me a lot is how Video Player is implemented in iOS and Android. In iOS, seeking to any arbitrary frame is a piece of cake, and I assume a well-designed framework like Android would be the same. I was totally wrong. It took me 2 months to search through many different solutions and approaches to figure how to do it in the correct way.

Only when you really get into coding, you can really know which part is challenging.

How to deal with changes

Another problem is customer change their requirement based on what you demonstrate them. An Agile approach normally helps by clearing any customers’ assumptions as soon as possible and not let them wait until the finished product. By receiving early feedback, we can constantly change the products.

1 problem of the Agile approach is that customers keep changing their minds way too often. There is 1 point that we really need to lock the requirement no matter what the customers want. Striking a balance between these issues may keep customers happy and our project budget and timeline in a good shape.