So, you’re building an application that will run on AWS. Or you are migrating one or more applications to the cloud. Perhaps you already have a growing number of systems running on AWS. The thing is, you are expanding your footprint on AWS and now you are hiring software engineers. You know that without the right talent, your AWS implementation won’t be a success.
What do you do? How do you identify an ideal candidate? Would any experienced software engineer be a good fit?
What you need is a good cloud engineer.
OK, but what is a cloud engineer?
A cloud engineer is a software engineer who also knows how to use cloud services effectively.
Cloud engineers know how to build software applications that use cloud infrastructure as well as services and tools available in the cloud. They know the pros and cons a cloud service brings to the specific software they are building. Once they find a good fit, they know how to use it. They are good at designing and writing code that interacts with cloud components.
For example, a good cloud engineer knows when and how to use Dynamo DB vs. S3 for the problem at hand, or when/if they should implement a particular service using AWS Lambda. They would know how to design and build applications that work well with Auto Scaling. They know how to use Identity and Access Management (IAM) features securely in their code and environments. They also know how to use the tools that complement a good AWS deployment (i.e. NewRelic, PagerDuty, StackDriver, Cloudability, Cloudyn, etc.)
For this article, I will focus on AWS.
Good cloud engineers…
First and foremost, are good software engineers
Software is still software - you still want people who are strong in problem solving, analytical skills, programming languages, data structures, system design and all that good stuff that you would always look for in a good software engineer.
Have a service-oriented mindset
They hate big, monolithic, inflexible applications that don’t scale. Their solutions identify common functions and boundaries within a system. They break-down big systems into sub-systems. But very importantly, they don’t over do it - instead they find a balance that doesn’t result in an unmanageable number of services.
Have an API-centric mindset
They know systems must interact with each other through Application Program Interfaces (APIs) and understand how to implement APIs effectively. They know APIs must be consistent within a system, they know how to use authentication and permissions effectively, they know how to make life easier for client applications that interact with APIs. They know they don’t have to reinvent the wheel when it comes to building APIs and know how to use existing tools and frameworks that make API development easier (such as AWS API Gateway).
Are pioneers…
New features and cloud products are released at a very high speed (AWS made 452 product announcements in 2015!) You need people who are comfortable working with technologies none of their peers have ever worked with. They will be the first ones to be blocked, experience bugs and find their way around those problems. Your ideal candidate won’t get scared by any of that - they will actually get excited about it and will implement good production grade solutions using new products in the cloud.
… but don’t get distracted by shiny objects
Pioneers also make good decisions. As soon as that new AWS product or feature is announced, they already know what to use it for and what NOT to use it for. They’re curious, but remain focused on your company and customers’ goals. In other words, they exercise good judgement and use new technologies with a clear purpose.
Know what’s going on in the cloud computing industry
I know, it’s hard to keep track of all the new announcements, but that’s just the way things are when it comes to the cloud. Good engineers show interest and they should at least have a general idea of what’s happening in AWS when they show up for that interview.
Automate the heck out of things
Using the cloud and not automating processes is an unforgivable waste. Good cloud engineers understand this and get frustrated by manual or repetitive tasks and have the initiative to automate them. Every time they see human intervention, they identify and implement ways to eliminate it. And of course, they know how to balance their automation efforts with project work.
Know (and care) about performance
They don’t think they will deploy software to the cloud and then AWS will magically scale infinitely and handle millions of requests per second. Running a fast application in AWS starts with good architecture design and good software implementation - and then it’s delivered by choosing and configuring the right AWS components. If any of these steps is not designed for high performance, then your customers will be frustrated by a slow application. A good cloud engineer knows all these factors and has experience building high performing applications in the AWS cloud.
Know (and care) about availability
Good cloud engineers design for failure. What does this mean? It means they ask “what will happen if this component goes down?” for all components in your architecture. They also do this at every stage in the application design and implementation. And then find ways to reduce or eliminate the impact to your customers when specific components go down. Good cloud engineers know that anything, at any point, can (and will) experience an outage. At the very least, cloud engineers should prioritize things such as using multiple Availability Zones, triggering EBS snapshots, doing cross-region replication for some services, load balancing and Auto Scaling.
Know (and care) about cost
Software engineers in today’s cloud computing world have access to infrastructure like they never did before. In the old days, they would get whatever server was available to them and deal with it - good luck with getting a bigger server. Today, a cloud engineer can provision 10 m4.2xlarge EC2 instances very easily, store any number of files of any size in any S3 storage class or get any number of provisioned IOPS in their EBS volumes. They can leave instances running forever or not care about choosing a cost-effective EC2 instance type. All of this is great for agility, but it’s also scary for cost management. Those choices will add up to thousands of dollars per year if they’re not made with good judgement.
Therefore, a good cloud engineer knows all factors that affect AWS pricing for the services they’re working with. For example, EC2 instance types, storage size (for EBS, S3, Glacier), storage types (EBS), storage classes (S3), compute time (in EC2 and Lambda), data transfers (i.e. out to the internet, inter-regional), data processed (for ELB), number of invocations (for Lambda), number of requests (for S3), provisioned capacity (for EBS provisioned IOPS, DynamoDB), price differences between AWS regions, etc.
Care about operations (a lot)
Good cloud engineers don’t develop software and forget about it. They know their software will run in production one day and it will have to perform well, not cost a fortune to operate and quickly recover from failure scenarios. They know someone will deal with that software during an outage (it could be them or not), so they must document the necessary details for colleagues to operate it.
Even though some organizations already have a good handle on DevOps, what I’m talking about is that engineers should visualize their code beyond their workstations and make it their mission that their software runs smoothly in production. They should be OK with being part of on-call rotations and get paged eventually. The most efficient development teams today are those that own the support of their software in Production.
And of course, AWS cloud engineers must know AWS!
Here are some key areas to look for:
Security + Identity and Access Management.
IAM is probably the most important service of all. Remember, when it comes to security AWS is a shared responsibility model and without good security nothing else in your application matters. AWS has great security mechanisms in place, but your team must know how to use them. Candidates should have solid knowledge and experience implementing AWS security best practices. They should be extremely familiar with Identity and Access Management (IAM) features such as Roles, Users, Groups, Policies, Federated Access and Multi-Factor Authentication.
Good candidates must have at least some basic hands-on experience with other security services, such as CloudTrail and Inspector.
Foundational AWS services.
There are many AWS services that have reached a mature state and that are the foundation of most cloud architectures. If a candidate doesn’t have good knowledge of these services, then they clearly haven’t worked enough with AWS: Elastic Compute Cloud (EC2), Virtual Private Cloud (VPC), Auto Scaling, Elastic Block Storage (EBS), Elastic Load Balancer (ELB) and S3. Anyone with good AWS experience knows inside out the process of launching EC2 instances, finding the right instance types, storage, network configurations, load balancing and Auto Scaling. S3 is also present in most cloud architectures.
There are other services that are used slightly less frequently in cloud architectures, but they might be essential for your application. Most experienced cloud engineers would have worked with them at some point: Relational Database Service (RDS), Elastic Container Service (ECS), Lambda, API Gateway, Dynamo DB, Elastic Map Reduce (EMR), Simple Workflow (SWF), Simple Queue Service (SQS), CloudFront and Route 53.
AWS Monitoring and Automation.
Good cloud engineers know how to use the right tools in AWS for automation, such as CloudWatch Alarms/Events/Actions/Logs/Subscriptions, Lambda functions, S3 events, Dynamo DB Streams, CloudFormation, Code Pipeline, Code Deploy, workflows, scripts, Auto Scaling, etc. They know how to glue those tools together.
Setting up and configuring AWS components.
For all AWS services your architecture is based on, your team must know how to set them up from scratch. Regarding configurations, a cloud engineer should know the main pricing and performance factors, advanced configurations, weaknesses and strengths of each configuration.
At the very least, know what ALL services in the AWS cloud do.
There are a LOT of AWS services and realistically, almost no one is an expert in all of them. But for ALL services in AWS, a good cloud engineer should at least know what they do and the problem they solve. This way they will know if a particular AWS service is worth taking a closer look or not when the need arises. This is extremely important, so your team is always ready to tackle your next problem using the appropriate AWS service and not reinvent the wheel.
Good cloud engineers want to learn
Last, but not least. If for some reason you find great candidates with a somewhat limited knowledge on AWS, don’t automatically say no to them. The cloud moves so quickly, that even the most knowledgeable AWS professionals today will have to learn and re-learn a lot of things in the near future. As long as a good software engineer is willing and can learn new technologies quickly, they will likely be effective when working with the cloud. For a period of time, you would only have to manage knowledge intake and the amount of responsibility when it comes to AWS tasks.
Are you hiring cloud engineers?
As a former Software Development Manager for AWS, I’ve built teams inside Amazon. This means I have interviewed and hired top engineering talent. If you’re hiring cloud engineers and need a neutral and detailed assessment from an AWS expert, I will interview candidates for you.
Please use the form below and I’ll get back to you.