Oskar Dudycz

Pragmatic about programming

Bring me problems, not solutions!

2021-01-06 oskar dudyczAgile

“Bring me solutions, not problems!” I’ve heard this sentence multiple times from Business and management. You’ve heard it too, haven’t you?

We should shout back “Bring me problems, not solutions!”

meme

Imagine you’re working on the HR system: holidays, contracts, that sort of thing. “Business” comes to you and says:

“Listen, let’s make a web app where employees will be recording their working hours. We talked in the kitchen lately about those “Reacts” and “Angulars” of yours. We could use them to make it look good. Will you do it?”

So the planning begins: severe discussions about whether we should put the form here or a grid there. Fierce negotiations with the backend, whether we are doing a rest API or maybe GraphQL. Whether a contract should look like this or the other way discussed in a separate meeting.

After the fights, in the end, it turns out that we even managed to complete the project on time, even with the requirements in Jira (woohoo!). The system has only a few bugs. We needed multiple sprints, but the job is done!

If it is so beautiful, why is it so bad?

It turns out that system users are not happy to type in their working hours, manually, every day. Previously, they entered their hours into an Excel sheet and sent them to their supervisor once a week. The supervisor then mixed it into one large Excel file and sent it on to the HR department.

These unhappy users will nag you to add or correct something in the system you have cleverly designed to solve the problem presented to you. In such a situation, where an unhappy user meets a solution they do not like, there will eventually be a confrontation. Confrontations can be painful, but they can also be helpful; they can expose the real problem that needs to be solved, rather than the solution handed to you by someone else. In this situation, it turned out that the user’s ability to fill out their time sheets wasn’t the actual problem to solve.

It was the solution to the problem, as decided by someone else. The real problem was that the HR department needs to know how many days each person worked to verify the schedules and calculate the fees.. The perpetually busy Team leaders, buried with their other work, were late putting these Excel files together. They also treated it as a tedious duty and made a lot of copy/paste mistakes. The staff also wasted time verifying this data and prosecuting them later to correct the entries’ errors.

If we were to ask what the actual problem is, we might conclude that you may not need to create a new web application. Maybe you don’t need to make new APIs; perhaps it would be enough to:

  • create a collective email account for sending and receiving the Excel spreadsheets,
  • integrate these with the e-mail system, grab emails from that account, import attachments and parse them,
  • if the Excel did not contain errors, the data will be saved to the HR system. After that, it will send the answer with confirmation to the employee,
  • if the email was incorrect (e.g. it did not contain an attachment, it was impossible to parse it or the entries were wrong), the system will send an email with a request to correct it.

It might turn out to be much more plausible, faster to do and more convenient for each party.

We programmers usually have two attitudes:

  1. “Business won’t be telling us how to write code”: we are Programmers with a capital P, and we know everything best.
  2. Business knows how the system is supposed to work: I won’t ask for clarifications. I’ll code what I was asked to.

Both attitudes can be considered irresponsible and dangerous.

As programmers, we know technology: that’s why we’re being paid. Therefore, “business” shouldn’t come and tells us what framework to use, or how to create API endpoints. Of course, assuming that the application with our design:

  • does what it should,
  • is delivered on time,
  • maintenance costs are roughly the same as an alternative solution,
  • it does not increase project risks (e.g. higher development costs).

The technical decisions should be entirely ours. Of course, the consequences of our choices should also be ours.

However, we must remember that we are not business specialists, even if we are a well-paid profession. Let’s make it clear: we are well-paid artisans, not artists. We are supposed to do our work to help the Business efficiently earn money. We are not specialists in the business processes in a given field.

But!

We cannot assume that Business knows everything. If our business domain is HR and payroll, will the “Business” understand what the authorization administration panel should look like? Or will they know what options we have to integrate with external systems? Will they know what the login screen should look like? Or which form will be prettier?

Maybe they will, but most likely they will honestly not know it, because it is not the “core” business domain. Business people are specialists in, e.g., human resources and payroll. They will be probably guessing how other features should work.

It is often the case that “Business” wants to help us solve a problem and automatically suggest a solution. When we ask “why should it be like that?” then we will often get the answer “I don’t know, I thought it would make it easier for you.”.

I recently had such a case, when my Product Owner wanted us to block the record’s use for all users when some background operation is working on it.

We have to be proactive and ask to determine if we’re getting a description of the actual problem or just the solution presented to us by someone else (a potential business solution). When we’re trying to understand a business process, we do not question its validity. It is, de facto, our duty to help the Business solve the problem. By taking the requirements blindly, we do not help them at all: we can even make it worse!

I predict that the time when software companies and business companies were separate things will soon be gone. It is a relic of the past where IT systems duplicated what people were doing to make it faster. Now with growing SasS solutions, IT is Business. Therefore, close cooperation between Business and IT is no longer “nice to have”,​​it is a “must-have”.

Henry Ford once said:

“If I had asked people what they wanted, they would have said faster horses.”

I’ll leave some homework for you. Consider whether the following cases are a problem or a solution?

  • licensing system in SASS systems
  • user administration panel
  • authentication and authorization
  • unique invoice number
  • development of a shipment handling system

Let me know what came out of it, and what are your thoughts!

Cheers!

Oskar

👋 If you found this article helpful and want to get notification about the next one, subscribe to Architecture Weekly.

✉️ Join over 11500 subscribers, get the best resources to boost your skills, and stay updated with Software Architecture trends!

Loading...
Event-Driven by Oskar Dudycz

cover

Through my window, I see the result of good plans but poor execution. Opposite my flat, there is a partially completed construction place. Buildings were supposed to be eye-catching Mediterranean style apartments. Delivery date? Two years ago. Actual? More and more unknown.

Some time ago, I heard that using Event Sourcing makes creating Event-Driven Architecture easier. The arguments were correct, that if we’re already publishing events to trigger business workflows, then at some point, we may want to also store events to not lose information. Agreed. However, I also heard that keeping the state as events will simplify things. We’ll have a source of truth with a record of the system behaviour. This will allow, e.g. to confront the results of the operations with the recorded state. I’d agree with that, with one distinction. It’s easier as long as you already know Event Sourcing.

Many people in the DDD community claim that the essential is to properly break down the system into autonomous parts called bounded contexts. Once we have it, the rest is secondary and will sort itself out. For sure.

Many seasoned programmers speak similarly about new technologies. They claim that they can translate past experience into new technologies. That’s true that by analogy, they can catch the big picture quicker. But isn’t it a bold assumption to say that Win.Forms specialist will learn Angular quickly?

The end result may differ a lot from the initial ideas. I saw the plan of those buildings next to me. Now I can see the effects of the execution. Or actually, the lack.

I believe that we should carefully acknowledge not only the point of view of our authorities but also their seating point. If we want to find out how to form a wall, do we ask an architect or a foreman? An architect may know the theory, but the practice is what we’re looking for. On the other hand, if you want to know where to put the wall, you prefer the architect to do measurements. At least if you don’t want to have the roof falling to your head.

After I had torn a ligament in my knee, I went to two qualified orthopedists. One said I should have surgery and do a reconstruction. The second stated that there is no need for that; rehabilitation should be enough. Guess which one had a specialization in surgery and which in rehabilitation?

People usually give us advice from the point where they’re currently standing. They are entitled to a biased view. An architect who rarely does programming will tend to downplay the value of implementation and tactical patterns. Midlevel developers will focus on technicalities instead of the global system impact. The team manager or consultant will emphasize the importance of soft skills (or esoteric techniques known only to them).

The truth is that we need all of them. The excellent plan will fall on the bad execution. The best execution for the wrong case will be just a waste of time. We should carefully evaluate the advice considering what we need and what an expert can give us.

Therefore, when we’re reading an article, watching a talk, let’s also pay attention to the place where the person is standing. The perspective from there may be much different from where we are right now. That can be good, as it may push us in the right direction. But it may also be misleading, as we accidentally take biases of this person without understanding the tradeoffs. Personally, I prefer to follow not only people from pedestal but also those that are closer to my position. A bit further in the journey, but not too far. That helps me to calibrate my view as those people are more relative to my daily struggles.

Polish historical leader Józef Piłsudzki reportedly used to say: “Right is like an ass, everyone has its own”.

Cheers!

Oskar