Como você valida entradas críticas que não podem ser examinadas?

8

Como impedir que os usuários criem conjuntos de entradas incorretos, quando não há uma maneira prática de verificar a entrada?

A cena

Modifico um pequeno pacote ERP escrito no Visual FoxPro. Uma parte da embalagem diz respeito a manifestos e faturas de caminhões de impressão a serem enviados com os motoristas em suas rotas de entrega. A rotina de impressão, quando não é alimentada como entrada, tenta imprimir tudo, resultando em resmas e resmas de papel da impressora sendo desperdiçadas em uma impressora de alta velocidade.

Não estou em condições de reescrever nenhum dos elementos da interface GUI, nem posso adaptar estruturas, kits de ferramentas ou outro código externo a ser usado nessa situação. Os motivos estão relacionados à política do escritório; por favor, não sugira que eu possa substituir a estrutura existente do ERP, pois não é uma opção para mim.

O problema

Os usuários estão em um ambiente de alta pressão e tempo crítico. Cada processo é medido em minutos ou até segundos, o que significa que tenho que minimizar o tempo de processamento o máximo possível. Devido a esse ambiente e às possíveis distrações, os usuários frequentemente ignoram as caixas de diálogo, pressionando a tecla [Enter], que faz com que o foco se mova rapidamente pelo formulário e, eventualmente, aponte para o botão de ação da caixa de diálogo de entrada, resultando em uma impressão automática. .

A entrada consiste em um intervalo de datas, intervalo de rota e intervalo de pedidos de vendas.

A entrada para o intervalo de datas não pode ser definida automaticamente como "data de hoje", pois é necessária uma impressão posterior frequente. Além disso, os usuários finais trabalham durante a meia-noite, ou seja, a rolagem de datas torna isso impraticável sem criar uma rotina que detecte automaticamente a alteração, etc.

A entrada para rotas não pode ser codificada, nem deduzida de rotas que já foram enviadas, porque são necessárias novas impressões (veja acima).

A entrada para pedidos de vendas só tem significado ao imprimir pedidos únicos ou intervalos específicos.

Portanto, francamente, não há maneira prática de validar informações .

O botão de ação que aciona a impressão não pode ser bloqueado. Qualquer sugestão de que uma caixa de diálogo de bloqueio seja colocada na frente do usuário será ignorada. Não tenho a liberdade de discutir por que isso não é uma opção, além do conceito já ter sido discutido em outras partes do site (de um ponto de vista diferente) e ter sido rejeitado.

O bloqueio de impressões quando todas as entradas estão vazias foi rejeitado como uma decisão de design, pois o software deve acomodar isso como um recurso.

Os usuários

Os usuários foram solicitados repetidamente a não fazer isso. Eles freqüentemente ignoram esse conselho. Desencadear esse evento infeliz não é algo que seus capatazes / gerentes abordem, portanto não há pressão para acabar com o comportamento.

A organização

Não tenho voz no fluxo de trabalho envolvido, apenas a modificação dos componentes de software existentes afetados por esse fluxo de trabalho.

O vendedor

O fornecedor obtém uma segunda fonte do pacote como uma instalação personalizada do fornecedor de software original. O fornecedor exige que todas as alterações de código sejam enviadas de volta para integração em sua base de código. Alterações significativas na arquitetura resultarão em aumento de custos futuros durante a migração de versões devido à extensa personalização envolvida; em alguns casos, os programadores me disseram que ignorariam completamente essas grandes mudanças e farão o que quiserem.

O software

Não tenho voz na seleção ou instalação do software, portanto, mudar a plataforma está fora de questão.

Em relação ao ambiente do software, cada fatura impressa é uma única chamada. Não há um recurso de impressão em lote, e por causa de como o recurso de impressão é integrado ao sistema (e algumas peculiaridades do idioma), não é possível criar um invólucro em lote em torno dessa API. Além disso, essa parte do programa chama outro programa que imprime a fatura, que por sua vez chama a API de imprimir um relatório, que imprime uma única fatura. Design horrível, eu sei.

Os formulários de entrada são uma combinação estranha de um cabeçalho de formulário que não possui caixas de entrada, mas pode conter outros elementos da GUI. As caixas de entrada são definidas em tempo de execução.

O objetivo

O software impedirá que os usuários imprimam erroneamente toda a papelada.

Como você resolveria esse problema?

Avery Payne
fonte
5
Parece-me que você precisa analisar completamente a usabilidade do seu software primeiro. Parece um pesadelo para usar.
Bernard
6
por isso, se eu entendo que essa impressão correta tudo precisa ser um recurso, por que não podemos imprimir todos com seu próprio botão e o botão de impressão existente ser bloqueado até que pelo menos um campo tenha dados?
Ryathal 6/01/12
8
Não ouvem falar do FoxPro há algum tempo, parece que vocês estão presos em meados dos anos 90. Em uma nota à parte, você parece terrivelmente estressado e sua situação parece bastante desesperadora. Eles jogaram você em corredeiras, mas amarraram suas mãos e pés com uma corda. Como você resolve um problema se estiver focado em não se afogar?
maple_shaft
4
Eu mudaria o parâmetro Output everything para algo específico como PRINTALL. Faça o param vazio para a saída a seleção mais comum (provavelmente registro atual)
SoylentGray
5
@ AveryPayne: Só porque o novo emprego é melhor que o antigo, não significa que o novo emprego não seja ruim.
Unholysampler

Respostas:

25

Isso é fácil, se deixar tudo em branco, você solicita que isso imprima tudo; no entanto, a seleção PADRÃO nesse prompt DEVE ser cancelada.

Se eles digitarem valores, imprima o que eles pediram.

Dessa forma, eles não irão queimar acidentalmente o formulário e imprimir tudo. Eles vão brilhar e imprimir nada. Eles precisariam pausar e imprimir alterar a seleção no prompt para OK, em Cancelar, para imprimir tudo.

CaffGeek
fonte
2
Isso não funcionará - assim que os usuários perceberem que precisam usar o mouse para clicar no botão (ou pressionar a tecla tab antes de pressionar enter), eles começarão a fazer isso automaticamente, sem pensar nisso.
TehShrike
7
@TehShrike, não, será, porque o prompt só aparece ao imprimir TUDO. Portanto, isso interromperá o fluxo normal, fazendo com que eles pressionem enter novamente porque esperam um prompt diferente (e cancelam a impressão) ou param para ler o prompt e escolher a opção correta.
CaffGeek
Isso resolve o requisito de eliminar o problema "preciso de um diálogo do mal (tm)", enquanto cumpria o objetivo original - quebrar sua "concentração" (ou falta dela). Isso os interrompe e os faz acordar por um segundo, em vez de pressionar a tecla [Enter]. Em todas as outras condições, eles podem continuar trabalhando normalmente sem interromper o fluxo de trabalho. Ótima resposta.
Avery Payne
@AveryPayne, feliz por ajudar.
CaffGeek
27

Parece-me que você tem um requisito para consertar algo, mas toda vez que você propõe uma solução (e há muitas boas idéias em sua lista), ela é derrubada.

Este é o ponto em que você precisa recuar. Você não precisa de uma vaga idéia de que "isso está errado; conserte". O que você precisa é uma especificação. Pergunte às pessoas que o querem fixo exatamente o que eles não querem fazer, já que até agora tudo que você tem é o que eles não querem. Isso é fácil: simplesmente não faça nada e você não fará nada do que eles não querem. Diga a eles que, se eles querem mudanças, precisam criar regras positivas e concretas e você as implementará.

Mason Wheeler
fonte
Pensamento muito original "fora da caixa" (ick, acabei de dizer essa frase antiga?), Então marque +1 em você. :)
Avery Payne
3
Infelizmente, quando a "política do escritório" é a razão das restrições, os requisitos sãos são geralmente escassos. A eliminação pela força ou decisão da "política de escritório" como algo que existe melhoraria universalmente a qualidade do código de produção em várias ordens de magnitude.
21412 Jason Jason
10

Tentarei responder a uma pergunta mais genérica: como evitar que um usuário cometa um erro que leve ao desastre ou algo que não possa ser cancelado ou desfeito (como desperdiçar papel imprimindo várias páginas que o usuário não esperava que fossem) impresso).

Como dito na pergunta original:

Os usuários estão em um ambiente de alta pressão e tempo crítico. Cada processo é medido em minutos ou até segundos, o que significa que eu tenho que minimizar o tempo de processamento o máximo possível.

Isso significa que:

  • O produto de software deve fazer o possível para aumentar a produtividade dos funcionários. Quando cada segundo conta, a experiência e a produtividade do usuário são ainda mais importantes do que nos produtos em geral, onde é aceitável uma perda de alguns segundos em algum recurso que a pessoa nem usa com muita frequência.

  • Os usuários estão ocupados demais para prestar atenção ao produto de software. Quando, em um ambiente calmo, uso algum recurso do Microsoft Word que usei na última vez no ano passado, se o Microsoft Word me faz uma pergunta, explicando quais seriam as consequências de minha escolha, posso me permitir gastar um ou dois minutos lendo a pergunta e talvez até vá ler a documentação. No seu caso, você não pode pagar por isso. Seus usuários não têm tempo para ler.

Caixas de mensagem: não, não e ... não!

Como já explicado em minha outra resposta , as caixas de mensagens são ruins na maioria dos casos, por dois motivos (consulte Sobre o rosto 3 de Alan Cooper para obter mais detalhes):

  • O diálogo que gritava "Lobo!" Este princípio incita o usuário a descartar repetidamente uma caixa de diálogo sem prestar atenção se o aplicativo mostrar a mesma caixa de diálogo com muita frequência.

  • A caixa de diálogo perturba o fluxo de trabalho: o usuário não pode manter o foco no aplicativo, porque o diálogo retira esse foco e a interação com o aplicativo é suspensa até que o diálogo seja descartado¹.

Isso significa que as caixas de diálogo são um mal absoluto no seu caso do ponto de vista do UX: elas serão descartadas e diminuirão a produtividade em um ambiente em que cada segundo conta.

Outros significados

De acordo com a pergunta:

  • "A entrada consiste em um período, intervalo de rota e intervalo de pedidos de vendas."

  • Não há valores incorretos (por exemplo, o usuário pode inserir uma data anterior, uma data futura ou hoje no primeiro campo), portanto, a validação não é possível.

  • "A rotina de impressão, quando alimentada apenas como entrada, tentará imprimir tudo, resultando em resmas e resmas de papel da impressora sendo desperdiçadas em uma impressora de alta velocidade".

  • É totalmente possível solicitar a impressão com os dados padrão usados.

Em termos mais genéricos, significa que:

  • Você tem um valor padrão, que pode realmente ser válido,

  • Você não deseja que os usuários apertem o botão "Imprimir" com valores padrão mantidos por engano, enquanto pretendem alterá-los.

Aqui estão algumas técnicas que você pode tentar:

1. A mágica desfazer

Sim, os usuários estão em um ambiente crítico de tempo. Sim, uma vez que a impressora começa a imprimir, ela não pode ser parada. Mas ainda há algo que você pode fazer.

Mesmo em um ambiente de tempo crítico, as chances são de que a impressão no momento e a impressão em cinco segundos não mudem nada.

Quando o usuário clica em "Imprimir", exibe um pequeno botão "Desfazer" , assim como o GMail faz quando você solicita a remoção, por engano, de todos os seus e-mails. Aguarde cinco segundos ². Oculte o "Desfazer" e somente depois imprima.

Agora, o usuário tem a chance de perceber o erro e cancelá-lo antes que o dano seja causado, enquanto o material é impresso apenas com um pequeno atraso de cinco segundos.

2. O plano de fundo discreto do "valor padrão"

É suspeito ter valores padrão? ³ Com um valor, raramente é suspeito. Com três, há chances de que os casos em que o usuário precise manter todos os três valores por padrão sejam bastante raros.

Nesse caso, você pode:

  • Destaque o valor quando ele tiver seu valor padrão. Não em vermelho: vermelho é para valores inválidos. Defina-o como amarelo-laranja e volta a branco quando o usuário altera o valor padrão.

  • Ou desative o botão "Imprimir" até que um valor seja alterado. Adicione uma caixa de seleção próxima, que o usuário pode verificar para confirmar que sua intenção é imprimir com valores padrão.

3. Melhore a interface do usuário dos seus controles

Estamos sexta-feira, 6 º de janeiro 2012 hoje. Qual será a data da próxima quinta-feira? Rápido, rápido, você está sob pressão, você tem apenas um segundo para sua resposta. Além disso, você está cansado e há muito barulho por toda parte. Não é fácil responder, não é?

As pessoas não podem manipular datas facilmente quando está escrito como 1/8/1012. Saturday, 7th of January (tomorrow)é um pouco mais fácil. Uma visualização gráfica que destaca sábado e domingo, mostra hoje e o deslocamento é ainda melhor.

Nada é tão feio quanto "Localização: Nova York". Essas três letras não fazem sentido quando você está cansado e trabalha em um ambiente estressante; erros são fáceis. Em vez disso, um mapa gráfico dos Estados Unidos mostrando um ponto vermelho para a cidade de Nova York é muito mais atraente, e o usuário tem muito mais chances de perceber que, enquanto ele queria selecionar São Francisco, o ponto vermelho parece aparecer em um lugar errado .

insira a descrição da imagem aqui

Você gostaria que o seu GPS dissesse que você precisa mudar de 38.90403, -77.04878 para 38.90568, -77.04665, depois vire à direita e vá para 38.90565, -77.04345, depois vire 90 ° à esquerda e vá para 38.90660, -77.04345? Você seria capaz de se concentrar no seu trabalho (na estrada)? Mostrar 1/8/2012 e Nova York a usuários ocupados é tão amigável quanto um GPS que gera coordenadas brutas em vez de uma visualização 3D de um mapa cheio de cores.

Ao fornecer controles mais ricos e uma visualização mais rica dos dados , você pode diminuir o nível de erros de seus usuários em um ambiente estressante.


A propósito, isso se aplica a outras variantes de caixas de diálogo. Você já fez uma pergunta sobre as caixas de diálogo em que os botões serão aleatórios e que dificultam o descarte. Infelizmente, essa abordagem não ajuda, mas apenas prejudica: os usuários ainda descartam o que é dito pela caixa de diálogo, mas perdem mais tempo tentando fechá-la para voltar ao trabalho.

² digo cinco segundos como exemplo. Você precisa monitorar a atividade dos usuários por alguns meses para ver com que rapidez eles clicam em "Desfazer". Provavelmente, estará abaixo de um segundo. Se você vir que o atraso é de 0,6 a 1,8 s. com uma média de 1,1 s., você pode mostrar o "Desfazer" por dois segundos e depois imprimir.

³ Por favor, por favor, diga não! Porque, se estiver, significa que há algo errado com seus valores padrão. Por exemplo, se o valor padrão da data é hoje, enquanto em 75% dos casos, os usuários precisam defini-lo para amanhã, 10% para ontem e 10% para o dia depois de amanhã, você deve definir o padrão valor para amanhã.

Arseni Mourzenko
fonte
A opção 1 é a melhor das três. A opção 2 pode ou não ser possível devido ao mau design da API para a interface. A opção 3 está definitivamente quebrada devido ao mau design da API (caixas de texto e botões são as únicas coisas disponíveis). Ainda assim, obrigado por comentários construtivos . :)
Avery Payne
1
Você pode gerenciar a segunda opção adicionando alguns rótulos e ativando e desativando a visibilidade deles (você ainda possui rótulos, não é?). Para a terceira opção, esqueça isso até que seu chefe / cliente entenda que ele espera um software de boa qualidade com uma interface do usuário de boa qualidade construída em uma estrutura ruim com apenas caixas de texto e botões, é como esperar que um Lamborghini fosse construído a partir de madeira e algumas peças velhas e enferrujadas de metal.
Arseni Mourzenko
Desfazer Mágico é definitivamente uma coisa bonita.
Nick Chammas
@MainMa, apenas como uma observação, a API é bastante primitiva para o que você está tentando realizar no # 2. Uma caixa de diálogo com quatro botões é uma única chamada de função que desenha a caixa de diálogo, vomita algum texto de uma sequência e preenche automaticamente os botões com palavras. Você adivinhou certo, 7 parâmetros - "mensagem", contagem de botões, foco padrão dos botões, sequência de botões1, sequência de botões2, sequência de botões3, sequência de botões4. Não há um "layout" ou "reclassificação de objeto" que possa ser aplicado. Mas, graças à sugestão, e certamente está dentro do meu poder de escrever minha própria caixa de diálogo e chamá-lo de vez ...
Avery Payne
3

Você pode determinar antes de imprimir quantas páginas serão impressas ou de alguma outra maneira medir o tamanho da saída? Nesse caso, determine um tamanho máximo para uso normal e, se for maior, use uma caixa de diálogo de confirmação que indique o tamanho da saída e, para que não possa ser descartada sem a leitura, exige que o usuário digite novamente o tamanho da saída para confirmar.

JGWeissman
fonte
Embora seja possível tentar calcular o número de páginas, é proibitivo no tempo e, portanto, a decisão de design foi rejeitada devido às restrições de tempo mencionadas acima. Ainda assim, se o tempo não fosse um fator, isso seria uma grande ajuda. A caixa de diálogo de bloqueio secundário, no entanto, é contrária à minha postagem acima (consulte o segundo ao último parágrafo em "O problema:".
Avery Payne
@AveryPayne Você pode cancelar a impressão depois de iniciada? Em vez disso, você poderia ter uma tela sem bloqueio indicando o número de páginas (calculadas paralelamente ao início da impressão) com uma opção para cancelar se não fosse o que o usuário pretendia fazer, para que você perca apenas algumas páginas enquanto o usuário percebe o erro.
JGWeissman
+1, simplesmente porque até agora, esta é a única resposta prática que foi dada. No entanto, ainda não consigo aceitar a parte da caixa de diálogo de bloqueio.
Avery Payne
Eu gostaria de poder, mas o gancho para impressão é "danificado" na melhor das hipóteses - ele exibe uma caixa de diálogo para cada impressão. Vou tentar esclarecer isso na pergunta, obrigado por apontar isso.
Avery Payne
3

Como você resolveria esse problema?

Separe claramente os casos de uso. Há um caso "imprima algo agora" que pode levar a uma saída sem fim. Corrija isso para fornecer todos os padrões corretos.

Há um caso de "reimprimir alguma coisa anterior" que é uma solicitação especial (não padrão) em que as entradas podem ser verificadas com cuidado.

A entrada para o intervalo de datas não pode ser definida automaticamente como "data de hoje", pois é necessária uma impressão posterior frequente.

Falso.

A entrada pode ser configurada automaticamente hoje, sem nenhum efeito em solicitações frequentes de impressão traseira.

Qual o impacto possível de uma configuração automática para "data de hoje" nas solicitações de impressão traseira? Enumere-os na pergunta.

A entrada para rotas não pode ser codificada, nem deduzida de rotas que já foram enviadas, porque são necessárias novas impressões (veja acima).

Falso.

Reimpressões e impressões traseiras são um caso especial. Eles nunca têm campos padrão e são a exceção, não a regra.

S.Lott
fonte
1
"chama pela entrada com a data errada"? Qual entrada? Existem dois casos de uso separados: data padrão e data anterior. Por favor, esclareça.
precisa saber é
2
@ S.Lott Isso é mais um comentário do que uma resposta.
Josh K
3
@PersonalNexus: Possivelmente. A questão é bastante difícil de lidar, porque está cheia de suposições.
precisa saber é
2
@AveryPayne - Então, por que não desativar a capacidade de imprimir sem parâmetros?
precisa saber é o seguinte
1
Por favor, tome discussões prolongadas para conversar .
21412 Josh K
2

Permita-me reafirmar o problema.

Estado atual: pressionar cegamente Enterfaz com que resmas de papel sejam impressas.

Estado desejado: pressionar cegamente Enternão faz com que resmas de papel sejam impressas.

Solução: altere o software para que pressionar cegamente Enterfaça alguma coisa , além de causar a impressão de resmas de papel.

Isso praticamente deixa você com o problema do que deveria fazer. Pessoalmente, eu perguntaria aos operadores o que eles querem. Meu palpite é algo como imprimir as faturas mais urgentes que ainda não foram impressas. Deixe a capacidade de imprimir tudo, mas exija uma decisão consciente para fazê-lo.

Karl Bielefeldt
fonte
2

Você tem uma situação em que o padrão atual do processo está criando desperdício e tempo de custo para seus usuários.

Desative a capacidade de pressionar Enter até o fim, mantendo o foco no botão "Redefinir parâmetros" (crie um, se necessário), para que, ao pressionar Enter, ele permaneça na tela, mas não faz nada. Eu criaria algum tipo de botão de atalho para as seleções mais comuns para preencher automaticamente o formulário com esses parâmetros para ajudar os usuários. Mas isso deve resolver seu problema, mesmo sem os botões de atalho.

SoylentGray
fonte
Os campos de entrada são adicionados "dinamicamente" no tempo de execução (não há layout em tempo de design) ... mas os botões são codificados no formulário, portanto, adicionar novos botões é uma ótima sugestão.
Avery Payne
O dinamicamente adicionado complica as coisas, mas acho que você ainda pode preenchê-las, mesmo no foxpro, se houver valor em descobrir isso.
precisa saber é o seguinte