Thứ Sáu, 12 tháng 5, 2017

Software Developer’s Guide to Being an Effective Leader

This is the power and responsibility of an effective leader.
An effective leader—one who takes extreme ownership, as Willink suggests—is not only able to make their team succeed, but leaves such an impact on their team that even when they are replaced the team is still a winner.
This post is all about how to become that kind of leader.
The kind of leader who so inspires, motivates, and pushes their team that success is all but guaranteed.
Not the kind of leader who is simply given a title of “leader,” but one who doesn’t need a formal designation of authority to command respect, foster cooperation, and inspire the best performance possible.

What Is Leadership?

Let’s start off by talking about what exactly leadership is.
Leadership is not a title or a position you are placed in.
Leadership is something you do and exemplify. You can be told that you are the leader. You can be given the official title. You can be put in charge of a team. But no one, no one, can make you a leader. You have to do that yourself. You have to own it.
Leadership is all about getting people to follow you into your vision of the future, to go the direction you are going, to follow the path you have set out.
That means you have to walk the path first. Leadership is about being in front, not pushing from behind. No job title, no official designation, no mandate from on high can make you a leader, because compliance is not the goal. Buy-in—full support—is.
You can temporarily control someone’s actions with force or authority, but leadership seeks to win their hearts and minds, and in turn, inspire loyalty rather than fear.

How to Lead Effectively

There is only one way to lead effectively, and that is by example.
The best leaders do what they ask of their team first.
They are willing to sacrifice and go the extra mile to pave the way for the people they are trying to lead. Even without an official title, you can lead people if you are willing to set an example for them to follow.
If you want your team to do test-driven development and write unit tests before they write any production code, don’t just tell them to do it, do it yourself first.
If you want your team to write better commit messages when they check code into source control, you better be doing it first, and be doing a damn good job of it.
Want your team to treat each other with respect, avoid arguments, and cooperate?
You should know what to do by now.
Often times, leading by example means doing jobs that are “beneath you.”
Too many “leaders” want to sit in their ivory towers and command their troops from above. To be a true leader who leads by example, you have to be willing to get on the front lines and lead from the battlefield. Take on some of the difficult and boring tasks that no one wants to do on your team. Show them the kind of quality you can bring to even the most monotonous task.

Lead in All Areas

A good leader is someone you look up to in multiple areas, not just their main discipline.
What I mean by this is that it’s great that you are an excellent programmer and that you can write the cleanest code anyone has ever seen, but that is just one area in which you must lead.
You should lead in every area you want your team to follow.
Do you want your team to have a good work ethic? To be motivated? Develop good communication and soft skills? You’ve got to be exemplifying your best in each of the areas you want your team to excel at. If you want to know the behavior and habits of a team, you have to look no further than their leader.
Teams tend to take on many of the traits of their leader, especially over time.
So, if you are constantly late for work, take long lunches, and spend a good amount of time surfing the internet instead of working, you can expect your team members to do the same.
If you don’t treat people professionally, make crude jokes, and frequently get into arguments or grumble and complain about your higher ups, you should expect that same kind of behavior from your team.
As a leader, you must…

Hold Yourself to a Higher Level of Accountability

This means that whatever you expect your team to do, you have to expect that same thing from yourself and more.
I consider my role at Simple Programmer, and especially my YouTube channel to be one of leadership. I want to inspire and lead people to perform and do their best. I want to teach people how to reach their true potential and to never give up, no matter how difficult things get. So, what do I do?
I set standards for myself far higher than what is expected and far beyond the goals I am trying to inspire people to reach.
I hold myself to an exceptionally high level of accountability. On the work side, I work in a focused and diligent manner and I never, ever give up. I try to get more work done in a week than most people think is humanly possible. On a given week, I produce several blog posts, 18 YouTube videos, several podcasts, and do plenty of other work.
If I’m going to ask you to do something, I’m going to not only have done it, but have done the 10x more difficult version of it. If I ask you to run a mile, I’m going to run 10 first.
If you want to lead people, don’t just lead them by example. Truly inspire them by showing them what is possible by going the extra mile––or 10.
Think about the best leaders you have known. Think about the people who inspired you the most. Did they just do the minimum, or did you feel like they did much more than they were asking you to do?
When supplies are low, a good leader gives his rations to his team, not because he is self-sacrificing and selfless, but because he wants them to see that even without food the battle can be fought and won. A good leader inspires people, because they think to themselves, “If he can do that, then surely I can do this.”

You Are Responsible for the Team

I've talked before about the idea that you should try and take as much responsibility for the team as possible. As a leader, this idea isn’t optional.
As a leader, you and you alone are responsible for the performance of the team.
As a leader, there is no one to blame but yourself.
To lead effectively, you must take full ownership for your team and everything your team does.
You cannot pass the buck or play the blame game. The blame is always yours. If your team fails, it is your fault and your fault alone. You will lead and inspire the team much more effectively when they know that they have 100 percent freedom to do what you are asking them to do, because you will hold yourself responsible for the outcome.
That doesn’t mean that team members don’t screw up. It doesn’t mean that team members can’t throw a wrench in your plans, or even completely foul them up, but it does mean that when that happens, it’s still your fault and your responsibility.
It’s your fault, because you could have trained that team member better.
It’s your fault, because you could have made sure that team member better understood and bought into the plan.
It’s your fault, because if you did all those things and you knew that team member still wasn’t on board, you could have kicked them off board officially and removed them from the team.
Remember, your most important job as the leader of a team is to make as many people around you as successful as possible.
You have to take responsibility, not only for your own mistakes, but for the mistakes made by everyone else on your team.
A good leader is responsible when things go wrong, but gives all the credit to the team when success is achieved.

Trust Your Team, Delegate

Even the best leaders can only do so much by themselves. Some leaders recognize they are ultimately responsible for the team, so their response is to simply do everything themselves. They figure if they are responsible for it, they need to make sure it’s is done right, and the only way to do that is to do it themselves.
That kind of attitude creates a team which is completely dependent on the leader and can’t function on its own.
“How should we solve this problem?”
“I don’t know, we need to ask James.”
“Well, James is out to lunch.”
“Ok, guess we can’t do anything until he comes back.”
No. Wrong!
You don’t want that scenario to play out on your team, so you need to make sure you trust your team well enough to delegate tasks and responsibility for them, although you’ll still be ultimately accountable.
But how can I trust they’ll do it right?
You can never be 100 percent sure, but there are few things you can do to reduce the instances of screwups.
The first thing is to make your mission and your intent as clear and as simple as possible.
As long as the members of your team know what you are ultimately trying to accomplish and what is important—the overall vision—they can make decisions on their own on how to achieve those ends. The idea is to tell team members what the objective is without telling them how to do it, or making them run every little decision by you.
You can also have a clear operating procedure that anyone can follow to get certain types of tasks done. Flowcharts or checklists work extremely well here.
Currently at Simple Programmer, I have team members doing jobs that I thought only I could do. I decided that I would start documenting the process I used to do the task and decisions I had to make along the way and the reasons for making those decisions one way or another. Pretty soon, I had a process document that anyone could pick up and run with.
Now we have a Wiki with all of our processes and delegation is very easy.
And don’t forget training.
The first time you ask someone to do a task, even if the process is documented, there are likely going to be issues. That is ok.
Go over the work, tell them what mistakes to correct and why those are mistakes, and then have them correct them.
That’s the best way to do training.
If your team is aligned and understands the mission, has a process to follow, and is well trained, it’s not that difficult to trust them to get things done—even the things you think you could only do yourself.
To be an effective leader you have to be able to delegate. This fact becomes even more important as you rise up the ranks and lead larger and larger teams.
You will have to groom and train leaders who will lead their own teams, and you will have to put significant trust in them.
One word of caution, though.
There is a difference between delegation and abdication.
Delegating a task or responsibility means giving it to someone else to do, but still ultimately owning it and being responsible for it.
Abdicating means chucking it over the wall and saying “you handle it.”
Make sure that when you delegate tasks, you still take ownership for them and check over the results. Don’t just assume it will be done and done right and then think, “It’s not my fault, I assigned Bob to do it.”
Leadership doesn’t work that way.

Lead On!

As you can see, leadership isn’t exactly easy. To be a leader, you are going to have to make a number of sacrifices. Much will be expected from you.
But there is a certain reward and satisfaction in knowing that you have inspired people to be their greatest.
Being a leader is not for everyone, but if you do take on that burden—and honor—hopefully this post has equipped and prepared you just a little bit better to do it.

Copy from: https://dzone.com/articles/software-developers-guide-to-being-an-effective-le?edition=298053&utm_source=Daily%20Digest&utm_medium=email&utm_campaign=dd%202017-05-11

Thứ Năm, 4 tháng 5, 2017

Top 10 Benefits of Docker

Today, there is a buzz all around about containerization and Docker. What exactly is Docker and how it is related to containerization? What are the top benefits of using Docker? Why did it become so popular? And what are the statistics and successful case studies related to Docker? In this article, I will answer all these questions.

What is Docker & How is it Related to Containerization 

Running applications in containers instead of virtual machines is gaining momentum in the IT world. The technology is considered to be one of the fastest growing in the recent history of the software industry. At its heart lies Docker, a platform that allows users to easily pack, distribute, and manage applications within containers. In other words, It is an open-source project that automates the deployment of applications inside software containers.
Docker really makes it easier to create, deploy, and run applications by using containers, and containers allow a developer to package up an application with all of the parts it needs, such as libraries and other dependencies, and ship it all out as one package. By doing so, the developer can be assured that the application will run on any other Linux machine regardless of any customized settings that machine might have that could differ from the machine used for writing and testing the code.

Docker Statistics & Facts

  • 2/3 of companies that try using Docker, adopt it. Most companies who will adopt have already done so within 30 days of initial production usage, and almost all the remaining adopters convert within 60 days.
  • Docker adoption is up 30% in the last year.
  • Adopters multiply their containers by five. Docker adopters approximately quintuple the average number of running containers they have in production between their first and tenth month of usage.
  • PHP, Ruby, Java, and Node are the main programming frameworks used in containers.

Popularity & Benefits of Using Docker

Why do large companies like ING, Paypal, ADP, and Spotify keep using Docker? Why is Docker adoption growing that fast? Let’s cover the top advantages of docker to better understand it. 

Return on Investment and Cost Savings 

The first advantage of using docker is ROI. The biggest driver of most management decisions when selecting a new product is the return on investment. The more a solution can drive down costs while raising profits, the better a solution it is, especially for large, established companies, which need to generate steady revenue over the long term.
In this sense, Docker can help facilitate this type of savings by dramatically reducing infrastructure resources. The nature of Docker is that fewer resources are necessary to run the same application. Because of the reduced infrastructure requirements Docker has, organizations are able to save on everything from server costs to the employees needed to maintain them. Docker allows engineering teams to be smaller and more effective.

Standardization and Productivity

Docker containers ensure consistency across multiple development and release cycles, standardizing your environment. One of the biggest advantages to a Docker-based architecture is actually standardization. Docker provides repeatable development, build, test, and production environments. Standardizing service infrastructure across the entire pipeline allows every team member to work in a production parity environment. By doing this, engineers are more equipped to efficiently analyze and fix bugs within the application. This reduces the amount of time wasted on defects and increases the amount of time available for feature development.
As we mentioned, Docker containers allow you to commit changes to your Docker images and version control them. For example, if you perform a component upgrade that breaks your whole environment, it is very easy to rollback to a previous version of your Docker image. This whole process can be tested in a few minutes. Docker is fast, allowing you to quickly make replications and achieve redundancy. Also, launching Docker images is as fast as running a machine process.

CI Efficiency

Docker enables you to build a container image and use that same image across every step of the deployment process. A huge benefit of this is the ability to separate non-dependent steps and run them in parallel. The length of time it takes from build to production can be sped up notably. 

Compatibility and Maintainability

Eliminate the “it works on my machine” problem once and for all. One of the benefits that the entire team will appreciate is parity. Parity, in terms of Docker, means that your images run the same no matter which server or whose laptop they are running on. For your developers, this means less time spent setting up environments, debugging environment-specific issues, and a more portable and easy-to-set-up codebase. Parity also means your production infrastructure will be more reliable and easier to maintain.

Simplicity and Faster Configurations

One of the key benefits of Docker is the way it simplifies matters. Users can take their own configuration, put it into code, and deploy it without any problems. As Docker can be used in a wide variety of environments, the requirements of the infrastructure are no longer linked with the environment of the application.

Rapid Deployment

Docker manages to reduce deployment to seconds. This is due to the fact that it creates a container for every process and does not boot an OS. Data can be created and destroyed without worry that the cost to bring it up again would be higher than what is affordable.

Continuous Deployment and Testing

Docker ensures consistent environments from development to production. Docker containers are configured to maintain all configurations and dependencies internally; you can use the same container from development to production making sure there are no discrepancies or manual intervention.
If you need to perform an upgrade during a product’s release cycle, you can easily make the necessary changes to Docker containers, test them, and implement the same changes to your existing containers. This sort of flexibility is another key advantage of using Docker. Docker really allows you to build, test, and release images that can be deployed across multiple servers. Even if a new security patch is available, the process remains the same. You can apply the patch, test it, and release it to production.

Multi-Cloud Platforms

One of Docker’s greatest benefits is portability. Over last few years, all major cloud computing providers, including Amazon Web Services (AWS) and Google Compute Platform (GCP), have embraced Docker’s availability and added individual support. Docker containers can be run inside an Amazon EC2 instance, Google Compute Engine instance, Rackspace server, or VirtualBox, provided that the host OS supports Docker. If this is the case, a container running on an Amazon EC2 instance can easily be ported between environments, for example to VirtualBox, achieving similar consistency and functionality. Also, Docker works very well with other providers like Microsoft Azure, and OpenStack, and can be used with various configuration managers like Chef, Puppet, and Ansible, etc.

Isolation

Docker ensures your applications and resources are isolated and segregated. Docker makes sure each container has its own resources that are isolated from other containers. You can have various containers for separate applications running completely different stacks. Docker helps you ensure clean app removal since each application runs on its own container. If you no longer need an application, you can simply delete its container. It won’t leave any temporary or configuration files on your host OS. 
On top of these benefits, Docker also ensures that each application only uses resources that have been assigned to them. A particular application won’t use all of your available resources, which would normally lead to performance degradation or complete downtime for other applications.

Security

The last of these benefits of using docker is security. From a security point of view, Docker ensures that applications that are running on containers are completely segregated and isolated from each other, granting you complete control over traffic flow and management. No Docker container can look into processes running inside another container. From an architectural point of view, each container gets its own set of resources ranging from processing to network stacks.

Docker Success Stories 

Let’s look at success stories of well-known companies who implemented Docker and are very happy about it.

ADP

ADP is one of those companies that keep using Docker to better manage their application infrastructure. ADP is the largest global provider of cloud-based human resources services. From payroll to benefits, ADP handles HR for more than 600,000 clients, which caused a challenge in terms of security and scalability.
To solve the security issue, ADP uses Docker Datacenter. Docker Content Trust enables their IT ops team to sign images and ensure that only signed binary will run in production. They also perform automated container scanning. Using multiple Docker Trusted Registries enables them to build a progressive trust workflow for their applications development process.
To solve the scalability issue, the company relies on Universal Control Plane/Swarm. Swarm gives their team the ability to first start small and have each application made up of many small Docker engine swarms instead of one swarm per application. Then the swarms will merge over time, becoming larger and, in the end, each application will have its own swarm. One day, a swarm could potentially span across public and private infrastructure and across applications. This will enable the business to make the best financial decision for the company. With Docker containers, ADP plans to containerize the most dynamic parts of their applications first making it easier to change and re-deploy them moving forward, while leaving the other areas of the application for a later time. Containerizing with Docker enables ADP to have a hybrid strategy. They will have a mix of big and small containers for any application, which creates an evolutionary path forward to micro services
The vision and goal of ADP is to get to microservices, but the reality is that no company will get there overnight. Not all applications will be refactored at the same rate and the platform needs to be flexible to accommodate a variety of application architectures. Now, by slowly isolating services into separate containers, ADP is able to slowly grow into a microservices architecture using Docker, rather than doing it all overnight.

Spotify

A digital music service with millions of users, Spotify is running a microservices architecture with as many as 300 servers for every engineer on staff.  The biggest pain point Spotify experienced managing such a large number of microservices was the deployment pipeline. With Docker, Spotify was able to pass the same container all the way through their CI/CD pipeline. 
From build to test to production, they were able to ensure that the container that passed the build and test process was the exact same container that was in production.
Now the company can guarantee that all of their services remain up and running, providing a great user experience for their customers. They also built a new platform called Helios based on Docker containers to deploy their containers across their entire fleet or servers and maintain their development ecosystem.

ING

As one of the top ten financial services companies in the world, ING operates on a global scale. The IT organization in the Netherlands alone comprised of 1,800 people created unique challenges of coordinating change across large groups of people, processes, and technology and it led to poor quality software.
Now, ING is able to move faster with their CD pipeline running in Docker containers. Key areas accelerated are provisioning build servers, provisioning and publishing tests, deployment automation, and in the functional integration testing environment across their 180 teams. Additionally, the increasing levels of automation were starting to strain their infrastructure resources and Docker helped to greatly reduce that utilization and ultimately hard costs, especially within some of their biggest development efforts.
As a conclusion, I want to say that Docker containers share their operating system so they run as isolated processes regardless of the host operating system. As Docker proudly admits, this means that its containers can "run on any computer, on any infrastructure, and in any cloud." The portability, flexibility, and simplicity that this enables is a key reason why Docker has been able to generate such strong momentum. We are big fans of using Docker at Apiumhub and we believe that it will continue growing.

Source: https://dzone.com/articles/top-10-benefits-of-using-docker?edition=293883&utm_source=weekly%20digest&utm_medium=email&utm_campaign=wd%202017-05-04