Cohesion and business problems
In software development there is a concept called cohesion.
It works like this. Suppose you have the following functions:[1]
function getArea(radius) { ... }
function getCircumference(radius) { ... }
function sendWelcomeEmail(user) { ... }
function updatePassword(user, newPassword) { ... }
function getTemperatureInFahrenheit(temperatureInCelsius) { ... }
function getTemperatureInCelsius(temperatureInFahrenheit) { ... }
You want to group similar functions together. Suppose you created the following modules:
// module-one.js
export function getArea(radius) { ... }
export function sendWelcomeEmail(user) { ... }
// module-two.js
export function getCircumference(radius) { ... }
export function getTemperatureInFahrenheit(temperatureInCelsius) { ... }
// module-three.js
export function updatePassword(user, newPassword) { ... }
export function getTemperatureInCelsius(temperatureInFahrenheit) { ... }
This wouldn’t make sense. The modules would each have a low degree of cohesion since we grouped unrelated functions together, and this is undesirable.
Now imagine that we did this instead:
// geometry.js
export function getArea(radius) { ... }
export function getCircumference(radius) { ... }
// user.js
export function sendWelcomeEmail(user) { ... }
export function updatePassword(user, newPassword) { ... }
// temperature.js
export function getTemperatureInFahrenheit(temperatureInCelsius) { ... }
export function getTemperatureInCelsius(temperatureInFahrenheit) { ... }
Much better, right? Now we have grouped like with like. Now our modules each have a high degree of cohesion. The functions in geometry.js
are each related to geometry, the functions in user.js
are each related to users, and the functions in temperature.js
are each related to temperature. This is desirable.
The concept of cohesion applies beyond programming though. Consider restaurants:
Appetizing Alice's:
- Pad thai
- Chicken parm
Bob's Bistro:
- Meatball sub
- Pork tacos
Carnivore Carol's:
- Tom kah gai
- Carne asada
Low cohesion. What about this?
Thai on Main:
- Pad thai
- Tom kah gai
Italian on Third:
- Chicken parm
- Meatball sub
Mexican by the river:
- Pork tacos
- Carne asada
High cohesion. Now we’ve grouped like with like.
You could do the same thing with stores. A convenience store has low cohesion whereas a book store has high cohesion. Relatedly, a large grocery store has lower cohesion than a high-end cheese shop.
Business problems
I’m in the process of looking for a startup idea to pursue. I’d like to pursue this as a solo founder and I’m looking for something that is moreso a “lifestyle business” than a “swing for the fences” type of business. Something “indie hacker-y”.[2]
Given this, I’ve heard pretty consistently that I should aim for:
B2B not B2C.
Something that is monetized straightforwardly via payments as opposed to something like ads.
Something that is priced in the ballpark of hundreds or low thousands of dollars a month. Maybe a rabbit or a deer, not a mouse or whale.
Something where I can do customer acquisition through sales, but that doesn’t have sales cycles that are too long.
Makes sense to me. So then, I’ve spent some time exploring different industries, looking for an idea to pursue.
As I do this I’ve been noticing something that is making my job difficult: the problems people face seem to have a high degree of cohesion. Let me explain.
Suppose you own a bike shop. You have various problems. Various needs.
A way for customers to pay you. Traditionally you’d have a cash register and a cashier. The customer hands the cashier some bills, the cashier hands the customer their product, receipt, and any change they are owed. Nowadays customers use credit cards and stores use POS systems.
To maintain an appropriate level of inventory. If customers want something and you don’t have it in stock, that’s bad. If you have lots of a certain item in stock and customers aren’t buying it, that’s also bad.
Accounting. I don’t really know much about what’s involved here.
To make data-informed decisions. This can be teased apart and broken into a need that is more “terminal” and less “instrumental”, but let’s go with it. If a certain brand of bike helmet isn’t selling well, you may want to drop it. If one is selling very well, you may want to consider increasing the price.
There are more, but let’s stop there.
I don’t know much about bike shops so I’m guessing a little bit here, but it seems to me that these problems are closely related. There is a relatively high level of cohesion at play here. When a customer purchases a product:
It’d be nice if whatever you use for your inventory tracking was updated. “Now we have one less XYZ brand bike helmet.”
It’d be nice if the revenue being tracked in your accounting stuff was incremented the corresponding amount.
It’d be nice if you were able to incorporate this data into decisions about pricing or what hours you keep the store open.
So then, I think there’s something “natural” and “efficient” and “appropriate” about bike shops having a single all-in-one piece of software to handle all of this stuff for them.
In theory this isn’t actually necessary. Instead they could use four different pieces of software, and these pieces of software can “talk to each other”. Your POS system exports data that your inventory software imports and uses. But I strongly suspect that this is often not possible in practice.
Think about it from the perspective of the inventory software. You need to import data from the POS system, but how do you know what the format and structure of this data is? I doubt there’s a standard structure that is used across all POS systems.
So you’d need to know about the structures that different POS systems use and parse the data accordingly. But that means the user of the inventory software has to input information about the POS system they use, which is added friction.
Suppose they’re ok with this friction. What happens when the POS system doesn’t have an option to export data? After all, if the POS system is part of a bigger all-in-one bike management app, it’s probably in their interest to do this. Just like how Apple doesn’t want iMessage messages to be available to Android users. Instead, Apple wants you to buy an iPhone.
There’s also the issue that the act of shopping for software is just not something bike shop owners want to be doing. They’d rather get it over with once and for all with an all-in-one solution. They don’t want to do it four separate times: one time for a POS system, a second time for inventory management, third for accounting and fourth for data analysis.
So… yeah: I feel like there is something “cohesive” about the problems that this hypothetical bike shop owner faces, and that many businesses face. Something that calls for “all-in-one apps”.
And this really makes it hard for me as an “indie hacker” to do what people often recommend: solve one very specific problem. Find a niche. Something narrow and focused. “Zoom in”. This works in areas where problems have low cohesiveness, but not when they have high cohesiveness.
At least that’s how it seems to me. Maybe I’m missing something.
But if I’m right, then I think my path forward involves looking for places where business problems have a low degree of cohesiveness.
Beyond business
I’m sure this applies beyond business problems. I don’t see why it wouldn’t.
I haven’t thought much about this but I wouldn’t be surprised if it had some important implications.
It’s really hard to solve a lot of problems well. The value of an all-in-one product is that you really don’t need anything else. Everything it doesn’t do, or doesn’t do well enough to meet your needs, is a ding against it, and it’s relatively easy to peel off specific problem spaces from the general problem of basic business operations needs.
Here’s a specific example from the company I’m part of (Anrok). We sell a product that aims to replace a SaaS business’s need for an accounting team to be compliant with sales tax & VAT. We compete against both all-in-one solutions from billing systems that offer to also solve this problem because the problem is hard and they are trying to solve at least two problems: billing and tax. Since we just try to solve tax, we can do a better job of it. We also compete against accounting firms who try to offer you all-in-one services, but again same problem, plus the cost is a lot higher because they use humans to do what we do with code.
So I wouldn’t worry too much about the existence of everything apps. It takes a long time to build a good everything app that actually does “everything” within its domain (think Salesforce or Jira), and even then “everything” is often achieved via outsourcing some of the everything to third parties who build plugins and integrations.
I guess it’s a matter of pros and cons and tradeoffs.
On the one hand a product that solves a narrow and specific problem can focus more on that problem and do a better job of addressing it than a general, all-in-one product can. But then on the other hand it still seems to me that the what I propose about cohesion stands.
Using Anrok as an example, on the one hand the fact that Anrok is narrowly focused on tax and thus is able to do a better job of solving tax-related problems works in Anrok’s favor. But on the other hand, there are cohesion-related things that work against Anrok such as having to integrate with other tools and such as customers having to spend more time shopping (with an all-in-one solution they just buy one thing and are done).
I suppose you’d agree that there are in fact tradeoffs at play here and that the real question is what direction the scale tends to lean. And I suppose you are of the opinion that the scale tends to lean in favor of narrower, more targeted solutions than broader, more all-in-one solutions. Is all of that true? If so, would you mind elaborating more on why you are of that belief?
That’s a very common misconception regarding all-in-one tools. In practice, all-in-one tools always need a significant degree of setup, configuration and customization before they are useful for the customer. Salesforce, for example, requires so much customization, you can make a career out of just doing Salesforce customization. Sharepoint is similar.
Thus the trade-off isn’t between a narrowly focused tool that does one job extremely well versus an all-in-one tool that does a bunch of things somewhat well. The tradeoff is between a narrowly focused tool that does one job extremely well immediately, with little or no setup versus an all-in-one-tool that does many things somewhat well after extensive setup and customization, which itself might require hiring a specialized professional.
To use the Anrok example, is it possible to do VAT calculations in the existing tools that the business already has, such as ERP systems or CRM software? Yes, of course. But that software would need to be customized to handle the specific tax situation for the business, which is something that Anrok might handle out-of-the-box with little setup required.
I can see that being true for all-in-one tools like Salesforce that are intended to be used across industries, but what about all-in-one tools that are more targeted?
For example, Bikedesk is an all-in-one piece of software that is specifically for bike shops and I would guess that the overall amount of setup and configuration for a shop using Bikedesk is lower than that of a bike shop using a handful of more specific tools.
I suppose the “little or no setup” part is sometimes this is the case, but it seems to me that often times it is not the case. Specifically, when the level of cohesiveness is high it seems to me that it is probably not the case.
Using the bike shop as an example, inventory management software that isn’t part of an all-in-one solution needs inventory data to be fed to it and thus will require a moderate amount of setup and configuration.
Scaling the business is different than getting started.
To get started it’s really useful to have a very specific problem you’re trying to solve. Provides focus and let’s you outperform on quality by narrowly addressing a single need better than anyone else can.
That is often the wedge to scale the business. You get in by solving a narrow, hard problem, then look for opportunities to expand your business by seeing what else your customers need or what else you could do given the position your in.
To give another example from a previous employer, Plaid got their start by providing an API to access banks, and they did everything they could to make it the best-in-class experience, with special attention on making the experience great for developers so they would advocate for paying a premium price over cheaper alternatives. That’s still the core business, but they’ve expanded into other adjacent products both as API access to banks has become easier to come by (in part thanks to Plaid’s success) and as customers have come looking for more all-in-one solutions to their fintech platform needs (e.g. a money-movement product so they don’t have to manage transfers on their own, alternative credit decisions tools, etc.).
Given your desire to do something that’s more lifestyle business than a high-growth startup, better examples might be to look at similar lifestyle products. In the LW-sphere there’s things like Complice and Roam, and outside LW you’ll find plenty of these that have been quite successful or were successful in the past (Basecamp is a prime example here, but I think Slack was arguably a lifestyle business that accidentally figured out how to take off when they pivoted to messaging away from MMOs, etc.).
I agree with everything you’ve said. Let me try to clarify where it is that I think we might be disagreeing.
I am of the opinion that some “narrow problems” are “good candidates” to build “narrow solutions” for but that other “narrow problems” are not good candidates to build “narrow solutions” for and instead really call for being solved as part of an all-in-one solution.
I think you would agree with this. I don’t think you would make the argument that all “narrow problems” are “good candidates” to build “narrow solutions” for.
Furthermore, as I argue in the post, I think that the level of “cohesion” often plays an important role in how “appropriate” it is to use a “narrow solution” for a “narrow problem”. I think you would agree with this as well.
I suspect that our only real disagreement here is how we would weigh the tradeoffs. I think I lean moderately more in the direction of thinking that cohesiveness is important enough to make various “narrow problems” insufficiently good candidates for a “narrow solution” and you lean moderately more in the direction of thinking that cohesiveness isn’t too big a deal and the “narrow problem” still is a good candidate for building a “narrow solution” for.
To be clear, I don’t think that any of this means that I should attempt to build all-in-one products. I think it means that in my calculus for what “narrow problem” I should attempt to tackle I should factor in the level of cohesion.
This sounds like exactly the sort of problem that a business might pay for a solution to, particularly if there is one particular pair of POS system / inventory software that is widely used in the industry in question, where those pieces of software don’t natively play well together.
I was thinking that too actually. And at the time I was thinking that for cohesion-related reasons, it’s often the case that there just isn’t a market for narrow tools like inventory software and instead the market demands an all-in-one tool, in which case there wouldn’t be a demand for a tool that solves the problem of many formats of POS system data.
But now I’m not so sure. I’m feeling pretty agnostic. I’m not clear on how often the market demand is largely for all-in-one solutions vs how often there is a market demand for narrow solutions.