Handling roadblocks in a project

When you hit a roadblock in a project what do you do? The correct answer is not “panic!”. The correct answer is “keep calm and carry on”. I have highlighted some steps that you can take to mitigate the impact of a roadblock.

Handling Project Roadblocks

Handling Project Roadblocks

As much as I would like to take credit for the above methodology, I cannot. Credit goes to ‘Ali Mehdi‘ for describing the steps.

Handling delays in a project

Here are some strategies for handling delays in a project. You can read about them in my earlier blog as well.

Handling Delays in a Project

Handling Delays in a Project

Qualities of a good manager

I had written a brief blog about the qualities of a good manager that can be viewed here. I am including a picture here to illustrate the point.

Qualities of a good manager

Qualities of a good manager

A picture is worth a thousand words

When building a new team, a number of factors have to be taken into account. These can be summarized in a visual called a ‘team canvas’ , as seen below.

Team Canvas

Why was the team formed? Define the purpose of the team in the center. List some of the values you want this team to have. Next, define the people and the roles that will make up this team. Follow that with some common goals that the team comes up with.

Ask the team to write their strenghts and areas of improvements. The team will need some tools to get their job done, list those under ‘needs and expectations’. Set some boundaries with rules and activities. For personal growth figure out what each team members wants to accomplish and list those in ‘personal goals’ section.

Creating a team canvas will help create structure for the team. It will give others an overview of the team, and it will also help in keeping the team headed in the right direction.

How to get things done

As a manager I am expected to “get things done”. I use Agile Scrum or Agile Kanban to plan out my execution when it comes to ensuring that my team is planning and executing at it’s best. I also follow a strategy by David Allen called “Getting Things Done®” in which he outlines the following strategy that will enable execution.

Getting Things Done

Getting Things Done

I ‘capture’ the list of things to do for my team in a product backlog. I then go through the backlog and ‘clarify’ the items in it to ensure that they are actionable. Avoiding vague terms such as “improve speed of web application”, I replace them with more specific terms such as “web app has latency of  ‘X’ ms, instead it should have latency of ‘Y’ ms.

Following that I ‘organize’ the backlog by priority and move items  in a given sprint or release into the ‘To Do’ swimlane in Kanban at the begining of the sprint or release. I either have daily stand-ups or weekly standups to ‘reflect’ on the progress of the work that I have ‘engaged’ in.

There are of course other strategies of execution as well. Dr. Stephen Covey has written ‘7 Habits of Highly Effective People’ which can help in improving personal execution. Tony Buzan has written about ‘Mind Mapping’ as a technique for unlocking our brains potential. Nick Cernis also has written about ‘todoodlist’ which is another way of organization to improve execution.

Stakeholders in Project Management

Managing people, process and technology is essential to be a successful project management. Stakeholder management falls under the ‘people’ management category.

According to PMBOK “A stakeholder is an individual, group, or organization who may affect, be affected by or perceive itself to be affected by a decision, activity, or outcome of a project.””

Without stakeholders active participation a project is likely to fail. A project manager should identify stakeholders and manage the relationship with them.  Figure 1 shows some of the stakeholders that a project manager may have to deal with.

 

Project Stakeholders

Project Stakeholders

As an SRE manager, I have add to play the role of a technical project manager (TPM) in projects where a TPM was not available. Identifying stakeholders can be tricky, since in large projects one may not be aware of all the potential stakeholders. Stakeholder identification can take place when the project charter is being defined.  This will help flush out the major stakeholders. However, it is not uncommon to find new stakeholder(s) throughout the implementation of the project. A project with unhappy stakeholders does not bode well for the success criteria of the project.  Stakeholders influence can be expressed in the power/interest model as shown in Figure 2.

Sketch004

Figure 2

The division of stakeholders in the categories of ‘keep satisfied’, ‘manage closely’, ‘monitor’ and ‘keep informed’ is the role of the project manager.  Stakeholders with low interest and low power require the least comparitive effort in terms of management, on the other hand stakeholders in the high power and high interest should be handled with utmost care.

The importance of stakeholders cannot be overestimated. For instance if you ignore sales as a stakeholder, you may end up with a product that the sales team has no knowledge of in terms of sales strategy.

My Netflix recommendations

I was taking an account of the shows on Netflix I have enjoyed over the past four years, and I thought I would share that with y’all.  What shows do you enjoy on Netflix?

  • Black Mirror
  • Planet Earth
  • Glitch
  • Ozark
  • Mindhunter
  • Marvel’s the Punisher
  • Marvel’s Jessica Jones
  • Marvel’s The Defenders
  • Marvel’s Iron Fist
  • Marvel’s Luke Cage
  • Marvel’s Daredevil
  • Arrow
  • White Collar
  • Sherlock
  • Breaking Bad
  • The Last Kingdom
  • The Walking Dead
  • Narcos
  • Into the Badlands
  • Archer
  • Supernatural
  • My Name is Earl
  • Better Call Saul

How to create a Docker base image

Here is a compelete set of instructions to create your own Docker base image. Docker base images are the first layer in a Docker image. There are plenty of base images available, however you can create your own if you like as well.

First, install debootstrap package on any given Ubuntu host.

# apt-get install debootstrap -y

Next, install docker.

# apt-get install docker.io -y

Next, download Ubuntu.

# debootstrap ubuntu-suite-name directory-name-to-download-to > /dev/null

Example for 16.04: debootstrap xenial xenial > /dev/null
You can get a list of Ubunutu suite names from https://wiki.ubuntu.com/DevelopmentCodeNames
Now you can import the Xenial directory into Docker as an image.

# tar -C xenial -c . | docker import - xenial

That’s it to create an image and store it locally, you can verify the image using ‘docker images’.
If you want to run a container using the image try ‘docker run -it xenial /bin/bash’. This should run a BASH shell in the container and give you a BASH command prompt.

Next, if you want to push this to your Docker hub registry, try the below steps:

# docker login -u your-docker-hub-username
# docker tag image-id-that-you-got-from-docker-images-cmd your-docker-hub-username/ubuntu:16.04
  Example for Xenial or Ubuntu 16.04: docker tag s3489dk349d0 syedaali/unbuntu:16.04
# docker push syedaali/unbuntu

To verify, visit in your browser hub.docker.com, login and check to make sure the image is present.
Alternatively you can run ‘docker search syedaali’ and it will show you the images that I own. Replace my username with yours of course.

Understanding Inodes

Understanding inodes is crucial to understanding Unix filesystems. Files contain data and metadata. Metadata is information about the file. Metadata is stored in an inode. The contents of an inode are:

  1. Inode Number
  2. Uid
  3. Gid
  4. Size
  5. Atime
  6. Mtime
  7. Ctime
  8. Blocksize
  9. Mode
  10. Number of links
  11. ACLs

Inodes are usually 256 bytes in size. Filenames are not stored in inodes, instead they are stored in the data portion of a directory. Usually filenames are stored in a linear manner, that is why searching for a filename can take a long time. Ext4 and XFS use more efficient Btrees to store filenames in directories, this allows for constant lookup times instead of linear lookup times.

Dentry is short for directory entry and is used to keep track of inode and filename information in a directory.

An inode can contain direct or indirect points to blocks of data for a given file. Direct block means that the inode contains the block number of a block that contains the actual file data. Indirect block means that the inode contains the block number of a block that then contains further block numbers to read data from.

Ext filesystem creates a fixed number of inodes when the filesystem is formatted. If you run out of inodes you have to format the filesystem. XFS does not contain a fixed number of inodes, they are created on demand.

When you delete a file the unlink() system call removes the directory entry for the inode and marks it available. The data blocks themselves are not deleted.

The number of links to a file is maintained in an inode. Each time a hard link is created the number of links increases. Soft links do not increase the number of links to a file or directory.

Superblock contains metadata about a filesystem. A filesystem typically stores many copies of a superblock in case one of them gets damaged. Some of the information in a superblock is:

– Filesystem size
– Block size
– Empty and filled blocks
– Size and location of inode table
– Disk block map

You can read superblock information using the command ‘dumpe2fs /dev/mount | grep -i superblock’.

Updating your GitHub.com Fork

Github.com hosts a large number of open source repositories. You can often fork these repositories, however keeping the fork updated with the master can be challenging. Here are some steps you can do to update your fork with the master. The below assumes you are in your local fork directory. Also, the branch from the master is called ‘develop’, if it is something else, then use that branch name instead of ‘develop’. I am using the SaltStack repo as an example.

$ git remote -v
$ git remote add upstream https://github.com/saltstack/salt
$ git remote -v
$ git fetch upstream
$ git checkout develop
$ git merge upstream/develop
$ git push