sábado, 2 de junho de 2012

{ Videocast } Metro . designing great apps

Com o lançamento do Windows Phone a Microsoft e seu estilo de design Metro começaram a colocar a experiência do usuário como ponto de partida do projeto de uma app imersiva, elegante e refinada.

Enquanto que os aplicativos tradicionais utilizam diversos tipos de elementos visuais que tiram o foco do usuário no conteúdo, no Metro, são removidos para dar lugar a tipografia e deixar o usuário focado no conteúdo.

Os princípios do design Metro são o guia para a construção de apps modernas e empolgantes.

Quer conhecer mais? Assista o videocast da palestra realizada no MspTechDay e no Hackathon de Windows 8.

{ YouTube } Metro . designing great apps

sexta-feira, 15 de julho de 2011

O que é ergonomia para software?

Bom, vamos começar pelas origens, a palavra ERGONOMIA vem de duas palavras Gregas: "ergon" que significa trabalho e "nomos" que significa leis.

Atualmente, é usada para descrever a ciência de "conceber uma tarefa que se adapte ao trabalhador, e não forçar o trabalhador a adaptar-se à tarefa".

A ergonomia tem discutido e comprovado que os aspectos humanos do trabalho devem ser considerados, e a situação de trabalho deve ser modificada em função do homem, o qual, deve ser considerado como um ser que acumulou experiências, desenvolveu crenças, estruturou valores, a partir dos quais define seus padrões de atitude e comportamentos (Medeiros, 1994).

Alguns dos aspectos considerados pela ergonomia são:

  • Competências: um atributo subjetivo sempre relacionadas as atividades a serem desempenhadas, são conjuntos de conhecimentos, de capacidades de ação e de comportamentos estruturados em função de um objetivo e em uma determinada situação (Gilbert, Parlier,1992 in Boterf, 1995);
  • Saber-fazer: são os conhecimentos procedurais, tal como eles se manifestam na atividade, dquiridos mais pela prática do que pela formação, raramente são verbalizados e dificilmente transmissíveis (Montmollin, 1995);
  • Erro Humano: o erro muitas vezes é determinado por características do operador (habilidades conhecimentos, experiência), somadas as características da tarefa (objetivos, sistema técnico, ambiente, regras de execução), portanto, a ergonomia analisa estas condições externas ao trabalho e consideram aspectos internos do trabalhador capazes de gerar erros;
  • Trabalho Prescrito x Trabalho Real: a ergonomia analisa o conhecimento do trabalho prescrito, das regras fixadas, confrontando com o conhecimento do trabalho realmente desenvolvido de forma a reduzir dificuldades relativas às condições de trabalho ou ao seu melhoramento devido ao fato de considerar apenas o trabalho prescrito e não o trabalho real;

MAS, E NA PRÁTICA?


Alguns exemplos das áreas de atuação da ergonomia no ramo de tecnologia da informação:

  • Na concepção de sistemas computadorizados, de modo a que sejam mais fáceis de utilizar e que haja menor probabilidade de ocorrência de erros durante a sua operação;
  • Na arquitetura da informação, de modo a que a interpretação e uso de guias, símbolos e interface seja mais fácil e sem ocorrência de erros;

Nesse momento você provavelmente deve estar esperando ver exemplos práticos de sucesso, porém, que tal conhecer coisas que não deram tão certo?

Suponha que um amigo seu te diz que a empresa XYZ S/A está procurando um profissional que se enquadra com o seu perfil, então, você vai até o site deles. Conforme você procura alguma coisa para clicar, veja como o rótulo escolhido para o botão para a seção de empregos pode fazer diferença:

< ÓBVIO REQUER RACIOCÍNIO >
Empregos!
Click
Hmm.
[alguns milisegundos pensando]
Empregados.
Click
Humm. Talvez seja a área de empregos, mas parece mais que isso.
Eu clico ou continuo procurando?
Click


Todos os elementos da interface do sistema pode nos obrigar a parar, porém, a falta ou a má condução das atividades de ARQUITETURA DE INFORMAÇÃO pode nos obrigar a pensar demais.

Imagine que você acabou de ser contratado(a) para trabalhar como caixa de um restaurante super movimentado no centro da cidade. Então, no primeiro dia de trabalho você olha aquela fila de pessoas querendo pagar, informa o produto que o cliente está comprando e...

O que está errado? A quantidade. Porque? Como e aonde eu corrijo o problema?

Sem mencionar o tom agressivo da mensagem expresso pelo “!”, a melhor abordagem é identificar onde está errado e fornecer informações da provável forma de resolver o problema.


Uma boa mensagem de erro pode reduzir o impacto do erro humano, facilitar o aprendizado do sistema e garantir a satisfação do usuário em relação ao produto, para isso, basta o ANALISTA DE SISTEMA formar mensagens concisas.

Que tal um outro belo exemplo de um péssimo design?



Mas nem sempre o design está péssimo a ponto de ter que ser totalmente refeito.

Repare que com algumas mudanças na paleta de cor, alinhamento e letra (tipografia) o design pode ganhar vida nova:





Na concepção de um sistema de computador (windows, móvel, web, etc), a ergonomia é o resultado de um trabalho bem estruturado de DESIGN, ARQUITETURA DE INFORMAÇÃO e PROGRAMAÇÃO.




Qual sua opinião sobre o assunto?



Artigos Recomendados:

>>   Porque Investir em Ergonomia e Usabilidade?
>>   Software para Pessoas do Séc XXI
>>   Redes Sociais no Ambiente Corporativo
>>   Pensando em ERGONOMIA e USABILIDADE
>>   Design centrado no usuário

segunda-feira, 23 de maio de 2011

Porque Investir em Ergonomia e Usabilidade?

Você já viu um bom produto, totalmente funcional, fracassar porque o usuário acha que ele “mais atrapalha do que ajuda”?

Não, isso não é história de vendedor. Vou dar uma dica. Atualmente, uma franquia de chocolates simplesmente prefere tirar o pedido dos clientes em papel do que usar o sistema do PDV da loja!

Quando apresentamos o trabalho de ergonomia e usabilidade, nossa equipe comercial ouve de alguns clientes “Não acredito nesse tipo de trabalho. Meu sistema está perfeito!”, e de outros, “Quero investir em usabilidade, mas não sei por onde começar...”.

Hoje, vamos compartilhar nossa visão para esse tipo de trabalho.

Usabilidade x Ergonomia

O primeiro passo que damos é deixar claro qual é o campo da ergonomia e qual é o campo da usabilidade.

A usabilidade ocupa-se da interação do usuário com a interface através de apresentações (painés de informações, dados, controles, comandos e mensagens) e estruturas de diálogo (o que interliga as entradas dos usuários com as apresentações de novos painéis).

Ou seja, é o casamento entre a inteface do sistema, o usuário que a opera, a tarefa a ser realizada e o ambiente de operação.

Já a ergonomia trabalha a adaptação de um dispositivo ao seu operador e à tarefa realizada.

Para se construir interfaces ergonômicas e que proporcionem usabilidade, os profissionais envolvidos utilizam técnicas e conceitos para organizar os diferentes elementos gráficos de forma a facilitar a percepção, o racioncínio, a memorização e a tomada de decisão.

O que é problema de Ergonomia?

O problema de ergonomia é identificado quando um aspecto da interface está em desacordo com as características dos usuários, por exemplo:

  • Aspecto inadequado na interface;
  • Recomendação ou critério ergonômico sendo desrespeitado;

Faça um teste você mesmo, olhe para uma interface do seu sistema e pergunte:

  • Os rótulos dos campos contêm um elemento específico, por exemplo ":", como convite às entradas de dados?
  • Nos agrupamentos de dados , os itens estão organizados espacialmente segundo um critério lógico?
  • Os títulos das páginas de menu são explicativos, refletindo a natureza da escolha a ser feita?

O que é problema de Usabilidade?

Já o problema de usabilidade é observado em determinadas circuntâncias, quando uma característica do sistema interativo (problema de ergonomia) compromete a produtividade, a qualidade da tarefa ou (no pior caso) inviabiliza sua realização e é descrito a partir:

  • Do contexto de operação onde o problema pode ser observado;
  • Algum aspecto inadequado na interface (problema de usabilidade);
  • Frequência com que o problema/contexto se manifesta;

O que faço? Inspeção de ergonomia ou teste de usabilidade?

O teste de usabilidade é um trabalho balisado por um estudo e avaliação que requer um tempo hábil para planejamento, execução e análise (de 2 a 3 semanas, dependendo da quantidade de tarefas a serem avaliadas) e fornece compensadores.

Para produtos com aspectos ou conceitos inovadores o mais indicado é o teste de usabilidade.

A inspeção ergonômica fornece uma resposta rápida e precisa (em média 2 semana, dependendo da quantidade de telas), que dependendo da natureza e dos conceitos do produto, pode até suprir testes de usabilidades.

Mas lembre-se, só é possível realizar inspeções ergonômicas ou testes de usabilidade se o seu sistema está pronto ou se você tem um protótipo funcional do sistema, caso contrário, o designer de interfaces é o investimento mais indicado.

Quero melhorar a qualidade do meu sistema, por onde começo?

Investir em inspeções de ergonomia é o melhor passo, porque, fornece uma resposta rápida da percepção que os usuários podem ter e permite que você conheça melhor os benefícios desse tipo de trabalho e como explorar o diferencial que trará ao seu produto.

A Apolineo realiza esse tipo de trabalho.

Baseado na norma ISO 9241:10, são avaliados 197 itens dispostos em 18 categorias e com pesos de acordo com sua criticidade, onde ao final, é gerado um score da qualidade ergonômica:

  • BAIXA: a interface precisa ser totalmente reformulada;
  • REGULAR: a interface possui muitos problemas críticos, corrija-os;
  • BOA: faça uma revisão dos itens mais críticos;
  • ÓTIMA: corrigir pontualmente os itens mais críticos (se houver);

Conheça nosso portfólio em http://www.apolineo.com.br/portfolio/.

Até a próxima!



Artigos Recomendados:

>>   Software para Pessoas do Séc XXI
>>   Redes Sociais no Ambiente Corporativo
>>   Pensando em ERGONOMIA e USABILIDADE
>>   Design centrado no usuário

segunda-feira, 2 de maio de 2011

Como vai a ergonomia do seu código?

No mundo RAD (Rapid Application Development) de hoje pouco se discuti sobre a qualidade do código fonte dos nossos softwares.

E se você fizer uma pesquisa no Google encontrará um conteúdo abordando aspectos da ergonomia do código de forma isolada. Nosso intuito com esse artigo é iniciar uma discussão no intuito de identificar e organizar as qualidades qualidades desejadas e como chegar lá...

Após algumas reflexões e analogias com a ergonomia de interfaces chegamos em 6 qualidades que devemos trabalhar:

  1. Acoplamento: diz respeito a qualidade de baixa dependência;
  2. Coesão: diz respeito a qualidade de responsabilidade única;
  3. Flexibilidade: diz respeito a qualidade de extensão e personalização;
  4. Legibilidade: diz respeito ao esforço necessário para compreensão do código;
  5. Mensagens de Erros: diz respeito a qualidade das mensagens de erro;
  6. Presteza: diz respeito a qualidade das informações disponiveis sobre o código para informar e conduzir a utilização do código;

Acoplamento

O acoplamento entre classes ou subsistemas é uma medida da interconexão entre as classes ou subsistemas.

Exemplo de recomendações:

  • Evitar duplicação de código;
  • Evitar classes muito grandes;
  • Evitar métodos muito longos;
  • Evitar lista de parâmetro muito longas;

O exemplo abaixo ilustra um módulo de processamento de negócios com acoplamento forte. O primeiro problema é que não podemos reaproveitar a regra de negócio independentemente da estrutura do banco de dados, e segundo, que qualquer alteração na estratégia de acesso a dados , na estrutura de dados ou configuração afetará a lógica de negócio.

public class BusinessLogicClass
{
  public void DoSomething()
  {
    int threshold = int.Parse(ConfigurationManager.AppSettings["threshold"]);
    string connectionString = ConfigurationManager.AppSettings["connectionString"];

    string sql = @"select * from things size > " + threshold;

    using (SqlConnection connection = new SqlConnection(connectionString))
    {
      connection.Open();

      SqlCommand command = new SqlCommand(sql, connection);
      using (SqlDataReader reader = command.ExecuteReader())
      {
        while (reader.Read())
        {
          string name = reader["Name"].ToString();
          string destination = reader["destination"].ToString();

          // do some business logic in here
          doSomeBusinessLogic(name, destination, connection);
        }
      }
    }
  }
}

Coesão

A coesão é a medida que indica se uma classe tem uma função bem definida no sistema.

Um sistema composto por classes e subsistemas coesos é semelhante a um grupo de discussão online bem projetado. Cada área do grupo online é estritamente concentrada em um tópico específico, para que seja fácil acompanhar a discussão e, se você estiver procurando um diálogo sobre determinado assunto, precise visitar apenas uma sala.

Exemplos de recomendações:

  • Utilize o principio de separação de conceitos dividindo as funcionalidades da aplicação e minimizando pontos de interação;
  • Utilize o principio Least Knowledge (LoD) para evitar que um objeto não conheça os detalhes internos de implementação de outro;
  • Utilize o principio Tell, Don’t Ask e evite que seus objetos façam perguntas a um objeto sobre seu estado interno, tome algumas decisões sobre esse estado, e então, diga ao objeto o que fazer;
  • Pratique a Lei de Deméter e faça com que a classe fale somente com seus “amigos” mais próximos;
public class Purchase
{
  private readonly double _subTotal;

  public Purchase(double subTotal)
  {
    _subTotal = subTotal;
  }

  public double Total
  {
    get
    {
      double discount = _subTotal > 10000 ? .10 : 0;
      return _subTotal * (1 - discount);
    }
  }
}

public class Account
{
  private double _balance;

  public void Deduct(Purchase purchase, PurchaseMessenger messenger)
  {
    if (purchase.Total < _balance)
    {
      _balance -= purchase.Total;
    }
    else
    {
      messenger.RejectPurchase(purchase, this);
    }
  }
}

public class ClassThatObeysTellDontAsk
{
  public void MakePurchase(Purchase purchase, Account account)
  {
    PurchaseMessenger messenger = new PurchaseMessenger();
    account.Deduct(purchase, messenger);
  }
}

Saiba mais através do artigo Padrões na prática: coesão e acomplamento

Flexibilidade

A flexibilidade do código é a qualidade que promove a reusabilidade e a facilidade de manutenção (reparo de erro e evolução) para responder de forma rápida e confiável as mudanças exigidas pelo dinâmismo do business das empresas.

Exemplos de Recomendações:

  • Padronizar a criação de objetos;
  • Isolar a complexidade de criação de objetos compostos;
  • Fornecer meios de extender o comportamento das classes;
  • Fornecer meios de mudar o comportamento das classes;

No exemplo abaixo, temos uma API para importação de dados externos ao sistema através de um conector. Nela isolamos e padronizamos a criação de conectores e fornecemos um meio de extendê-los e ou mudar sua estratégia de leitura das informações externas sem impacto no código.

Você pode fazer o download do projeto clicando aqui.

Legibilidade

A performance e a qualidade na evolução do código leva em conta as características cognitivas e perceptivas dos usuários.

Uma boa legibilidade facilita a leitura do código, a identificação de defeitos, reduz a curva de aprendizado da equipe, promove o reuso e reduz o gap de idioma com a área de negócio.

Exemplos de recomendações:

  • Usar nomes claros e explicativos para funções (verbos) e variáveis (substantivos);
  • Fazer com que o código reflita suas intenções e decisões;
  • Trabalhar a lêxia do código de forma a refletir uma frase natural;
  • Utilizar o padrão Pascal Case para nomes de namespaces, classes, métodos, propriedades, eventos e delegates;
  • Utilizar o padrão Camel Case para nomes de variáveis;

Um recurso muito útil introduzido na versão 3.0 do Microsoft .Net Framework é o Extension Method, o qual, podemos adicionar comportamento (método) a um determinado tipo sem a necessidade de alterar o código original ou criar tipos derivados.

Vejamos um exemplo:

if (sale.IsValid() && sale.SaleDetailsList.HasAllItemsValid())
{
  if(Stock.EvaluateProductsAvailability(sale))
  {
    using (var trans = new DataTransaction())
    {
      sale.Insert();
      Stock.UpdateStock(sale.GetProductsSold());
      sale.SaleDetailsList.Insert();
      Invoice.Generate(sale);
      Carrier.PlanDeliver(sale);

      trans.Complete();
    }
  }
}

Mensagens de Erros

A qualidade das mensagens favorece o aprendizado do sistema, indicando ao usuário a razão ou a natureza do erro cometido, o que ele fez de errado, o que ele deveria ter feito e o que ele deve fazer.

Exemplos de recomendações:

  • Construir mensagem no idioma do usuário;
  • Utilizar mensagens de erro tão breves quanto possível;
  • Fornecer mensagens de erro orientadas a tarefas;
  • Utilizar termos tão específicos quanto possível para as mensagens de erros;
  • Adotar um vocabulário neutro, não personalizado, não repreensivo nas mensagens de erro;
  • Evitar o humor;

Vamos avaliar isso em um exemplo.

Ao invés de frases com estrutura negativo-negativo, como “A idade mínima não pode ser menor que 18 anos”, procure utilizar linguagem positiva e indicar os valores esperados, “A idade deve ser maior ou igual a 18 anos”.

Forneça na mensagem de erro todas as informações necessárias à compreensão e solução do problema.

Ao invés de “Desconto superior ao máximo permitido (G527)”, procure alternativas como “O valor de desconto (R$50,00) é superior ao máximo permitido para essa transação (R$7,50). Por favor, tente novamente com valor adequado ou solicite aprovação da supervisão”.

Curiosidade: 10 principais, diferentes e engreçadas mensagens de erro da computação

Presteza

Uma boa presteza facilita o aprendizado do usuário em como usar uma classe/método/serviço e diminui a ocorrência de erros.

Exemplos de Recomendações:

  • Documentar a responsabilidade da classe;
  • Documentar o que seus métodos fazem;
  • Documentar para que serve o parâmetro de um método/serviço, o valor padrão e os valores esperados;
  • Fornecer um cenário de uso da classe/método/serviço;

Vamos avaliar isso em um exemplo.

Você já usou uma classe de alguém que não se preocupou em escrever aquele cabeçalho do método, ou pior, que escreveu coisas que não ajudam em nada?

Vendo o exemplo acima você deve estar se perguntando: O que a classe XnMSteadyDetector faz? O que o parâmetro “CooldownFrames” controla e qual o range valores válidos? E o parametro “DetectionDuration”? Controla o tempo em segundos, millisegundos, ou outro? Qual é o valor padrão? E o “MaximumAllowedVelocity”?

Alguém pode argumentar “Isso está na documentação”. Perfeito! É o mínimo que tem que ser feito, senão, seria quase impossível usar a classe.

Mas no mundo .Net, onde há o Microsoft Visual Studio, você deveria ir além!

Deveria fornecer informações de forma integrada com o ambiente de desenvolvimento de forma a facilitar a vida da pessoa que está utilizando sua classe/método/serviço.

E isso é simples. Basta:

Para produzir esse resultado:

Fique a vontade para compartilhar suas experiências, visões, sugestões e críticas.

Até a próxima!


Artigos Recomendados:

>>   Event-based Asynchronous Pattern (EAP). O futuro padrão para as interfaces das aplicações?
>>   Software para Pessoas do Séc XXI
>>   Prepare-se para o C# 5 – Parte 2
>>   Prepare-se para o C# 5 – Parte 1
>>   Reflection de Alta de Performance
>>   Extension Methods = Manutenibilidade

quarta-feira, 20 de abril de 2011

Event-based Asynchronous Pattern (EAP). O futuro padrão para as interfaces das aplicações?

Sabe quando seu aplicativo vai realizar uma tarefa demorada e ele “para de responder” enquanto não termina de processar? Esse é o cenário de grande parte dos aplicativos atualmente.

Com a versão 2.0 do Microsoft .Net Framework foi introduzido um pattern endereçado a esse tipo de cenário chamado Event-based Asynchronous Pattern (EAP), oferecendo as vantagens de uma aplicação multithreaded e "escondendo" a complexidade inerente a esse tipo de design.

Com ele, você pode:

  • Executar tarefas demoradas, como downloads e operações de banco de dados, em "background", sem congelar sua aplicação;
  • Executar operações simultaneamente e receber notificações quando cada uma for concluída;
  • Aguardar que recursos fiquem disponíveis sem congelar sua aplicação;
  • Comunicar-se com as operações assíncronas pendentes usando o modelo de eventos;

A efeito de exemplo e aprendizado, o cenário que vamos trabalhar é a leitura de arquivos texto para importação de dados no sistema.

Começamos a implementação do pattern criando as classes de argumento dos eventos que criaremos para nos comunicarmos com o chamador. Essas classes devem herdar do AsyncCompletedEventArgs ou ProgressChangedEventArgs (no caso de informação referente ao progresso da execução).

No nosso caso, a classe padrão (ProgressChangedEventArgs) é suficiente para notificarmos o progresso da leitura e mapeamento dos dados do arquivo. Então, o argumento para a notificação da finalização do processamento ficará:

public class MapCompletedEventArgs : AsyncCompletedEventArgs
{
  public IEnumerable<Customer> CustomersList { get; private set; }
  public MapCompletedEventArgs(IEnumerable<Customer> customersList,
  Exception error, bool isCancelled, object userState)
    : base(error, isCancelled, userState)
  {
    this.CustomersList = customersList;
  }
}

O próximo passo é criar os handles (delegates) para as operações de avisar o progresso e quando o processamento estiver terminado:

public delegate void MapProgressChangedEventHandler(ProgressChangedEventArgs e);
public delegate void MapCompletedEventHandler(MapCompletedEventArgs e);

Agora, criaremos os respectivos eventos para informar o progresso e quando a execução estiver concluída:

public event MapProgressChangedEventHandler MapProgressChanged;
public event MapCompletedEventHandler MapCompleted;

Para garantir o uso da thread correta na execução dos eventos precisamos criar callbacks para serem executados via AsyncOperation:

private SendOrPostCallback onProgressReportDelegate;
private SendOrPostCallback onCompletedDelegate;

A última variável que precisamos é um dicionário para controlar as múltiplas requisições:

private HybridDictionary userStateToLifetime = new HybridDictionary();

No construtor da classe inicializamos os callbacks:

public CustomerMapper()
{
  onProgressReportDelegate = new SendOrPostCallback(ReportMapProgress);
  onCompletedDelegate = new SendOrPostCallback(ContentFileMappingCompleted);
}

private void ContentFileMappingCompleted(object operationState)
{
  OnMapCompleted(operationState as MapCompletedEventArgs);
}

private void OnMapCompleted(MapCompletedEventArgs e)
{
  if (MapCompleted != null)
  {
    MapCompleted(e);
  }
}

private void ReportMapProgress(object state)
{
  OnMapProgressChanged(state as ProgressChangedEventArgs);
}

private void OnMapProgressChanged(ProgressChangedEventArgs e)
{
  if (MapProgressChanged != null)
  {
    MapProgressChanged(e);
  }
}

E finalmente chegamos aos métodos de mapeamento assíncrono do arquivo, o qual, criamos uma operação assíncrona através da classe AsyncOperationManager:

public IAsyncResult MapAsync(string filePath)
{
  var asyncOp = AsyncOperationManager.CreateOperation(filePath);

  lock (userStateToLifetime.SyncRoot)
  {
    if (!userStateToLifetime.Contains(filePath))
    {
      userStateToLifetime[filePath] = asyncOp;
    }
  }

  var action = new Action<string, AsyncOperation>(MapFileWorker);
  return action.BeginInvoke(filePath, asyncOp, null, null);
}

Disponiblizaremos um método para ser utilizado caso o usuário queira cancelar a operação a qualquer momento:

public void CancelReadAsync(string filePath)
{
  var asyncOp = userStateToLifetime[filePath] as AsyncOperation;
  if (asyncOp != null)
  {
    lock (userStateToLifetime.SyncRoot)
    {
      userStateToLifetime.Remove(filePath);
    }
  }
}

No método que realiza o processamento da requisição precisamos garantir que o evento referente a finalização do processamento seja executado em caso de sucesso, cancelamento ou falha. E para executarmos o evento utilizamos o método PostOperationComplete da operação assíncrona que criamos:

private void MapFileWorker(string filePath, AsyncOperation asyncOp)
{
  Exception error = null;
  IEnumerable<Customer>customersList = null;
  if (!TaskCanceled(asyncOp.UserSuppliedState))
  {
    try
    {
      customersList = MapFileLogic(filePath, asyncOp);
    }
    catch (Exception ex)
    {
      error = ex;
    }
  }

  if (!TaskCanceled(asyncOp.UserSuppliedState))
  {
    lock (userStateToLifetime.SyncRoot)
    {
      userStateToLifetime.Remove(asyncOp.UserSuppliedState);
    }
  }

  var arg = new MapCompletedEventArgs(customersList, error,
    TaskCanceled(asyncOp.UserSuppliedState), asyncOp.UserSuppliedState);

  asyncOp.PostOperationCompleted(onCompletedDelegate, arg);
}

Para o evento de acompanhamento do progresso usamos o método Post da operação assíncrona:

var arg = new ProgressChangedEventArgs(progressPercentage, asyncOp.UserSuppliedState);
asyncOp.Post(this.onProgressReportDelegate, arg);

Ao final, a classe que utilizará o método assíncrono ficará assim:

var mapper = new CustomerMapper();
mapper.MapCompleted += new CustomerMapper.MapCompletedEventHandler(mapper_MapCompleted);
mapper.MapProgressChanged += new CustomerMapper.MapProgressChangedEventHandler(mapper_MapProgressChanged);
mapper.MapAsync(Environment.CurrentDirectory + @"\CustomerTextFile1.txt");

E talvez você esteja se pergutando “Legal, e por que eu deveria me importar com isso?”.

Essa é uma tendência de programação que ganhou força com o Silverlight e parece ser o padrão para se programar no Windows Phone 7.

Será que esse pattern se tornará padrão para programação de aplicações no futuro?

Você já usou esse padrão?

Até a próxima!

DOWNLOAD EXEMPLO:
EAP.TEXTFILEMAPPER.RAR


Artigos Recomendados:

>>   Software para Pessoas do Séc XXI
>>   Prepare-se para o C# 5 – Parte 2
>>   Prepare-se para o C# 5 – Parte 1
>>   Reflection de Alta de Performance
>>   Extension Methods = Manutenibilidade

terça-feira, 12 de abril de 2011

Software para Pessoas do Séc XXI

Antigamente quando você dizia “Chefe, chefe, estou com uma grande idéia”, ele te dizia, “Calma. Respira fundo que passa.”

Hoje, as necessidades mudaram. As pessoas estão se despedindo dos seus chefes e apenas em 2011 foram 163.679 formalizações de empreendedores individuais segundo o Sebrae.

Antes, ao comprar uma televisão você virava um consumidor, agora, ao comprar qualquer eletrônico você se torna um produtor. Já percebeu quanto material é produzido por pessoas como você em eventos, festas, desastres, etc? Somos mais rápido que a imprensa!

O tempo virou o bem social coletivo. Relevância, a palavra chave nesse mar de informação. E co-criação a saída de uma vida moderna sem significado. Você conhece o Camiseteria? Ou o Electrolux Design Lab? Talvez o Fiat Mio? Provavelmente o Nespresso? Mas com certeza o Wikipedia!

As pessoas mudaram. Você mudou! Só que as empresas ainda criam software como na época do “Departamento de Processamento de Dados”? rs

"Empresas que compreendem a importância de aproveitar o poder dos comportamentos colectivos para impulsionar mudanças positivas nos negócios serão bem-sucedidas." – Gartner

Em projetos de softwares modernos além da arquitetura do software, da estrutura de dados, da distribuição e da sergurança precisamos considerar as capacidades e limitações dos usuários, de forma a tornar o trabalho deles mais eficaz, eficiente e agradável.

Para isso, primeiramente sua metologia deve promover o envolvimento do usuário no projeto.

Como o usuário é a pessoa que mais conhece sobre o contexto do seu trabalho, sem desconsiderar o risco de perda de tempo e recursos em função da variabilidade e subjetividade que caracterizam as atividades com usuários, devemos desenvolver técnicas para planejar, organizar e executar o envolvimento adequado, que pode ser:

  • Informativo: o usuário é visto como fonte de informação que são extraídas através de técnicas de entrevistas, questionários ou observação;
  • Consultivo: o projetista, valendo-se ou não das informações coletadas, elabora soluções de projeto e pede que o usuário as verifique e emita uma opinião;
  • Participativo: quando a corporação transfere ao usuário o poder sobre as decisões de projeto e requer alto engajamento (que deve vir desde a alta gerência);

Durante a especificação do sistema e o desenvolvimento do protótipo você deve trabalhar os 5 fatores da experiência do usuário:

  • Utilidade: percepção do usuário quanto a funcionalidade lhe agregar algum valor dentro do seu contexto;
  • Usabilidade: diz respeito à eficácia, eficiência e satisfação do usuário na realização de seus objetivos com o sistema;
  • Disponibilidade: refere-se aos elementos da interface que fornecem feedback sobre o estado do sistema, mecanismos que evitem perda de informação, etc;
  • Estética: refere-se ao apelo visual da aplicação, à sua atratividade para o usuário;
  • Processo off-line: complementa a experiência do usuário, como a confiança no nome da empresa, a segurança dos dados, suporte, treinamento, campanha de marketing, entre outros;

O IPhone é um exemplo de produto criado com esse tipo de abordagem.

O que achou? Deixe seus comentários.

Até o próximo!




Artigos Recomendados:

>>   Redes Sociais no Ambiente Corporativo
>>   Pensando em ERGONOMIA e USABILIDADE
>>   Design centrado no usuário

quarta-feira, 30 de março de 2011

Redes Sociais no Ambiente Corporativo

Quando você leu o título o que lhe veio a cabeça? Twitter? Facebook?

Hum, se sua resposta for sim, sinto em lhe dizer, mas você está confundindo MÍDIA SOCIAL com REDE SOCIAL.

“Qualquer pessoa ficaria chateado, qualquer um de nós ficaria abatido, desmotivado, mas não Joseph Klimber” e você também não precisa.

Então, o que é uma rede social?

Rede social é uma estrutura composta por pessoas conectadas que compartilham valores e objetivos comuns. Isso quer dizer que o grupo que se reúne todos os domingos para jogar bola, as pessoas que participam do Campus Party ou o grupo de voluntários da GRAAC são todos redes sociais (só que em diferentes níveis).

Com a aparição de novas tecnologias como a internet a interação entre as pessoas cresce com rapidamente. Então, com a criação de mídias sociais como o Youtube, o Twitter ou Facebook essa velocidade aumentou ainda mais. São milhões de pessoas colaborando, compartilhando, co-criando, presentes em todos os lugares e em busca de um mundo melhor.

“Empresas que compreendem a importância de aproveitar o poder dos comportamentos colectivos para impulsionar mudanças positivas nos negócios serão bem-sucedidas.” – Gartner

E porque na minha empresa não é assim?

Quando dentro de uma empresa buscamos conhecimento para atingirmos uma meta, realizar um trabalho, só que a máquina da empresa, a obrigação, a rotina, seus processos não permitem troca de conhecimento, e esse ambiente inadequado, inibe a interação das pessoas.

Ninguém interage se não vê essa troca.

Para estabelecer relações precisam ser criadas conexões, as quais podem gerar ou não relações de confiança, onde geralmente, a troca de conhecimento pessoal começa a acontecer.

Talvez você já tenha experimentado isso de alguma forma. Você já conversou sua vida pessoal com algum colega do trabalho que você não confia? Mas já deve ter considerado o comentário de um desconhecido sobre um produto que você queria comprar.

Uma vez que as pessoas começam a trocar informações pessoais elas se viciam nisso e esse caminho evolui para o ambiente profissional.

Nessas conexões haverá pessoas com diversos perfis e nosso trabalho será identificar o perfil de cada um e incentivá-las. Os principais perfis são os CRIADORES (aquelas que geram conteúdo para outras pessoas), CRÍTICOS (aquelas que opinião sobre os conteúdos gerados), PARTICIPANTES (aquelas que participam comentando ou interagindo com o conteúdo gerado) e os ESPECTADORES (aquelas que apenas acompanham esses conteúdos).

Você deve estar se indagando, isso é bonito, mas sem controle vai virar uma bagunça!

O “controle” muda para moderação, bom senso, política de boa conduta. E isso a própria rede é capaz de “controlar” se as pessoas críticas entenderem a política da rede. Alias, VOCÊ DEVERIA SER UMA DESSAS PESSOAS COM PERFIL CRÍTICO!

Estamos na era da Economia da Colaboração. As pessoas agora interagem para a CO-CRIAÇÃO do conhecimento em busca de um mundo melhor. Então, permita de alguma forma que seu cliente ou colaborador faça parte do processo criativo e produtivo do projeto.

E porque as pessoas dedicam seu precioso tempo na co-criação de um produto?

1. Fazer parte de algo maior
2. Mostrar que fazem parte daquilo
3. Pura diversão
4. Oportunidade de colaborar
5. Recompesa financeira

Já está acontecendo. É real! Não conhece a CAMISETERIA, o NESPRESSO, o FIAT MIO, o DESIGN LAB ELECTROLUX ou ainda o WIKIPEDIA.

Contudo, nada disso faz sentido se não aprendermos, não compartilharmos, não inovarmos, não criticarmos, não participarmos. E para isso, são necessárias estratégias, capacitação, metodologias específicas e projetos.

Como é o ambiente na sua empresa? É colaborativo? Participativo? As pessoas se sentem confortáveis em expressarem suas opiniões? Torcem o nariz quando houvem falar de rede social? E qual sua opinião sobre o assunto?


PARTICIPE DA DISCUSSÃO NO FACEBOOK!




Artigos Recomendados:

>>   Pensando em ERGONOMIA e USABILIDADE
>>   Design centrado no usuário