When I say "sustainable", I'm referring to development practices that can help keep a business competitive, both in terms of performance (time and price) and quality - as well as talent retention.
The key, in my opinion, is to invest in optimizations up front, to decrease turn-around time, increase quality - and keep developers free from distractions, focused on goals that matter to the client (things they can see and understand) and above all, happy.
Here is an illustration that demonstrates the basic principle:
In timeline A, we go straight to work on a set of features being built as part of a project for a client. In the alternate timeline B, we instead start by optimizing in various ways, which in terms of time and cost is an immediate loss - as you can see, features A and B are completed behind timeline A. However, long-term, this loss turns into an overall win.
Now, we may not achieve the "edge" shown on the illustration after a single project - it may take multiple projects to get there. But if you invest in the right optimizations, you will get there eventually.
Here are some of the basic optimizations we can do:
- Educate Your Team: Give developers the time they need to learn new technologies and more modern patterns that produce better results in less time.
- Take Ownership: Encourage developers to take ownership of the technology they've selected - give them time to contribute to open-source projects you use. This benefits both you and the community.
- Evaluate New Technology: When new libraries and tools become available, have your team check them out early. New development tools, automated building and deployment tools, databases - even a new programming language, if it comes to that. Keep an eye on the direction the world is moving - know where it's going to go early, and don't get left in the dust.
- Create Solutions: Avoid short-term, stop-gap patches - these either come back and bite you in the ass later, or you end up repeating the same patches on your next project.
- Take Charge: If there is no existing solution for a recurring problem identified by a developer, maybe the opportunity has come for you to demonstrate some community leadership and create that missing solution.
- Modular Development: Build for reuse whenever possible - it takes longer to build a feature as a reusable module, so don't blindly build modules for everything. But always weigh the benefits of being able to ship a particular feature in very little time, improve it's quality over time, and resell it on future projects - versus building a lesser version of that feature, and building it repeatedly.
Saving time is not the only long-term benefit of following these principles - some additional long-term benefits may include:
- Side Effects: Often, more modern technologies and tools are not only faster to work with, but produce increased quality in the form of positive side-effects - slicker UI details without any extra effort, increased security, or easy access to other little "nice to have" features; things that add to the client's perception of quality, and meets the increasing expectations of end users.
- Slimmer Codebases: Typically, working with better libraries means writing less code - having less code to maintain typically makes it easier to change a feature; it is usually easier to modify 100 lines of simple, elegant code, than 500 lines of tangled, complex code. Your clients will perceive you as being more flexible and helpful, when you deliver (to them) seemingly small changes without any push back, a substantial bill, or delayed delivery.
- Consistency: When each project is built using the same modules, libraries and tools - and when those are well-known to the entire team, we can delivery consistent (or increasing) quality in a predictable time-frame, every time.
- Expertise: Becoming an authority on something, or becoming a vendor of something others use, is good for the company's image - and it's good for the team morale.
- Focus: Accept that you can't be good at everything - you will earn more of a reputation for delivering great solutions on time, than you will for being capable (but at best average) at everything.
There is no such thing as a client who will hire you to do "everything" - every client needs "something".
- Flexibiliy: On a more technical (and perhaps more personal) note, I highly recommend you urge your team to avoid dependencies whenever feasible - having the freedom to replace a single component (without throwing away an entire framework) means you can make incremental overall improvements.
Ultimately, all of these things also have the added benefit of increasing developer happiness, which is key to retaining talent in the organization.
Keep in mind that human attention cannot be purchased - you can pay people to do what you want, but only until they find somebody else who will pay them to do what they want. You cannot pay people to care - since you're buying their time, making sure they are interested and invested in what they're doing may actually be more important to you as a business owner, than precisely what they're doing.
Fortunately, cultivating sustainable development also generally leads to more excited or enthusiastic developers.
After all, new tools and technologies in the area of software development are rarely toys - software development is not video games. Unless it is video games, but then maybe that's what you want. I digress. If your developers are adamant about newer tools and technologies, there is usually a reason: with a little up-front investment, we can do things faster and better, while also having more fun! :-)
And yes, I like to have fun - I'm not ashamed of it. It so happens that fun for me is usually about delivering better software in less time. Win for you as a business owner, win for your clients, and win (and more fun) for me!
Of course, the benefits of what I propose here can be hard to measure - but it's easy to measure when a company is not doing well, so maybe what you need is a better long-term strategy? If you've been working your ass off for years, if your clients think you're too expensive, if your best developers walk, or if you're losing potential clients to the competition - chances are you haven't yet invested in technology that is truly sustainable for your business.
@mindplaydk that is absolutely brilliant post Rasmus. I agree with everything and couldn't have said it better. Thanks for writing it!— Antti Peisa (@apeisa) March 24, 2013