Before becoming an agile coach, I was in software development for about ten years. Before that, I did a bachelor’s and a master’s degree in computer science. Programming books and tutorials out there suggest that writing code is easy. Writing great, quality code, however, is extremely difficult and can be frustrating at times, but it can be highly rewarding.
During those years, I started to notice that there are professionals in different levels of their careers. On the first level, the software professional’s behavior is the same as of that of a Freelancer, focusing on writing code (also called programmer or coder); the second level is the Software Engineer, who also utilize engineering skills other than writing code; and the third level has two paths: the Specialist and the Software Intrapreneur. These levels already assume a certain level of expertise in software development and they do not equate with how good you are at writing code, nor with your years of experience. It is mostly dependent on your career choices. Let’s take a closer look at each of them.
Disclaimer: The levels described in this article are not meant to replace the seven stages of expertise in software engineering described by Meilir Page-Jones; rather, it’s a look at software development in another axis.
Freelancers (programmers or coders) are pretty good at coding and probably have the full stack. They deliver small to medium projects and mobile apps fast, if not in record time, and are not afraid of trying a new technology if it’s challenging and exciting. If they are working with more programmers, they’ll use the divide-and-conquer approach, where each team member creates a different piece of the puzzle and then integrates the pieces together. Meetings are interruptions to their state of flow and should be kept to a minimum, but they can be also fruitless, since project managers (PMs) or product owners (POs) have a hard time understanding what the programmers are saying.
Freelancers do their jobs by writing code.
If you are a freelancer, you are excited about getting your hands dirty, getting to the code level, and building cool things. That’s what attracted you to this job in the first place.
Most programmers on this level I know are freelancing or come from freelancing background (thus the name) or a one- or two-man startup where all above skills are amazing. So you if you are actually freelancing, you are probably doing well by focusing on what you do best. You might get some value out of the next levels, but at this point in your career, they might not be your focus.
However, once you start building a growing startup or begin working on a longer, larger project, involving a dozen or dozens of other programmers, because of the nature of your previous type of work, there are probably a few habits that you should lose:
- In order to meet that freelance deadline, you probably didn’t have time to write too many tests. And since your contract might not have included maintenance work, there was no real incentive to develop code with higher quality, which takes more time.
- You are more reactive than pro-active. Since you are used to getting requirements from your clients, you don’t know who your final users are and why you are building these apps and features for them.
- You got used to building everything yourself , since you were hired to do so. For you, it’s less frustrating building things from scratch, than finding the right product in the market and to integrate with your app.
- And because of all of that, you find working in teams extremely difficult , because of all the interruptions, synchronizations, and mentoring you need to give to your team mates.
Consider the example of Rick, a Freelancer who might have been a great coder, but that didn’t make the transition to Software Engineer. His brilliance didn’t translate into working on a long project, and as the codebase became larger and larger, his code, less and less readable and with fewer and fewer tests. He went into a downward spiral where eventually he was fired and the project was cancelled.
These habits will need to be reevaluated in the case of working on larger projects. But if you are aware of them, you can start making the transition in your career from Freelancer to a Software Engineer way more smoothly than Rick. Let’s take a look now at the qualities of a Software Engineer.
A longer project will involve not just building, but also maintaining the project for a long period of time. So if there is already an app out there that can can be integrated on the business logic of your app, you could buy it in order to avoid having to maintain that additional piece of functionality. For example, you don’t need to code a shopping cart functionality to your ecommerce site because there are multiple companies that specialize in shopping carts, and you can just integrate an app of your choosing into your site.
Like Freelancers, Software Engineers will have all the skills to develop code. But they will also have other T-shaped skills, since the role is not simply to ship products, but to ship, maintain, upgrade, and support users for years after shipping. Because of this, Software Engineers know that speed is not the only factor, but quality as well. Other characteristics include a preference for working in teams and knowing that the best code designs come up during pair programming (sometimes mob programming) sessions.
- practice pair and mob programming;
- understand why TDD, CI, CD (Test-Driven-Development, Continuous Integration, Continuous Delivery) are important, and are familiar with several software engineering practices;
- work on Agile teams, often trade ideas with their Agile Coach/Scrum Master and understand that retrospectives are a chance for teams to adapt to a better way of working together and growing;
- know that an extra hour spent on quality at the beginning of the project can save hundreds of hours and thousands of dollars for the project down the line;
- clean up after themselves (i.e. refactor).
Software Engineers know that their job is not to just write code, but to be part of an orchestra of developers all working together towards the same score. The software engineers do their job by architecting high-quality software products with a team of developers.
Being a Software Engineer, you discovered that your job is not to write code, but to deliver value. In fact, sometimes you deliver value without writing code at all by building prototypes to validate ideas. Before writing a single line of code, you had to plan it, discuss it, prototype it, test, survey your users, and test again. All along the way of writing the code, you will write tests to make sure it’s doing what you think it’s doing. As matter of fact, you might even write your tests before the product itself, using TDD techniques.
By becoming a master of building software products, from here you have two options: 1) you can look inwards and strengthen your relationship within your team and become a mentor, or 2) look outwards to your POs, stakeholders, and users, and become an expert of the product you are building.
Let’s take a look at these two options.
Specialists not only know how to work with teams and long projects, but they care about their team mates and the work they are doing. They also coach their team-members to evolve into Software Engineers or Specialists as well.
Specialists are experienced software engineers and invariably end up as team leads of software teams. They not only continue mastering their crafts, but also coach their team members to grow as well. As a matter of fact, they take on the KPI (Key Performance Indicator) for their team-mates growth. They value meaningful results over just doing tasks; understand the meaning of the phrase “If I had 8 hours to chop down a tree, I would spend 6 of those hours sharpening my axe”; and truly understand that you don’t need to be writing code 100% of the time in order to be productive. After all, the best code is the one that doesn’t need to be written.
(One of the 12 principle of Agile states: “Simplicity–the art of maximizing the amount of work not done–is essential.)
Specialists do their jobs by fostering an environment where the team is always learning and delivering products with more and more quality at an increasing and, most importantly, sustainable pace.
Having an entrepreneurial mindset is the paramount quality for professionals of this level. Intrapreneurs enjoy not only building cool stuff, but also do it with the customer in mind. They know to sync with the product manager or product owner and to build software not just with speed and quality, like the software developer and specialist, but also with the focus of building the right things. It’s the key difference between effectiveness and efficiency. When you are efficient, you can build things right. But what good is that if you are building the wrong thing? That’s what differentiates the Software Intrapreneur: they are also effective, that is, they build the right thing. They know the value of what they are building for the customer and can provide invaluable feedback to the PO. They strive not only for software development mastery, but to delight the customer.
The Software Intrapreneurs run their teams as if the team were a start-up within the organization. The Software Intrapreneurs do their jobs by making sure that real value is being delivered to their users
You know that great software is not simply done by writing code. As an Intrapreneur, you will be talking to the PO or the users to understand exactly what they need you to build. As a Specialist, you will make sure that great craftsmanship is being applied to the product by everyone involved in building it, from the junior to the senior developer. You will make sure the team has enough support before, during, and after the development of the product. You will make sure the team is progressing, not simply with the development of the app, but individually in their crafts and together as a team. A gelled team is much greater than the sum of its team members. Teams that have gelled perform at a much higher rate than non-gelled teams.
So what’s next after these two levels? If you are a Specialist or Intrapreneur, you probably already know the answer. You probably already have a blog like this one. Maybe you are thinking of writing a book or speaking at a conference, or even starting your own startup.
As I mentioned at the beginning, the levels presented here do not equate with years of experience. You can be an experienced and highly successful Freelancer (and may use one or two techniques of the Software Engineer) who decided to focus your career on the freelancing world. Or maybe a beginner who becomes a successful Software Intrapreneur.
As an agile coach, I want to coach the members of an agile team to become Specialists and Software Intrapreneurs, because they will be the most successful working in a team. If you treat your software engineering skills and your career as something of value that you are selling (as consultancy or to an employer), you should not just focus on learning new technologies and new languages; but also in learning agile and soft skills that will make you more hireable. You will have the upper hand when negotiating your salary to your future (or current) employer, and you will also enjoy a more exciting role at whatever company you decide to work for. And most importantly, you will be creating products that delight your customer.