AWS Bites Podcast

111. How we run a Cloud Consulting business

In this episode, we discuss how we work as a cloud consulting company, including our principles, engagement process, sprint methodology, and focus on agile development to deliver successful projects. We aim to be trusted partners, not just vendors, and enable our customers' business goals.

By the end of this episode, you will know what working with a cloud consulting company like fourTheorem could look like and you might learn some strategies to make cloud projects a success! We will also digress a little into the history of software practices, common misconceptions, and what we believe should be the right way to build software.

AWS Bites is sponsored by fourTheorem, an AWS Partner with plenty of experience delivering cloud projects to production. If you want to chat, reach out to us on social media or check out fourtheorem.com!

In this episode, we mentioned the following resources.

Let's talk!

Do you agree with our opinions? Do you have interesting AWS questions you'd like us to chat about? Leave a comment on YouTube or connect with us on:

Luciano
00:00:00

At fourTheorem, the cloud consulting company where we work, one of the things that we get asked a lot, both from our potential customers, but also from our peers in the industry is how do we work? And it seems like a simple question, but in reality, we can cover a bunch of different topics. Things like what's our unique selling proposition and our target customer base? What the first engagement with a potential customer is going to look like? Do we ever say no to potential customers? How do we gather requirements? Why are software projects somewhat unique? How do we make plans, including a desired architecture, estimates and success criteria? What do we do when the work starts and how do we keep iterating over it? And what happens after the delivery? There are so many different ways of working and methodologies to deliver software and cloud projects. We believe we have our own unique way of doing that and today we want to share it with you. Hopefully by the end of this episode, you will know what working with a cloud consulting like fourTheorem could look like and you might learn some strategies to make cloud projects possibly more successful. We will also digress a little bit on the history of software practices, common misconceptions and what we believe should be the right way to build software in the cloud. I hope this is going to be a fun ride. My name is Luciano and I'm here with Eoin for another episode of AWS Bites podcast. AWS Bites is sponsored by fourTheorem, an AWS partner with plenty of experience delivering cloud projects to production. If you want to chat, reach out to us on social media or check out fourtheorem.com. All the links will be in the show notes. So why don't we start by giving a little bit of an introduction to our audience, telling them what fourTheorem is, a little bit of the history, the people and some of our past projects made.

Eoin
00:01:36

fourTheorem started in 2017, actually that's already a good few years. There are three founders in the company, myself, Peter and Fiona. And I guess the interesting thing about us as the initial team is that we've all been through a lot of startups in the past, like our own startups, working in startups, bootstrapping, funding, building new products, getting them to market, succeeding and failing. That kind of helps shape, I think, our culture and our mission a little bit. One of the founding principles is that we don't want to just become a body shop. In the consulting world, it's pretty common. There's almost an inevitable gravitational pull towards just throwing people at problems. And that's customers and consultants kind of enable this behavior a little bit instinctively because when things get tough, people tend to just say, okay, let's add resources. We don't have enough resources to solve our problems. So let's just add more people. And this suits the business model of consultancies very well, because they're just earning money based on time and materials on a day rate. So you just times the number of days times the number of people, and you end up with a nice revenue at the end of it. But the problem with that is that it doesn't really solve the core problems in general, the core engineering problems, cultural problems, etc. And we try to do it a little bit differently. So rather than just adding people, we try to focus on the minimal number of people almost to do projects and focusing on the quality of the people and the quality of the work. And so far, we've been able to stick to that after almost seven years, six or seven years, which is good going so far, I think.

00:03:01

And so we focus on a small team. We're deeply technical, I would say, but with a focus on business because of, I guess, our previous startup experience, we optimize for delivering early and often so continuous improvement where possible, we were bounded with a big focus on AI and data science. That was one of the reasons myself and Peter wrote the book on, you know, using Amazon machine learning services in the beginning, just kind of stake a claim to that as a direction of travel. We're seeing that a lot now these days with Gen AI and other machine learning fields, data science, modern data architectures, production, those in a really optimal way was going to be a big differentiator. And the rest is just focusing on more managed services. So trying to remove a lot of the old school operations and maintenance that legacy systems have seen a lot of in the past so that people can do more again with fewer people. We help people of all different sizes. One of the nice things about working for fourTheorem, I guess, as an engineer of any kind, or no matter who you are, is that we work with startups, but also larger enterprises. That kind of has a, there's a virtuous cycle within that because when you're working with startups, you tend to move very quickly, iterate quickly. And therefore, as an engineer, you learn quickly and course correct quickly. In enterprises, the appetite for speed of innovation is less because there's more risk associated with it. So the pace is naturally different. But when people move from a startup environment into one of our enterprise environments, they bring that innovative culture, lots of new learnings. And then when you move from an enterprise client onto a smaller client, like a startup one, you kind of bring that rigor and process and compliance and governance and all of that stuff that's more common in the enterprise world. So it kind of benefits our clients in a virtuous cycle kind of way, but also our people. No matter what we're dealing with here, big customer, small customer, I think the first engagement is kind of similar. Do you want to take us through the discovery part when we, okay, we've wooed a new client or we've been another client has referred a friend of theirs in and we start talking to them for the first time. How does that work?

00:08:08

So sometimes not all the problems are problems that you should solve with AWS. So also evaluating, even if we are brought in as AWS experts, does that problem really require AWS? I think it's a very fair question to ask and assess very honestly. Don't just try to put AWS in there just because you are the expert on it, but make sure that it's something that is really needed that is going to make the difference for the success of that project. So basically, at this point, we want to come out of this meeting with two possible outcomes. It's generally like an alpha day, so it's not super intense. And the idea is that at the end, we have a quite good understanding of what's the problem space, the people involved, what everyone expects as success criteria. So we might decide that we can help and that's kind of a positive outcome or that maybe we are not the right fit for that particular company and problem. And at that point, we just say, okay, this is not going to work. Hopefully, you got some value anyway with all this conversation and try to describe it and nail down the requirements of the project. But if we decide to start to help the company, what we are going to do is create a proposal. And that proposal is effectively a document that says this is our understanding of the problem and this is how we can help you out to develop that solution further. And there were also other interesting cases that happened to us in the past where we decided not to be a good fit for that company because we didn't really believe on the structure, on the framing of that particular project. Sometimes we realized that a founder is really early in the implementation. Maybe they need to do a little bit more market research. So even though we could build a product for them, that product is still likely to fail just because there isn't enough research. So we feel like it's... We are obliged to say, well, make sure you really understand the problem sets before you invest money into this project and then come back to us later and we can reassess together whether we feel we are going to be more likely to be successful after all of that. So I think it's also important to call out that you need to be a little bit honest that way as a consultant, because we feel that's part of our job. If we have that expertise where we can give a useful piece of advice to our potential customers, even though that means losing business in the short term, I think that can be much more valuable in the longer term. Now, I guess another question that comes very often when we have this kind of conversation and maybe when we present a plan to our potential customers is this looks very different from what I expected. I was expecting maybe, I don't know, lots of planning and then maybe a very clear roadmap going forward. And then you give me a very precise deadline where everything is done. But then when we present our plan, it might look very different from that expectation. So I think it's worth spending a little bit of time discussing our opinion and how do we perceive the history of software development and why we think that there is a large misconception, especially from people that are not really into the software industry or now software should be built.

00:11:21

There's a bit of a bad reputation around software as well because of lots of horror stories around scope creep, bad estimates, delays, significant cost or time overruns, quality expectations, being poor and then from a team perspective, burnout, death march projects. So those things are quite common, right? It is common, let's face it, for software projects to ultimately fail and we want to avoid that. So we have a strategy to make sure that we do avoid that. And we just think that it all comes down to the fact that software projects are inherently just more complicated, more complex than people might think, especially when you compare it to maybe more of a traditional engineering field like construction engineering or mechanical engineering. So I think one of the analogies we've been using recently is if you compare what it takes to build a mobile website versus what it takes to engineer a coffee grinder. And if you can imagine more of a mechanical engineering example and let's look at it from a few different angles. So in terms of specification, if you're building a device like a coffee grinder, generally you have a clear set of functions. You want to grind coffee to various sizes. The requirements are pretty clear and they don't usually change once the design is finished. Whereas with software, like you're building a mobile web website, even a simple one, the requirements are always dynamic. It needs to adapt to a variety of different user needs and expectations, and those change rapidly.

00:12:41

User expectations are always changing and user behavior is changing. You might need to update the website frequently to meet new user demands and expectations, or even just to stay ahead of competitors. The process of understanding requirements, communicating them clearly, and making them a reality in software is really complex. And it's actually one of the major areas where potentially great projects can falter at the very beginning. And when you get your first delivery, then looking at the environment in which these two products operate, you know, coffee grinder will work in a kitchen and it'll have a stable power supply. The environment is generally controlled and predictable. Once you ship software, it must function across lots of different devices, smartphones, tablets, PCs, and different screen sizes, operating systems, browsers, which all constantly change, specs change, they have continuous updates. So it's a very different context from that point of view. And then users, when they use a coffee grinder, generally they put in the beans, press the button, empty it out, hopefully they clean it once in a while. With software like a mobile website, it has to function across, I suppose, contexts where you didn't anticipate. Users do unexpected things all the time. Simple things like they put a special character in the first name field that you didn't think of and didn't expect. And then at the other end of the scale, you have malicious users, actors who are trying to damage the system, steal data, hack the system. There's so many variables in terms of user actions.

Luciano
00:15:36

Yeah, I think speaking of the Gantt chart example, another thing that comes to mind is the waterfall approach, which is generally the idea that you have a specification, you do some kind of analysis, from that you do some kind of design, then you move to an implementation phase, then you have some kind of ready product that you just need to test a little bit before you can confidently release and you're done. So it's like step by step from beginning to end, it's kind of a straight process and it's called waterfall because generally it's represented with this kind of diagram where things are moving down to the completion phase. And this approach is really interesting because I think there is this misconception that most people believe this is how anything is built, including software, but you could argue that this model is not really something you can use. In reality, it's kind of a conceptual model to understand what are different phases of a project, but this is not really how you move things from zero to completion. It's not like one single iteration and the phases are very distinct. And even if you think about building physical products, if you start to compare this model with the agile methodologies that we are going to talk a little bit more about in the second part of this episode, you can see that the agile methodologies actually started in more traditional manufacturers, not something that was invented in software, it's something that actually came out from Toyota. So even in traditional manufacturing, there is a clear need that you need to have a more dynamic process where you can adapt to change, you can adapt to things you didn't expect, you can adapt to new requirements and try to minimize waste at every step of the process. So it is really interesting to see how even in traditional manufacturing, this kind of conceptual model, it's good to understand the basics of the different phases of a project, but it's not realistic. This is not really how you move a project forward.

00:18:16

And this is one of the main reasons why the waterfall approach doesn't work, because if you spent a huge amount of time building a project and invested tons of money, and then you come at the end phase, and when you are there, everything changed in the landscape, you're understanding of the problem, what the customers would expect, you just wasted tons of money and tons of time. And going back basically means let's start from scratch and let's redesign again. And then let's hope that next time things don't move as fast as they do, as they did. But we know that most likely they're going to move again. So the only way really is to find a process that's flexible enough that allows you to understand what's going on, understand if you are on the right path, and if you need to change something, have the time to do that as soon as possible. So the way that you can do that is using a process that is divided in small chunks of iterations, and we generally call them sprints. A sprint can be a period that can vary between one week and four weeks, typically. And again, this is just arbitrary amounts of times, you just need to pick one size. And ideally, it should be small enough that gives you frequent chances to reassess, but also big enough that gives you enough time to have a small objective in mind that you can complete during that timeframe. So it doesn't make sense to have a sprint of one hour because realistically you're not going to have time to do anything meaningful in one hour. But if you start to think, for instance, about two weeks, you can probably achieve something useful for the business in two weeks. I think the other side effect of this approach is that it reduces the risk of experimentation.

Eoin
00:23:02

Well, when you learn that code is not just a measure of productivity, but it's also like an, it's an asset, right? When you build a product, you want the work that your team are creating to be an asset that's valuable and growing. But at the same time, code is a liability. I think we hear this expression quite a lot, which means that every time you have a line of code, it's something you must maintain into the future, every line. And every line of code is a line that can have a bug. So what you want to do is get the balance right, maximizing the benefit in terms of business outcome, by minimizing the amount of code it takes to create that. And there's lots of ways we do that. We talked about one of our principles being leveraging experts like AWS as partners to manage our infrastructure, so that we have to write less code. And this is a constant journey, trying to remove the code you have and offload things that aren't really specific to your business. We talk about this quite a lot. So let's think about software development. And we've seen some studies that say an average software developer, if you have an eight hour working day, they're spending anything from one hour to four hours coding. And it might seem like you're unproductive. But when you look at what the function of a software developer is, it doesn't seem so bad at all. Because a software developer, you don't generally want to be coding all the time. It's a bit of a red flag if they are, because it probably means they're a little bit isolated from the larger mission.

00:24:19

If we look at the all of the activities of a developer, they need to understand the customer and the business need, they need to be constantly honing their skills, because the landscape is changing quickly. So they need to be learning the right tools to do the job and ensuring that the approach is optimal. No matter how experienced a developer you are, learning is a daily part of the job, that's never going to change. Then you have things like analyzing bugs and constraints in existing systems, often systems that were implemented by others who aren't available anymore. And this is a really advanced skill almost in software development, which is understanding software that you don't have full control over. It's a lot easier to start from scratch with a blank canvas all the time. A lot of companies out there that will do that, but there aren't a lot that will kind of understand the value in your existing systems that are already working pretty well and generating revenue. Then you have things like updating stakeholders, communicating with them so that everybody's on the same page, sharing your learnings and ideas with peers, learning from your peers, collaborating with maybe QA staff, user experience, designers, project managers, and lots of others. Then you have just other collaborative activities like creating, reviewing, and updating documentation. This is pretty important if you don't want lots of problems in the future, peer reviewing code, and then writing and even rewriting code tests infrastructure. So the coding part almost comes last on the list once you've got everything else right. That's the way it should be, getting the balance right between the focused implementation time, you know, this kind of stereotypical view of a developer, headphones on, furiously coding away. That's important, right? But it only makes sense if you have the right context to set, the mission is clear, and you've communicated with everybody else, because otherwise you could be in isolation, furiously coding in the completely wrong direction, something that will have to be rewritten or thrown away later. That's not good. So the other thing is too many meetings, interruptions can kill momentum.

00:29:36

And we need to figure out how to align everyone with that particular expectation in mind. So mission and objectives are at some point mutually agreed. Everyone is say, okay, this is what we want to achieve. And this is how we think we should be proceeding for the next sprints. So that basically helps us to create a product backlog where we try to define all the features that we need to build. And those features are not just in a random pile where anyone can just pick one, but it's very important to try to prioritize the ones that you want to do first, because generally they are the ones that are either going to enable other things or deliver the most value straight away. So it's very important that you focus a bit of time trying to prioritize what is really important for the business, because that's going to drive the next phases. So you definitely want to finish first the things with the most value or the things that are going to block more value for the future. The other thing that we need to do is if there is any dependency on existing systems or legacy software that is used in the company, that needs to be totally analyzed and documented, because this is generally where you can find surprises, where you can find blockers. And if you need to create some kind of integration, you really need to understand what that integration could look like and how much work there is involved in creating that integration. Sometimes you need access to systems like that. You need access to documentation and might not be an immediate thing to get that access. Maybe you need to go through a process where you need to request access, where you need to request access to documentation. So it's really important to identify this kind of dependencies straight away and make sure you try to unblock them as soon as possible, very early on in the process. At this point, we should have a clear enough idea to be able to design a first architecture. And we generally try to do that at two levels. One level is very high level. It's kind of a logical architecture. Like what do we expect the systems to do and how they are integrated with each other? The other one is a lot more detailed, what we call it physical level, where we actually describe what the implementation of the systems could look like. Are we going to use, for instance, DynamoDB or a SQL database and which other systems are going to connect to that database? Maybe we need multiple databases. So it's really trying to nail down also the technologies that you're going to be using for implementing this architecture.

00:32:51

And finally, once we have all of this, so we have a clear understanding, we have an architecture, we have a list of tasks, there is the $1 million question, which is how long is this going to take? Everyone wants to know that. And of course, you can never have a precise answer, especially with an agile approach. You try not to have a super accurate answer because you are always learning. And as you learn more, you can be more accurate, but you need to have some kind of estimate anyway, because you cannot just tell the customer, we don't know this is going to take potentially forever. No, you need to be able to provide some value in a specific timeframe. So what we do is we generally assign a size to all the tasks. And we call this exercise T-shirt sizing, because we give a small, medium, large, extra large kind of sizing. And then we have a very simplistic model that allows us to see, depending on the size of cards and number of people involved and how easy it is to parallelize certain tasks, how much more or less that project is going to take. And it's just a ballpark figure that you have as a feeling to see, are we talking about weeks? Are we talking about months or years? And of course, the longer it is, the more you need to make an effort to try to reduce the scope so that you can come up with something valuable in a shorter amount of time. It's not uncommon to see that a project might take, I don't know, two years after you do all of this research. And that's when you have to go back and see, okay, this is not a realistic project that we can be successful in. We need to reduce the scope. We need to trim down, focus maybe on a smaller area, try to deliver that one first, reassess everything. And then eventually maybe you come up with like, this might be a three months worth of project. And at that point, you have the risk a lot, the success of that investment, because you are much more likely to come up after those three months with something valuable rather than investing years into something that might not turn out to be so important after the three years. So what happens next? At this point, we are ready to roll. How do we continue?

Eoin
00:34:40

When people think about this approach to software development, it sounds fuzzier and maybe less of a commitment. Maybe it's just more of like a cop out from the developers, because you're not committing to a rigid timeline. In fact, to do it right, it all it means is that you're doing more planning, you're just spreading it over time, and you're constantly planning. Now there's that old saying that says, plans are useless, but planning is critical. And that's what this really is about. Rather than say, okay, here's a plan that gives us very fixed scope in a fixed period is we time box our milestones. So we say, okay, well, here's what we're trying to achieve. But let's make an initial time box. And for a new customer, first greenfield project, or actually any type of customer, we try to limit the duration of the first engagement to like six to eight weeks, so maybe three or four sprints. And that gives us and the customer enough time to see a lot of value. And it's generally a good enough amount of time to set the foundation and deliver something that's really valuable from a business perspective to production that you can iterate on from that point. And it seems like a short amount of time to a lot of people. But if you're really focused and you've got a very high performing lean team, you can do a lot in that amount of time. After that, sprint zero, which is critical foundation, you generally have a good idea of what that value is. So you can kick off your regular sprint, sprint cadence. Sometimes agile teams work in sprints. Sometimes it's more kind of Kanban kind of continuous taking tasks off. More often than not, we work in two weeks sprints. And the idea of that is you've got, that's the kind of feedback loop in terms of talking to your stakeholders and end users and understanding how to course correct your plan.

00:36:13

The main activity within these sprints, of course, is coding, development, delivery of prioritized features and tasks, including all of the best practices like continuous deployment to your production environment. That's something we put in from the very start so that it doesn't become a big effort later. It's always good to get all of those production deployment, best practices, observability, quality control in from the very start. It's much cheaper to do it at the very start and then just increment them over time. So it involves programming, the creation of virtual infrastructure in a cloud environment, documentation, tests, all of that. Studies have shown that waiting until the end of a sprint or, you know, monthly or three monthly release cycles to deploy software, that's been shown to slow down high-performing teams. So we follow the practice of continuous delivery. So it just becomes a habit that you do without even thinking about it. That's automated, highly and tested. Once you've got good planning in place, hopefully the items on your backlog, those features, whatever it is, ideally they should take between like a half a day or three days to deliver. The reason for that is that if you've got unexpected hitches along the way, external blockers, sometimes as a developer, we end up spending a day or two resolving an unanticipated issue. But if your units of work are small enough, then the impact is less overall and the time to adapt and of course correct. It doesn't have such an impact on the overall delivery schedule. Two-week sprints, there's always meetings, of course. Some people live by these meetings, some that when they work well, they're great for everybody and they get a lot of satisfaction. They can become a pain for a lot of developer teams when these meetings are not done well, because they think it's just a bunch of managers distracting you from the work you're supposed to be doing just to talk rubbish. Believe me, I've worked in companies where agile software has been done really well and I've been lucky enough to be in that position. And when it works, it really, really works and makes everybody more productive.

00:38:02

So we try to get a good balance ration, try to keep the meetings focused and short and not take too much of people's times. Planning meeting at the start of a sprint with the product owner, the delivery team, that's about reviewing the top of the backlog, checking your priorities, adjusting, getting more clarity on specific features and just having a good sense of what you're going to try and achieve over the next couple of weeks. Then you have a daily check-in, which is about raising and tackling any blockers, reviewing your work done, and just basically self-organizing the people who are involved in delivering, self-organizing to get that day's activity done. And it should not take more than 10 or 15 minutes. If it is, there's a red flag there. It's typical at the end of the sprint then to review. You have a demo with your stakeholders where you showcase everything you've done. You get feedback on it. They say whether it meets the needs, fulfills the mission. You look at your KPIs, your checklists, look at your risks and your actions. Now it's pretty common in like agile methodologies like Scrum to have that end of sprint demo. What we like to do is actually a weekly demo at least, and also ad hoc demos to stakeholders even, because I think two weeks to wait to show them the work you did maybe 10 days ago, it's quite a long feedback loop and doesn't give you a chance to course correct quickly enough. It also often causes you to rush the demo and maybe do a little bit of a polished demo where you're just trying to show all of the nice things you've built. A demo is much more valuable for everybody where you show the stuff that didn't work as well as the show the stuff that did work. It goes back to that transparency principle we talked about at the start that we try to adhere to. It establishes a lot more trust. You can show things a lot more detail and as well it means there's not a lot of pressure for everybody to be there and to be super engaged in the demo at the end of every sprint. You can maybe miss one every once in a while and it's not such a big deal. So I encourage people to think about more regular and more honest and raw transparent demos as well. So getting the value in those meetings measured, checking that you're not wasting time, people aren't just phoning it in and checking in and nodding along to the meeting while they keep coding. That's important because what's the point if that happens? You have to make sure that they're valuable and I always think if you're not either contributing value to a meeting or getting value from a meeting just don't show up. You're better off doing something else and you're better off kind of raising it and saying okay how can we make this more valuable for everyone who is there. So we've gone through sprint zero. We've gone through the regular sprints. Luciano, should we talk about milestones and releases, things that are less discussed in agile processes?

00:43:14

So that's totally an option. And when that happens, it doesn't mean that we haven't been successful. Actually means that we've been extremely successful and we are going to help the customer to just move on to the next phase and continue building things on their own. In other cases, we can still decide to continue the partnership. Maybe the customer decides that they want to build more stuff with us, maybe expand that project, build more features, maybe build the next phase of that project, or even just move us to other projects because in bigger companies, they always have a number of projects going on at the same time and we might be helpful in other projects as well. Or maybe there are other projects that they want to start as more experimental activities and we might be the partner that helps them to try to build something new. So in summary, today, what we did is covering what are our principles, how do we work as a company, and we try to be trusted partners for our customers. We don't just want to build hours of engineering time, but we want to make sure our customers will succeed with their own business goals. And we are the enablers from a technical perspective to make sure that they're going to deliver the best technical stuff that can fulfill that specific business need. We also spoke a little bit about the software world and how there are so many misconceptions on how you should be building software, even though it's not a perfect science and everyone has its own kind of incarnation of what good software development looks like. I think it's important to recognize that there are some principles, some guiding principles that are universally recognized and you should be using them. Then as long as you have a clear process and you can work effectively with your customers, it's fine to probably have slightly different take on how you actually organize the day to day. We have our own way that we described today, and hopefully you found that interesting. But we are also, as usual, very curious to hear it from you. Do you use a very similar process when you work with technology projects? If you are also a consultant, what are we saying? Does it make any sense or do you do something entirely different? I think it's really important to have a healthy conversation in our circle to compare all the different processes and learn from each other. What does it really work? What doesn't work? How can we grow together and get better at this craft? Definitely let us know what you think. Leave us a comment either on YouTube or reach out to us on socials. All the links will be in the show notes as usual. Thank you very much and we'll see you in the next episode.

Help us to make this transcription better! If you find an error, please submit a PR with your corrections.