Product
|
Cloud costs
|
released
January 17, 2021
|
3
min read
|

Tabs vs. Spaces: How They Write Java at Google, Twitter, Mozilla, and Pied Piper

Updated

When it comes down to coding styles, most choices are pretty arbitrary and depend on personal preference. Yes, even if tab width changes between editors, and spaces tend to be more precise. If there were such a thing as developer team anthropology, style guidelines would probably be a major part of it.

In this post we will highlight formatting guidelines and different Java coding styles in companies like Google, Twitter, Mozilla, the Java standard, and our own teams at Harness.

(Whether you use tabs or spaces, it’s what you write after them that counts. Code quality is crucial, which is why Harness analyzes your code at runtime to give you actionable insight about all errors and slowdowns – even those that don’t end up in the logs.)

Why Use Guidelines in the First Place?

Readability is the main consideration here. It’s almost certain that you will not be the only person to read the code that you write. And the best thing you can do for the next person who reads your code is to stick to conventions.

A consistent style of writing not only helps create good looking code, but also makes it easier to understand. The twitter guidelines specify one exception and we tend to agree, “if the more ‘readable’ variant comes with perils or pitfalls, readability may be sacrificed”.

  1. Google Java style guide (there’s another one for Android)
  2. Twitter style guide
  3. Official Java code conventions (New OpenJDK guidelines are available right here)
  4. Mozilla guidelines
  5. Our own guidelines at Harness

Let’s see what they have in store.

1. Indentation: Tabs vs. Spaces

First, we need to get this off our chests before proceeding. There’s a clear preference for spaces over tabs in the style guides. We’ll not go into pros and cons here and just share the findings:

  • Google: 2 spaces (android is 4 spaces, and 8 for line wraps)
  • Twitter: 2 or 4 spaces (for line wraps)
  • Mozilla: 4 spaces
  • Java: 4 spaces, tabs must be set at 8 spaces. Both are acceptable.

Data from Github suggests that around 10-33% of the Java repositories prefer tabs, and the majority use spaces in different formations, preferring 4 spaces over 2. There’s actually a pretty nice module for running this analysis (comparing different languages). BTW, peeking over to other JVM languages like Scala and Clojure, we see almost 100% 2 spaces.

Considering a larger dataset that covered individual commits gave us different results (The convention analysis project, one of the Github data challenge winners), but we can estimate it to be somewhere in-between probably closer to 10%.

2. Line Length, Wrapping, and Breaks

Sometimes lines of Java code tend to get long, and the style guides set conventions on when is it appropriate to break or wrap. The general convention is around 80-100 max length

  • Google: 100 columns
  • Twitter: Preference towards 100 columns
  • Mozilla: Appropriate judgement
  • Java: 80 columns

Of course, apart from natural breaks after semicolons, line breaks are used not only when lines get too long but also for logic separation. The general convention is to break after commas, before operators, and use a hint of common sense.

Here’s an example from twitter’s style guide that makes good use of this concept:

// Bad.
//   - Line breaks are arbitrary.
//   - Scanning the code makes it difficult to piece the message together.
throw new IllegalStateException("Failed to process request" + request.getId()
     + " for user " + user.getId() + " query: '" + query.getText()
     + "'");
// Good.
//   - Each component of the message is separate and self-contained.
//   - Adding or removing a component of the message requires minimal reformatting.
throw new IllegalStateException("Failed to process"
    + " request " + request.getId()
    + " for user " + user.getId()
    + " query: '" + query.getText() + "'");

This helps separate statements and create a logic where each line of code represents a contained / “atomic” operation. The style guides tend to agree here.

Blank lines also have an important role in the mix, separating logical blocks. The Java standard style guide also has a reference to double line breaks, separating interface and implementation.

3. Variable Naming

Wide agreement across all style guides. FirstLetterUpperCase for class names camelCase for method and variable names, all lower case package names and ALL_CAPS for final static constants.

A common exception for this would be the logger, which we usually define as:

private static final Logger logger = LoggerFactory.getLogger(Class.class);

Twitter’s guideline adds another interesting style of including units in variable names:

// Bad.
//   - Field names give little insight into what fields are used for.
class User {
  private final int a;
  private final String m;
 ...
}
// Good.
class User {
   private final int ageInYears;
  private final String maidenName;
...
}

4. Exception Catch Clauses

Exceptions are a thorny issue. Recently we’ve covered a research that looked into over 600,000 projects on Github and Sourceforge and uncovered some grim truths about non standard use of exceptions. Google’s and Twitter’s style guides reference the infamous empty catch blocks:

  • Google: No empty catch blocks
  • Twitter: In other words, don’t swallow exceptions
  • Mozilla: No reference
  • Java: No reference

Moreover, another guideline we recommend to at least try to keep is making sure your exceptions are actionable, and avoid control flow exceptions. The amount of noise so called “normal” exceptions cause in a production environment is terrifying.

The current state of exceptions and error handling, relying mostly on log files to get to their root cause in production, is our main motivation behind building Harness. If you haven’t already, check it out! We’d love to hear what you think.

5. Parentheses for Clarity and Curly Braces

Even when they’re not necessary, parentheses can help improve readability. With compound predicates, it’s common to use parentheses for clarity, even when the order of execution is obvious. For example:

if (x == y && a > 10) // bad
if ((x == y) && (a > 10)) // good

So what do the style guides say about grouping parentheses?

  • Google: “Recommended”
  • Twitter: “Be explicit” (even when it’s obvious)
  • Java: “Generally a good idea”
  • Mozilla: Following the Java standard

When dealing with curly braces, all style guides examined support breaking after the opening brace. 

6. No Brains Inside Constructors

One guideline that we keep and didn’t find in any of the style guides is not to keep any “brains” inside constructors (so they’re safe from zombies – but not from weak jokes apparently).

If we need to create an object and do some heavy duty operations to build it, we use a creator method instead. For example:

// simple constructor
//
private final int x;
private final int y;
private final String z;

public MyClass(int x, int y, String z) {
    this.x = x;
    this.y = y;
    this.z = z;
}
// complex building
//
public static MyClass create(List<Stuff> list, Set<Stuff> set) {
    // int x = some brains...
    // int y = more brains...
    // other brains...
    // String z = more complex stuff here
    //
    return new MyClass(x, y, z);
}​
private final int x;
private final int y;
private final String z;​
private MyClass(int x, int y, String z) {
    this.x = x;
    this.y = y;
    this.z = z;
}

Final Thoughts

There are many more style guidelines that we didn’t cover in this post to avoid making this an exhaustive list, and they’re all available in the original docs linked at the beginning of the post. Readability is a major factor in keeping your code error-free, and… it just feels right to keep these OCD senses from tingling.

What are some of the unique guidelines/quirks that you follow? Does your company/team use a style guide of your own?

Sign up now

Sign up for our free plan, start building and deploying with Harness, take your software delivery to the next level.

Get a demo

Sign up for a free 14 day trial and take your software development to the next level

Documentation

Learn intelligent software delivery at your own pace. Step-by-step tutorials, videos, and reference docs to help you deliver customer happiness.

Case studies

Learn intelligent software delivery at your own pace. Step-by-step tutorials, videos, and reference docs to help you deliver customer happiness.

We want to hear from you

Enjoyed reading this blog post or have questions or feedback?
Share your thoughts by creating a new topic in the Harness community forum.

Sign up for our monthly newsletter

Subscribe to our newsletter to receive the latest Harness content in your inbox every month.

Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.
Service Reliability Management