Melhorando  a comunicação entre stakeholder/desenvolvedores com a  Linguagem Ubíqua   Alline Watkins
O problema: Programadores conversam usando jargões técnicos  ( design patterns, abreviações, termos técnicos ) Especialistas do Domínio usam terminologias específicas de suas áreas de conhecimento    (economia, hotelaria, telecom, …) Computadores conversam linguagens de programação alguém tem que ceder!
O Acordo: Agile prega que programadores devem usar a linguagem de domínio como nomenclaturas no código fonte (“ubiquitous language”, “system metaphor” na XP)
u. bí .qu:o   que está ao mesmo tempo em toda a parte, onipresente    (pt.Wikcionário.org) UBIQUITOUS LANGUAGE . A language structured around the domain model and used by all team members to connect all the activities of the team with the software.   (Excerpted from Domain-Driven Design by Eric Evans )   .  We understand each other.   (Excerpted from The Art of Agile Development by James Shore and Shane Warden, published by O'Reilly. Copyright © 2008 the authors. All rights reserved.)
Histórias de Usuário Reuniões E-mails   Mensagens Intântaneas Planejamento de Projeto Documentação do Software E  CÓDIGO FONTE  !! Onde aplicar:
As vantagens... Comunicação mais Eficiente Menor  risco de desentendimentos Conhecimento do Domínio armazenado no código fonte Código mais compreensível (manutenibilidade, extensibilidade)
NÃO Quando o  Usuário  clica no  Grid , o  sistema  exibe  0 ou X dependendo que qual é o  Usuário  atual.   Exemplo de História de Usuário: SIM Quando o  Jogador  clica no  Tabuleiro,  o  Jogo  exibe o  símbolo  0 ou X dependendo de qual é o  Jogador  atual.      (retiradas de um software exemplo para o Jogo da Velha)
NÃO . Integer  i  =  new Integer(); . String  char1  =  new String(); . public class GameDAO() { } . catch (Exception e) Exemplos no Código Fonte: SIM . String  realSignificadoDaString  =  new String(); . public class ScoreDataLoader() { } . catch (Exception  ExcecaoUsuarioNaoAutenticado) NÃO  . Ambiguidades . Inconsistências . Sinônimos . Abreviações SIM . Clareza . Precisão . Reuso . Nomes Completos
/**   * Exibe a string O ou X na celula do jogo. */ public class   MostraCellGrid { public static void   exibeUsuario  (Grid  grid , Cell  cell ) {            if (! Inicializacao. flag     &&  Inicializacao.statusJogo.getSequencia () == null      &&  isVazio ( grid ,  cell )) {   Inicializacao. flag = true;    String  mk =  exibeString ( Inicializacao.statusJogo          . getUsuarioCorrente (). getStringUsuario ());    grid .setHTML( cell. getRowIndex(),  cell .getCellIndex(),  mk );   Inicializacao.statusJogo.getStatus ()[ cell .getRowIndex()] [ cell .getCellIndex()] =  Inicializacao.statusJogo . getUsuarioCorrente (); GameEnd . verificaFim ( Inicializacao.statusJogo , cell .getRowIndex(),  cell .getCellIndex());         } (...) } Uma classe  ANTES  e  DEPOIS  da Linguagem Ubíqua /**   * Efetiva o movimento do jogador na grade do jogo.   */ public class  MovimentoDoJogador   { /**  * Quando o jogador clica numa celula na grade do tabuleiro o jogo desenha  * um 0 ou X dependendo de qual e o jogador atual.  */ public static void  mover    (GradeDoJogo  gradeDoJogo , Cell  celulaSelecionada ) {    if (! VariaveisGlobais.flagDeAguardoDoMovimento   &&  VariaveisGlobais.statusCorrenteDoJogo.getSequenciaGanhadora ()  == null  &&  eCelulaVazia  ( gradeDoJogo ,  celulaSelecionada )) {   VariaveisGlobais.flagDeAguardoDoMovimento  = true;   String  simbolo  =  exibeSimboloDoJogador  (   VariaveisGlobais.statusCorrenteDoJogo   . getJogadorCorrente (). getSimboloDoJogador ());   gradeDoJogo  .setHTML(  celulaSelecionada  .getRowIndex(),   celulaSelecionada  .getCellIndex(),  simbolo );   ChamadaParaOJulgamentoDoMovimento.verificaSeGanhou (   VariaveisGlobais.statusCorrenteDoJogo ,   celulaSelecionada  .getRowIndex(),   celulaSelecionada  .getCellIndex());   } } (...) } (Excerpted from a Tic Tac Toe Game source code)
Qual das duas opções um Stakeholder melhor entenderia ? Movimento do Jogador      Efetiva o movimento do jogador na grade do jogo. Mover        Quando o jogador clica numa celula na grade do tabuleiro          o jogo desenha um 0 ou X dependendo de qual e o       jogador atual. E Celula Vazia         Um jogador podera selecionar somente as celulas que         ainda nao foram selecionadas. Mostra Cell Grid     Exibe a string O ou X na celula do jogo.                                               Exibe Usuario          Is Vazio (retiradas de um software exemplo para o Jogo da Velha)
[email_address] !!  OBRIGADA !!

Ubiquitous Language - Portugues

  • 1.
    Melhorando acomunicação entre stakeholder/desenvolvedores com a Linguagem Ubíqua Alline Watkins
  • 2.
    O problema: Programadoresconversam usando jargões técnicos ( design patterns, abreviações, termos técnicos ) Especialistas do Domínio usam terminologias específicas de suas áreas de conhecimento (economia, hotelaria, telecom, …) Computadores conversam linguagens de programação alguém tem que ceder!
  • 3.
    O Acordo: Agileprega que programadores devem usar a linguagem de domínio como nomenclaturas no código fonte (“ubiquitous language”, “system metaphor” na XP)
  • 4.
    u. bí .qu:o que está ao mesmo tempo em toda a parte, onipresente (pt.Wikcionário.org) UBIQUITOUS LANGUAGE . A language structured around the domain model and used by all team members to connect all the activities of the team with the software. (Excerpted from Domain-Driven Design by Eric Evans ) . We understand each other. (Excerpted from The Art of Agile Development by James Shore and Shane Warden, published by O'Reilly. Copyright © 2008 the authors. All rights reserved.)
  • 5.
    Histórias de UsuárioReuniões E-mails Mensagens Intântaneas Planejamento de Projeto Documentação do Software E CÓDIGO FONTE !! Onde aplicar:
  • 6.
    As vantagens... Comunicaçãomais Eficiente Menor risco de desentendimentos Conhecimento do Domínio armazenado no código fonte Código mais compreensível (manutenibilidade, extensibilidade)
  • 7.
    NÃO Quando o Usuário clica no Grid , o sistema exibe 0 ou X dependendo que qual é o Usuário atual. Exemplo de História de Usuário: SIM Quando o Jogador clica no Tabuleiro, o Jogo exibe o símbolo 0 ou X dependendo de qual é o Jogador atual. (retiradas de um software exemplo para o Jogo da Velha)
  • 8.
    NÃO . Integer i = new Integer(); . String char1 = new String(); . public class GameDAO() { } . catch (Exception e) Exemplos no Código Fonte: SIM . String realSignificadoDaString = new String(); . public class ScoreDataLoader() { } . catch (Exception ExcecaoUsuarioNaoAutenticado) NÃO . Ambiguidades . Inconsistências . Sinônimos . Abreviações SIM . Clareza . Precisão . Reuso . Nomes Completos
  • 9.
    /**   *Exibe a string O ou X na celula do jogo. */ public class   MostraCellGrid { public static void   exibeUsuario (Grid  grid , Cell  cell ) {            if (! Inicializacao. flag    &&  Inicializacao.statusJogo.getSequencia () == null     &&  isVazio ( grid ,  cell )) {   Inicializacao. flag = true;   String  mk =  exibeString ( Inicializacao.statusJogo        . getUsuarioCorrente (). getStringUsuario ());   grid .setHTML( cell. getRowIndex(),  cell .getCellIndex(),  mk );   Inicializacao.statusJogo.getStatus ()[ cell .getRowIndex()] [ cell .getCellIndex()] =  Inicializacao.statusJogo . getUsuarioCorrente (); GameEnd . verificaFim ( Inicializacao.statusJogo , cell .getRowIndex(),  cell .getCellIndex());        } (...) } Uma classe ANTES e DEPOIS da Linguagem Ubíqua /**   * Efetiva o movimento do jogador na grade do jogo.   */ public class  MovimentoDoJogador   { /**  * Quando o jogador clica numa celula na grade do tabuleiro o jogo desenha  * um 0 ou X dependendo de qual e o jogador atual.  */ public static void mover   (GradeDoJogo  gradeDoJogo , Cell celulaSelecionada ) { if (! VariaveisGlobais.flagDeAguardoDoMovimento && VariaveisGlobais.statusCorrenteDoJogo.getSequenciaGanhadora () == null && eCelulaVazia ( gradeDoJogo , celulaSelecionada )) { VariaveisGlobais.flagDeAguardoDoMovimento = true; String simbolo = exibeSimboloDoJogador ( VariaveisGlobais.statusCorrenteDoJogo . getJogadorCorrente (). getSimboloDoJogador ()); gradeDoJogo .setHTML( celulaSelecionada .getRowIndex(), celulaSelecionada .getCellIndex(), simbolo ); ChamadaParaOJulgamentoDoMovimento.verificaSeGanhou ( VariaveisGlobais.statusCorrenteDoJogo , celulaSelecionada .getRowIndex(), celulaSelecionada .getCellIndex()); } } (...) } (Excerpted from a Tic Tac Toe Game source code)
  • 10.
    Qual das duasopções um Stakeholder melhor entenderia ? Movimento do Jogador      Efetiva o movimento do jogador na grade do jogo. Mover        Quando o jogador clica numa celula na grade do tabuleiro          o jogo desenha um 0 ou X dependendo de qual e o       jogador atual. E Celula Vazia         Um jogador podera selecionar somente as celulas que         ainda nao foram selecionadas. Mostra Cell Grid     Exibe a string O ou X na celula do jogo.                                               Exibe Usuario          Is Vazio (retiradas de um software exemplo para o Jogo da Velha)
  • 11.

Notas do Editor

  • #3 Main problem in software is miscommunication
  • #5 The common language is in the middle and not more of business language nor technical language Somewhere in between, not programmers completely conforming to biz language
  • #7 Maintainability – classes and packages are named/grouped in a way that makes sense in the real world Agility improve - Precise Communication
  • #12 We understand each other Software development is by its nature a series of translations and compromises. What the end user wants, what the customer is willing to pay for, and what is technically feasible rarely combine to form a unified set of features. In this talk we will explore how an Agile team can work to understand each other better, in particular at the communication divide between stakeholders and developers. We will show you how to develop a domain-specific ubiquitous language, how to lessen the responsibility gap between managers and developers, and how to use your codebase as the central source for documentation.