Imagine a bacon-wrapped Ferrari. Still not better than our free technical reports.

RebelLabs Developer Productivity Report 2017 raw data

RebelLabs Developer Productivity reports are analytical reports based on online surveys of Java developers. Over the last 6 years, we reported on the ecosystem landscape, performance tooling choice, software development quality and predictability, and so on. One of our main reasons for writing the reports is to understand how the Java developer community evolves, which tools they use and the current trends.

This year’s report focuses on why Java developers use the tools they use and how satisfied they are with their choices in tools, architecture, and so on.

The data for this report comes from the results of a public RebelLabs survey that we ran in May-July 2017 which received about 2060 responses.

We analysed the data and all the findings are publicly available in the main report blog post. Or you can download the pdf of the report and enjoy reading it at leisure:


GET THE REPORT!

However, this year we decided to share the data we gathered as well as the analysis. This way you can always check the claims, do additional research, or just play with the data to generate pretty graphs about your favorite tools.

If you’re in a rush, there’s a csv file with the data available. For the exact phrasing of the questions please check the original survey questions. Filling the survey won’t change the results in the report, but if you feel like getting the full RebelLabs report experience, have a go and respond to the questions.

If you’re less eager to import the data into a spreadsheet software of your choice, here’s another way to have a play with the data.

In the past we’ve done the analysis in Excel: it is great, you can use the formulas, create charts by clicking around, and share it with people in your team. This year we decided that the cons of using Excel — being error prone, not very declarative, and less than straightforward to version and diff properly, outweigh the ease of use, and took another approach.

We wondered: do we know of software, that is great at dealing with the data, preferably in a table form, that allows us to declare the analytical queries to the data and easily process the results? Spoiler alert: we thought of a relational database with a single table generated from that CSV file above. Duh!

And to access that database, we naturally created a Spring Boot app with jOOQ for SQL generation. Check how it fares against the spreadsheet approach:

  • The code is Java, so anyone can spot the bugs (if we knew the results of the report in advance, we’d try Kotlin though).
  • Excellent VCS support: diffing 2 versions of a query is super straightforward.
  • Cross-platform and easy to distribute.
  • Wonderful IDE support!
  • The same lack of documentation for the queries as in a spreadsheet file, but now we are acutely aware of it.

To have a play with the data, you need to clone the repository on GitHub: zeroturnaround/rebellabs-report–2017-analysis-app.

Import the project into the IDE of your choice.

Run the spring boot app, preferably, from the IDE, but on the command line it is something like:

./mvnw spring-boot:run

Which will build the app, start it, and if everything is fine will open a browser window with the app. If not, check http://localhost:8080 yourself.

You should see a list of links clicking on which you’ll see a JSON output like this:

Now the app is super simple, it maps URLs to the controller methods, which query the database and return a JSON output of a select query with some post-processing when it was easier for us to do that in Java.

For example here’s the code that generates the result how satisfied the developers are based on their country:

@RequestMapping("/happiness-by-country")
public Map<?, ?> happinessByCountry() {
 Result<Record3<String, BigDecimal, Integer>> records = dsl
   .select(RESULTS.COUNTRY,
     avg(RESULTS.IDE_RATING
       .add(RESULTS.LANGUAGE_RATING)
       .add(RESULTS.APPSTACK_RATING)
       .add(RESULTS.ARCHITECTURE_RATING)
       .add(RESULTS.DATABASE_RATING).div(5)), count().as("CNT"))
   .from(RESULTS)
   .where(RESULTS.COUNTRY.isNotNull())
   .groupBy(RESULTS.COUNTRY).having("CNT > 2")
   .orderBy(DSL.val(2).desc())
   .fetch();
 return r2m(records, "average-rating", "count");
}

If you’d like to tweak it, just change the code, and rerun it. If you’re not into waiting 20 seconds for this tiny app to restart, check out JRebel which can reload your Java code on the fly in a running Java process, so you don’t need to restart your application every time you change the code.

If you’re not feeling like Java is the best interface to a single CSV table of data, just get the CSV and use any other tools you fancy.

Our findings can be found in the Developer Productivity Report 2017! If you do your own analysis, tell us about it, we’d be happy to know about it.

And if you want to read our analysis download the PDF version of the report (in excellent quality):


GET THE REPORT!