A Learning or an Earning Project
Just before going on a vacation, I decided to write about a subject that has been on my mind for a while now. A question that frequently comes to me every time I start a new project is, “Is the project for learning or earning?”. Since my early years in the professional world, I always thought that these two go together, when starting a project it’s always both. It’s always having a project to make money, but it will also be a learning opportunity, from the different challenges that are along the road. But, time passes and my perspective of this matter has shifted a bit, especially after erring several times.
Before diving into the subject any further, let me define what I mean.
Earning Project
The earning project is mainly subject to one thing, the Market. When starting a project that is destined to be marketed, it’s either to answer a need or trying to compete with an existing solution but with an axis of improvement (at least if we want to have a market share) and both of these cases are time-constrained, because of the nature of the ecosystem, something that is hyped today will not necessarily be tomorrow, a solution that doesn’t exist for one day, can exist and take all the market the next day. Conditions change, needs change, stakes, and circumstances change. If you have a business idea then someone else has probably also had it. All this to say that, the time to market is critical and needs to be optimized and when building a project for earning, then the project needs to be in the market in the timeframe limited from having the idea to the time the need of the project becomes obsolete.
Earning projects are not devoided of learning, but compared to its counterpart, it is limited to the challenges met along the path of the journey.
Learning Project
The learning project has less of a business intention (or none at all) and more of an educative purpose. The reason one can start a learning project varies and they can be very subjective. For instance, the need to learn a new framework, exploration, comparison, or just out of curiosity. The size of the project also varies, it highly depends on the motivation and the learning subject. Whether for the time, this kind of project has no constraints and is also variable.
Where there are no time/cost constraints, it’s pretty important to take all the time trying to understand thoroughly the subject, making sure to cover the different aspects of the matter. I also believe that using or building the same thing over and over again will build reflexes for avoiding earlier mistakes which will lead to increasing the quality of the outcome as well as our mastery of the subject. This kind of rewriting can’t always be applied to an earning project. In addition to that, for learning purposes over-engineering is somewhat allowed, If the goal is to learn microservices, microservices should be built, even though the real need is not present.
Having the meanings clear, I believe it is important to separate those and define, at the very start, if the project’s main purpose is to learn or to earn. Since mistaking one for the other will have heavy consequences.
Confusion
Confusing an earning project for a learning project can come with a cost. An example would be better to explain this case. Let’s say, a development team (can be a solo developer) decided to build their next product (or just migrate an existing project) using the latest Javascript framework (for whatever reason) without having any prior knowledge of it. Several options come into play :
-
Learning then building: This can be beneficial for quality, but it can increase the time drastically, and from starting the project to building it is in tight correlation with the learning curve of the new subject.
- Learn and build simultaneously and alternately: This is a very dangerous option, it can either lead to a gain of time or it can lead to a mediocre quality which will subsequently be very bad for time as well. It can also lead to what I come to define as learning paralysis (inspired by analysis paralysis), this is manifested by spending hours to days trying to find the best way to approach something, or the best practices for it.
- Use it as something known: This option is mostly useless since there is no learning and if there was any benefit from switching to a new framework then probably it is lost since it’s not used properly. This may sound rare but it is very common among developers and one of its symptoms is the feeling of fighting the tool to make it do something like the old way we know (using any JS framework like Angular >_<)
The example was about a Framework but can be for anything, databases, libraries, paradigms, architecture, etc. The above was a listing of what can go wrong. Team maturity and seniority can impact positively or negatively the outcome of those options.
Refactoring and Spikes
There are a couple of practices out there that can be used to reduce the impact of learning in a project destined to market namely refactoring and spikes.
With the confidence to refactor, we can iterate over our code multiple times, improving its quality while maintaining its behavior. This allows us to go back to the code after new knowledge was acquired and change that part of it to make it better.
In the scrum world, there is a spike, which is a special kind of a user-story, it is time-boxed and can be either technical or functional. Its purpose is to gain the necessary knowledge to reduce the risk of a technical approach.
Software Engineering as a Learning Process
I have concluded that Software Engineering is primarily a learning endeavor, the working code is rather a side effect. “Alberto Brandolini”
Learning in Software engineering is not limited solely to technical matters. A big part of SE is about learning: Learning about the domain we are tackling, learning about our users and the different ways they are going to use our product. That’s why we need to set up feedback loops to make sure we are building the right things and avoid speculations and assumptions as much as we can. This kind of learning is different from the one I talked bout earlier, the first one is mostly technical and is needed to release and the second one comes mainly after the release(when our product is in production).
This learning is very important and doesn’t harm the project, on the contrary, we can’t build a usable product if we don’t learn from our users.
Starting a New Project
Next time starting a project on my own, I’ll make sure to decide if I want to learn something or if I want to make money out of it. If it’s the former, then I’ll allow myself to pick a new technology, try new things, change the way I work, and dwell in perfectionism. But, it’s the latter, I’ll do things the way I know best, to go fast and release it to its destiny and then eventually learn from that.
If you read so far, then thanks -I wasn’t that boring-. Let me know what you think.