The options #

In Drupal’s backend, we are able to drag and drop fields around and order them in the order we want:

Drupal's UI to drag fields around to change their order

Next to that, we are also able to hardcode the position of fields in the template:

Twig Created with Sketch.
node--blog--full.html.twig
{% block content %}
  {{ content.field_c }}
  {{ content.field_a }}

  {{ content|without('field_c', 'field_a') }}
{% endblock %}

How to combine them #

Drupal’s backend gives you an overview for everyone to reorder the fields as they see fit.

Templates, give you the flexibility of making sure no-one moves fields around, when styling or design is depending on it. It also gives you the flexibility of only hardcoding the position of the fields that need hardcoding and leave the rest intact.

It’s important to note that both options are completely valid, and each have their advantages. It’s recommended to start with the backend-approach, and hardcode the parts in the templates when needed.

Conclusion #

It’s common for frontend developers to take control in to their own hands and hardcode the location of fields. This is considered ok, as long as you only hardcode the parts that you consider needed.

So therefore the rule of thumb becomes: use Drupal's UI first, and when insuficient control, hardcode location of fields.

You should never hardcode the location of every field. but if you need the need to do so, you still have to print the content variable, as it contains hidden cache tags coming from Drupal, that you would miss on first sight.