Skip to content

Open Source

Mainstream: Noun. The principal or dominant course, tendency, or trend

Sonar - Wed, 09/30/2015 - 22:13

At the SonarQube Geneva User Conference last week I learned that 7 of the Fortune 10 companies and 47 of the Fortune 100 use the SonarQube platform. We’ve got an estimated adoption of 50,000 companies overall (based on the number of unique IP’s that hit the update center). The figures really struck me because I’d never realized before how mainstream the platform is.

At my previous job, there was a lot of discussion about adopting a standard tool set. The logic went that standard tool sets are easier to hire for than home-grown frameworks. Not only that, but it’s easier to keep up with the pace of change if you’re using the standard; for any given technology change, you simply do the normal upgrades everyone else is doing, rather than having to re-engineer your stack, and wonder if you’ve covered all the bases.

That’s why an adoption of 50,000 companies – more than 20 times the adoption rate of our all our competitors put together, I’m told(!) – caught my attention. If you assume an average of 40 developers and development managers at each company, that’s 2 million people using SonarQube today(!). And that doesn’t even count the contributors to open source projects that track their code quality on nemo, the demonstration instance of SonarQube.

That means that if your company is using SonarQube, your chances are good that any new hires will already be familiar with it. You’ll have to train them on your expectations, but not on the tool itself.

At my last job we wanted to adopt the standard tools. At SonarSource, we are the standard tool. That’s pretty cool.

Categories: Open Source

The Agenda for the Geneva Conference is Available

Sonar - Fri, 09/11/2015 - 15:02

The Geneva SonarQube is going to take place on 23rd-24th of September in Geneva and it is still possible to register

We want this 2-day conference to be very valuable as possible for participants, therefore it took us a little bit of time to put it together, but we believe we have a great agenda for the conference.

Categories: Open Source

SonarLint for Visual Studio 1.2.0 Brings Code Fixes to the IDE

Sonar - Thu, 09/03/2015 - 16:36

SonarLint for Visual Studio version 1.2.0 was released this week. In this version we focused on improving the user experience by adding code fading and fixes. Code fading makes some issues less obtrusive, and code fixes are concrete suggestions for solving specific issues in the code. This means that when an analyzer identifies an issue in the code, the IDE can propose an automatic fix for it. We’ve added fixes for 17 rules, and the best part is that the user can choose to fix all issues of the same type all at once for the whole solution, which can immensely speed up paying down technical debt.

Analyzers and code fixes are integrated into Visual Studio 2015 natively thanks to Roslyn. As you would expect, the issues we raise show up in the Error Window. As part of improving the user experience, now some issues on redundancies or useless code just show up as faded text (note the fading in the image below). So these less serious issues aren’t uselessly cluttering the Error Window any more.

Redundancies fall into the “easy to fix automatically” category. For example, for the above issue (Rule S3254) we could simply remove the redundant code. In Visual Studio, to check and accept the proposed code fix, you should hover over the issue location and expand the lightbulb tooltip. Or you can move the caret to the line of the issue, and hit Ctrl+. (There is a good video on Channel9, which shows the navigational shortcuts in Visual Studio 2015.) The tooltip window contains all the available options for the issue. There can be multiple possible fixes for an error, so you can choose which one to apply. For the above case, there is only one fix, which is to remove the redundant arguments. Also note in the image below that at the bottom of the preview window you can choose to apply this fix to all issues in the document/project/solution.

One of my favorite code fixes is the one that simplifies conditional statements. Consider the following code, where the true and false branches of the conditional statement are very similar.

Here, the code fix for Rule S3240 proposes using the ?? (null-coalescing) operator instead of the 8-line conditional statement. The code fix provider is clever enough to recognize that this if can be simplified to ?? and not just to the ?: (ternary) operator, and it only proposes the simpler one.

These are just two of the new code fixes. There are 16 more available (one rule has two fixes). We also added two new rules and fixed some bugs in this version. You can see the full list of rules at the new version-specific landing page. A slight restructuring of the SonarLint website, means that each release now has its own landing page, which summarizes the changes since the previous version.

Categories: Open Source

MSBuild SonarQube Runner now available on Visual Studio Online

Sonar - Wed, 09/02/2015 - 09:13

The MSBuild SonarQube Runner TFS 2015 Build Tasks are now available out of the box on Visual Studio Online, and even on Hosted Build Agents! This means that SonarQube analysis can now be enabled in a few clicks on any Visual Studio Online project without having to install anything!

I could tell you more, but Jean-Marc Prieur from Microsoft has already done such a beautiful job that you should just read what he wrote in his Visual Studio ALM blog post.

Categories: Open Source

Don’t Cross the Beams: Avoiding Interference Between Horizontal and Vertical Refactorings

JUnit Max - Kent Beck - Tue, 09/20/2011 - 03:32

As many of my pair programming partners could tell you, I have the annoying habit of saying “Stop thinking” during refactoring. I’ve always known this isn’t exactly what I meant, because I can’t mean it literally, but I’ve never had a better explanation of what I meant until now. So, apologies y’all, here’s what I wished I had said.

One of the challenges of refactoring is succession–how to slice the work of a refactoring into safe steps and how to order those steps. The two factors complicating succession in refactoring are efficiency and uncertainty. Working in safe steps it’s imperative to take those steps as quickly as possible to achieve overall efficiency. At the same time, refactorings are frequently uncertain–”I think I can move this field over there, but I’m not sure”–and going down a dead-end at high speed is not actually efficient.

Inexperienced responsive designers can get in a state where they try to move quickly on refactorings that are unlikely to work out, get burned, then move slowly and cautiously on refactorings that are sure to pay off. Sometimes they will make real progress, but go try a risky refactoring before reaching a stable-but-incomplete state. Thinking of refactorings as horizontal and vertical is a heuristic for turning this situation around–eliminating risk quickly and exploiting proven opportunities efficiently.

The other day I was in the middle of a big refactoring when I recognized the difference between horizontal and vertical refactorings and realized that the code we were working on would make a good example (good examples are by far the hardest part of explaining design). The code in question selected a subset of menu items for inclusion in a user interface. The original code was ten if statements in a row. Some of the conditions were similar, but none were identical. Our first step was to extract 10 Choice objects, each of which had an isValid method and a widget method.


if (...choice 1 valid...) {
if (...choice 2 valid...) {


$choices = array(new Choice1(), new Choice2(), ...);
foreach ($choices as $each)
  if ($each->isValid())

After we had done this, we noticed that the isValid methods had feature envy. Each of them extracted data from an A and a B and used that data to determine whether the choice would be added.

Choice pulls data from A and B

Choice1 isValid() {
  $data1 = $this->a->data1;
  $data2 = $this->a->data2;
  $data3 = $this->a->b->data3;
  $data4 = $this->a->b->data4;
  return ...some expression of data1-4...;

We wanted to move the logic to the data.

Choice calls A which calls B

Choice1 isValid() {
  return $this->a->isChoice1Valid();
A isChoice1Valid() {
  return ...some expression of data1-2 && $this-b->isChoice1Valid();

Which Choice should we work on first? Should we move logic to A first and then B, or B first and then A? How much do we work on one Choice before moving to the next? What about other refactoring opportunities we see as we go along? These are the kinds of succession questions that make refactoring an art.

Since we only suspected that it would be possible to move the isValid methods to A, it didn’t matter much which Choice we started with. The first question to answer was, “Can we move logic to A?” We picked Choice. The refactoring worked, so we had code that looked like:

Choice calls A which gets data from B

A isChoice1Valid() {
  $data3 = $this->b->data3;
  $data4 = $this->b->data4;
  return ...some expression of data1-4...;

Again we had a succession decision. Do we move part of the logic along to B or do we go on to the next Choice? I pushed for a change of direction, to go on to the next Choice. I had a couple of reasons:

  • The code was already clearly cleaner and I wanted to realize that value if possible by refactoring all of the Choices.
  • One of the other Choices might still be a problem, and the further we went with our current line of refactoring, the more time we would waste if we hit a dead end and had to backtrack.

The first refactoring (move a method to A) is a vertical refactoring. I think of it as moving a method or field up or down the call stack, hence the “vertical” tag. The phase of refactoring where we repeat our success with a bunch of siblings is horizontal, by contrast, because there is no clear ordering between, in our case, the different Choices.

Because we knew that moving the method into A could work, while we were refactoring the other Choices we paid attention to optimization. We tried to come up with creative ways to accomplish the same refactoring safely, but with fewer steps by composing various smaller refactorings in different ways. By putting our heads down and getting through the other nine Choices, we got them done quickly and validated that none of them contained hidden complexities that would invalidate our plan.

Doing the same thing ten times in a row is boring. Half way through my partner started getting good ideas about how to move some of the functionality to B. That’s when I told him to stop thinking. I don’t actually want him to stop thinking, I just wanted him to stay focused on what we were doing. There’s no sense pounding a piton in half way then stopping because you see where you want to pound the next one in.

As it turned out, by the time we were done moving logic to A, we were tired enough that resting was our most productive activity. However, we had code in a consistent state (all the implementations of isValid simply delegated to A) and we knew exactly what we wanted to do next.


Not all refactorings require horizontal phases. If you have one big ugly method, you create a Method Object for it, and break the method into tidy shiny pieces, you may be working vertically the whole time. However, when you have multiple callers to refactor or multiple implementors to refactor, it’s time to begin paying attention to going back and forth between vertical and horizontal, keeping the two separate, and staying aware of how deep to push the vertical refactorings.

Keeping an index card next to my computer helps me stay focused. When I see the opportunity for a vertical refactoring in the midst of a horizontal phase (or vice versa) I jot the idea down on the card and get back to what I was doing. This allows me to efficiently finish one job before moving onto the next, while at the same time not losing any good ideas. At its best, this process feels like meditation, where you stay aware of your breath and don’t get caught in the spiral of your own thoughts.

Categories: Open Source

My Ideal Job Description

JUnit Max - Kent Beck - Mon, 08/29/2011 - 21:30

September 2014

To Whom It May Concern,

I am writing this letter of recommendation on behalf of Kent Beck. He has been here for three years in a complicated role and we have been satisfied with his performance, so I will take a moment to describe what he has done and what he has done for us.

The basic constraint we faced three years ago was that exploding business opportunities demanded more engineering capacity than we could easily provide through hiring. We brought Kent on board with the premise that he would help our existing and new engineers be more effective as a team. He has enhanced our ability to grow and prosper while hiring at a sane pace.

Kent began by working on product features. This established credibility with the engineers and gave him a solid understanding of our codebase. He wasn’t able to work independently on our most complicated code, but he found small features that contributed and worked with teams on bigger features. He has continued working on features off and on the whole time he has been here.

Over time he shifted much of his programming to tool building. The tools he started have become an integral part of how we work. We also grew comfortable moving him to “hot spot” teams that had performance, reliability, or teamwork problems. He was generally successful at helping these teams get back on track.

At first we weren’t sure about his work-from-home policy. In the end it clearly kept him from getting as much done as he would have had he been on site every day, but it wasn’t an insurmountable problem. He visited HQ frequently enough to maintain key relationships and meet new engineers.

When he asked that research & publication on software design be part of his official duties, we were frankly skeptical. His research has turned into one of the most valuable of his activities. Our engineers have had early access to revolutionary design ideas and design-savvy recruits have been attracted by our public sponsorship of Kent’s blog, video series, and recently-published book. His research also drove much of the tool building I mentioned earlier.

Kent is not always the easiest employee to manage. His short attention span means that sometimes you will need to remind him to finish tasks. If he suddenly stops communicating, he has almost certainly gone down a rat hole and would benefit from a firm reminder to stay connected with the goals of the company. His compensation didn’t really fit into our existing structure, but he was flexible about making that part of the relationship work.

The biggest impact of Kent’s presence has been his personal relationships with individual engineers. Kent has spent thousands of hours pair programming remotely. Engineers he pairs with regularly show a marked improvement in programming skill, engineering intuition, and sometimes interpersonal skills. I am a good example. I came here full of ideas and energy but frustrated that no one would listen to me. From working with Kent I learned leadership skills, patience, and empathy, culminating in my recent promotion to director of development.

I understand Kent’s desire to move on, and I wish him well. If you are building an engineering culture focused on skill, responsibility and accountability, I recommend that you consider him for a position.



I used the above as an exercise to help try to understand the connection between what I would like to do and what others might see as valuable. My needs are:

  • Predictability. After 15 years as a consultant, I am willing to trade some freedom for a more predictable employer and income. I don’t mind (actually I prefer) that the work itself be varied, but the stress of variability has been amplified by having two kids in college at the same time (& for several more years).
  • Belonging. I have really appreciated feeling part of a team for the last eight months & didn’t know how much I missed it as a consultant.
  • Purpose. I’ve been working since I was 18 to improve the work of programmers, but I also crave a larger sense of purpose. I’d like to be able to answer the question, “Improved programming toward what social goal?”
Categories: Open Source

Thu, 01/01/1970 - 02:00