My Software Team Philosophy
In my experience, smaller teams of higher-skilled Engineers outperform larger teams of less-skilled Engineers. I don’t believe in armies of offshore coders.
Building software is not physical labor, and it’s not something that can be easily broken into parallel parts for development. That approach is often taken, especially when offshoring, but it requires substantial up-front planning and then even more work to test that all the parts fit together at the end. Unless you are doing waterfall development and you have solid skills in upfront planning this will generally take a lot longer than you think and the results will be a mish-mash of parts that hopefully work together.
I believe that fewer, better skilled Engineers will build a better product, faster. This leads to the obvious conclusion that one must become good at identifying, recruiting and retaining higher quality Engineers.
I did an interview on the Software Synergy Podcast in March of 2024 where I talk about some of this.
But what attributes are you really going for?
Desired Attributes of Software Staff
No single candidate will have all or even most of these attributes. This is a list of attributes that tend to profile candidates that I have observed to have been successful in building the kind of software that I am drawn to build.
I have the most experience building SaaS software that also has a hardware side (either embedded or mobile). I think this applies to an increasing amount of the kinds of systems we all use every day, especially as IoT becomes normal. These are distributed systems of varying scales that span multiple technology areas.
This list is of course not prescriptive and does not apply in all cases. But in my experience it’s directionally accurate.
Ideal Leadership Structure and Scope
Smaller teams (3-5) can be led by an Engineering Lead but larger teams (5-8) usually need an Engineering Manager. Several teams form a group. A smaller group can have a Senior Manager, usually if there is some common thread across the teams (product, tech stack, geography, etc.). A group that is composed of several different teams spanning products, technologies, and/or geographies is led by a Director. Team leaders would report to that Director. This pattern scales out from there. Up to 5-8 Directors report to a VP, etc.
Typical attributes of Engineering Leaders include:
- Strong bias for action – see problem, fix problem
- Strong sense of “ownership” – it’s not ever “someone else’s problem”
- Extremely technical background – not “just people a leader”
- Has strong opinions loosely held – knows what “right” looks like
- Demands the best of themselves and those around them
- Has the courage of their convictions – stands up for what they believe
- And, has the ability to commit to a course of action once a decision in made
These mirror some of the famous Amazon Leadership Principles. Bonus points for understanding the different skills required for each level of leadership (see the fantastic book “Leadership Pipeline.”).
I also am a strong believer in what Netflix calls a “Dream Team”. They say it best: “Imagine working alongside stunning colleagues who are great at what they do, and even better at working together.” And great Engineering teams ARE more like sports teams. Hiring is about team composition and leadership.
Attributes I Look for in Engineers
Typical attributes of Engineers I seek for my teams include:
- Ideal candidate has startup experience, or time on a team operating like a startup
- Self-starter, high “bias for action”
- Constant lifelong learner and problem solver
- Builds things – does not have to be tech, but actually creates things
- The kind of person who says “how can I help” instead of “that’s not my job”
- The kind of person who says “I’ll figure it out” instead of “I don’t know how to do that”
- Actively curious, especially about how things work
- Comfortable multi-tasking when needed
- Multi-disciplinary – knows many technologies, not afraid to learn more
- Goal-oriented, biased towards action, gets things done
- Does not let the perfect get in the way of good enough to ship
- Plays with technology for fun, is an inventor/creator
- Often involved in user groups or meetups on technology
- Examples: drones/quadricoptors/model planes/robotics/fitness tech
- Typically is a builder/maker – but could be baking bread, sewing, welding, etc.
- Usually have built their own computers and/or home networks
- Can name many open source projects/tools they use – and why
- Often has actually has contributed to open source projects
- Usually very smart, but may not communicate well with non-Engineers
- Often have strong opinions on technology choices
- Often have a background in communications protocols or control systems
- Able to quickly ramp up on new technologies outside of comfort zone
- Has experience with distributed systems, usually with substantial complexity
- Can rapidly ingest knowledge on a large systems
- Believes that software is not done until it’s running in production
- Often has experience with micro-service architectures and principles
- Often strongly believes in the “Unix philosophy”
- A college degree is NOT an indicator of success - only that you are trainable
- Having gone to a “top school” just means you can handle the stress
- Often have “hard science” Engineering degrees (EE/ME/AE)
- Somehow folks with Music degress are often really amazing
Typical Attributes of Experienced Engineers
- Typically have had 3-5 jobs, not at the same company, 2-5 years at each
- Almost always codes in two or more programming languages
- Anti-pattern: only codes in Java (e.g. diversity in programming language)
- Anti-pattern: only knows one tech stack (e.g. only Microsoft tech)
- Don’t have a recent PhD – academic midset is not really about building
- Typically have a very active GitHub or GitLab profile
Typical Skill Sets for Mid-Career Software Engineers
- Experience with deploying and operating software solutions into cloud environments
- Strong experience developing REST-based services, often with swagger
- Hands-on experience with micro-service architectures
- Strong programming/troubleshooting experience
- Strong experience with using unit tests to verify functionality
- Strong experience with designing software for testability using test frameworks
- Experience decoupling services using message queues (SQS/NATS/etc)
- Experience decoupling services using in-memory cache (redis/memcache)
- Experience designing software to be monitorable (especially Prometheus)
- Experience designing software to have logs that enable operations (ELK)
- Experience designing software that uses cloud-friendly datastores
- Experience designing software that uses complex database operations
- Experience in a DevOps model where development and operations are close
- Experience with high throughput communications
- Fairly strong experience scripting (bash/python)
- Very strong in modern distributed source code management tools (git/GitHub)
- Very strong with code reviews and collaborative development
- Very strong sizing user stories and working in a scrum team
- Significant experience using open source libraries and code
Typical Attributes of New-Grad Engineers
- Usually are quite active using and/or contributing to open source
- Often have done some kind of community funded project (kickstarter/etc)
- Almost always prefer Linux or MacOS to Windows
- Exception: folks who build gaming or high end graphics
- Quite often have done some kind of development for mobile devices
- Quite often have done development on Arduino or Raspberry Pi
Typical Skill Sets for DevOps Engineers
- Generally many of the above attributes AND:
- Expert level of understanding in networking protocols and concepts
- Deep understanding of IP networking at the packet level
- Expert understanding of Linux/Unix command line
- Strong experience with automation tools like Salt/Chef/Puppet/Cobbler/Ansible
- Prior experience supporting mission critical 24/7/365 global services
- Experience with monitoring / alerting tools (especially Prometheus)
- Experience with metrics visualization (Grafana)
- Experience using logs for system intelligence and alerting (Loki)
- Experience with multiple Linux distributions (Red Hat/Ubuntu/Debian/etc)
- Experience with virtualization and containers (KVM/libvirt/docker/etc)
- Strong experience with block, file, and object storage systems
- Understanding of redundant systems – arbitration/voting, failover mechanisms
- Understanding of load balancing and application layer routing technologies
- Understanding of the configuration and use of DNS (named/zone files/Route53/etc)