ia: Benvenite! In mi blog io scribe in interlingua, italiano e anglese.

it: Benvenuti! Nel mio blog scrivo in interlingua, italiano e inglese.

en: Welcome! In my blog I write in Interlingua, Italian and English.

Back to Maemo!

New year, new job. After leaving Canonical I'm back to working on the same software platform on which I started working back in 2006: Maemo. Well, not exactly the vanilla Maemo, but rather its evolution known as Aurora OS, which is based on Sailfish OS. This means I'm actually back to fixing the very same bugs I introduced back then when I was working in Nokia, since a lot of the middleware has remained the same.

At the moment OMP (the company developing Aurora OS) is mostly (or even exclusively, AFAIK) targeting business customers, meaning corporations such as the Russian posts and the railway company, whereas the consumer market is seen as something in the far away future. Just in case you were curious whether there were any devices on sale with Aurora OS.

I should also explain why I've refused several very well paying job opportunities from Western companies: it's actually for a reason that has been bothering me since last March, and it's a very simple one. The fact is that because of the sanctions against Russia I already had to change bank once (as the one I was using fell under sanctions), and in these months I've always been working with the fear of not being able to receive my salary, since new sanctions are introduced every month and more and more banks are being added to the blacklist. That's why I've restricted my job search to companies having an official presence in Russia; and to my surprise (and from some point of view, I could even say disappointment) the selection and hiring processes were so quick that I received three concrete offers while I was still working my last weeks at Canonical, and I joined OMP on that very Monday after my last Friday at Canonical.

I mean, I could have rested a bit, at least until the Christmas holidays, but no. ☺ Anyway, I'm so far very happy with my new job, and speaking Russian at work is something totally new for me, both challenging and rewarding at the same time.

Leaving Canonical, again

For the second time, I'm being shown the door at Canonical. Well, technically, this time it was me who handed over my resignation, but that was only after I was told in very clear terms that I would eventually be fired. No timeframe was given, but since I don't particularly enjoy the feeling of checking my e-mail every morning to find out whether this is the day when I'm being fired, I decided to take the initiative and leave myself.

The reason? Those who know me well might suspect that it's related to some complications with that fact that I'm living in Russia, or maybe with some remarks I might have made about the war in Ukraine or about other current events, since I tent to be quite outspoken and provocative. Nothing of all that: it's about my refusal to get vaccinated against COVID-19; unfortunately, it has now become apparent that I'm not the only one leaving, and other employees who have refused either to get vaccinated or to disclose their vaccination status are also being shown the door (including people who have been in the company for more than 10 years). This has sparked some internal discussions in the company, and several different point of views have been voiced: from those who welcome this policy and would like to see it extended to flu vaccinations (which makes a lot of sense, since once you've accepted to renounce your freedom in order to protect the weak, you should accept it for all transmissible diseases), to those who voiced concerns about the legality of this move, or would have found this reasonable one year ago but not in the current situation as restrictions are getting lifted and the current variants are less scary than the previous ones; those who pointed out that being vaccinated has little impact on transmissibility of the virus; that we are mostly a remote company and we could instead have exceptions to allow unvaccinated people (or people with a weak immune system) to remotely attend the few in-person meetings we have; that as long as there are no vaccination mandates for plane flights and other guests attending the same hotel premises where we meet, mandating employees to get vaccinated might not help a lot; and whether this is a decision that a company should make, or shouldn't it rather lobby the politics to have it mandated at state level. I think there's merit to all these arguments, but I'm personally not particularly interested in discussing any of them, since my point is another.

Before talking about that, though, let me clearly set one thing straight: I hate lies, and Canonical's management is lying about this matter. The vaccination mandate measure is being justified on the grounds that it allows employees to travel (something that I've been able to do as unvaccinated throughout the last two years, even when restrictions were at their peak) and, most importantly, to protect our weaker colleagues. This is what I find most disgusting: using genuine feelings like love and compassion to justify repressive measures. No, dear Canonical, this has nothing to do with protecting the weak; not only because a vaccinated person can still spread the virus (and our employees know this from first-hand experience), but also because, if this was the real reason, then you'd accept people who have recently recovered from COVID-19, since immunisation after recovery is not worse than that of vaccination; but you don't, as I was explicitly told by HR that any previous infection is irrelevant. It's also significant that you didn't establish clear rules about how often one needs to get vaccinated, since all recent scientific literature on vaccine efficacy shows that this is not a minor detail. Why not just be honest with ourselves, and admit it's just for business? Being open about the fact that having a fully vaccinated workforce can grant us access to more business deals would not change a lot in the practical life of the (ex-)employees, but at least we won't feel that the company is treating us as fools while embellishing its image with fake care and compassion. Or, if there are other reasons, state them, because these ones don't stand up to logic scrutiny.

Another thing that doesn't match (though maybe this is a timing issue, so I cannot for sure call it out as a lie) is the fact that HR claims to have an exemption process through which one could opt-out of the vaccination for religious beliefs. Well, I was explicitly told in very clear terms by HR that no exceptions would be made on either moral or religious grounds. But maybe this has changed since the time I was told this (mid October) and now?

Here, finally, let me state why I believe that such a mandate is wrong. The first thing I want to put on the table is that even though I see very little reason for this mandate (given all what we know about the virus mutability and infectiousness, the shortcomings of the vaccines, etc. — by the way, if you are into science I suggest reading this article which raises some questions you won't hear in mainstream media and has a comprehensive bibliography for further study), I recognize that in principle there are very solid reasons for vaccination mandates, for example in the case where a virus is extremely lethal, its symptoms otherwise uncurable and the vaccine is 100% safe and highly effective. But even in that case, while getting vaccinated myself, I would still oppose a mandate. Why? Because of freedom, which trumps everything. The choice is never between a healthy life and freedom: if there's no freedom, there's no life worth living. Even if some decision has very solid reasons behind it, this doesn't automatically make it a good decision.

Let me make a few examples: if a company (I'm talking about companies here, but the reasoning could be extended to states as well) decided that smokers will be fired, or that those who drink alcoholics will be fired, or that you cannot eat meat, or that you must take a pill whenever your head aches, or that transgender people must undergo gender reassignment surgery, or that everyone should wear a black band on their arm whenever a relative of a colleague dies, or that employees' households must use the product made by the employer, or that they have to excercise sports for at least two hours per week, etc.; I would be categorically opposed to every single of these impositions, despite recognising that there are reasons behind each of them, and that I even dream of a world in which some of their goals are attained (could we just all be fit and healthy?!). Because I think that personal freedom is more important. You can always find good reasons to justify this or that action; surely, if we think back at the fascist and totalitarian regimes of the first half of last century, we must acknowledge that they were supported by the (overwhelming?) majority of the population. An effective propaganda machine could convince the population on this and that matter, but ultimately it's the population who reasoned and accepted that storytelling. Nowadays the situation is different, but the mechanisms are the same, except that propaganda has become way more effective (or have we become dumber?) and aligned over the same direction, thanks to the globalisation process.

I'm well aware that societies are made of rules and therefore inevitably restrict personal freedom: Western societies, for example, forbid nudity in public places, and that's something I accept because it's part of my culture; it's a rule deeply entrenched in our history, and I don't feel it as a burden. I'm convinced, however, that the evolution of human society should be that, as we become more conscious, we should be moving towards more free societies, with fewer rules and more tolerant for diversity.

The “idiotism” of software developers

Before you get angry at me for this title, please let me state that I count myself in the number of the “idiots” and, secondly, that what I mean by “idiotism” here is not to be intended as an offence, but as some traits of mindset which are typical of very logical brains.

Some months ago I finished reading Dostoevskiy's “The Idiot”, a book about an exceedingly good-hearted man, prince Lev Mishkin, whose behaviour was puzzling the people around him so much that they thought of him as an idiot. Sure, the fact that he was suffering from epilepsy didn't help, but it was far from being the primary reason for their thinking, since his epileptic seizures were very rare (if I remember correctly, only two occurred during the time of the story) and everybody's opinion had already formed well ahead of witnessing him in such a state.

He was an idiot because he was open, trustful, and especially because he could not “read between the lines” of what was been said to him: his social conduct was straight, and although he was following at his best the customs that he had been taught, he was supposedly awkward and unable to perceive and parse all the messages that are implicitly conveyed by social behaviours and human interactions. I added the word “supposedly” because, as a matter of fact, his behaviours were all perfectly normal for me: I only noticed their awkwardness when it was pointed out by the other characters, at which point I couldn't help smiling and acknowledging that, indeed, that thing he did was weird.

However, he was a good and caring person, and not without talents: he had an interest in calligraphy, and everybody liked to listen to him, as his speech was insightful and his thoughts were original. I wonder how many of my readers can identify themselves in such a character?

I definitely can. I won't get into the details, but I've felt many times on me the amused or puzzled glance of people (like that time in high school when I could not open a door in front of dozens of people, and I heard them say “So, that guy is the genius of mathematics?” — I'll never forget that!), often without understanding the reason for their reactions. Still, generally people seem to like my company and be genuinely interested in talking to me.

So, what's wrong with prince Lev Mishkin, me, and maybe with you too? Well, a few things, I would say. I'm not going to claim any scientific truth on what I'm going to say, these are just my own impressions and deductions, which seem to be shared by other people in the interwebs too, judging from a quick search I did; take them for what they are.

The first thing I notice is some common traits between us and autistic people: we tend to work better with things, rather than with people; we can focus on a certain thing (work, a mathematical problem, a game) and forget about the world around us; we have our unique hobbies, like solving puzzles, arguing about a specific and very narrow topic, learning artificial (both human and programming) languages; it's as if we needed to build a small, better world where we would feel safe and at ease.

The other thing, which I actually consider harmful and which I put efforts to change in my own life, is the fact that it's extremely easy to get us interested into a specific aspect of a problem, and make us forget (or just not notice) the big picture. That small part that we are looking at is stimulating and challenging, and we are led to think that it's core of the issue, and maybe of all the issues that affect our world. What is often missing is the ability to take one step back and try to look at the issue from a different angle, and especially the ability to listen for counter arguments; I mean, we do listen to them, but since we have, in a way, “gamified” the issue, even when we think that we are open to listen to the other side, we are in reality trying to win the counter-arguments, rather than genuinely trying to understand them.

Another thing which we have, is faith. Yes, you read it right: even though the IT world is probably the one with the highest percentage of atheists, men always need something to believe in. We just don't realize it, but we do hold a blind trust in certain persons and authorities. This does not mean that this trust lives forever and cannot be broken, but this generally does not occur because of a conscious realization of ours. Much more often than we'd like to admit, the reason why we lose faith in a certain person or authority is because the rest of the persons and authorities that we trust has told us so. In other words, even if there's undoubtedly a reasoning of our own, the full realisation and conviction occurs after having collected and compared the opinions (or statements) of those we trust. The net result is that the IT population is the one most trustful of the mainstream media, because it's the mainstream media who has more “voice”: that's where the most reputable journalists, scientists, activists are (and “reputable” is the key word here, since this reputation is recursively created by the mainstream media themselves or by their sponsors).

I might be biased by my own experience here, but it seems to me that there isn't a group of people more homogenous in their political (and generally, world) views than that of IT workers. When, in 2018, I saw the leaked video of Google's co-founder Sergei Brin and other executives' reaction at Trump's presidential victory, what I found most surprising was not the contents of the speech, as they were mostly mainstream opinions, but rather the fact that all this could be said in a company meeting. Something like this, I though, could never happen in an European company, as political matters are a conventional tabu in the work environment. But the point is that Brin and others could say those words only because they knew that the overwhelming majority of the audience shared the same opinion. I don't think you could find the same homogeneity of thought among shop assistants or philosophy professors.

Assuming that you have followed me this far into my rambling, and that you recognize that there might be some truth in what I wrote, you might now be wondering if there's a way to counterbalance our “idiotic” traits. Unfortunately I don't have a full answer, as myself am only halfway there (but maybe I'm too optimistic here? and does this road even ever end?), but there are a few things that I think are absolutely worth trying:

  • Talk with people. Better if face to face, or at least in a video call; just 1-on-1, avoid groups, or you'll get on the defensive and try to defend your position for the sake of not losing the argument in front of an audience. But it's not a fight. Your goal when talking should not be that of convincing or getting convinced, but rather just to understand the other points of view.

  • Read both sides of the narrative. Try to see the other party's argument as they themselves present it, and not how it is presented in the media you usually read. Media often use this trick, to either invite “clown representatives” of the other point of view just to ridicule it, or they give them too little time, or extrapolate their answer out of context, just to make them appear unsensible.

  • Always assume that other people are smart, and that no one is bad.

  • Whatever the argument, try to answer the key question: “Cui bono?” (who profits?) to be at least aware of all the hidden interests behind this and that. They don't necessarily invalidate a position, but they must be considered.

  • Lose faith. The only faith you are allowed to keep is the faith in God (or Gods), if you have it: but men, theories, institutions, authorities (including religious ones!), these must always be assumed to be imperfect and not blindly trusted. People serve their interests or can be manipulated. Try always to start from a clean table and an empty mind, and see if they have enough arguments to convince you.

  • Do never assume “They can not all be wrong” or “If this were wrong, at least some media would report it”. It just doesn't work this way, this is again a matter of having faith in the majority. Think of how many times in (recent) history you were presented an unambiguous truth, which later came out to be a scam (Iraq war being a famous one).

  • Defocus. You might be spending a lot of energy into something that's not worth it. I mean, feel free to pursue whatever hobbies you like, as long as they make you feel better. But if you think you have a mission, think twice about it. Think about the world you'd like to live in, and whether/how this mission contributes to it.1

  • Ask questions. Be curious. Be challenging. For any topic, there are questions that have not been answered in mainstream media2. Find the answer, then find explanations, never stopping at the first satisfactory one, but always get at least two competing answers. From here, ask more questions, rinse and repeat. And at every step ask yourself this: why didn't I know about this? Is someone trying to hide the truth from me?

  • Aim at improving. Whenever you read something or talk to people, keep a humble attitude and try to be challenged. Your goal should be that every reading and every dialog should make you wiser, even if what you initially read and heard sounded like garbage. There are always reasons for all these thoughts you disagree with.

  • Reach out to the people nearby. Try not just to be sympathetic to the needs of some population living far away from you, which the media has singled out as being those needing your compassion, and try instead (or in addition to that) to be sympathetic and helpful to the people around you. To your neighbours, to those you see in the public transport and, first and foremost, to your relatives.

Summing up, what I want you to realize is that we IT workers are easily exploitable. All those thought manipulation techniques represent a problem to everyone, but it's particularly with us that they tend to be especially effective; as a matter of fact, I've found that awareness of how the power controls us is higher among uneducated people, because they are more distrustful of the media and just tend to consume less of it. We, on the other hand, are not only well educated to respect the authority (see Noam Chomsky on education), but our logical, detail-focused mind can be easily externally controlled by continuously stimulating it to focus on specific things and not others.

How would Dostoevskiy call us?


  1. I was recently surprised when I read people in a forum who were discussing avoiding doing business with Saudi Arabia because of their human rights record. Seriously? We are talking about a government who has indirectly caused the death of more than 300 thousands people in Yemen, and your main reason to criticize them is human rights? It's like asking the police to arrest a killer because before the assassination he misgendered his victim! Yet the elephant in the room continues to go unseen. 

  2. My favourite one is: which country hosts more refugees from Ukraine? 

Deride, a generator of mock objects for unit testing

If you have been writing C++ classes for mocking out your C or C++ dependencies, you know how tedious it is. I generally write small classes with just a handful of methods, so it's generally bearable, but when using third-party code I'm usually not that lucky. If the dependency is a C library this becomes especially tricky, both because they might be larger than what you can handle, and both because the lack of an object-oriented design might not offer you an easy solution to store the mock object data.

But fear no more, Deride is here!

I won't spend too many words describing it, since you can read its description from the link above, where you will also find some example code. More examples, by the way, can be found in the example/ folder in the code repository, where you can see how it can be used to mock both pure C++ and QObject-based classes, and C libraries.

What is most important for me to say now, is that the project is in alpha state, meaning that I've tried it on a handful of header files only; it's highly likely that it will not work on many real-life scenarios, and if that happens I warmly invite you to inform me by filing a bug report providing the include file that was not properly processed.

I leave you with a short example of a unit test, written using Deride. The class under test is called Stable, and internally it uses objects of type Horse, that we decided to mock. We used Deride to generate the mocked implementation and a MockHorse class which can be used to control the mocked objects. When building the test, we won't link against the original horse.cpp, but we'll only use the original horse.h; the implementation will be found in mock_horse.cpp, generated by Deride. And in the corresponding mock_horse.h file we'll find the MockHorse class with all the on<method>Called() hooks which we can use to install our callbacks (either to reimplement the object behaviour, or to just be notified on when its methods are called).

    /* This MockHorse is the object created by Deride
     *                   |
     *                   |
     *                  \|/
     *                   V
     */
    using Mock = Animals::MockHorse;

    std::list<std::string> horseNames = {
        "Tom",
        "Dick",
        "Harry",
    };

    /* We could use a vector, but let's be explicit */
    Mock *mockTom;
    Mock *mockDick;
    Mock *mockHarry;

    int createdHorses = 0;
    // onConstructorCalled() is created by Deride and called when the mocked
    // Horse object is created
    Animals::MockHorse::onConstructorCalled([&](const std::string &name) {
        std::cout << "Horse instantiated: " << name << std::endl;
        createdHorses++;
        if (name == "Tom") {
            mockTom = Mock::latestInstance();
        } else if (name == "Dick") {
            mockDick = Mock::latestInstance();
        } else if (name == "Harry") {
            mockHarry = Mock::latestInstance();
        } else {
            assert(false); // should not be reached
        }
    });

    Stable stable;
    stable.createHorses(horseNames);
    /* It's at this point that the contructor callbacks we defined above will
     * have been called. Let's double-check that indeed that's the case.
     */
    assert(createdHorses == 3);
    assert(stable.count() == 3);
    assert(mockTom != nullptr);
    assert(mockDick != nullptr);
    assert(mockHarry != nullptr);

    /* Prepare for mocking the jump; these methods are generated by Deride and
     * allow setting the return value for the corresponding jumpHeight() method
     * from the original Horse class. */
    mockTom->setJumpHeightResult(1.5);
    mockDick->setJumpHeightResult(1.7);
    mockHarry->setJumpHeightResult(1.3);

    std::string highestJumper = stable.findHighestJumper();
    assert(highestJumper == "Dick");

In my closing words I'd like to thank the Clang project, which Deride is using to parse and interpret the input files, and Jinja2, the templating engine used to generate the mock code.

Scrum, agility and the human factor

I've been working in Scrum teams for 15 years now, give or take. Different companies, different approaches, from loosely following the agile principles to a stricter implementation of the Scrum methodology. The only invariant being that in practice Scrum is never followed by the book, but every company and team makes its own adaptations, which makes it hard for everyone to voice statements and critiques that could be considered universally true. That's why I will refrain from taking this road, and instead I'll try to point out a few aspects and behaviours that I've personally noticed during my career, good and bad ones (but of course, since I'm old and bitter, more bad than good).

Scrum's focus on communication is, in my opinion, where most of its value lies on: it's indeed important that other team members know what you are doing, and that management has an idea of the progress being made. Hence daily standups and the scrum board, and demos and retrospective at the end of each sprint.

It makes sense, on paper. And in practice as well, if you find yourself in a team which is not really a team but a group of individuals with communication problems. But that should not be the rule, and that's my main criticism of Scrum: it's a very good system for managing poorly skilled developers.

In a highly skilled team, all of the benefits that Scrum is supposed to bring are already a given: back in 2006-2008, in Nokia, most of our communication was occurring in IRC and mailing lists. The fact that some of our co-workers were remote indeed acted as a push for this choice. The same occurred in my early years at Canonical, where (at least in my team) we had a video conference only once per week: if the communication is already happening in an open (to the team members) place, there's no need for further synchronisation points. And if the managers and product owners are also monitoring these discussions, they know perfectly well how the situation is and can report it further up.

Demos

What about demos? Having always worked on middleware and system programming, where there's very little to show, I've never been fond of demos. Our team demos have always been boring and of little significance for most of their spectators. And while it can take a lot of time to prepare a demo, if we already communicated what he have done in this sprint, what's the point of spending more time for the demo? Is it a lack of trust? Or is it a way to make the team proud of its accomplishments? In any case, the same could be achieved in a more efficient way: have a specialized person (maybe from the QA team) prepare and run all the demos. In this way you'd not only achieve those goals, but you'd also make sure that there's no cheating (ehmm…) and that bugs are noticed right away.

Story estimations

Luckily so far I've been involved in only two projects where it was required to estimate the complexity of the backlog stories. But it was enough to convince me that there's something fundamentally wrong with it. On one hand, we are being told that we should estimate complexity, and not time, but then the story points are being used to decide how many stories can fit in a sprint. It can make sense to estimate the complexity, indeed, because it's an intrinsic property of the story, which typically does not depend on the actual person who sits down to work on it; but then what can we use this value for? And how much time are we willing to spend in order to figure out this nearly useless magic number? We keep the whole team sitting down together while throwing estimates, and then question them; and indeed, in order to let other people express a reasonable estimate we should also explain the story with a certain level of detail. And while this sounds like a worthwhile thing to do (explaining the story, I mean), it's probably better to do that in written form, and ask the team members to read all the stories before the grooming session. This is what we have been doing at some point, except that most of the time there would be at least one colleague who hadn't done his homework, so you still had to either retell the story during the meeting, or have the complexity discussion anyway since not all estimates were in agreement.

Having a clear description on all the stories (where a “clear description” could even be just a link to a bug report, if that contains enough information) does not cost a lot of time, as long as the description is written by a single developer and not during a meeting with the whole team. It brings the benefit that while writing the story one might realize that there's more to it and this can lead to the creation of additional stories before one actually starts the sprint.

If, for whatever reason, a point score is absolutely required (just because upper management wants so), then this should probably happen as the description is being written, and can be set by the author alone; no need to gather the whole team for this (since, in any case, the score is inevitably linked to how the story's creator presents it).

Sprint planning

It is my firm believe that a team member with no stories assigned should always be allowed to drag the topmost story from the backlog (who should be kept in the desired order by the product owner) into the sprint, without needing any kind of approval from above.

Unfortunately, I've been working on teams where this was actively discouraged, if not prohibited. The rationale being that all stories that we bring into the sprint are a commitment, and that once the TODO column is empty, everybody who is free of other work should help their colleagues to complete their stories which are still in progress. This sounds good in theory, but in practice it makes little sense, unless the stories still in progress can be reasonably split into smaller parts (and most of the times they can't).

So, a lot of effort is made in order to plan a sprint so that all of its stories can be completed, and at the end of the sprint one can look at the burn-down chart and feel proud of that diagonal line having gotten so close to the horizontal axis. Except that everybody knows that we are just fooling ourselves, because that beautiful graph is only the result of us undercommitting on the sprint planning and then avoiding to bring in more stories into the sprint once we had the resources to do so.

Every developer is worth 1

It seems to me that Scrum works under the assumption that all members of a team are interchangeable, and that it does not matter which developer takes up which story. It has been like this at least in one of the projects I worked in: as soon as you'd finish working on your story, it was mandatory to pick the topmost story from the TODO column, whatever it might be. Not the second or the third one: you were allowed to pick the first one only. The reason for this is that we had some stories that no one wanted to work on, and they'd risk getting delayed forever. But this “solution” caused another issue, because if the topmost item in the TODO column was an uninspiring story, this made so that developers would be slower and hesitant in finishing their current stories; no one would openly talk about that, but it was something you could easily sense, as people started to find issues in their code, adding more unit tests than usual, or “inadvertently” picking up the second topmost story from the TODO column. So, a problem that could have been easily solved by authority (just let the PO or the lead developer decide who should do what) would become another source of inefficiency.

A slightly related issue is the fact that if a team is very inhomogeneous, and we estimate the stories just by their complexity, we can't really predict whether our sprint will be a successful one, because it all depends on which developer works on which story. Believe it or not, I happened to complete in a handful of hours a story that a teammate had been working on for almost one month (I assume he was also slacking off, but the point remains): at the standups he was always reporting “good progress”, until I took the chance of him having a day off and I stole the story from him. One might argue that even if a complexity estimation gives no forecast on when the story will be completed, it can still be used in cases like this, to detect the underperformers. This is totally true, but that's the subject of another blog post.

Rearranging developers in homogeneous teams

Besides, it should not come as a surprise that developers can have very different skills, up to a factor of hundreds, if we take the extremes, and this can be due to very different reasons: a low performance could be due to one being a junior developer, to personality issues, or just to a congenic lack of an analytic mindset.

If on one side it makes sense to mix junior and experienced developers in the same team in order to boost the productivity and skills of the junior developers, the same does not hold true for good and bad developers: if one hasn't acquired the needed coding skills after a couple of years of work experience, it's unlikely that continuing to have this developer work side by side with more experienced ones will bring much benefit to him. On the opposite side, it can stress out the more productive developer and demotivate him. Now that a long time has passed, I can say that this is exactly what happened to me in a couple of occasions during my career (and the fact that these colleagues continuously argued and did not recognize their shortcomings did not help).

You will never get a perfectly homogenous team, since people always have different experience and skills; anyways, a little of gradation is healthy, because it stimulates all team members to compete in improving, by seeing each other as a model to surpass. But this only works if the target is felt as reachable (otherwise the lowest skilled developer won't have enough motivation) and worth reaching (otherwise the highest skilled developer will feel he has nothing to learn from the others).

That's why, in my opinion, it's worth rearranging teams along skill levels: the teams with lower skill levels can benefit from being Scrum managed, because Scrum sets up a frame inside which a low-skilled developer can still be productive (albeit at a slower pace) thanks to the continuous monitoring and feedback. Highly skilled teams — which, incidentally, does not only mean good coders, but also good teammates with prioritization and communication skills, and understanding the project goals and nearly capable of managing themselves — could do very well even without Scrum, and just need a project owner who sets the goals and defines the high-level stories (generally called “epics”), which they can then break into smaller tasks by themselves. Adding more Scrum to such teams might not lead to any improvement.

What about managers?

I tend to think on a similar vein when it comes to managers (be it project manager or product owner): my impression is that Scrum is most beneficial when the team has a poor manager, because it sets some rules that make the figure of the manager less relevant and reduce it to a role that can be easily performed by almost anyone. Here I might be totally wrong, of course, since I've never worked as a manager and there are aspects of their job that are less visible and that I might be overlooking; but again, I think that a good manager makes Scrum redundant. Being crystal clear about the team goals, setting up a work environment that stimulates every team member to give his best, being able to notice early when things are not going as planned or when someone is underperforming or not feeling at ease, making sure that the current development stage is well understood by the rest of the project, etc.: all these things are also Scrum's goals, so if they are already happening, the company should cherish this manager as a role model and question whether Scrum would be really beneficial here.

Conclusion

In other words, summing up, one company/department should consider introducing Scrum once a problem has been detected; “as long as the boat goes, let it go”, as a popular Italian song says.