Ask HN: What's a build vs. buy decision that you got wrong?

326 points by kiernanmcgowan ↗ HN
What are services/products that you built and wished you had bought?

Have you bought something that you had to scrap and build yourself anyways?

278 comments

[ 4.7 ms ] story [ 269 ms ] thread
My company is currently paying through the roof for Datadog. While I'm not certain that it's cheaper to staff a full-time observability platform team, there are a lot of open source off-the-shelf TSDB solutions like M3, Timescale, Influx, etc. that should make maintaining an in-house platform less arduous.
How big is your company? I would try to stick with Datadog until 1000+ engineers at least
The biggest issue here is that you have to hire real engineers to manage the bought product, and they feel dead ended or just waiting for a layoff opportunity.

The institutional knowledge around your data never develops because the engineer whose job it is to manage datadog and observability never gets the opportunity to learn or demonstrate technical depth, and so jumps ship to another team or company literally as soon as possible.

SRE recruiters make this worse, making point after point of gaslighting new hires.

I don’t buy your take at all. Isn’t this like arguing we should be running our own Postgres bare-metal instead of relying on RDS because engineers who work with RDS are “dead ended” and a “layoff opportunity” and will never develop institutional knowledge about our database schema? In my experience working on all kinds of infra, I have 1000 things I need to do, and buying a product that lets me avoid worrying implementing 300 of those things myself is a no-brainer.
If you're spending time jumping through hoops with RDS, then it's very possible bare-metal will be easier.

I don't believe the same is true today but in the past we did exactly this because we were spending a bunch of time banging our collective heads against some RDS idiosyncrasies and it turned out running our own Postgres was a breeze.

Plenty of things can and should just simply be bought. It's not always so cut and dry, though.

All too often the integration costs are overlooked.

Do we spend two engineers to build a system or buy a system (and spend two engineers integrating and maintaining it)? I've seen this happen more times than I can count.

Wouldn't be so sure. Observability tools usually have the highest traffic, highest data volume, and highest availability requirements of any system a company runs. The times you need them most tend to be the times all of your other systems are failing, so having a shared blast radius is a really bad thing. In any microservices architecture, they're multi-tenant systems with plenty of noisy neighbors.

Those factors make running them well both harder and more expensive than running any ol system.

I did triage / performance consulting for a long time with several products in that space, added features to shipping commercial projects, and worked on a product of my own in that space. While in theory you could build your own tool tailored to your specific organizational needs, I can't really say I'd recommend it. In fact, it wasn't completely uncommon for me to replace whatever homegrown tooling had been built with our kit because of scale, features, better UI / time to resolution tools, etc. If you are just doing some basic app logging, sure - roll your own if you want - but if you are trying to do real-time tiered analysis across something bigger than a few servers, there are commercial products that in this day and age are relatively cheap (or at least a lot more affordable than in the past)
I've looked into all sorts of APM platforms and have used most. All the free, open-source ones have absolutely nothing on Datadog and New Relic (which is what we use).

I wish this wasn't the case, but all the time I spent on Honeycomb and various other OpenTelemetry packages simply can't get it done. Automated APM platforms are simply that much better.

A monitoring system is more than just the TSDB. You've got all those pre-built integrations with everything else. All those log, traces and a nice GUI for your user to actually be able to use them.

Currently in the later stages of a Datadog project. Which of course means we are working to get the cost down a little. Modern apps product a lot of logs, traces and metrics.

SaaS solutions for monitoring are usually great except for the cost. You can build (I'd advise going with the Grafana stack) but I'd only go down that route if SaaS was way too expensive.

Monitoring always takes a long time to setup whatever you do. Manually setting up every app, team, server just takes ages.

The elastic stack is pretty good, but you’ll need to either run it on your own cluster/s or pay for the cloud product. It’s likely to be much cheaper than datadog but not quite as good
Have never regretted a buy. Sometimes you need to pivot if price gets too high, but there's always been mitigations and alternatives.

Anything I've seen built that was not contributing business value ended up being a distraction.

Virtually everything in my self-hosted tech stack: Web, mail, specialty apps for CRM and project management... all of it.

I like the control and I like tinkering. But as I've become busier, I realize how much revenue-producing/move-the-ball-forward time I've lost and am still losing by doing all of this myself.

I am spending an inordinate amount of time on my homelab (and the todo list does not seem to get any smaller). But on the other hand this activity gives me a ton of experience that I could not get doing $DAYJOB, and this experience comes extremely handy from time to time.
100%.

What are you running?

- Unbound+nsd for all dns needs

- Tiny Tiny RSS

- Nextcloud

- Docspell

- Gitea

- Youtrack

- Prometheus

- Minio

- Set of wireguard mesh networks for management, monitoring, service access, backups

Almost everything is managed through a single Nix flake with deploy-rs and agenix

::::partial overlap high-five::::

All of my stuff is public-facing and needs more reliability than I can provide via home internet, so I have a rented 1U in a datacenter. Proxmoxing my way through about 20 Wordpress sites, mail infrastructure to handle 100k messages a month for a couple of organizations, Gitlab (would have preferred Youtrack!), Nextcloud, FreshRSS, Mautic, Bookstack, Nextcloud, etc. Really want to dive into Minio on another machine for backup storage.

EDIT: See what I did in that last sentence? More tinkering! Argh!

Minio has been great IME. I have set it up to replicate the backups into Backblaze B2.

I do recommend managing it via terraform from the get go as it will save you quite some time later and lower the wtfs/minute metric.

There's people who use hammers because they have nails that need hammering, and there's people who use hammers because they enjoy hammering.
The folks who just love hammering and teach themselves in their spare time, may well come across an opportunity to hammer professionally.

In which case, nobody will care how they got their skills, whether it was on the job or not. Just that they are really good at hammering and can prove it.

You missed my point. I don't disagree that as long as you're good at hammering, it doesn't matter if you learned it by hammering on the job or because you love hammering so much that you kept doing it by yourself. My point was that some people don't have hammering as a goal. Some people's goal is to make money, and some times that's best achieved by hammering, some times that's best achieved by sawing. But the people who hammer because they like it will try to hammer even when sawing would be more effective.
I didn't get it wrong, but the company I worked for did. I spent 2.5 years creating a sales tool that they dropped the same day I released it. The company went with Salesforce instead.

It was really disheartening to have 2.5 years of hard work dropped like that, but it was absolutely the right choice. They had designed it themselves and it was barely functional. They had a lot of upgrades planned to make it do what they really wanted.

Did you continue with this company?
I did, but I can't remember how much longer it was until they decided to stop giving me good raises, so I left them. I think I got 1 more good raise out of them after that, but then they hired a new CTO and that stopped.

I now think they were desperately trying to pump up their valuation so they could sell, since they did that less than a year after I left.

Can you tell me more about the Salesforce decision? Salesforce is one of those companies that I hear the name a lot, but seldom do I get to read insights about them.
I added some code for our Salesforce integration, but I never actually used it, nor did I see it used. So I don't have any insights there beyond what's already on their own page.
Salesforce (SFDC) provides the customer relationship management (CRM) solution where your entire sales team will view prospects and do data entry on their status in the sales cycle. People build entire industry-specific solutions on top of its (IMO horrid) API and have been doing so since the early 2000s; they had an App Exchange long before Apple had a consumer-facing App Store: https://9to5mac.com/2011/08/26/salesforce-boss-tells-a-story...

It's absurdly complex and had a reputation for being annoyingly slow for any user interaction (though reportedly that's improved in the recent half-decade). If your needs are unusual (say, for a B2B2C multi-sided marketplace where dynamics are counterintuitive and your schema constantly changes) it may be difficult to iterate fast enough with Salesforce. But if you're doing any kind of B2B sales, and you want something that everyone knows, that will grow (however painfully) with your organization, it's the default choice.

Also worth noting that they acquired Slack last year for $27B, and overall have a $128B market cap.

I was in the same boat and finally did an implementation just recently. Salesforce is a crazy beast. At it's heart is really just a CRM. A tool for tracking and nurturing customer relationships. Different businesses have very different kinds of relationships with customers if you're like a giant retailer vs something like selling industrial equipment to manufacturers so making a tool to cover all those cases is hard. Salesforce to me really feels like a UI-on-a-database kinda tool surrounded by a load of data manipulation tools. It's also rife with DSLs (Apex, derived from Java and two custom flavors of SQL). The big thing about Salesforce is just how big it is. It integrates with everything, they have a robust app marketplace and dozens of integration partners, they've acquired loads of complementary software companies like Exact Target, Tableau, Mulesoft and now Slack and Heroku. It's expensive has a ton of operational overhead but everyone in that domain knows what it does and how to use it.
That's just bad management. It didn't take them until the release date to realize that SF was the right choice. They just procrastinated until they couldn't anymore when you released your project.

I had the same thing happen at a previous job. My team built and executed and hit every object and was ready to ship and that's when they decided to inform us that they don't want to ship what we built and wants us to integrate our features into a product they had acquired. Like that decision could have been made 6 months or even a year earlier. Instead they procrastinated until the last moment. I decided to leave the company after that. Seeing 2 years of effort and good execution flushed down the toilet was very disheartening.

I have frequently found myself directed to build something when it clearly would have been better for the company to buy (or use SaaS). It seems like a lot of business owners and managers have some mental block that makes it hard for them to pay for that kind of thing directly, but easy for them to burn shitloads of developer, ops, and support hours doing the same thing in-house even when there's no strong business reason to do so. Totally bizarre.
Workflow engines. Every company develops one base off of queues or some form of async messaging. Works great when prototyping and your initial customer base. Works less great as you grow, add more complicated features, and realize you didn't have the distributed systems expertise to write this thing to begin with. It doesn't handle any of the common edge cases, and is increasingly painful to operate, needing constant babysitting.

Use Temporal, StepFunctions, something and try to avoid this urge.

Workflow engines are the most difficult thing to sell in organisations as the usecases are open ended. Organisations needs certain level of maturity to understand that they need one
That and a lot of engineers are genuinely excited to build their own workflow engine - whether they call it that or not - because it’s complicated and it feels like they just discovered a brand new and powerful abstraction.

Tears follow when the team either doesn’t account for all the edge cases or doesn’t have the resources to address them.

People assume all workflow engines need all complicated document logic and business aware routing.

We built one for a medium sized business without any of that. It's essentially a form system where the users can select the next destination for the form's approval on their own. Users understand the business process and are responsible for implementing it in any other context, turns out, they are capable of managing it in an online forms system as well.

Then all you really need is an auditing system that tracks all the states the document has moved through and displays that to users who are making decisions based on the form and that state. Add "final approval" and "return for revision" and "recall" states and you're pretty much set.

No business specific logic. No need to keep the system configuration in sync with the organizational chart. No need to build "vacation delegation" or "user impersonation" features. You just need to keep the forms up to date with the business use cases, the users will manage everything else on their own.

Our system has been in place for around 6 years now. We do maybe two form updates a year. We have not changed the backend code or system logic since it was deployed. The only other support issues we have to deal with are when the LDAP integration configuration needs to be updated.

In a way your solution sounds like a JIRA tickets. Not criticising but a lot of upper middle management want guard rails.
To a certain extent, that was certainly the idea, the main difference would be that once a flow is started it is not editable. It has to be returned or recalled to be changed, and then the audit trail starts over again.

That's also a valid criticism. Especially if you're expecting a lot of automated processes to be kicked off once an appropriate approval chain exists. This really is only well suited to businesses where there are limited opportunities for automation. In this particular case, once they recognized that all of the terminal business process steps are mostly manual anyways, they understood the utility of something so simple.. and cheap.

I'm glad you got a solution implemented out of it. Nice to see reason win the day.
Nah, it sounds like Lotus Notes.
"Workflow engines" and their close cousins "DSLs" are the ultimate newbie trap. In theory, it's awesome for everyone: programmers get to work on interesting, abstract problems like distributed systems, syntax parsing, event-based architectures, and "business users" get to make changes to "business rules" without bothering developers or impacting feature roadmaps. Win-win, right?

In reality you just end up making a shitty, nerfed version of a programming language, that business users can't understand, because you still have to understand conditional logic to model workflows, oh and your documentation is terrible because devs don't bother with the boring stuff. Most of the time the devs end up implementing the workflows anyway because they don't actually work properly.

If you really need a workflow engine definitely use something off-the-shelf, but I would go so far as to say that in the 95% case, you don't even need a workflow engine: you need a developer who is capable of writing some python scripts. Even if you pay a developer a full salary to do nothing but sit around and make changes to Python scripts on-demand, that's still going to be way cheaper than the complicated workflow engine solution, which will probably require a team (or multiple teams) to maintain.

> the complicated workflow engine solution ... will probably require a team (or multiple teams) to maintain

You can get these "as a service" which might scratch the itch for some.

(Disclaimer: I work for a company that sells Airflow-as-a-service and adjacent consulting)

With some tweaks to your second paragraph, the description fits CMake:

In reality you just end up [with] a shitty, nerfed version of a programming language, that [...] users can't understand, because you still have to understand [CMake's] logic to [utilize its magic behavior], oh and [the] documentation is terrible because devs don't bother with the boring stuff. Most of the time [you] end up implementing [workarounds] anyway because [CMake doesn't] actually work properly.

It will work that way with anything :)

Especially gradle.

While Cmake has a large share of idiosyncrasies, a build system is much more graph oriented and must therefor at some point have a way to declare such dependencies, often using a DSL, for concurrency and incrementals to be reliable. Lets not forget IDEs that need to understand the project structure as well.

Workflows on the other hand are more conditional and imperative, mapping better to normal programming languages, with the exceptions of transient error handling, long timers and distributing workload. Here, writing a custom DSL would be a much bigger mismatch.

Best for build configuration would be a hybrid, where the declaration of dependencies is done with normal programming language, which at the end calls a build(dep_tree)-function where all the magic happens. With the risk of developers abusing this setup-step and run half the build in their own reinvented imperative flow here instead... trust me, I've seen this happen even in makefiles that run shell commands outside of targets. This is what Scons tries to be, it seems however not to be very popular compared to cmake.

Isn't Scons abandon-ware? I remember it being part of the build setup at work at some point and it caused quite a bit of frustrations because it broke every now and then. I believe it was mainly failing on Windows.

Conan's recent development is promising and it gives you the full power of Python. It can also be used declaratively but with limitations. If I remember correctly, there are discussions in the C++ world about a declarative exchange format for dependencies and build information, but it's in the early stages. It's not trivial because there are also C++ modules now.

Damn, this hits the nail right on the head.
This reminded me of the time I wrote a mini-language for querying web server log files and generating reports (this was early 2000s) so you could answer questions like "how many users searched for 'cyprus flight' per day and went on to purchase a holiday?". With a nice web-based interface etc.

It was a disaster of course. The business people weren't programmers, had no understanding of programming, didn't want to learn programming even greatly simplified with docs and examples, and I ended up translating their queries into code anyway. So essentially I had written a DSL for myself.

I agree about the limitations of DSLs.

Temporal is a workflow engine that doesn't use a DSL or nerfed version of a programming language. It runs your arbitrary code with any of the supported runtimes (currently Go/Java/Node/Python).

I'm able to write, deploy, and maintain workflow code by myself and use their cloud service for persistence and admin UI.

You're probably thinking of a different type of "workflow engine" than what Temporal is. It's not something where business people drag boxes in a GUI. It's still all code, within your code base, only with different approach to handling long running (whatever that means in your context - 2 minutes or 2 years) tasks.
Low level infrastructure of any kind is the worst.

Programmers love to work on it, so there's never a shortage of good implementations, companies need it, so some of them get proper funding and teams, and yet it's really hard so there's no way your DIY solution will have the features of the big ones, and it probably won't have the reliability.

And worse, you'll probably need to learn and support the existing thing anyway, why not just skip to it?

>"Workflow engines"

I actually had quite opposite about this particular area. At the time we were to develop particular product for a client company. The product would've greatly benefited from using workflow engine. I did some shopping around, talked to sales reps and have discovered that we would have to shell out at least $350K for our particular case. So I've proposed to the boss that I would quickly build one that would cover basics. The boss has agreed and I built it in about one month. It worked fine for what it was intended for.

After a while we have approached a vendor (the one we would have paid those 350K for their wares). We showed them what we have built, how it was used. They were impressed enough and we became sales and implementation partners. They have routed a gobbles of jobs, training and installations for us to do.

As for original home built engine - over the time we have replaced it with the one from our partner without much troubles.

Win win for everyone involved

I had very similar experience. We built a custom workflow engine, with visual designer in a few weeks, which then went with our DMS custom solution. Any workflow engine we tested, before or after the build, was either too complex or too expensive. We had few bugs and newbie mistakes in ours, but nothing too bad. We sold few more installations quickly because we could implement any customer need promptly. It's now more than 10 years and I moved on, but the company is still selling the engine with other solutions. I would say, a big win for build vs buy.
Temporal has really solved so many problems for us it is only opinionated about a few things that actually matter, and gives you complete flexibility otherwise.

The days of Airflow and similar seem like a stone age in comparison.

Is Temporal meant to be an Airflow replacement? The website exclusively offers examples of executing multi-step core business logic and not ETL workflows.
It’s for whatever your code can do, same as Airflow.

One of the great things a Temporal workflow can do is can send or wait around for signals from external processes, indefinitely if needed. It’s much easier to start orchestrating things you already have. You don’t really need to buy into it as much as you do with Airflow. If it exceeds retries or timeouts, it can send a signal or launch a process to notify a human that something needs fixed, then someone can intervene, then notify the workflow that it can keep going now. Airflow is much more all-or-nothing success or failure in my experience. Very hard to re-enter the workflow after something got twisted.

Certainly Airflow has more ETL integrations at this point in part due to how much longer it’s been around and the use cases it’s been evangelized for.

I had never worked in place that had much investment in the ETL integrations, we used dockerized processes and just the docker operator, as it was easier to develop and test independant of an airflow instance.

So, when looking at Airflow some time ago it looked like it was good at 'fixed workflows', something like, fetch last day's data from a website, process then load it at the DB

But it seemed it was bad at more flexible ones, like, load data, then process each entry in a certain way, then trigger a new workflow based on each entry (like send an email to every entry on the data fetched based on some condition)

Does Temporal does this?

Yes, Temporal workflows are as dynamic as needed.

The other useful pattern is always running workflows that can be used to model lifecycle of various entities. For example you can have an always running workflow per customer which would manage its service subscription and other customer related features.

Major benefit of Airflow is the number of already implemented integrations. Importing data from GCS to BigQuery, copying data from Postgres to GCS, KubernetesPodOperator and so on. IIUC with Temporal you get only workflow management which can be easily integrated with any application to implement business logic. And this is great, because implementing business workflow in Airflow is even more awful than the Airflow itself. But for any ETL or plumbing job Airflow is IMO better due to existing integrations.
What exactly is a workflow engine?

At a previous job, we had a fair amount of celery tasks and logic around starting them based on user input or on a schedule, retrying on failures and marking progress or cleaning up state in various databases.

Is that a workflow engine?

Sure.

Open source analogue would be Apache Airflow.

Abstractly, it's some directed acrylic graph (DAG) that is asynchronously computed, sometimes on a schedule.

Unfortunately, most things fall under DAG. But the framework / engine exists to manage the complexity of the ever-extending pipelines declared by the engineers

Event/push-based workflows also fall under this taxonomy.

why acyclic? review steps can send stuff back to previous input steps, can't they?
It is usually better to have explicit returns.
Yeah, I mean, the computation can be re-materialized.

DAG may too specific. It's really a dependency graph, that likely has a DAG topology.

What makes Temporal a "workflow engine" rather than a background job runner? I think I used Active Job or its like a career ago in rails. The docs on Temporal are showing me retries and storing results of the job. That does seem useful!
Temporal jobs/tasks are called workflows because the code is effectively translated into workflow steps—i.e. code progress is made by workers, and each step is persisted so that if the worker dies, you don't lose anything—another worker picks up in the exact same place in the code, with all local variables and threads intact. It also provides helpful built-in features like retries and timeouts of anything that might fail, like network requests, and the ability to "sleep" for arbitrary periods without consuming threads/resources (other than a timer in a database that is automatically set up for you when you call `sleep('1 month')`).
This comment is just too real and too precise.
> Have you bought something that you had to scrap and build yourself anyways?

Yes, but that hasn't meant it was a mistake -- 'buy-then-build' can be a great strategy. Often the 'then-build' never happens, but going into a decision with the mindset readiness for 'then-build', you can learn from existing products, hit their limits and understand what is the custom version of it you'll need in your context. Recent examples are on smaller scale, though - using a library that speeds work up early, hitting its limits, and replacing or extending with DIY that does less things but goes deeper for my use case.

> What are services/products that you built and wished you had bought?

The most annoying recurring version of this has been being just a little too early - building something, then discovering a few months or years later a public product that does the same, but better. At that stage, rebuilding to use has low ROI, and one ends up maintaining a legacy monster. There was a period when public offering of supporting backend infra was maturing, ie things like secrets/configuration management, logging, observability, monitoring, a/b tests, a bit earlier even basic web frameworks (ie building anything on PHP before Laravel came out meant you built your framework first; iirc worse than the frontend framework landscape in 2022).

I 100% agree with your second point. Case in point, my previous employer built an in house development platform to create ephemeral environments and run deployment pipelines for production. At the time, around 2016, there weren't many (or any? I wasn't part of the research time) options to buy this type of software. Today, there are more than a handful in this space.

I wonder at what point companies would finally bite the bullet and swap to buying? Maybe cataloging the feature set of the internal software, seeing what is a necessity, and seeing which vendors can cover those requirements?

Time travel, time travel, wherefore art thou time travel.

When it comes to build versus buy, there are only right answers with hind-sight.

>> Maybe cataloging the feature set of the internal software, seeing what is a necessity, and seeing which vendors can cover those requirements?

Feature set is part of it. Longevity is another. (been relyinb on Google Reader lately?)

Cost us part of it (internal is usually more expensive, but not always.)

Flexibility is another - building up the knowledge and expertise helps morph the system to your needs, not the other way around.

I'd say it's mostly better to buy, you'll likely get much more for much less, but it comes at a cost beyond just money. Beware of things on your critical path, to which you are beholden to outside "partners".

All that said, I think developers err on the build side way more than they should.

> Today, there are more than a handful in this space.

Really? I was a DevOps engineer a few years ago and can't really imagine a useful tool in that category so I'd appreciate a few names I could check out. While I've switched to frontend development, I'm still interested in CI/CD and just can't imagine any tooling being able to make it easier then what we had back then too (ephemeral envs using docker-swarm/k8s and pipeline triggers, basically)

Vercel, netlify, aws amplify, google app engine come to mind. Not sure if they’re strictly better than the setup you describe, but easier to get started.
… interesting.

So we went the "build-then-buy" route with Netlify. AFAICT in hindsight, what we built was more stable than Netlify, and had the same interface for devs, basically. (… and might have been operationally cheaper.)

(It's all moved to an -and-buy-another-different-thing-for-no-real-reason-other-than-different-people, now.)

Infrastructure automation tools like Pulumi or AWS CDK make this relatively straightforward... just deploy a new stack (or use the APIs to automate a deploy/test/destroy cycle.)

It's even possible with good old Terraform, used correctly.

At my previous job the company heavily relied on an industry standard application. This app basically had a monopoly on that particular industry. However, they were pushing the app beyond the limits of most other companies. It was also just generally an old and busted Windows 2000 era kind of deal.

When I first arrived, and knew nothing, they told me we were going to build a replacement. That sounded great to me at the time. Obviously the right thing to do is replace something old and busted.

Well, I and the company learned over time that actually that was not really the best business strategy. It may have been possible, but not with the resources we had available. I ended up doing a whole lot of work that went unused, through no fault of my own.

A better strategy is to first move a small part of it out of the system. And not go for a complete rewrite. And then make sure the old system can work as a proxy for the new system, or vice versa.

When both can be used simultaneously you can now gradually move from one to the other, or revert back as needed.

This is what I followed.

It reduces risk of failure but can end up costing more in the end. It's like doing a home renovation piece by piece rather than all at once: if you have the capital upfront and an experienced professional, doing the whole reno at once will be cheaper.
If you need to keep things running and to make changes while doing the rewrite, then you might not have any other option than the Strangler Pattern.
I built an entire custom e-commerce platform - product catalog, cart, checkout, CRM, order tracking, fulfilment management and back office. The site is a print on demand store, using contract printers. In hindsight I wish I had gone with either an off the shelf package or taken the punt on Shopify (this was 2012).

My assumptions around how much integration our custom product customiser/editor needed with the rest of the e-commerce platform ware wrong. I thought I need a user system and "saved designs" for the customers, but that's somewhat rarely used, and could have been bolted onto a standard system.

Maintaining and updating it is extra work over what the core business is, there is now a lot of custom code to fix old assumptions and implement features that we didn't previously expect. All of which come as standard with Shopify.

We also believe that customers are increasingly used to seeing the Shopify checkout, it is a reassuringly familiar experience. I suspect it has a measurable effect on dropouts.

If I was to start again now I would 100% just use Shopify, no question. We are considering a large project to move to it. It would be quite satisfying to delete all that code. But it would probably bring new problems, and thing we are used to being able to customise that we will be unable to.

Do I regret doing it? No not really, hindsight is 20:20. A lot of lessons were learnt, but that enabled us to build a successful business.

I did this same exercise circa 2002. At the time there really weren't any good options (at least none that I was aware of) so I was pretty much charting my own territory. It took the business well past $1,000,000 in revenue before they switched to some off the shelf package long after I had moved on. I guess it wasn't too bad for a comp-sci student with no e-commerce experience and little serious programming experience.
Too funny - did the same thing in 2009 for a print on demand greeting card site. Wonder how many of these are still around. Cardstore, Greeting Card Universe, SendOutCards, etc. There was a moment ~ 13-15 years ago...
We are repeating this process because the Shopify API, library infrastructure, making it difficult for us to manage our 30K products. It takes 5 hours to sync our catalogue via the Shopify REST API. The once amazing Shopify API gem regularly breaks.

Additionally, the admin interface is slow and buggy, lacks the necessary information to effectively pick and pack orders at scale, and is unable to handle multiple kinds of inventories (local vs supplier inventory) and lead times.

Furthermore, it takes 47 clicks to ship a product (together with Australia Post), whereas our system can do it with one click. This saves us just under 2K hours per year. Our system also integrates with a robot[0], which can automate the shipping process further.

Our system removes the siloing of data which is a huge problem when it comes to effective ecommerce customer support, and followup service. An example of this, our system tracks deliveries to customers, so we can touch base with them when an order is delivered, or reach out when an order is awaiting collection at Australia Post.

[0] https://raspberry.piaustralia.com.au/pages/the-raspberry-pi-...

Sounds neat. Tell us about the problems with it.
Could you plaese be more specific on "it"?
Not a decision I've got wrong, but I'd suggest authentication services are a common regret. Yes authentication is important to get right, but it's not _that_ complex. SaaS tools for auth are incredibly expensive for the feature set they offer, and are difficult to replace once embedded in your services. SSO in large scale business is a case where buy is the right option but I'd anticipate that for many simpler use cases teams have to work hard to unentangle themselves from Okta etc.
I twice worked at companies that built authentication as part of their application (using open source libraries, not from scratch). It's a mistake, and a mistake that's very expensive to fix later. Even more expensive not to fix given the sensitivity of this area of software.
All the companies I worked with in the last 15 years had custom auth (all bcrypt in the end).

Nothing bad ever happened. They're still rocking the same system and the only notable change that went through was adapting to gdpr deletion requests. And they all avoided that okta hack from some time ago.

What's expensive mistake are you talking about?

I feel like authentication itself is probably straightforward, but there's a lot of boilerplate for account management that these services provide. Creating a new account, resetting a password, etc.

I'm thinking of firebase specifically. I'm using it for a website I'm building and I've spent very little time on integrating and using it. Quite less than it would take me to write the stuff myself.

I work at Stytch, a company that provides auth services

> Yes authentication is important to get right, but it's not _that_ complex...

Though I agree in some cases, I think that authentication complexity is rapidly changing and providing a _good_ authentication flow is not straightforward.

Consumer adoption of Passkeys, biometrics on mobile, OIDC/OAuth etc is really starting to take off and that really complicates your login flow quickly.

The eng time to get auth done right (and importantly securely) is not trivial, nor is maintenance. Even companies who's core competency is security get hacked (LastPass just this last week), it is that much harder to worry about when that isn't your core business.

> SSO in large scale business is a case where buy is the right option...

100% agree; any team that I've talked to wants solid, off the shelf SSO to add into their product within a sprint and doesn't want to embark on untangling the SAML/OIDC knot.

> ...teams have to work hard to unentangle themselves from Okta etc.

Agreed, a huge complaint that I hear all the time. Okta/Auth0 have decided to take the interesting road of increasing cost per user as you scale rather than offering volume discounts.

Whenever you're considering SaaS, it is critical that you look at cost per user over time and make sure your contract scales with you instead of explodes when you cross a threshold.

I'm looking forward to your SSO product. I hope that it adopts the same developer friendly pricing as your current product.
Authentication is (usually) not that complex, but identity and authorization are. I've seen plenty of institutional regret when each application has its own pool of users and an internal authZ system.
Authorization is one of these areas that has traditionally been viewed as too hard to extract from the application, but it's core to no one's business and in recent years lots of companies have started to use authorization products. I'd chalk this up to:

1) Better abstractions for disentangling authorization

2) Better technical literature on the subject [1][2]

3) Increasing comfort with third-party infra services (RDS, LaunchDarkly, etc.)

Note: I'm cofounder of an authorization-as-a-service company (Oso) [3]

[1] https://www.osohq.com/academy

[2] https://research.google/pubs/pub48190/

[3] https://www.osohq.com/

I thought I was alone on this one. I feel the same way.
Authentication is a nightmare web of complexity to me that takes me away from the differentiators to my product that provide value. If I spend all that time and get it right, I might save $10 a month in a cloud bill. If I get it wrong, terrible, terrible things happen.
You can certainly pay $10 and still have terrible terrible things happen.
Shameless plug.

Our company (https://aembit.io/) solves auth problems (specifically identity and authentication between workloads).

I have been doing security and auth for the last 20 years in different shape and form. It's a minefield. Grabbing and using some SDK for auth is simple. Making sure that you account for the whole lifecycle (identity, authentication, authorization, secrets management, secrets rotation, addressing vulnerabilities as they pop up) is incredibly complex.

It’s hard to get right. In my experience plenty of developers fool themselves into thinking it’s not that hard. The problem is they’ve never read an NIST standard or spent time learning state of the art black hat techniques. If you don’t keep up you’ll implement something out dated or broken and not even know it.
We built our own elaborate auth system.

Soon afterwards keycloak came on the scene and negated a lot what we had done.

I've spent a better part of last week upgrading Keycloak docker container from 13.0.1 to latest (and then rolling back the changes after I failed to make it work, I will try again after New year). IMHO, Redhat just introduces breaking changes on purpose to force you to pay for their single signon thing.

Installing and configuring it was relatively easy. Keeping it up to date and secure is a different thing

I think auth SaaS is very expensive, but I’m currently playing with on-prem Zitadel, and it’s very good so far.
I agree, but only in a consumer environment, such as games and other trivial consumer apps with a lot of free sign-ups, when storing none or very little PII, where SSO/etc aren't ever going to be required. These SaaS products are far too expensive for free consumer apps.

Otherwise, if you are going to be selling into the enterprise and the majority of your users are paid, this is an area where using a SaaS tool is a no-brainer. Your sales team is going to run into customers that need XYZ-compliant auth and it's solved out of the box with the SaaS and cost isn't an issue since it'll just be baked into the per-user pricing.

(Note: I work for Passage.id, now part of 1Password...)

Auth is pretty easy to implement, but difficult to get and keep right. Then there are the nooks and crannies that crop up and appear and get discovered that you have to be aware of and keep up with. I am of course biased, but it seems to me that paying a company to keep up with the rapidly changing environment is much more efficient than trying to do it yourself.

And with WebAuthn and Passkeys -- you can implement that yourself without too much trouble. It's not trivial but not impossible, but the same argument applies -- nooks, crannies, corner cases, risks, etc.

I recently had a conversation with a colleague who mentioned:

“We can only be great at one thing. The rest we can only be good at.”

This doesn’t quite answer the question, but I think it’s related.

The software that ran the "core business" of the company. The CEO and I decided to not hire an off-the-shelf solution, which would do everything that we wanted to do, but would put our data into the vendor's hands and we thought that it was not worth the risk. After all, we are gonna be huge and our data is our oil!

A few years later, our internal version of this software was crappy and our data was still not something that we could monetize. In the future, I'd refrain from being too cautious at the beginning when you are facing bigger risks that may not be sexy, but are very dangerous.

It's amazing how the attitude about not wanting to put data in the vendors hands has changed over the last ten years.

I remember having a hard time to convince our CEO to use BitBucket in 2011 because our precious code (that no one would actually want or could actually understand.....) was going to be "in the cloud".

I bet there are many firms that gave into the fear and regret it now.

Interested in hearing any tales of build vs. buy for CMS. Anyone have anything to report? Medium/large size company usage would be interesting to me.
I've worked at 20 people companies and 2000 people companies, and can never recommend building a CMS. There are so many out there, and the one you build will just have a different limitation to the one you buy.
I second that. Any CMS-like system that you attempt to build with some customization will fail to implement some core elements of a CMS that you can adopt - be it versioning, publishing, workflows, etc.
Yes. Buy a CMS, and then cache the ever-loving shit out of it so it’s flaky slowness can’t affect your production delivery
Man… just about every woodworking project ever.
Do you enjoy woodworking? Or do you do it to save money?

Just like with coding, it's best to start small so you get better at the core skills. Building a chess board as a first project is like learning Javascript then trying to build a github clone, you're just setting yourself up for failure.

I've seen a project outsource a core component "to speed up development". Turns out integrating with a 3rd party service added similar level of completely, all the design decisions had to be made around 3rd party system which constrained the project pointlessly. Project eventually got scrapped - part of the reason was that their core component wasn't even their own and they would have to renegotiate the license to pivot.
Definitely had this happen in recent memory. Also the thing to be careful about here from experience is you still need to qa the contractors deliverables. Team had a contractor delivering features and it turns out what was “delivered” many times didn’t actually work. Wasted several months of my engineering time babysitting and validating said contractor. Net result was wasted time and money as we just ended up reimplementing ourselves.
Yep, this was part of the reason I said integration vs developing in house would have been similar level of complexity. Pitching to our management "everything we requested was already covered by their system, it's just a matter of exposing it publicly and configuring it for us". Reality - we would hit blockers regularly and we were basically dealing with a black box system + cross org communication delay. It was obvious that some of their shit wasn't even tested before shipping, let alone done before we singed.
Magento Cloud... a.k.a. platform.sh was exactly that.
Oh I have such a good answer for this one: a camper van.

TLDR: I wanted to travel the US and explore national parks in a camper van. I'm handy as a builder and knew that I could, technically, build everything. Turns out that the challenge wasn't in the technical aspect but rather the sheer volume of work involved.

A little more detail: Having grown up around 4x4 vehicles, I wanted something four wheel drive. No full-sized American made vans come from the factory as four wheel drive. Even if you find a new 4x4 van on the lot, it will be an after market conversion. This means that they're harder to find and, thus, cost a bit more than your typical 4x4 truck. But I was determined. I found a 1987 Ford Econoline in rough shape for around a grand. I bought it, named it "Polar Bear," and set to work on it.

One of the biggest setbacks for the project was the ongoing expense and hassle of repairing an old van with a custom conversion. I learned more about automotive mechanics with this vehicle than anything else I've owned. Still, a lot of repairs were well beyond my scope and I ended up spending tens of thousands of dollars rebuilding various components. Repairs were a near constant problem and this drastically slowed my build process.

Another hitch in my plan was fuel economy. Polarbear would take me a mere 9.5 miles on a gallon of gas. With a 3-speed transmission, the engine was always running at a high RPM. The alternative factory transmission with an overdrive wasn't as strong as the 3-speed and the gas mileage was only nominally better. After extensive research, I learned that a manual 5-speed swap could be done and would increase my MPG to over 20. However, with all of the expense and hassle of installing a clutch, I never took on this endeavor. Ultimately, I never did that national parks tour. I did, however, go a whole heckuvalotta cool places.

The camper conversion, which was supposed to be the focus, took me a solid ten years to finally complete. There are a lot of rather sloppy looking camper vans in the world and I really wanted mine to look good. This meant taking time on the details. And oh my, where there details. Unlike a box truck, a cargo van's walls are all continuously curved. Cutting wood to smoothly fit the curves of the walls is tricky and takes time to figure out. I also learned a ton about automotive and RV electrical systems in the process. When I began, I imagined a very complex system. I quickly learned that the more simple the design, the better the design. Everything has the potential to break and the more complex it is, the more likely it is to break. In the end, I decided to entirely skip water pumps and simply went with a gravity based system. And despite having a propane tank mounted to the van, I opted to use a portable camping stove instead of running more propane lines. In my opinion, these were good decisions.

Over the course of ten years, I spent enough money to have bought a nice completed rig right from the start. At the very least, I could have purchased a completed 2wd camper and had it converted to 4x4 for far less money. This would have also given me a more modern 4x4 drive train and suspension.

Still, I have no regrets. What I learned was priceless and the adventures I had along the way are some of my best memories in life. I finally sold the van last year for almost 10x what I paid for it - but far far less than I had invested in it. The following link is the build thread I posted to the Sportsmobile Forums for anyone who may be interested in seeing what she looked like:

https://www.sportsmobileforum.com/forums/f24/polar-bear-1-a-... (the last page has the final pictures)

Typically, home renovations and custom vehicle builds/resto-mods have negative payback. You do them for the personal enjoyment you get from the end result, which it sounds like you got.
You can't buy some locations, so home renos oftentimes make sense.

Vehicle builds rarely, if ever do. Unless you absolutely, positively, must have an electrical motor in a Javelin or something.

Yes but it's worth understanding that houses rarely sell for more than average in the area. An "overimproved" house is likely not going to recoup the money spent. Of course if the house is very dated or hasn't been kept up, simple updates like paint, carpet, new appliances, etc. can be inexpensive enough to be worth doing.

If you're renovating because you want to continue to live in and enjoy the house, it's more a personal question of whether spending the money will increase your happiness.

Thanks for posting that. I clicked through a bunch of pages and read a decent portion of your journey.

I really want to try the van thing but there are a few hard factors preventing it for me. So, I live vicariously through such accounts from time to time.

Have you tried renting? I love the folks at GoCamp [1] (no affiliation, I've just rented from them) and they've been great even after getting acquired by Storyteller.

[1] https://gocampcampervans.com/

Thank you for the suggestion! Health issues in the family make this sort of thing impossible for me.

But, I think it's highly possible your suggestion could help somebody else reading this and in any event, I definitely appreciated your effort. Thank you.

Yes, this is exactly why I bought my campervan (2017 promaster 2500) already built out by a youngish kid who wasn't a professional, but sure made nice instagram pictures.

It certainly cost me a lot more than just doing it myself, but by doing it this way, I achieved two goals: immediate use for camping and the ability to figure out what I would do differently by living in it first.

There are a few things I learned pretty quickly:

1. Get rid of the "fancy" toilet. Just use a bucket with eco bags that can be buried or tossed into a trash can. No cleanup mess, lighter, and frees up a lot of valuable space.

2. Moved the sink from the door side and put it on the other side of the van next to the stove (there was an uncomfortable seat there before). Again, freed up a lot of space and made better use of it.

3. Removed a lot of hidden unnecessary support wood. Like in the backs of cabinets against the walls. People don't realize how heavy that stuff is and every extra pound affects van handling and gas mileage.

The list goes on and on, but one thing I did learn after taking my van into cold climates... insulation is critical and very hard to add after the fact.

In the past I've built servers by carefully selecting parts, calculating maximum power usage versus airflow, calculating full time electrical load, building, testing with fans disabled in rooms with high ambient temperatures, looking for failure modes, researching failure rates of specific power supplies and drives, et cetera.

I'd build one or two, test them for several months while making adjustments and fixing various weaknesses, then I'd build ten, twenty, however many were needed.

One particular client decided they wanted to skip all that and just spend the money on Dell. They didn't have many servers, certainly not enough to justify a separate server room. Their offices weren't air conditioned at night, and they had an entire summer where one server or another would become unresponsive over the course of a weekend, and sometimes at night between weekdays. Accessing iDRAC was beyond what they wanted to do, so of course I had to do that.

They had Dell support, but Dell had no "fix" for unstable machines other than to tell them to build a server room. Mind you - the ambient temperatures were always below 100º - any reasonable person would say that while that's not ideal for servers, "premium" servers should still be able to handle warm rooms, particularly when they're idle, and not crash or lock up.

After that fiasco, they gradually replaced the Dells, one at a time, with machines I built. I wish they had tried harder to return the Dells, but they just wrote them off.

I've learned that any savings in time and money (mostly - the Dells cost more than the machines I build, even accounting for extra billable time) aren't worth the loss in time, productivity and reliability in the long run. Of course, the opposite would be true if I just wanted more billable work, but I can't do that, unlike many others in the field.

BTW - when I build a new generation of servers, I do months of testing, but the same general platform can last a good five years, like Ryzen 1000 through 5000 systems with ECC have lasted since 2017.

I might have a consulting gig for you if you’re interested. Let me know how to get in touch if relevant!
Sure, I'd be interested. My email address is john at klos dot com :)
Is there much business building custom rack mount servers for people? I would have thought that market would have been taken out by the big brands.

Do you have a favored brand for server motherboards?

I do something similar as part of a team that builds bespoke equipment (can't be too specific). It's a full time job for 2 people for runs of around 50 custom half-racks every year. It's definitely a niche, but there's demand for sure.
ASRock makes some good motherboards, and all support ECC by default.

Somewhat related:

I don't like server motherboards like those from, say, Supermicro, because they don't care very much about security. For example, they've had motherboards for years that let you share the primary ethernet with IPMI. Is there a way to disable this? No. Is there a way to force IPMI to ONLY use the dedicated ethernet? No - the settings are stored in the battery backed memory. Wouldn't a jumper make sense? Sure, but they don't think so.

What this means is that if your motherboard battery dies and your dedicated IPMI port is somehow disconnected, your server can be completely, 100% taken over via the public interface. While it's not a likely attack scenario, the point is that if you have a need to ship servers to various datacenters, you genuinely can't be sure that your server won't be utterly vulnerable on first boot unless you're there, confirming it yourself.

Does Supermicro care? No. They refuse to consider the loss of all security due to a dead battery to be a security issue. Having a security issue is one thing - ignoring it when told about it (or worse - pretending it's not an issue) is something else entirely.

While fun and enlightening, my Toyota SR5 EV conversion was twice the cost of the used Nissan leaf I had before it, and apart from the stunning good looks (IMHO) has crappy range and all the other drawbacks of a 1990 car. My BMW 528 conversion I started in 2019 will probably never get 100% finished as I always seem to need another fix to get something to work properly, last year the wife got tired of my efforts and bought a Model 3. (Sigh!)
This reminds me of situations where people “buy then customize”. Such as buying a payments gateway, then using its internal RDBMS tables directly for reports and integrations. Or buying Great Plains and then massively building on it.

Then one day these products eventually go EOL and the company is often stuck maintaining a zombie product. Or the products undergo a major refactor that breaks their customizations and integrations, and they end up stranded forever on version X.

I hear ERP systems often go like this too.

The only thing worse to me is entire huge products built in stored procedures. I know one product that was written in about 2 million lines of PL/SQL. It did some amazing things, but we were locked into PL/SQL for all time, and the Oracle scaling bills and HW were astronomical…

> Then one day these products eventually go EOL

This happens with any product you buy. Dealing with it has to be included in the value proposition.

> we were locked into PL/SQL for all time, and the Oracle scaling bills and HW were astronomical

Yeah Oracle is expensive. Scaling costs should have been part of the calculation to commit to it. For most orgs that use Oracle, the cost is not really an issue in the grand scheme of what they spend on IT and servivces.

I agree, all products die, but how you integrate is all the difference. When you start reaching into the private guts of the system (in this case, the database), you are hopelessly intertwined with them. There are much cleaner ways to do this that makes a migration to something new a lot less painful.
Yup, they are better off making small changes to their processes to fit the ERP system, instead of the other way around.
I wrote about this at length in my book, and hopefully this part will fit within the limits of a Hacker News comment. What I got wrong: I thought this work needed to come in-house, but in the end that was not the crucial issue. The crucial issue was building a trusting, long-term relationship with the team, and that team could have been an out-sourced team.

Open Verse Media

When I first started, in 2016, at Open Verse Media, an ebook publisher, they asked me to look at their content management system (CMS/CRM). The staff had to rely on it, but it was very slow. The COO, whom I'll call Robin, had overseen the creation of this app. The actual work of creating the software was outsourced to one firm, but after two years Robin felt they were too expensive. She fired that first firm and then hired a firm in Ohio, which I'll call MegaStars.

The app had been built using a popular software framework called Ruby On Rails. Whenever Robin felt that a new feature was needed, she would ask MegaStars to add the feature. MegaStars billed $500 an hour, and over the course of seven years, a total of $3 million had been spent on the creation of this app.

The staff hated the app. When the head of marketing wanted to bring up the top 100 best-selling books, they would click on a link, and it would take a full 60 seconds for the page to come up. The staff had gotten used to the fact that they always needed to be engaged in two tasks, that is, something to keep them busy while they waited for the pages in the CMS to render. An advanced search, with multiple filters, could take up to five minutes to render a report. Many of the lower-level staff would simply go into Slack and engage in gossip with their peers while waiting for each page to slowly appear.

So on my first day I logged into our main web server, and right away I could see that the app was generating several thousand errors each hour, all of which were being written to a log file. Since this app was single-threaded, the work of writing the errors to the log file had to happen while each page was rendering. This was one reason why it was so slow.

This arms-length relationship needed to be closer.

Why did this app have so many problems? Well, when Robin requested a new feature, MegaStars would tell her exactly how much time was needed to get that feature done. If they felt a new feature needed 30 hours to build, they would simply quote $15,000 as the price tag. Sometimes the new work conflicted with old work and generated new problems, but that wasn't in the estimate and therefore the new problems needed to be ignored as much as possible. This tactic of ignoring new problems had been going on for many years. Additionally, much of the code base was now out of date and suffered version conflicts whenever some parts of the system needed to use newer libraries of code (which in Ruby On Rails are called “gems”).

MegaStars could have said, "Pay us $100,000 and we will clean up all of these problems." But then Robin might ask, "Why did you allow these problems to exist? What are we paying you for?" It might seem like a scam, if MegaStars asked for more money to fix the problems that they themselves had created.

Here was the central dynamic of the situation: Robin felt she held power because she could terminate the relationship at any time. In fact, all of the problems in the relationship were because she could end the relationship at any time and was leaning on that fact as her main way of getting compliance. MegaStars was unwilling to commit to the long-term health of the software while Robin was constantly threatening to fire them.

When you work with an outside agency, they typically can't or won't go back and clean up the code, because the customer is not willing to pay $500 an hour for that work. Some of the better agencies try to include the clean-up work in the overall price, but then those agencies seem expensive — and they get undercut by other agencies that are willing to do the absolute minimum, even if ...

I enjoyed this story quite a bit. Thanks for sharing!

(I don't think it was answering the question, which I took to be about build-it-yourself vs. buy-something-prebuilt, not outsource-to-someone-else, but I enjoyed it nonetheless.)

I've been the lead on an insurance / vehicle appraisal platform for the past 3-4 years. One of the primary functions is scheduling the claimant to come in for an appraisal; we used a platform called YouCanBookMe for the scheduling, wiring webhooks and API calls into the core product. We mostly used YCBM because the owner's previous experience. It was great initially, but I tremendously regret not refactoring YCBM out after the first year. It had a few outages and quirks that caused tremendous issues on our platform, all for a commodity of a function.

I actually wrote about this experience and the ultimate refactor. [0]

[0] https://koptional.com/article/nuanced-strategy-build-vs-buy

That's a great article. The divergence of domain is a really big sticking point that doesn't always rear its head until you scale up. I would be interested in reading more about the solution you built to replace it.
Interesting, we need to implement something similar but for real estate appraisal appointment scheduling. Any advice on modeling that all out?
Happy to talk and offer what I found- my email is jack at koptional dot com feel free to shoot me a message
I’m not the OP, but was involved in a radiology booking platform. It still blows my mind how hard a problem this is and how poor the existing solutions are (that I have used).

Hooking in staff rosters, asset availability, appointment reminders, holidays and the multitude of other quirks is daunting.

While not strictly build vs buy (eg: technically you still have to "build" a postgres cluster and in house expertise even when buying AWS Aurora) but I generally like the ideas in the classic https://mcfunley.com/choose-boring-technology

IMO your product is the only thing you build, as much as possible should buy everything else.

There is eventually an inflection point where your product is so mature that the opportunity cost of improving it operationally vs marginal next feature you will eventually save money, but that scale has been growing YoY for a while (AWS mostly gets cheaper every generation so far) .

Years ago, a camera gimbal. One of those DIY kits at less than a quarter of the price of name brands.

Spent hours messing around with the physical rig and software settings, but the balance was never quite right.

I'd imagine that the kits today are better all-around. At the time it was pretty cutting edge and the idea of being able to do steadicam shots with my DSLR but on a budget I could afford was too good to be true.

I love tinkering with hardware, but I always make a mental note to myself and say that building it will often cost 2-3 times what I thought it would, and that I'm actually paying for learning and having fun along the way, not the final product (I often end up using many of my projects only a handful of times, but still enjoy making them).
(If we're talking about physical things) trying to build/fix anything has always been a failure, a waste of time/or money.
(comment deleted)