📜 ⬆️ ⬇️

Product or service

On Habré (and in real IT life) there are many questions like:



The key question in all the examples below is: what do you develop: a product or service? Oddly enough, but as soon as you answer this question about products and services, all doubts about the need for tests, abstractions, etc. will disappear by themselves.


Terms


There is a fundamental difference in them: the product is complete, you can sell it, and then forget about its existence. In the case of service, the buyer and seller communicate for a long time (by analogy with the subscription, which is the service itself).


Product examples:



Examples of services:



Why do we need to know the difference between product and service?


The idea is simple: if you view your program as a commodity (that is, your connection with it is interrupted after the first release), then there is no point in wasting too much time on tests, or on refactoring, or on matching coding styles . After all, if you spend your time and make it "perfectly well", then your product simply increases the cost. And in the future, these abstractions will simply not be needed (after all, you will stop working on the program).


However, if you provide a service for users (for example, make an analogue of Facebook), then you will have tasks for updating dependencies, you will have tasks for adding / removing functions, and therefore there will be tests, because they will reduce risks in the long term. Moreover, you will need to allocate abstractions, at least in order to build new logic in the future. So, if you consider your development as a service, then you need to update dependencies, write tests, highlight abstractions and do a lot of other work to avoid legacy and minimize the risks of mistakes in the future.


Manual: how to make a legacy program with your own hands


In the context of this article, it is very easy to derive a formula for how it is very easy to make legacy from almost any developed software, and following this formula for success is achieved by the developer of this program itself, without anyone’s help. The formula is simple: to get legacy software, you need to treat the development of service software as if you were making a product .


Or in other words: if you see that you are participating in the development of the service (that is, you are in this project for a long time, you will add new functions to the project for several years, adapt it to new realities), but there is a desire to make the project a true legacy ( there is a program in which it is incredibly difficult to make changes, which is unable to work on a newer OS / hardware, etc.), then just start treating the project as a product. Just treat each release as the last. Use the words "well, everything, have sold the version." As actively as possible make small crutches and hacks, instead of processing the code. And finally: more manual labor (forget about TeamCity / Jenkins), and never write documentation, specifications and various comments in the code.


It is quite interesting that if you literally slightly change the attitude towards software, then it will itself become a terrible legacy, and moreover made with your own hands.


Manual: how not to make their programs legacy


Strangely enough, however, in order not to get terrible software on hand, you only need to ask yourself a question once a month / quarter: and the product that I make is a product or service? And remember / write down this answer at least for a while. In the future, any questions about tests, refactoring, documentation, etc. will disappear by themselves.


Examples:



Product or service sells IT outsourcer


Despite the fact that an outsourcer is technically an IT company (moreover, the main part of the record is people related to IT), the most important steps in the project:



That is, all other actions of the company's employees revolve only around these points. And it is precisely these two things that directly affect what the outsourcer himself develops - a product or service.


For example, goods are often developed for government orders. And never the services (although this also happens). Therefore, in such projects there is no reason to do the documentation, speed up the work of the program (that is, make the customer satisfied). So we get the rule: if you develop, test or customize software in an outsourcer company that forgets about a contract after signing an act, then there is no point in even thinking about tests, documentation, highlighting abstractions, etc. Moreover, if you advise the middle manager to "make software better", he absolutely will not understand why you are thinking about this in principle. After all, a company is not only not getting any profit from refactorings, it can often suffer real losses from the fact that a developer spends time, do not understand what.


Moreover, if an outsourcing company makes such software to order, then it often has no incentive to make the programs safe (after all, in the future you can always just run over a blogger , as they did in the 90s, right? But the customer will suffer all the losses )


So why do you get legacy?


After reading the article, the thought involuntarily is born: after all, all these ideas are painfully simple. Why then do we get legacy software? Why does one company / team have products that are easy to support, while others have programs that slow down and developers spend a lot of time on support?


One (of many) answers is the attitude of the people themselves in the teams to the programs as a product or as a service. And here it is important to understand that in this context, the team is all people who were related to the development of software, that is, testers, and developers, and analysts, and management. The total position of all people and gives the position of the team. And it can be like “we sell goods”, and “we do service”.


Examples of conflict when a team develops a service, however, treat it as a product:



Examples of reverse conflict when a team actually creates a product, however, it treats it as a service:



The impact of products and services on languages ​​and technology


On Habré there is often a lot of controversy over which programming language is better. Or which technology is better. Strangely enough, many of them arise from the fact that the parties have a different understanding of what a program is - a product or service.


If you have a one-time task (for example, copy files from point A to point B with some conditions and minimal conversions), then it would be rather foolish to choose technologies designed for long support, giving long backward compatibility. For such tasks, Go / Python would be the perfect solution.


And vice versa - if your task includes a long-term service (with frequent security updates, etc.), then such advantages of the platform as backward compatibility, ease of updating, ease of patching, etc. come to the fore. It becomes absolutely unimportant to you whether it is easy or difficult to write Hello World in your chosen language, since such programs will be created every few years.


And how to use it?


In conclusion, how to use the fact that the program can be both a product and a service.


  1. Once a month, just remember what you are doing: a product or service.
  2. Do not try to develop the product. It is sold once and forgotten. This approach is incredibly clear to business. Work on the system "made - forgot."
  3. Do not treat service projects as goods. You will communicate with users for a long time, in this case it is more important for them to have long-term cooperation, and not momentary benefits.

')

Source: https://habr.com/ru/post/261001/


All Articles