They want it quickly so there is no time to plan.
They want it cheaply so there are no resources to test.
They want it according to the drawing they prepared which you then later need to find places to stuff any extra features they ask for later.
They quickly get tired of answering clarifying questions about it and ask developers to "just figure it out." They also don't really care about reliability, or at least that doesn't come up much in discussions.
They insist up and down that their use case is unique and that the way they do things cannot be modified.
They have immensely complex business rules they never wrote down and can't agree on the details of as when the process was done by humans, the answer was up to the human.
So they may not ask for complexity, but that is the end outcome of everything they do ask for.
I asked him how the location of products is stored now. "Is there a system, a database that keeps track of where in the store, on what shelves, product is stocked? Something the app could use so it knows where your pasta can be found?"
He didn't understand the question. So I asked him how workers who stock the shelves know where to put what products. There must be a system that gives the workers that information, right?
"Oh no", he said, "there is no system. They know through experience and gut-feeling."
I spent a goodly amount of time preparing a questionnaire about the client's business needs and purposes for doing ad-hoc database queries. None of the questions were leading or simply offered up a feature. They required some thought and would yield useful information.
The project manager was baffled by it. NO! he said, clearly flummoxed by this divergence from what apparently was his (and perhaps the firm's) lazy, half-assed approach: Look up all the available products for the customer's task, put all of the features they claim to offer in a big list with checkboxes next to them, and hand it to the client. This is exactly what I was told to do, in the rebuke I got for doing it right.
I referred to this as the grocery-list approach. Of COURSE the client is going to create an imaginary need for most of the features and check them off. Who wouldn't?
Another great example is "customizable UI." How many thousands of man-years of work have been wasted on this boondoggle?
A business software developer's job is to help the people you described overcome those problems.
Some have more money than others. Some are smarter than others. Some are better people than others. But ultimately, that's the job.
There is code that I literally prototyped myself in a week and that I am told would take years to rewrite by IT.
This one. I'm primarily familiar with the "internal customer" scenario, and so it becomes uncomfortable to have to go back and forth clarifying details that are crucial to the development of the solution but seem trivial or even entirely inconsequential to the 'customer'.
It highlights the size of the knowledge gap between 'customer', who's been doing their process for years and 'developer' who's just finished a project for a completely different aspect of the company and is therefore a blank slate as far as this new project.
Another poster mentioned sitting with the people that actually do the process. I can't see a good solution being possible without this - one way or another. That's the role of the Business Analyst isn't it? The translator between requester / user and developer.
That usually gets them to rethink that one.
Some Agile here is also a good way out of these kinds of things. Quickly build something they can complain about, then fix it. Either they will start to take responsibility for their software (that is clearly theirs) or they will just keep burning money and that will put an end to it too.
However, who you are describing is actually a bad customer. So make sure you get PAID very regularly as you are on this death march and if you ever do not get paid, stop work immediately.
Indecision and abdication of responsibility are hallmarks of an incompetent customer.
I always found they assigned the most junior and inexperienced person on their team to liaise with the developers.
Eventually I started putting a risk section in the proposal that covered stuff like this. What I found was the more they pushed back on the risks the more likely the risks would occur.
Ps. Raising prices mostly helps
simple, simple - ok I get it.
>> This model should cover all aspects, so also the key business aspects.
a simple model that covers all business aspects?
This is where the complexity comes from. Your all-encompassing "simple model" is likely a high-level abstraction that is not implementable.
Software systems that model complex domains by definition are complex or incomplete or, and this is what we should avoid, both.
This post is either naive or intentionally glosses over why we end up with complexity. All good software starts will the ideal of a clear & simple integrity; the only software that keeps it is likely not used.
I find the simple models are usually easier to implement, but are made simple by ignoring details that are actually important.
Of course choosing between a monolithic approach or modular approach (or microservices) is also very important at the beginning of the project.
It's definitely a major source of complexity. But also there's nothing stopping you from adding in unnecessary complexity on top of that. Part of the trick is to know which is which.
This is like saying customers don't ask for wheels and a motor, they just ask for a car that is capable of driving.
There is a beauty in creating simple solutions for complex problems. Not many are able to do that. And that is the way it is , always was, and always will be.
Nobody wants complex, cumbersome tools, but they do want every iota of flexibility they can imagine delivered in unrealistic timeframes for vanishingly small budgets. Complex, kludgy software is usually the result of customers prioritizing fast and cheap over good, and being given exactly what they asked for.
Wanting virtually unlimited flexibility inherently already dooms a project to be complex. That's before talking about timeframes and budgets.
Well there's the rub right there.
The model can be simple or it can cover all aspects.
It can virtually never do both, because all the aspects the software is needed for is always complex.
In fact, the aspects are so fiendishly complicated that we usually can't even understand them entirely in advance, let alone simplify them.
This is why agile has become so popular: it eschews "cover all aspects", acknowledging the impossibility of this, and aims for complexity to evolve gradually as it is demonstrably needed, rather than up-front.
General customers care about software that solves their problem and it's cheap. The later is debatable. Complexity and maintainability is very, very low in he priority list of secondary attributes that customers want. Higher up are things like: it's delivered on time, made by someone they trust, doesn't break often, etc.
> Essential Complexity is inherent in, and the essence of, the problem (as seen by the users).
> Accidental Complexity is all the rest — complexity with which the development team would not have to deal in the ideal world (e.g. complexity arising from performance issues and from suboptimal language and infrastructure).
> ...
> For example — according to the terminology we shall use in this paper — bits, bytes, transistors, electricity and computers themselves are not in any way essential (because they have nothing to do with the users’ problem).
---
You can't reduce essential complexity without sacrificing your ability to solve the problem. (Of course, this isn't to say it's never a valid way to meet a deadline.)
Reducing accidental complexity is a noble cause though, but as an engineer, it can be difficult. It sometimes precludes using shiny new technology, or even making it yourself. Maybe the user's problem can be solved with an off-the-shelf solution. Or maybe you don't need a full website and database because a spreadsheet will suffice.
More generally, the issue is that customers often do not understand which requirements lead to complexity, and which ones don't. If the software development relationship is transactional (and in Enterprise it usually is), then this leads to unmanaged complexity.
A lot of software (and processes) fail to have an "escape hatch" where exceptions are kicked out for manual intervention. Putting this in and then managing to the intervention rate is a decent way to manage complexity.
They never say "Take this out, take that out." They say "add more, add more!"
There's an old saying that I love about design, it's about Japanese gardening actually, that "Your garden is not complete until there is nothing else that you can remove." -Will Wright
Ask them if they want "sophistication" instead. It can often mean the same thing as complexity.
I'd like, for instance, my dictation software (such as dictating text messages on my phone) to get it right. I don't want to constantly have to edit it when it makes what you might call "dumb mistakes." (my current biggest gripe, Android constantly inserts the word "oh" at random places while I am dictating, for no apparent reason)
When I ask it for directions, I don't want it to give me directions that are dangerous to follow (they finally corrected the one that told me I should cross 4 lanes of traffic on a busy interstate -- 280 south from 101 to Alemany in San Francisco -- to get from entrance to exit in 800 feet, when there is another exit I can take that is safe and takes about the same time to get to my destination).
To do it right, it needs sophistication in the extreme. You can also call that complexity. But I want it, thanks.
There will never be a happy medium.
All of the projects I've been on that insist on going on that journey again end up with a different, yet subtly more or less complex solution. There are rare exceptions, but it's rather foolish to think that, given two roughly equal teams or individuals a better result would be obtained.
At this point one of two things happen. Management on both sides double down and a system is build that on the very first contact with the users is shot down into a never ending dead spiral of change requests and extensions before it is eventually abandoned and replaced by a next clean slate attempt . Or, more rarely, the as-if document gets ditched and the system is reconsidered and the project gets amended to actually deliver something that can support the real business operations.
They do if they are expert users of very complicated toolkits. Look into any art toolkit, for instance. 2D or 3D, as they age they add on more features. Some of these features come from the dev team experimenting, some come from cloning good ideas in the competition, some come from user requests. There's a pretty steep learning cliff for Photoshop or Maya or Procreate or Blender. There are a lot of settings in these things because there are a lot of ways people use these things. And a lot of tools in these toolkits, many of which have their own particular settings.
Power tools that let you do fundamentally complicated things have a level of inherent complexity.
A solution which can do all the needed thinks but is to complex => worthless.
A solution which is so simple that it can't do what the user wants to do as this would be to complex => worthless.
Finding the right way to do thinks so that it simple _and_ can do what users want it to do => really hard.
Example why it's hard?
The writer of that side "failed" because he use a font which is not simple to read for people with eye problems. (Assuming his goal is that people read his side. In which case it should be simple to read. Which it mostly is. Actually it's better readable then many other sides. Except the font.)
This was pretty complex to sort out TBH. I'd say personally I don't mind complexity as an outcome as long as the work environment is flexible and allows for a winnowing-down or a reorganization of the product.
It's like there is some moral code of some devs out there not to use it for their personal advantage. Others are doing it casually and exactly like that.
We should all fight it, and learn from it. There is no silver bullet, and we probably don't have programming languages that good that we can struggle with it with ease.
Well, it wouldn't have been very hard if you had told us at the start of the project...
The tax code is a perfect example. Nobody asked for thousands of pages of tax code, but after you add up all the individual rules (each of which someone asked for), you get thousands of pages. The business logic of any long-serving application ends up like that, which is why we can't just replace all those COBOL systems in a long weekend.
The hard part about software in the real world is not making software simple. The hard part is pushing back on the real world to make it simple enough to model in software.