Atom e a linha automática no final do arquivo

TL;DR

Para o interessado em desativar o comportamento, segue passo-a-passo:

  1. acessar menu: Edit > Preferences > Packages;
  2. buscar Pacote “Whitespace”;
  3. acessar opções do pacote e desativar “Ensure Single Trailling Newline”.

RESUMO

Este trabalho busca apresentar uma experiência de uso do autor com o editor de texto Atom, mais especificamente, em relação à funcionalidade que garante a presença de um caractere de nova linha (newline, \n) no final do arquivo. Visando a discussão acerca da qualidade de software, o texto analisa alguns aspectos da interação e levanta um referencial sobre a motivação por trás do recurso em destaque. Além disso, é feita uma pequena reflexão sobre os possíveis efeitos na imagem do produto de software a partir dos problemas de usabilidade que este venha a apresentar.

1. Introdução

O objetivo de qualquer aplicação de software deve ser atender às necessidades de seu usuário, seja ele humano ou não¹. Dessa forma, a experiência que o usuário tem em sua interação com o software é um dos aspectos mais importantes no que tange à qualidade de software, devendo este nunca ser ignorado.

Atualmente a oferta de aplicações de software é vasta, sejam tradicionais aplicações desktop, sejam na forma de aplicativos para dispositivos móveis, ou mesmo fornecidas como serviço (SaaS²). De qualquer forma, a base de usuários também é cada vez maior, e não só isso, ela é cada vez mais exigente. Com a evolução da computação de uma forma geral e sua introdução cada vez maior na vida das pessoas, não é mais satisfatório que as aplicações apenas realizem suas tarefas sem problemas (bugs). As aplicações de hoje devem ainda criar uma boa experiência de uso para o usuário, o que inclui, dentre outros aspectos, uma apresentação simples e intuitiva.

2. Experiência de uso

2.1. Encontrando o Obstáculo

O editor Atom³, pelo menos em sua versão 1.12.2, vem com um comportamento ativado por padrão que pode não satisfazer a alguns usuários. O editor garante que haja sempre um caractere de nova linha (newline, \n) no final do arquivo. Assim, toda vez que o usuário salva um arquivo que não tenha o caractere naquela posição, uma nova linha em branco aparece no final do arquivo, e mesmo que o usuário a remova manualmente, assim que o arquivo for salvo, a linha será adicionada novamente.

Como desativar o recurso? Essa pergunta é sem dúvida a primeira reação do usuário insatisfeito, o que o leva ao segundo problema.

Ao explorar o menu principal, que pode ser visto na Figura 1, o usuário provavelmente espera encontrar algo no menu Edit, ou até mesmo em File — em um maior esforço. Essa expectativa vem de seu contato com outras aplicações, onde convenções e padrões largamente utilizados pelo mercado são absorvidos pelo usuário, que por sua vez passa a esperar estas convenções em outras aplicações.

Figura 1 — Tela de Configurações do Atom

Então, através do menu Edit o usuário acessa o sub-menu Preferences, o qual leva a uma tela bem promissora. Em destaque na Figura 1, a interface apresenta as opções de configuração de forma categorizada, cujas categorias são dispostas à esquerda. Seguindo seu instinto, o usuário provavelmente nem tenta rolar pelas opções da categoria Core, e aciona logo a categoria Editor, por parecer mais promissora.

Com expectativa de sucesso, o usuário percorre a lista de opções rapidamente, procurando alguma coisa sobre new line, ou blank line. Infelizmente nada é encontrado, mesmo após repetir a busca com maior atenção. Frustrado, o usuário volta sua atenção às categorias de opções e tenta procurar algo na categoria Core, o que traz o mesmo resultado negativo.

Perseverante, o usuário volta ao menu principal e tenta encontrar alguma coisa relacionada, e com isso acaba chegando ao menu Config, o qual leva à edição de um arquivo texto de configurações, onde mais uma vez nada é encontrado. Vale citar que este arquivo trata de configurações de preferências do usuário, ou seja, são incluídas ali apenas aquelas específicas do usuário, que diferem das configurações padrões da aplicação. Já que o comportamento é padrão, faz sentido não estar ali. Um exemplo do arquivo segue Figura 2.

Figura 2 — Arquivo de configurações de preferências do usuário

2.2. Contornando o obstáculo

Recorrendo aos motores de busca o usuário consegue encontrar uma discussão no GitHub⁴, onde um outro usuário insatisfeito reclama do comportamento e pergunta como desativá-lo. Felizmente há uma resposta, onde consta uma captura de tela e a indicação da opção “Ensure Single Trailling Newline”. A reprodução da foto está na Figura 3, onde pode-se notar que a interface sofreu algumas mudanças ao longo do tempo, o que é natural, porém acaba sendo um contratempo para o caso em questão.

Figura 3 — Antiga interface de configurações do Atom

Ao realizar a comparação com a interface mais atual, disposta na Figura 1, nota-se que não há nenhum campo de busca na lateral esquerda, o que gera a dúvida sobre como afinal chega-se àquela opção Whitespace. Após sofrer mais uma frustração, o usuário nota que trata-se de um pacote de extensão do Atom. Embora não esteja muito claro, é possível notar isso pela estrutura do quadro lateral direito da interface e pelo texto “This package addded 4 ms to startup time.”.

Com novo direcionamento o usuário agora realiza nova tentativa. Acessa a tela de configurações (Figura 1) e aciona a opção Packages, onde finalmente é presenteado com aquele campo de busca, onde pode buscar pelo pacote Whitespace. Acionando a tela de detalhes do pacote, representada na Figura 4, o usuário pode finalmente desativar a opção “Ensure Single Trailling Newline.

Vale citar que a extensão tem ainda outras opções que podem ser ativadas/desativadas. O interessado pode também desativar a extensão completamente, caso os recursos adicionais não sejam desejados.

Figura 4 — Tela de edição do pacote Whitespace

3. Motivação do desenvolvedor

Após expor e analisar a interação do usuário com a aplicação, cabe citar algum referencial acerca da funcionalidade que deu início à dissertação.

3.1. Padrão POSIX

Com aquela opção acionada por padrão, os desenvolvedores do Atom possivelmente buscam atender a uma especificação POSIX (Portable Operating System Interface)⁵ que define uma linha em um arquivo de texto. Em uma tradução livre a definição seria a seguinte: uma sequência de zero ou mais caracteres com exceção de <newline> acrecida de um caractere <newline> como terminador.

Nesse caso o caractere newline (nova linha), normalmente representado por \n, funciona como um terminador de linha, e não como um inicializador de uma nova linha, o que pode gerar uma confusão conceitual. Contudo, a maioria dos editores de texto representa isso graficamente pela inclusão de uma nova linha no texto — que é o caso do Atom. Isso por sua vez pode ser um dos fatores que causa o maior incômodo no usuário insatisfeito.

Vindo de sistemas Unix, que fazem largo uso de arquivos de texto, é natural haver uma definição a respeito disso. Assim, muitas aplicações esperam que este padrão seja atendido, principalmente aplicações relacionadas ao terminal de comandos, onde muitas podem ignorar a última linha do arquivo caso ela não tenha a terminação inclusa (já que esta seria uma linha inválida). Há ainda o caso de algumas aplicações que, embora não ignorem a linha “incompleta”, podem gerar resultados insatisfatórios. Um exemplo disso seria o uso do utilitário “cat” para juntar dois arquivos, tal como apresentado no Quadro 1.

Neste exemplo serão concatenados os arquivos “cidadesto.csv” e “cidadesrj.csv”, cujo resultado será alocado em um terceiro arquivo “todascidades.csv”.
Primeiramente segue o conteúdo dos arquivos a serem concatenados:
[cidadesto.csv]
Gurupi,TO
Palmas,TO
[cidadesrj.csv]
Rio de Janeiro,RJ
Itatiaia,RJ
Com isso, utiliza-se o seguinte comando para a concatenação no novo arquivo:
cat cidadesto.csv cidadesrj.csv > todascidades.csv
O conteúdo concatenado no novo arquivo é o que segue:
[todascidades.csv]
Gurupi,TO
Palmas,TORio de Janeiro,RJ
Itatiaia,RJ
O problema pode ser notado na segunda linha do novo arquivo, onde o esperado seria que o início do conteúdo do segundo arquivo fosse colocado em uma nova linha, porém, como o cat apenas concatena os arquivos sem qualquer alteração, o conteúdo segue na mesma linha.
De qualquer forma, seria incorreto afirmar que o utilitário funciona incorretamente, visto que se incluísse automaticamente o finalizador de linha, estaria entrando no mesmo problema que é tema central deste trabalho.

Quadro 1 — Exemplo de problema causado pela falta do terminador de linha.

3.2. Consequências

POSIX é uma família de padrões definido pelo IEEE⁶ que busca a compatibilidade entre sistemas da família Unix. Os padrões não se aplicam apenas aos sistemas Unix, mas também àqueles conhecidos como Unix-like, que embora não atendam a todos os requisitos, implementam boa parte deles. Isso gera um alcance considerável, a julgar que entram nesta lista, por exemplo, distribuições Linux, MacOS, IOS e Android. Dessa forma, entende-se a motivação dos desenvolvedores do Atom.

Sem dúvida a funcionalidade tem sua aplicabilidade, contudo questiona-se o fato dela vir acionada por padrão, podendo por outro lado, constar inicialmente desativada e disponível para uso por aqueles usuários interessados. Da forma implementada, normalmente resulta em estresse para o usuário, visto que ele obtém um resultado diferente do esperado.

Um efeito colateral da funcionalidade que pode ser citado, refere-se aos sistemas de controle de versão (VCS — Version Control System), tais como SVN e Git. Ao abrir um arquivo que não tem como último caractere o newline, e então salvá-lo, mesmo sem alterações, resultará em uma alteração para o VCS. Isso poderá resultar em uma nova versão desnecessária na base de arquivos, ou no usuário tendo de reverter a alteração manualmente.

Pode-se afirmar também que, embora a funcionalidade tente evitar o mau funcionamento de alguns programas, o inverso também pode acontecer. Alguns programas podem interpretar o newline como indicação de nova linha, o que poderá resultar, por exemplo, em uma linha vazia indesejada em uma tabela de dados carregada a partir do arquivo.

4. Conclusão

A proatividade do desenvolvedor ao tentar resolver possíveis problemas futuros dos usuários pode gerar impactos negativos quando resulta em comportamentos inesperados pelo usuário. Cabe ao desenvolvedor refletir sobre os prós e os contras dos seus esforços antes de realizá-los e, principalmente, estar sempre atento ao retorno gerado pelo seu público.

De qualquer forma, cabe sempre ao sistema de software deixar claro ao seu usuário o que está acontecendo a cada momento⁷ invés de realizar ações inesperadas de forma silenciosa, por mais positivas que elas sejam. Ademais, deve sempre manter o controle nas mãos do usuário, fornecendo-lhe formas de configurar o comportamento do sistema através de diálogos claros e no formato esperado pelo usuário.

No mercado de hoje, onde há concorrência até na categoria de softwares gratuitos, e ainda novas opções surgindo a todo instante, alguns erros de usabilidade podem gerar sérios ruídos na relação entre o software e seu usuário. Por isso é importante sempre estar atento aos detalhes.


Notas

  1. Aplicações podem servir a outras aplicações, o que é muito comum atualmente, onde há integração entre aplicações de uma mesma organização ou entre organizações distintas.
  2. SaaS refere-se a Software as a Service, categoria de aplicações fornecidas como um serviço, pago ou gratuito, através da Internet.
  3. O Atom está disponível para várias plataformas e pode ser baixado gratuitamente no seguinte endereço eletrônico: <https://atom.io>. Acesso em: 02 jul. 2017.
  4. A discussão no GitHub refere-se a uma issue que pode ser acompanhada no seguinte endereço eletrônico: <https://github.com/atom/atom/issues/4741>. Acesso em: 02 jul. 2017.
  5. Uma referência da especificação POSIX pode ser acessada no seguinte endereço eletrônico: <http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_206>. Acesso em 02 jul. 2017.
  6. O IEEE (Institute of Electrical and Electronics Engineers) é uma organização de profissionais fundada nos EUA, que sem fins lucrativo se dedica ao avanço tecnológico em prol da sociedade.
  7. Refere-se a uma das heurísticas de usabilidade de Jakob Nielsen, que fala sobre o sistema sempre informar ao usuário o que está acontecendo atualmente. Para detalhes, consultar NIELSEN (1994).

Referências

NIELSEN, Jakob. Usability Engineering: Interactive Technologies. Elsevier, 1994.

PS.: Este texto foi originalmente postado em http://www.hmagalhaes.eti.br/?p=535