Tools

Have been using vSphere extensively over the years and we finally started using vCenter to manage all the hosts. I am happy but not excited, not because it is bad but I just don't feel the craftsmanship.

I use a lot of tools at work and I picked what to use all with a reason. Lately, I spend a lot of time in configuration management and Puppet is what I am using. A similar offering by VMWare is the Orchestrator.

With both tools on hand, why would I prefer learning Puppet than Orchestrator? Probably comes down to,

Openness
I am not confining myself to a particular stack of technology, I can use Puppet to manage instance virtualizing on whatever platform.

User base
I can pick up a lot of resources on this tool since this is so common.

Best of breed
Puppet focus on what it do best and rely on (or people find a way to) other tools to fulfill the other needs. For instance, we are using GIT to manage all the .pp files versioning, access control by PKI, etc. While for Orchestrator, it is taking care all by itself. If vSphere is the only tools we use, this will not be a problem but we are not.

By the same token, this explain why I would use New Relic, Zabbix, Jenkins and Nexus instead of vFabric.


Think, before you ask.

We encounter questions more than answer and we would love to get the questions offload from our ship as soon as possible.

So we either do it ourselves, or ask others to do that for you, partially or in whole. And since we have so much to achieve and thus, a natural tendency is to ask the help from others.

The intent itself is fine but think about the last question you have asked. Is it along the line of "Something doesn't work" or "The app is so slow".

The question I am being asked most by the developer is, "Ronnie, I clicked the link bit it doesn't work". The second runner-up is, "The site is slow, why is it?"

These are very open ended question and lots of possibilities. But one thing in common is how one (or I) can start investigating it on - log reading. But people are just lazy and would rather get an answer straight from someone, instead of figuring it out themselves.

They can get the answer quick, but traded off from learning. Every single incident is a chance to learn, you pass it over to someone (or me) just meant giving up the opportunity to learn. You forgot what you've been told very easily but remember life long if you worked this out yourself. So next time, think before you ask.

Why do estimation always wrong?

It's been asked by every boss or project manager. Everyone got their own version but mine is always like,

- too religious towards the end date
- over estimate the efficiency
- a tendency to accept excessive risks

When a new project started, the first thing being asked (or told) is, "When could it complete?'" or "We must finish by bla bla bla.".

In the first scenario, even though the end date is not pre-defined but the project owner usually already got something in mind. Thus, the end date looks flexible but not really that flexible. Whenever the team comes back with a date later then his desire, the usual and only response is "Finding more people to do it"!

Instead of spending time to discuss on what the risk are, "solutions" are being put forward right away. The outcome? Pitfall is being skimmed through.

Another common management principal is, parallelism. Can we work in parallel? Could a task breaks further down? It could work, but only if the team is well balanced. When the project demands a particular skillset which only a single entity can fulfill, asking him to context switch and leverage the resources will not shorten the development time. Also, there's an overhead on communication, which if not managed properly, can result in tasks undone.

When we do estimation, we are always ignoring the fact that we are not as efficient as we want to be. Able to spend 70% on the project is already very efficient. Take myself as an example, I am spending 50% of my time helping to team to resolve projects issues, 20% on daily matters (like development and operation daily issues). But I am still assigning tasks to myself which leaves out to at most 30% of my available time.

Are there solutions? There is, but takes time to practice, which I am still working hard on.

Be persistent. Don't give it up or rush out for a decisoin even when we are pressed. There are not as many "life-or-death" issues. When we need to labor a baby, there's no short cut but 9 months of pregnancy.

Be realistic. If we can only afford 30% of work hours, stick with that. Don't try to fool yourself, or your project manager that the week after will be better.

I don't know about you but to me, family and health is more important than work. Save your late night and weekend, you've got a life project to fulfill which don't stand a second chance.

Burn out

"Can you try getting this to work? The biz user need this for bla bla bla"

"I know it is a last minute thing but we definitely need to have this in the next day"

Sounds familiar? Each of this stands a business value for sure (assuming they are making sensible judgement) but the fulfillment for each of this means "something" is taken away from your team.

If you have some gaming experience, you should be familiar with the magical skill, or that fatal stunt attack. They are powerful but also in limited quantity.

The "something" I refer to in the earlier paragraph works in the same way. We do the stunt and penalized a bit. When we are doing it repeatedly, we burnt out. And the sad thing is, it is very difficult to get recovered.

Unlike the fantasy world, where portions in different color could help to regain the magical point. In reality, we need both time and courages to recover. We need plenty of time to rest, to rebuild the interest in the project and to plan out the to-do. We need courages since the deliverable we are going to deal with is very likely to be broken - another penalty in doing last minute stunt.

What makes it even more difficult is, both ingredients needed are usually taken away to fire fight the instability of the system.

So your best bet is to try finding some additional resource, to start off from scratch or to find a pair of new legs to do the job.

We need to be both specialist and generalist

Dynamic is one of the nature of Agile - priority varies as needed, team member can take up different kind of tasks as the project sees fit. And to achieve this, everyone should possess a wide range of skills so that they are able to cover up one another.

For instance, during the initial stage where most of the time are spent on design, env setup, etc. This demand the team to functions like an architectural and engineering team.

When the foundation is up, dev begins and the team is becoming a development factory. Coding becomes the number one thing.

When it is approaching launch date, everyone is focusing more on polishing the deliverable - intense testing, user training are the job of focus.

I agree that in each sprint, these tasks should all be covered. We need to design stuff before we can code and test but what I am trying to say is. The proportion of such work shall never be constant. It's natural to spend more time on design initially instead of towards the launch day.

And by doing so, this brings benefits to the next activities - debug and support.

In the old days, when team are focused in a single area and communicate with others through API. When things went wrong, the issue will need to pass from one team to the other. What makes it worst is, each team member will focus on a particular part of the system and not knowing the rest. Identifying the right person to ask and awaiting the reply becomes a challenge. It us not surprising when this has to be repeated for a number of times before the cause is found.

But in the agile team, if everyone is able to do go through the system and perform initial inspection. This enable a much better response time.

Also, by knowing how the system works, this enable the team to think through while they code. They can identify what is possible to happen more easily.

Sounds too good to be true. The drawback of this is the difficulty in finding the right person and the cost of hiring them. But if u have a team like that, you can move on and endeavor much flexibly.


Cultural Differences

Agile, scrum, are all principle to get the teams proceed in a steady pace, with great visibility. We plan on what to do in a fixed period of time and re-prioritize things as needed.

But have been running like 6 sprints and yet, we don't see the steadiness expected. Team is working long hours, feeling stressful, cannot deliver quality deliverable.

Come to think of it, I have noticed the following.

1. We keep adding things to the originally planned task lists.

2. We take dead line as DEADLINE

3. Admitting mistake is shameful

Being a Chinese, we are not good at saying 'No' and especially when the request is coming from the boss. It is not a common thing in telling the boss that something cannot be done.

And we are reluctant to change, and enduring an ever changing requirement is something not in our culture. Personally, I disagree to reject things just because we don't want to take changes. Pushing back should only because what's working on is of higher importance.

Also, asking for help is like raising excuses, we don't see it proper to postpone when a mutual consent has been established.

Lastly, admitting mistake is shameful. Cover up, denial or finding excuses is more common. But then, this results in inaccurate judgement, especially on determining task completion.

There are also some simple thing which differs between Chinese and westerner. We take lunch quite seriously, we rarely skip lunch, or do a quick one. Eating an apple as lunch is not our style.

Getting scrum or agile to work for Chinese might need to tweak a few things but the most important thing of all, is to make people understand the principle and follow it religiously.

Code change shouldn't be horrible

Was having a discussion with a developer and came across a topic about code change. Since he is very new in developing java stuff, now after getting thru the jungle for half a year. He looks back and realize many stupid implementation.

He then told me something he learnt from another developer, who has been writing code for some years that if code works, don't fix it.

I am quite surprised when he mention the rationale. It is the risk that the changes might break what works is inhibiting him from doing changes.

I can't help but "educating" this budding developer at the spot. With unit testing framework so widely available, there is no other reason but laziness or unrealistic timeline that no unit test is written.

Automated build and unit tests are so crucial that it should be conducted across the team as early as possible. Once it is in place, all code changes will need to endure through the bunch of test cases, before it is allowed to get into trunk. It is all the little test case that aggregates help us to build the confidence of code change.


Stress

Stress - the urge or tension that we felt. We usually feel the stress when we have deadline to meet, or task that has zero tolerance of getting wrong.

Working under these constrain firstly results in a highly focused and very efficient work mode. But when the period of tense is prolonged, it's not only efficiency drops, but also the motivation gets diminished.

That's why setting realistic schedule and priority is so important. But they are usually skipped or poorly done. Lack of time and over ambitious are usually the cause. Ambitious, desire to be a hero or simply don't want to be looked down as obstacle are what leads to un-realistic schedule.

Be honest to oneself, and also to the decision are keys to reduce the un-necessary stress. Get the whole team involved instead of taking it all over by oneself, there's nothing must be done by YOU.

WTF is "Devlosophy"

Developer, or engineer, is not any different from a skillful craftsman. They polish on the code they write, making sure it is robust and reliable.

And like any skillful worker, they possess their own set of tools to do their work. And what's more, they have their set of "standard" in defining what is good, or not.

Me as a veteran in the industry for years. I have also developed my own standard and working approach, towards fulfilling and leading the development.

And I sum this up as "Devlosophy" - the philosophy I believe in software development.