Hidden technical debt in machine learning systems (paper summary)

Machine learning systems are wonderful. Many shapes and forms of machine learning algorithms are currently in use. Different models such as clustering like k-means, prediction methods like trees, or more advanced deep learning methods suffer from technical debt. In traditional software engineering, technical debt can be found in specific shapes. In addition to the “traditional” software engineering problems, machine learning systems also face new challenges. The following paragraphs present the different technical debt found in machine learning systems.

1. Encapsulation

Isolation of the different software components is considered a good practice. Encapsulating objects enables easier code maintenance by derisking future changes (regardless of their goal).

Machine learning models are inherently coupled to data. Different features affect the model differently. If the input distribution of a single feature changes, then the model output is susceptible to change as well. The model interconnects all inputs so no input is really independent. To solve this issue it is recommended to monitor the input features as well as the output of the model to notice changes over time. If either changes, it may be an indicator that it is time to update the model.

Correction cascades
Sometimes the model does not behave the way we want it to behave. To solve this we can add fitter, calibrations, heuristics, or thresholds. These hotfixes can pile up in a correction layer that hides the special cases that the model could not handle correctly. As the layer increases, it is harder to differentiate the model from everything else surrounding it. Improving small parts of the system may lead to global detriments. The solution to solve this is to create a model that corrects for everything instead of coupling several layers on top.

Undeclared customers
Generally, there are no restrictions on whom can use the output of a model. By allowing different systems to use the output of a model it may create unintended and poorly understood dependencies. Sometimes hidden feedback loops may arise. To prevent this tighter restriction access should be put in place to track usage dependencies.

2. Data dependencies

Code dependencies can be studied with static analysis. However, there are no similar tools for data analysis. That can lead to a build-up of dependency chains difficult to untangle.

Unstable data dependencies
Data can be consumed from another machine learning system that can change over time. The source model provides an outcome distribution that can change when the model is updated. If that is the case, the downstream models will be affected. This brings a higher complexity to identify the source of the changes. A solution would be to track the versions for each of the models and specifically tag each model. However, this in return creates a higher complexity of maintaining several signals over time.

Underutilized data dependencies
Underutilized data dependencies are input signals that bring little improvement to the model. Moreover, changes in these signals can lead to unintended effects on the final outcome. It can be that a feature made sense in the past but now, without really being used, it is still in the model. Other effects of underutilized inputs leading to problems may be correlated features or bundled features. Features that bring marginal performance increases with unclear relevance are included at a cost of model complexity and overhead.

Static Analysis of data dependencies
Like with traditional code, there are tools to perform static analysis for data. This is essential for tracking changes, migrations, and, if necessary, force updates. This can make automatic checks to make sure that the right dependency trees are correctly resolved.

3. Feedback loops

Machine learning models usually influence their own behavior over time. A priory, it is difficult to assess how much it will affect the model. These feedback loops are difficult to assess and address especially when it happens over time.

Direct Feedback Loops
In a direct way, the model influences its own future training data. One of the ways to solve this is to apply randomization. Another way is by leaving portions of the data untouched.

Hidden Feedback Loops
Direct feedback loops are challenging to identify and fix, but even more with hidden feedback loops. The hidden ones consist of two or more systems that influence each other through the real world. For example, two different investment companies have developed two different investment algorithms. Both of their actions are tightly influenced by each other and may influence the buy/sell behavior of the other.

4. Machine learning system anti-patterns

As sexy as it may seem, the ML model is only a fraction of all the code required. All the data pre-processing filtering and post-processing is required and often underappreciated.

Glue Code
Packaging the whole system into one solution inhibits improvements. It makes it harder to analyze, update and tweak the parts individually.

Pipeline Jungles
This anti-pattern occurs when new signals and information sources are found and added sequentially without care.

Dead Experimental Codepaths
Within the production code, it is common to create new branches of execution to test new hypotheses or experiment with new methods. However, with time this creates a code complexity that needs to be scrapped out, or otherwise it can lead to fatal errors. It is good coding practice to examine regularly all the branches and delete the unused ones.

Abstraction Debt
There seems to be no consensus on the right abstraction in the ML community. Map-reduce started being the predominant abstraction; however, it seems that the parameter-server pattern is more robust.

Common Smells
Multiple-language smell. If it is possible, avoid using different languages for the same system. Otherwise, it increases its complexity. Prototyping smell occurs when the production system is scaled from small prototypes. Prototypes do not always reflect the reality of the full-scale system.

Configuration Debt

An obscure place where the technical debt of a machine learning system can be hidden is in the configuration. A large system has many configuration options such as algorithm learning settings, pre- and post-processing methods, verification procedures, etc. It is easy to make configuration errors that may lead to at least waste computing power or even worse production errors. Redundant or settings should be detected and removed. Ideally one could easily visualize how the different configurations affect the system.

Dealing with Changes in the External World

Machine learning systems are often developed to interact with the real world. That comes at a cost. The cost of interacting with the real world is that real-world data shows little stability and has the potential to change.

Fixed Thresholds in Dynamic Systems
Generally, the thresholds are selected manually. However, that is time-consuming and not scalable. The best way to select thresholds is to have a hold-out validation set to adjust automatically the value.

Monitoring and Testing
Unit testing is used for software development but for machine learning systems it is difficult. One cannot predict fixed values if the system is intended to adapt to new input distributions over time. As mentioned above, it is possible to monitor the input and output distributions of the values and issue warnings if they change. In the event of a significant change, it may be worth revisiting and, if necessary, updating the system. Some manual limits can also be placed. It may make sense to prevent trading algorithms to invest all the money in one stock or prevent it to set a book price to ridiculous amounts.

Other Areas of ML-related Debt

Data Testing Debt
As mentioned earlier, testing the data for at least outliers is critical to the well-functioning of a system. More advanced methods, of data distributions evaluation, are useful for more subtle changes.

Reproducibility Debt
Reproducibility is important to real-world ML systems usage. Once developed, the model should perform similarly to the real data as it did during the development phase.

Process Management Debt
As the number of systems increases, manual management gets more time-consuming. Therefore, it is important to try to simplify and remove manual steps and create more streamlined pipelines.

Cultural Debt
There shouldn’t be a hard line between engineering and research departments. They both should interact and collaborate. That helps to reduce system complexity and increases reproducibility; thus, leading to long-term better system health.

I hope this post helps you to be mindful of the type of debt encountered in ML systems and how to avoid it or at least minimize it.

[1] Sculley, D., Holt, G., Golovin, D., Davydov, E., Phillips, T., Ebner, D., Chaudhary, V., Young, M., Crespo, J.F. & Dennison, D. (2015). Hidden technical debt in machine learning systems. Advances in neural information processing systems, 28, 2503-2511.

Gain specific knowledge by making an observation

As defined by Naval Ravikant, specific Knowledge is the knowledge that you cannot be trained for it. It is located at the edge of knowledge and is very hard to figure out. To acquire specific knowledge requires a combination of existing tools but also creativity to combine them in innovative ways to create something new. To gain specific knowledge in your field you need to experiment. Everything starts with the question “what would happen if?“.

1. Make an observation

Let’s say you’re a blogger and you saw that one of your blog posts has five times the average number of views as your blog’s average. However, you don’t know why.

2. Ask a question

Much in life is about asking the right questions. So, let’s suppose you’re writing a new article. Based on that you may want your new post to be as successful as your older one. The question would be: how can I make this new post as successful as the previous one?

3. Form a hypothesis

Here you build a testable explanation. After taking a closer look at the old post, you realize that you inserted images in the article. That is something that you never did. Then your hypothesis is: An article with images will perform better than without.

4. Make a prediction

Based on your hypothesis you can say: if I put images on the new article it will perform better than the average.

5. Test the prediction

To test this prediction all you have to do now is to include images on the new article you’re writing.

6. Iterate to make new hypothesis and predictions

After a month you analyze the page views and realize that the new article did not perform better than the average. So, the images were not the key to getting more views. It’s time to take a look at the old article again and form another hypothesis. You realize now that the article is 500 words longer than the average. Your new hypothesis is that the combination of images with a longer article will perform better.

The faster the feedback loop, the faster you can gather specific knowledge. The more specific knowledge you have the harder is going to be to replace you.

How to build assets?

Generally, when people talk about investing they think it’s about buying assets. However, that’s not the case. There are plenty of activities in which one can build assets with little to no money. If you create a blog, you’re creating an asset. If you learn, you’re improving your asset. When you go to work, you’re creating value. All of these activities have different pros and cons but one could say that all of them will bring you more money. Some of them are scalable, others not, and others depend. If you want to truly create a clean asset you should ask yourself the following questions:

  • Do I own the upside in the thing I’m creating?

If you go to work, any work you do will probably belong to the company. So, working extremely hard won’t bring you better rewards. You’re dependant on others. You should be able to take full ownership of the things you created.

  • Will the thing I’m creating work while I sleep?

In this question, there is the implicit assumption that you’ve completed the thing. This question will help you separate your work from your income. If you work for money there will be only so many hours you can work. However, if things work for you, the upside is unlimited.

So going back at the examples from the first paragraph. A blog, you can own it and it will work for you while you’re at sleep. If you learn you will own the knowledge, but there is an upper limit of time you can use the new skill (days have 24h). And if you go to work and create a super-cool software, the company is owning it, so you’ll be left out with an hourly salary.

Moving from power to talent

This is the most profound shift of all. Moving from the J.P. Morgan model of ambition to the Mark Zuckerberg model shifts the balance of power from capital to talent. Ambitious people have gone from writing cheques to writing code. Today the most ambitious individuals don’t own the means of production, if they can write code they are their own means of production (Marx would, perhaps, be surprised). This gives ambitious people unprecedented power.


Worth mentioning III: Acquisition loops, NFTs explained, Orson Welles and friendship, and B2B sales

This is the continuation of the worth mentioning experiment where I shared relevant links to be kept for future references.

Acquisition Loops: The old ways of acquiring new customers -aka funnels- are outdated. Modern brands are adapting their marketing strategy and shifting their tactics to acquisition loops. In this article, there is an explanation accompanied by some examples from relevant brands.

NFTs, explained: Currently cryptocurrencies are in everybody’s mouth. Even newer trends are the Non-Fungible Tokens (NTF) which are a piece of information that certified your ownership over a digital asset. This link explains it in detail on a conversation style addressing most of the typical questions an average person may have.

Orson Welles, art and friends: He is an innovative professional that has interesting takes on art and friendship. This is a 2min video worth paying attention to. He regards his friendships over any of his art in spite of maybe regretting those choices. So, in the end, we’re all people.

Winning Through Intimidation: This is a book summary very concise and clarifying. The concepts are simple but worth knowing to be aware of when you’re being played.

30 B2B sales techniques that work: Most of the sales techniques on internet are B2C. However, in this instance, I found a worthy not-so-basic guide for B2B. It is worth keeping around.

The Veblenian Entrepreneur

For quite a long time I’ve been thinking that people tend to focus their time on easy things instead of focusing on the complicated ones in an attempt to avoid pain. People, in general, try to avoid harmful situations which leads them to take the path with the least pain possible (at least at the start) i.e. the easy path. In some cases, the easy and straightforward choice may become the worse long-term solution. But this scientific publication made me rethink the problem. In a way it is related to conspicuous consumption where people choose to buy items by the status they give rather than the value and utility they provide.

In the article, Rasmus et. al. state that we are heading towards an untrepeneural economy. As defined in the paper, an untrepeneural economy is a seemingly dynamic society full of inefficiencies and a substantial lack of innovation. This is achieved through the promotion of entrepreneurship irrespective of their likelihood of success. Leading people to desire the “entrepreneur lifestyle” as an identity. But this lifestyle is flawed for the simple reason that many endeavors fail and the ones that make it big are extremely rare and not the norm. Even though startups and innovation are needed in a society, the distribution success vs failure of startups is heavily skewed towards failure. Individuals who start a company have many odds of failure which incurs personal risks. Starting a company is something that people should carefully consider.

The entrepreneurship industry benefits from promoting entrepreneurial endeavors in a catch 22. This industry motivates individuals to build startups to get rich but the industry itself needs only aspiring people. So the more people start startups the better, but also if they fail and keep trying that’s recurrent revenue! If an individual has a failed startup it may be due to a lack of skills so they will consider buying more info-products to get better and have more chances the next time. So in a way, the best possible course for the entrepreneurship industry is about selling dreams and expecting people to keep showing up every time their dreams get crushed.

Currently, there is a cultural celebration of entrepreneurship founded by many parties. Universities are promoting innovation through many programs, VCs, hubs, clusters, governments, etc. These ventures create a vibrant startup environment that may be more likely to attract trend-following individuals. These vibrant environments created people with the desire to present themselves as entrepreneurs. Sometimes they are people in search of jobs or have wealthy families to support them. The Veblenian entrepreneur is the one who desires to build his or her identity on being an entrepreneur and being apprised for it.

Veblenian entrepreneurs “work” on early-stage startups. They are highly engaged with the ecosystem to signal that they are active entrepreneurs thus obtaining the recognition of their counterparts. They approach work in an enjoyable and leisure-like approach. They love pitching, networking, and attend idea-competitions as an opportunity to have fun and socialize rather than creating tangible value. In a way, they see pitching as a ritual to be part of the community. But they lack deep technical knowledge. They are good enough to engage in tech talks and impress non-technical audiences. They only need to look competent and have a plan.

“Real entrepreneurs” have industry experience which Veblenian entrepreneurs see as an asset whereas Veblenian entrepreneurs see their knowledge gap as an asset to reinvent the industry and build grand alternatives irrespective of their viability.

Veblenian entrepreneurs see acquiring venture capital as an end itself irrespective of their source (family, friends, and fools vs experienced VCs). Capital and the most fashionable technology give them legitimacy to be in business. Technology for them is a fashion statement showing that the entrepreneur is working on something visionary and cutting-edge.

Innovation-driven entrepreneurs design their physical and work environments to attract and motivate talented workers whereas Veblenian entrepreneurs design it mostly for their own enjoyment and as a statement of coolness and anti-corporate sentiment. Like most of the things they do it lacks substance. It represents an unproductive form of entrepreneurship with the principal purpose of emulating successful entrepreneurs. This creates an entrepreneurial process based mostly on consumption rather than production. They mostly validate their identity through the consumption of entrepreneurial goods instead of materialized achievements (product development, sales, profitability, etc.).

The rise of entrepreneurship is based on several factors. The feeling of self-realization and making a difference is inspiring to many, especially when a young employee has a mundane and unfulfilling job. This creates an identity tension that can be resolved using the counter-narrative of being an entrepreneur. It also helps to escape the job market realities where maybe not everyone is easily employable. So, entrepreneurship creates an extended period of unemployment financed primarily by parents or spouses whose demands are insulated from real market forces. The Veblenian Entrepreneur is not bound anymore to the corporate constraints nor the socio-economic realities of the market while at the same time they are being praised by other fellow entrepreneurs.

Veblenian Entrepreneurs are not only a risk to themselves, but they are also a risk to the whole ecosystem. Upon failure, the aspiring entrepreneur may choose to rebrand themselves and become a mentor, coach in incubators, or work on other parts of the industry playing up their experience. Inspiring others to take the leap leading some to believe that this world is full of charlatans and dreamers. Veblenian entrepreneurs incur other costs to the community like increase the risk of seed-stage investments. Leading to an actuarial increase in the price of equity, reducing the available funding for other kinds of entrepreneurs. Leading to an overall slower technological progress and economic growth.

The solutions proposed in the paper are that institutions encourage more experienced individuals and discourage the young and inexperienced. The young are less likely to succeed leading them to take unsustained risks. Whereas the old face higher opportunity costs thus preventing unfounded pursuits. The policies should be growth-oriented and prevent the romanticized idea of entrepreneurship. Entrepreneurship has substantial costs that should be explicitly stated.

Here you can find the table in the manuscript where they compare the innovation driven entrepreneur vs the veblenian entrepreneur on several axis.

Exemplary differences between innovation-driven and Veblenian entrepreneurship
Exemplary differences between innovation-driven and Veblenian entrepreneurship

Roulette Wheel Selection in Python 🐍

The roulette wheel selection (also known as fitness proportionate selection) is a function used by genetic algorithms for selecting potentially useful solutions for recombination.

The crossover individual probability is computed based on the individual’s fitness divided by the sum of all population fitness. The following is the formula for it:

roulette wheel chromosome probability

where pi is the probability of each chromosome equals the chromosome frequency divided by the sum of all fitness. Let’s imagine that the roulette wheel selection algorithm is like a pie chart. Each individual has a fitness value and the sum of all is the circle. So the probability of selecting a potential mate depends on your fitness with respect to the rest. The following illustration shows the probability of selecting each of them depends on how much space they take in the pie.

Roulette wheel selection pie chart example

Roulette wheel selection in genetic algorithm python

An example of the genetic algorithm roulette wheel selection in python. Easy python implementation without pseudo code.

If you desire to apply this genetic algorithm operation as a minimization problem all you have to do is reverse the probabilities of the function. the roulette wheel selection for the minimization problem requires updating the probabilities to 1-prob. Below the python example:

I hope that was clear, if not leave a comment and I’ll do my best to clarify it.

Genetic Algorithm Python Example

Genetic Algorithms (GA) are a subclass of evolutionary algorithms that emulate natural evolution. Darwin’s theory on natural selection states that the fittest individuals are the ones which reproduce. Following this theory, genetic algorithms are composed of three main phases: selection, reproduction, and mutation that attempt to copy the working mechanisms of nature. Genetic algorithms are principally used to find the global optimal solution heuristically.

Genetic Algorithm Applications

Genetic algorithms have been applied to many different problems in a wide spectrum of industries. This set of algorithms are widely used by computer science students to solve problems like the travel salesman problem (TSP) or the knapsack problem but it is widely used in many fields. All of the following points are also evolutionary algorithms applications since they are a bigger set of genetic algorithms.

Genetic Algorithm Steps

To program the whole genetic algorithm from scratch in python can be intimidating. Therefore, we’ll go through the genetic algorithm step by step. The next figure shows the other of each of the tasks involved to implement the full ga algorithm.

Genetic algorithm state diagram
Genetic algorithm step by step flow chart.

1. Start

First, randomly define N possible solutions to the problem. The first thing to do is to randomly generate solutions to the problem. They don’t need to be the best or follow any particular pattern, they will be the seed upon which later the best solution will be found. If you feel confident, you can try to create the initial set of possible solutions in the region where the optimal solution may be found. Instead of generating the solutions randomly, you can try to provide pseudo-random guesses on which may be the ideal solution. If you overdo it you may get stuck in the local optima instead of the global best solution.

2. Fitness Evaluation

With a set of N possible solutions is time to evaluate each of them individually and assess the fitness one by one. Fitness is a metric that represents how well each of the individual solutions performs for our model. If a solution is looking nice and well-optimized the fitness will be high whereas a wrong solution will have a low score. However, sometimes we may want to search for the minimal value of the function. If we have a minimization problem, then the best solution will be the one with the lowest value.

3. Progenitors selection

Based on the previously computed fitness the progenitors are selected. The higher fitness an individual solution has the higher the probabilities it has to mate and produce offspring (descendants). We simply need to select a set of progenitors based on their mating probability. The selection process is executed as many times as necessary until we obtain enough progenitors to produce N kids to replace the original set of N solutions. It should be noticed that each progenitor can mate more than once and with different partners. To select the parents there are several strategies (sorted from most to least common):

Roulette Wheel Selection

The roulette wheel is a selection method based on fitness probabilities. So, to do that you need to add up all the fitness metrics for each of the solutions and give each solution a probability of being chosen so that probability is individual_fitness/total_fitness.

Rank Selection

As the name indicates one should rank the solutions using the fitness function from worse to best. Then number them so that the worse is 1, the second worse is 2, etc. Then we add up these numbers and compute the probability as before individual_rank/sum_ranks.

Tournament Selection

This selection strategy is slightly longer. We randomly select a subset of solutions and pick the best enough times as solutions we need. Notice that if the subset has a size of 1 we’re effectively picking at random.

4. Mating or reproduction

Two different solutions are expected to mate. For simplicity here we will assume that reproduction is done between two solutions although there seems to be evidence that more progenitors increase the performance of the algorithm. The mating consists of merging the two solutions into one keeping bits of each of the parents. The mating can be done by exchanging fixed sections of the solution, but also selecting random bits of each parent. In either case, we need to make sure that the solution is still consistent. For example, if no repeats are allowed, we need to check that no repeats exist in the offspring, otherwise, that needs to be corrected so the solution satisfies the problem constraints.

5. Mutating

The mutation step is important to prevent that our algorithm gets stuck at the local optima. The local optimum is a solution that seems the best if we look at nearby solutions but it’s not the best possible solution. The best possible solution or global optima may be behind a dip and therefore we need randomness to jump across hills. The mutation step generates this so necessary randomness. Depending on the selected randomness, the mutation step changes different parts of the solution arbitrarily. If it’s too little we get stuck at the local optima, if it’s too much it will break the best solutions preventing them from consolidating and keep improving the general population fitness. There should be noted that some implementations do have inclusion criteria for the offspring. Some applications have a filter that prevents really bad offspring to be added to the set of solutions. Other solutions include mechanisms to prevent that the generated offspring are too similar for the sake of variation. The higher the variation the higher the chances of achieving a better solution, otherwise it can converge to all the solutions being the same.

6. Stopping criteria

If the stopping criteria are met, then we stop the execution. Otherwise, we go to step two and repeat the whole process again. Since the best solution is unknown a set of rules can be defined in order to stop the computation.

  • There is a solution that satisfied the minimum criteria. That means that there is a solution that has a fitness equal or better than we expected to be satisfied.
  • We already performed too many iterations. The algorithm has looped enough times so we assume that nothing better can be found.
  • We spent the budget. The computation/time/money has been used and there are no more resources left to continue iterating.
  • The solution has plateaued. The solution does not seem to improve and maybe it is not worsening either. The algorithm seems unable to find something better.
  • We think that the solution is good enough. After checking the results manually we can decide that we’re satisfied with the results and decide to stop the experiment.
  • A combination of all. We can merge all of them and find the best stopping rule for our taste.

Genetic Algorithm Example

Let’s get our hands dirty and code a genetic algorithm in python for optimization. To keep the consistency of methods, the evolutionary algorithm in python is going to be the genetic algorithm (GA). We first will tackle the traveling salesman problem using the genetic algorithm and then the knapsack problem also with the genetic algorithm and python. You’ll find both genetic algorithm python code in GitHub as a link at the end of each problem description.

Traveling Salesman Problem Genetic Algorithm Python

We’ll go through this genetic algorithm example step by step. The traveling salesman problem or TSP is a classic problem where you have a set of cities and there is the need to find a round trip route across all cities without repeating any.


Fitness assessment




Stopping criteria

A fully working implementation of the TSP problem implemented using a Genetic Algorithm in Python can be found on the jupyter notebook in Github.

Knapsack Problem Genetic Algorithm Python

This is the second ga algorithm in python. The knapsack problem provides us with a set of items with a weight and a value. Based on that we need to find which objects include in the collection so that the total weight is less than or equal to the limit and the total value is as large as possible.


Fitness assessment




Stopping criteria

The full working implementation on jupyter notebooks and python using a genetic algorithm of the Knapsack problem can be found on the GitHub.

Advanced: Tricks to improve your code

Each problem has a different set of rules, but researchers have found out a different set of techniques that if properly used can improve the performance of the algorithm.

  • Good initial solutions Instead of setting the problem with random solutions you can start with bets on how the solution is going to look like. In this way, the algorithm will be directed and hopefully closer to the best solution the problem has.
  • Elitism consists on keeping the best N solutions of the problem as they are. You should keep them as they are to the next generation. By ensuring that the best solutions are passed over generations the algorithm will avoid that the overall quality of the population decreases. Keeping the best will enable an improvement over the existing solution.
  • Adaptive hyperparameters enables adaptation for the crossover and the mutation rate depending on the state of the solution. Higher variation may be desired at the start but once we’re close to the solution we should aim to search in the nearby space.

Short video explanation

This is a short video explanation of genetics algorithms. After the presentation, the speaker shows his Traveling Salesperson Problem (TSP) implementation and how different parameters affect the performance of the algorithm. Different population sizes or mutation rates affect performances at various rates. It is very well explained and clear.

Thanks for reading. If you have any further questions leave a comment!

Resumen y reseña de “Cómo hacer que cualquiera se enamore de usted” de Leil Lowndes

Leil Lowndes es una experta reconocida a nivel mundial en relaciones. En su libro “Cómo hacer que cualquiera se enamore de usted” nos asegura que el amor tiene reglas para ambos sexos. Hay ciertas características que hacen una persona del sexo opuesto mas atractiva. Nos pasamos muchas horas frente el espejo intentando mejorar nuestro peinado o la ropa, pero nadie nos ha enseñado que características y cualidades nos hace más atractivos. A parte del punto de vista de citas y amor, el libro nos ayuda a entender las relaciones humanas des de otro punto de vista. Este libro no es solamente para hombres o mujeres, sino que sirve para todos. Todo esto esta basado en estudios científicos humanos, pero expresando su investigación de un modo ameno y apto para todos los públicos.

El primer paso del amor son las miradas

Mira el chico o la chica, si cruzas miradas desvíala. Pero vuelve a mirar en 30-40 segundos. Si los dos volvéis a cruzar miradas hay interés. Esta vez haz algún gesto, por ejemplo, sonríe y acércate. Di algo, cualquier cosa, no tiene que ser nada del otro mundo. Un comentario del sitio dónde estáis es suficiente.

Intenta mirar intensamente a los ojos (sin pasarte). Miradas intensas causan sensaciones buenas. Mientras habléis presta atención. Las conversaciones van dejando migas de pan que tienes que ir recogiendo. Puede que mencione un perro, pues aprovecha y pregúntale por el perro. En cualquier caso, mantente relajado, o por lo menos aparéntalo. Sonríe y disfruta del momento. La felicidad es contagiosa.

Las primeras citas

No pidas una cita temprano. Deja que se lo ganen. Que la primera cita sea llena de emociones. No la saques a comer esto es para más adelante. Escoge algo venturoso o que os deje mentalmente agotados por las emociones. En cualquier caso, vístete bien. Un hombre que vista bien tiene mucho ganado las chicas se fijan en esto.

Empezar una relación

Cuando ya hayáis pasado un par de citas juntos hay que mirar otros aspectos. Tenéis que ser diferentes, pero no muy diferentes: complementarios. Mira aspectos como deportes, música, libros, y hobbies en general. Las mujeres intiman hablando, los hombres haciendo (recuerda que esto puede cambiar a nivel individual).

Alimentaros el ego mutuamente. Hacer sentir el otro especial. Reconoce por lo que quiere ser recordado tu pareja y refuerza su visión. Ambos lados de la ecuación deben tener la sensación que han conseguido lo mejor de lo posible. Que las cualidades que se valoran las lleven a la mesa. Las cualidades son aspecto físico, dinero, prestigio y estatus, conocimiento e información, personalidad y naturaleza propia.

En general las mujeres les interesan las emociones y sensaciones. Hablan de salud, animales, filosofía, personas y problemas. Aquí los hombres tenéis que respaldar y no competitivos. Los hombres son más simples. Quieren sexo. Pero los hombres tienen que hacer sentir a las mujeres especiales. Personaliza el sexo para ella. Lo que quieras hacer no es para todo el mundo, es solamente para ella. Si ya lleváis tiempo juntos pregunta por el pasado, que le gusta y escucha atentamente, probablemente no sea muy exhaustiva. ¿Que busca tu pareja en una relación? ¿Qué significa ser un hombre ideal? ¿Qué significa ser amado? Estás preguntas pueden dar valiosa información.

New Year’s Resolutions 2021: Building a healthy lifestyle

Life is a never-ending learning process. For many years I have been writing publicly my new year resolutions (2020, 2019, etc) and my own assessments at the end of the year (2020, 2019, etc). It is a practice that I find useful to reflect on oneself decide what to keep and what to change. This practice is not perfect and includes failure, like last year when I tried to list my goals in a monthly format instead of bullet points. For this year I considered going for weekly goals but it seemed impractical. Separating a year in 7-day increments (52 weeks) requires too detailed planning. It is impossible to make it realistic considering the large numbers of unknowns. Instead, I will come back to my bullet list with coarse goals and hope I’m skilled enough to devise the short-term action plans at each step without deviating from the goal. I will again use the famous SMART technique to define and assess the goals.


  1. Physical exercises: With Corona and regular working from home, I’ve been quite physically inactive compared to other years. Gyms, swimming pools, and fitness centers had reduced capacity or were closed. And me working from home did not feel like going out into the cold and do sport. With this resolution, I intend to do short dayily home workouts and at least twice per week longer ones.
  2. Yoga and stretching: Following the same reason, sitting all day worsens everybody’s flexibility. I intend to do at least once a week 1h yoga and daily 10min of stretching exercises.
  3. Meditation: I had better times with meditation, but this year I’m finishing my PhD which seems to be a stressful time for many. I’ll try to do my best and not let it get me. Being Zen is my goal, so 10-20min of meditation daily is a must-to. I’m inclined to put napping time as a replacement for meditation is accepted.
  4. Books: For many years already I’ve managed to read quite a lot of books on top of my work reading. I intend to keep that, but I’ll try to get some action points from each book and implement it. Otherwise, knowledge gets lost between words.
  5. Reduce social media and time-wasting websites: Last year I reduced my social media consumption to once per day “just in case”. Sometimes I even forgot to check and people understood that. This next step is to not check it at all. For streaming services, I will limit it to eating time or weekends. Done eating? Done watching. Regarding messaging apps, reduce the replies to two/three times per day. It does not require speed. The same goes for the work ones.
  6. Travel: In spite of corona, this year I managed to do intercontinental travels and visit family several times. Now with the vaccine and “summer approaching” things can only get better. If possible and without too much of a hassle, I would like to visit a new country during summer.


  1. Finish my PhD: That being said, hand in before the end of the year, if possible even defend it before Christmas. Also, publish one or two manuscripts that are in preparation.
  2. Secure my post-PhD position: Decide what I want to do afterwards (career-wise) and secure it. That does not exclude getting some free time between jobs to travel or do other things.
  3. Mushrooms: Learn to grow mushrooms in a professional manner. Start with the basics like champignon and go to more advanced types. The goal is to find the easiest way to make the farming reproducible.
  4. Batteries: Think and try to move this field forward. Renewable energy lacks consistency over the day; therefore, energy storage seems the solution to bridge the gap between micro shortages. Understand at a deeper level how batteries work and are being recycled would meet the requirements to accomplish this resolution.
  5. Start a company: This point has been here for as far as I can remember. I hope to get my act together and accomplish the goal. A success is generating a recurrent income.
  6. Investments: I’m considering trying to invest and generate a stable income source. I don’t know yet how to approach this.


  1. Get a 6 pack: Because why not. Since I’m doing home workouts I can target specific muscle groups.
  2. Declutter: Check all my possessions and donate things I dislike or don’t use.
  3. Quit alcohol alltogether: I haven’t been drinking much at all mostly because it does not bring me anything but I still do it in social gatherings. I thought it could be interesting to see if I manage to not do it at all, and how to replace it. A little bit like I did with meat.
  4. Keep more regular schedules: I’ve been waking up and going to bed at similar times during the whole year. Let’s see how much more regularity I manage. Meaning that on weekends I still follow the same schedules as the weekdays.
  5. Publish here monthly: It is not easy to write things here but I try my best. I would like to continue the current approach because it has not felt like a burden. Let’s continue with this rhythm.
  6. Arguing more often: I feel I have an intuition for things but I’m not always able to express it correctly on the fly. I should try to defend better these “intuitions” without preparation time.

Remember to aim for the stars, be happy, and when in doubt choose the adventure.

Happy new year!