Técnicas

Retry pattern

Cada vez mais a web se torna uma plataforma de serviços ao passo que necessitamos estar conectados para que possamos fazer o uso destes. A grande maioria dos serviços hoje são hospedados na nuvem e a comunicação entre a aplicação e o serviço é extremamente crítica neste cenário. Os servidores que oferecem serviços de nuvem são servidores de alta disponibilidade e robustos o suficiente para minimizar ao máximo uma possível paralisação. Porém o caminho até um servidor pode não ser tão estável assim, visto que há outros recursos durante o percurso que podem impactar a utilização de um serviço, como infra interna da empresa e a operadora por exemplo.  Diante deste cenário, cada vez mais é exigido que as aplicações consigam lidar com esta instabilidade e garantam uma responsividade (capacidade de dar repostas) aceitável num cenário que pode ser imprevisível. 

 

Contexto 

Existem certos tipos de erros em uma aplicação que são momentâneos, são chamados erros Transientes. Estes erros, ou falhas, como ficar melhor, são devido a diversos fatores externos à aplicação e que muitas vezes não são previstos no desenvolvimento. Se um serviço torna-se indisponível por um certo tempo, a aplicação deveria saber tratar este problema. É comum fazer o acesso aos serviços dentro de um bloco Try catch para tratar uma possível falha. Porém, como já vimos, existem erros que são momentâneos, e nesse caso uma nova tentativa teria grande chance de obter sucesso. Simplesmente “empacotar” uma chamada de um serviço dentro de um bloco Try catch apenas impede o erro de “quebrar” a aplicação e uma abordagem mais reativa cairia bem nesses cenários. 

O padrão conhecido como Retry Pattern vem ao encontro dessa abordagem e permite que a aplicação converse com os serviços de uma forma mais responsiva num cenário de instabilidades.  

Para implementar esse padrão, deve-se levar em consideração a natureza da falha em questão, pois nem sempre tentar novamente é o procedimento apropriado naquele momento. Podem haver casos em que simplesmente abortar a operação é o mais indicado.  Para identificarmos qual será a abordagem a ser seguida, vamos considerar o seguinte: 

  • Falhas que indicam não ser transitórias: falhas na autenticação ou dados inconsistentes por exemplo, devem ser abortadas após uma tentativa malsucedida, pois reenviar a mesma solicitação provavelmente não implicará num retorno bem-sucedido. 
  • Falhas pouco comuns ou raras: em situações como esta, onde a falha ocorrida é incomum ou raramente acontece, tentar novamente é uma boa abordagem, pois é muito pouco provável que esta volte a ocorrer em uma nova tentativa, dada sua natureza rara. 
  • Falhas recorrentes (problemas de conexão ou ocupado): essas são falhas em que uma nova tentativa provavelmente resultará em um retorno bem-sucedido, isso porque esses tipos de problemas são instabilidades momentâneas e por serem de natureza esporádica, a chance de sucesso aumenta muito em uma nova tentativa. 

 

Use com parcimônia 

Se o problema por exemplo for relacionado a uma sobrecarga no servidor, fazer uma nova chamada pode agravar ainda mais a situação. Isso fará com que o servidor leve mais tempo para normalizar seu funcionamento. Então como lidar com essas situações? O Gmail implementa uma forma bem interessante de resolver isso, se você estiver off-line e tentar atualizar seus e-mails, suas tentativas terão intervalos cada vez maiores. Essa abordagem de intervalos maiores ou exponenciais permite que outras requisições sejam finalizadas antes de um nova tentativa, garantindo assim que o servidor não seja sobrecarregado por inúmeras requisições em um curto espaço de tempo. Não esqueçamos também de sermos cuidadosos com a quantidade de vezes que essa requisição será solicitada, até que atinja um limite. Limites altos, podem fazer com que a aplicação sobrecarregue ainda mais o servidor que ainda não restabeleceu o serviço, acarretando em um problema ainda maior. 

 

Modelo de implementação 

O modelo consiste em tentativas sucessivas de requisições em caso de falha. O diagrama abaixo mostra o fluxo das requisições. 

RetryPatternImage

 

Exemplo 

O exemplo abaixo faz o download do conteúdo de uma página e retorna a string correspondente à estrutura da página. Foram utilizadas as rotinas assíncronas do .NET (async e await), porém isso não se faz obrigatório. Existem diversas formas de implementar esse padrão, inclusive existem bibliotecas prontas para isso, um bom exemplo é a Polly.  

Obs.: Tratamentos na saída do resultado foram desconsiderados.

 

    class Program
    {
        private static int _maxTentativas = 3;
        private static readonly TimeSpan _delay = TimeSpan.FromSeconds(5);

        public static string DownloadContentFromWeb()
        {
            var client = new WebClient();
            return client.DownloadString("http://www.microsoft.com");
        }

        public static async Task<string> DownloadContentFromWebWithRetry()
        {
            int _tentativaAtual = 0;
            var client = new WebClient();
            var conteudo = string.Empty;

            for (; ; )
            {
                try
                {
                    conteudo = await client.DownloadStringTaskAsync("http://www.microsoft.com.br");
                    break;
                }
                catch (Exception ex)
                {
                    Trace.TraceError(ex.Message);
                    _tentativaAtual++;

                    if (_tentativaAtual > _maxTentativas)
                    {
                        throw;
                    }
                }
                await Task.Delay(_delay);
            }
            return conteudo;
        }

        static void Main(string[] args)
        {
            Console.WriteLine(DownloadContentFromWebWithRetry().Result);
            Console.ReadKey();
        }
    }
}

 

O código acima define alguns valores inciais como número máximo de tentativas e o tempo de espera entre cada tentativa. Todo o processamento ocorre dentro de uma estrutura de repetição for. Se o resultado chegar na primeira tentativa, o comando break interrompe o laço e retorna o valor, do contrário, este cairá na captura da exceção, incrementa a variável que controla a tentativa atual e em seguida verifica se o número máximo de tentativas foi atingido. Se ainda não foi, a task aguarda o delay para a próxima tentativa.  

É um processo bem simples que mostra uma forma resiliente de deixar uma aplicação mais responsiva na hora de lidar com possíveis falhas que possam vir a ocorrer. 

Fonte: Microsoft Docs 

 

Padrão
Técnicas

Conhecendo a filosofia de codificar da NASA

O conteúdo deste artigo é uma tradução do original escrito por Abner Coimbre que pode ser conferido aqui. Ao final do texto há mais referências sobre ele bem como seus contatos. O texto traz algumas premissas utilizadas pela NASA no desenvolvimento dos seus softwares e na sequência algumas considerações do próprio autor sobre o mundo do desenvolvimento de softwares

Desde já agradeço ao Abner por ter permitido esta tradução.

Nearly an hour after launch, contrails from the lift-off of US space shuttle Atlantis float above the Vechicle Assembly building 08 June, 2007 at the Kennedy Space Center in Florida. The shuttle is on an 11-day mission to the International Space Station. (Photo credit should read TIM SLOAN/AFP/Getty Images)

O Mundo do software moderno

Existe um tema recorrente na comunidade de desenvolvimento que está associado a encontrar “melhores formas” de escrever “software moderno”.  Se o termo “moderno” é ou não realmente útil – programação de computadores é relativamente nova –  eu definitivamente sigo com a impressão de que sempre há algo novo ou melhor para falar. Então, se nós prestarmos atenção nos temas abordados no desenvolvimento de software hoje, rapidamente perceberemos o quão importante é separar o joio do trigo: o que é útil e o que não é.

Dada toda essa conversa sobre software moderno, eu tenho visto programadores iniciantes perguntando o que eu penso ser a questão mais importante das suas carreiras: “No que devemos prestar atenção?”, e honestamente, é um pouco cruel encorajá-los a seguir com:

  • POO deve ser o futuro da programação?
  • Vamos nos juntar ao Rust Evangelism StrikeForce
  • Go é muito melhor que qualquer <language_with_other_design_goals>?

Pelo menos, não é assim que a NASA se posicionou para responder quando esta pergunta foi feita. A história da agência é bem conhecida, sabemos que o programa espacial pode sofrer consequências irreversíveis se alguns dos seus softwares tiver problemas, podendo ser fatal. O choque de realidade permitiu-lhes desenvolver certas atitudes a respeito do seu modelo de desenvolvimento. Vale a pena conferir o que eles têm valorizado.

Com alguns anos de trabalho lá, gostaria de apresentar em primeira mão a filosofia de trabalho que permitiu a agência espacial produzir alguns dos softwares mais confiáveis do mundo e irei elencar suas atitudes em relação a programação num conjunto de quatro premissas que eles praticam na sua força de trabalho (e que eu vivenciei diretamente).

 

As quatro premissas da NASA 

  • Você terá acesso a um mentor.

Quem é seu mentor? É um quebra gelo comum com qualquer programador da NASA graças ao seu compromisso de garantir que todo programador possa ter um mentor. Isto poderia ser no nível de negócios, com o programa OSBP’s Mentor-Protégé, com o projeto interno NEXT ou com o Pathways Agency Cross-Center Connection (PAXC). Curiosamente, você não precisará sair procurando por um porque todos nós temos nossos mentores pessoais desde o início. A ideia de que um programador não pode ter alguém com uma experiência sênior para acompanhar seu progresso é descartada no programa espacial.

 

  • Nós confiamos no potencial de cada um

Existe um razoável grau de confiança quando você entra em uma equipe, devido as investigações de antecedentes a que você é submetido. Também assumimos que cada um tem algum valor para oferecer e nós confiamos no potencial do indivíduo. Mostre que você é bom e o título se torna quase sem sentido. Não é incomum um estagiário contribuir com projetos de software de alto nível da NASA.

 

  • Você dirá “Eu não entendo”

Esta declaração é dita a todo momento. Você verá desenvolvedores experientes perguntando para estagiários “Eu não entendo essa parte do código, é um novo recurso da linguagem que eu ainda não conheço? ” ou gerentes perguntando para engenheiros “Eu não tenho certeza das implicações do seu trabalho neste momento. Poderíamos rever mais algumas vezes até que eu tenha uma boa ideia disso? ” Estas são questões que fazem parte da rotina de trabalho.

 

  • Nós valorizamos Insights sobre como os sistemas computacionais funcionam

A NASA procura incessantemente por novas descobertas sobre os o funcionamento dos computadores, o valor desta procura está em conhecer as limitações dos sistemas para prevenir decisões ruins no desenvolvimento de softwares.

Considere Gene Amdahl. Ele foi um dos pioneiros da computação com uma interessante questão: Qual é a eficácia de melhorar um componente de um sistema? Digamos que 50% do tempo de execução do seu programa foi melhorado por apenas um fator dos quatro existentes e agora queremos saber o quão rápido a aplicação está. Em outras palavras, algo consumiu o tempo T1 para executar até o fim, agora uma parte desse algo (que consumiu uma fração f de T1) é k vezes mais rápida. Pouparei de você alguns cálculos, embora seja muito simples – definir o novo tempo T2 e expressar a melhora relativa de performance como uma razão de T1 e T2. Você terá a seguinte equação:

Al1

Continuando com o exemplo anterior para saber o quão rápido sua aplicação está,vamos aplicar na fórmula:

Al2

 

O resultado é 1,6. Embora você tenha otimizado para ser quatro vezes mais rápido, no geral o sistema é somente 1,6 X mais rápido. Vamos ainda mais longe. Digamos que você melhorou algum outro componente e o tempo que este leva para rodar é agora zero (k tende ao infinito). Você agora tem um tipo especial da lei de Amdahl.

Al3

 

Suponha que o componente responda por 60% do tempo de execução do seu sistema, e agora não consome tempo algum para executar. A velocidade máxima teórica é de 2,5… a lei de Amdahl nos diz que para melhorar significantemente a velocidade de execução, teremos que melhorar uma grande fração disso. Pura verdade, mas facilmente esquecida. A lei é usada frequentemente na computação paralela para prever acelerações utilizando processadores de vários núcleos e Julian Browne reformulou ela no seguinte contexto: “Essencialmente a lei afirma que enquanto um processador pode trabalhar com fluxos que podem então rodar em paralelo, o tempo tomado pelo processo inteiro será significativamente limitado pelos fluxos que restam sequencialmente”. Ver Artigo sobre a Lei.

 

Com estas suposições em mente, o resto do artigo fornece uma visão mais pessoal sobre as lições que poderiam ser aprendidas.

  

Evitar fontes de conhecimentos duvidosas

Alguns dos meus amigos concordam que a atividade de programar ainda precisa amadurecer, pois ela estaria no estágio pré-científico da sua existência. Eu diria que muitos de nós estamos aderindo subconscientemente a fontes tradicionais de conhecimento que tem se provado duvidosas, e posso dizer que a NASA tem feito um bom trabalho para se proteger contra isso.

 

Eu não quero dizer fé no sentido de esperança. Fé também é compreendida quando nós queremos acreditar em algo sem que tenhamos bons motivos para acreditar. Vejamos um exemplo:

 

Lead: “Gosto das novas funcionalidades das aplicações para nossos usuários, mas você disse que baixou uma biblioteca para escreve-las. ”

 

Junior: “Sim. Funcionaram muito bem. ”

 

Lead: É código aberto? De qualquer modo, quem é o fornecedor e como é o suporte que eles oferecem?

 

Junior: “Não é, mas eu tenho usado ela e por enquanto não tive nenhum problema. ”

 

Lead: *PLONK*

 

Isto acontece não apenas para downloads aleatórios, mas quando seu código não estava funcionando e então magicamente ele funcionou e você resolve utiliza-lo um dia. Pode ser difícil perceber quando alguém está confiando na fé para decidir o quão bom é o seu software, mas se isso se prolongar por muito tempo, o resultado será um software lento de cheio de bugs.

 

Revelação

Por revelação, quero dizer quando uma figura de autoridade revela algo como incontestavelmente verdadeiro, ou algum fato que tem sido transmitido até hoje, e você acredita ser verdade simplesmente porque se acredita ser verdade. Se você associar isso com a necessidade de as pessoas se identificarem com algum assunto aleatório da comunidade de programação, vai descobrir que essa é a causa raiz de discussões calorosas sobre qual editor de textos reina supremo e se a linguagem que usa faz de você um verdadeiro programador.

 

Carisma

A conferência está repleta com uma atmosfera de euforia, empolgação para o anúncio do que virá a ser o próximo framework. Um palestrante empolgado chega ao palco com uma voz altissonante.  A fala e os slides discorrem sobre os mais novos princípios que prometem práticas de programação a prova de balas – do tipo que fará de você um programador 10X melhor. Com uma habilidade natural para interagir com a plateia e conduzir muito bem o tema da palestra, pode ser difícil de perceber que passamos a acreditar em suas afirmações, e o mais importante, comprando seus livros.

 

Brilho

Percebo que esta é uma palavra estranha para usar, mas quando uma ideia é atraente e empolgante o suficiente isto parece dar um certo “brilho”.  É “brilhante” e, portanto, deve ser verdadeiro. Poderíamos continuar, mas afastar-se desse tipo de desejo (ou sentimento) é o que significa ser científico sobre o nosso progresso tecnológico.

 

Expanda seus conhecimentos na área

Uma conversa sobre a natureza do universo geralmente é mais interessante quando as pessoas envolvidas são pessoas cientificamente alfabetizadas. Igualmente, uma conversa sobre programação beneficia a todos elevando a um certo patamar os seus conhecimentos. De fato, existem conhecimentos já bem difundidos sendo utilizado em novos sistemas computacionais, e os programadores deveriam estar atentos a isso.  Se nos intitulamos profissionais, temos uma grande responsabilidade em aprender os conceitos fundamentais da computação. Isso nos protege de fontes de informação não confiáveis e nos mostra aquilo de devemos prestar atenção. A NASA percebeu isso e garantiu que a cultura da organização seja capaz de expandir rapidamente seus conhecimentos.

 

Recomendações

Alguma coisa lhe chamou a atenção? Você é um programador procurando melhorar seus conhecimentos? Se for, eu tenho algumas sugestões pessoais.

Computer System’s: A Programmer’s Perspective: Foi muito importante na minha carreira, e para constar, este é meu conteúdo favorito de programação. Os temas apresentados aqui são os fundamentos que eu acho que todos deveriam ter. Pelo menos um estudo mais aprofundado dos capítulos 1-3, a hierarquia de memória e os sistemas de entrada e saída são excelentes. Se você está trabalhando em qualquer coisa relacionada a web, é claro que o capítulo sobre redes é de extrema importância.

Encontrando pessoas com o mesmo interesse

Existe uma pequena comunidade chamada Handmade Network, essa comunidade possui um time incrível (eu faço parte do time) onde tentamos construir um lugar em que evitamos conversar sobre softwares modernos, em vez disso, falamos sobre coisas que eu citei aqui. Assim como em qualquer comunidade, somos passíveis de cair em um dogma (já aconteceu no passado) mas estamos cientes disso.

Na comunidade também há entrevistas com programadores conhecidos discutindo diversos assuntos independentemente de nossas ideias. Confira algumas aqui.

 

Blogs/sites relacionados:

 

Abner Coimbre foi um estagiário do Kennedy Space Center no ano de 2015 e no ano de 2016 foi nomeado como Kennedy’s 2016 top 10 innovators. Onde encontra-lo: TwitterTwitch ou e-mail.

Padrão
.NET, Banco de Dados, Certificação, Dica de leitura, Mova-se, Técnicas, Visual Studio

Certificações Microsoft – Por onde começo?

Olá pessoal, o objetivo desse post é esclarecer um pouco mais sobre a nova linha de certificações Microsoft, e também ajudar a direcionar aquele profissional que pretende obter uma certificação mas não sabe por onde começar.

A Microsoft criou uma linha de certificações chamada MTA – Microsoft Technology Associate. Essas provas são a “base da pirâmide” para uma carreira nas tecnologias Microsoft. O objetivo dessas provas são fornecer um conhecimento sólido dos fundamentos na tecnologia em que você pretende se especializar. Fazendo uma prova MTA, você já é um MTA Certification e já possui os conhecimentos fundamentais para seguir em frente.

Dentro do nível MTA, o profissional deve escolher qual área pretende seguir carreira, podendo optar por uma das três áreas conforme figura 1.

Áreas Microsoft

Figura 1 – Áreas na plataforma Microsoft

Mais detalhes: http://www.microsoft.com/learning/en-us/mta-certification.aspx

Como já sabemos o nível MTA visa garantir o conhecimento necessário para as outras provas (MCSD e MCSA ou quem sabe um dia MCM), então essa prova é obrigatória? Não, você não precisa se tornar um MTA para fazer as outras provas. Se você já é um profissional que tem experiência na sua tecnologia, então você pode pular esse nível. Porém se você está começando agora, certamente esse é o seu ponto de partida na carreira.

Em resumo, agora temos o nível MTA (de cada área) para iniciar, e a partir desse nível, cada um escolhe a carreira que pretende seguir. Para compreender melhor como ficou o RoadMap das provas vamos ver a figura 2.

Provas Microsoft

Clique para Download em PDF.

Figura 2 – RoadMap das provas

Existem dois centros de testes que você pode agendar a sua prova, Certiport para quem é estudante e Prometric para quem não possui nenhum vínculo acadêmico. Para o caso dos estudantes, é necessário verificar se a sua instituição está registrada no Certiport, verifique com seu professor ou chefe do departamento.

Um caminho para aprender e ajudar na preparação para as provas no nível MTA é através do Microsoft Virtual Academy que oferece diversos treinamentos gratuitos para desenvolvedores, profissionais de infra e banco de dados.

Lembrando que o mercado está carente de profissionais qualificados, enquanto sobram ideias, planos de marketing, investimentos dos mais variados, profissionais com uma boa qualificação ainda são uma pequena parcela do mercado, portanto uma certificação será muito bem vinda!

 Abraços!

Padrão
.NET, Boas Práticas, Técnicas

String VS StringBuilder – O Coiote não pega o Papa Léguas!

O título desse post remete a dois personagens bem conhecidos de todos (principalmente das crianças) em que um deles sempre tenta capturar o outro, porém esse último é muito mais veloz e raramente se dá mal. A ideia por trás dessa analogia é que algumas vezes tentamos utilizar tipos de dados com limitações de desempenho em nossos códigos e então saímos fazendo mil coisas (“gambiarras”) para tentar se aproximar do melhor desempenho possível, nem preciso comentar o resultado final. Esse fato no leva ao problema de atualização de conhecimento, pesquisas, estudos sobre as novidades de uma linguagem e/ou uma ferramenta. Aquela famosa frase “Para quem só conhece o martelo como ferramenta, parafuso é prego” cabe perfeitamente aqui.
Quando precisamos trabalhar com strings, o primeiro tipo que vem a mente é o tipo String ou string (essa última é apenas um apelido). Legal, esse é o tipo mais conhecido, e naturalmente, mais usado. Acontece que um objeto do tipo String é imutável, o que isso significa? Significa que uma vez atribuído um valor a um objeto desse tipo, esse valor jamais mudará, isso mesmo, jamais mudará. Mas então como eu consigo fazer concatenações e o novo valor é atribuído ao objeto? O que ocorre por baixo dos panos é algo que talvez você nunca imaginasse, a cada nova atribuição de valor a um objeto String, é criado um novo objeto semelhante que agora contém o valor antigo mais o valor atual. Isso mesmo, um novo objeto é criado e isso é transparente aos desenvolvedores. Você simplesmente solicita o valor do objeto e lá está ele.
No momento em que um novo objeto é criado, o objeto antigo continua na memória heap a disposição do garbage collector. A figura 1 mostra esse cenário, podemos ver que ao final das concatenações sucessivas temos um único objeto que iremos trabalhar e mais quatro objetos aguardando para serem eliminados da memória.

StringVSStringBuilderFigura 1

A cada nova iteração criamos um novo objeto e descartamos o antigo, isso causa um overhead imenso nas aplicações e um péssimo aproveitamento da memória do computador. Ma então o que devemos fazer quando precisarmos utilizar strings em iterações? A solução presente no .NET chama-se StringBuilder. Essa classe foi especialmente desenhada para trabalhar com strings dinâmicas, strings em que o valor muda constantemente e garante uma performance excelente quando recebe grande quantidade de dados. Os métodos disponíveis para trabalhar com StringBuilder fazem uma referência a mesma instância e não a uma nova como no caso da String. Vamos ver na prática como isso funciona. A figura 2 mostra dois métodos, o primeiro faz um loop de 20000 iterações utilizando um objeto StringBuilder e ao final exibe em milissegundos o tempo gasto. O segundo método faz a mesma coisa porém utilizando um objeto String.

ExemploCodigo

Figura 2

ExemploStringBuilder_2

Figura 3

Ao compararmos os resultados da figura 3, podemos concluir a enorme diferença no tempo de execução. Quando chamamos o método que utiliza String, gastamos um tempo de 2637 milissegundos e o mesmo loop utilizando StringBuilder consumiu apenas 10 milissegundos.
Então o tipo de dados String é um tipo ruim de trabalhar? A resposta é que String não é um tipo de dados ruim para trabalhar, porém ela atende exatamente aquilo que ela se propôs a atender, trabalhar com strings estáticas ou com poucas mudanças.

Abraços!

Padrão
Uncategorized

Resumo do Livro Engenharia de Software de Ian Sommerville 8ª Ed.

Segue um resumo que preparei do livro de Ian Sommerville  – Engenharia de Software 8ª Ed. Esse resumo aborda os principais tópicos dos capítulos 1 ao 7. Aproveitem! Imagem

Introdução a Eng. De Software

É um ramo da engenharia com foco no desenvolvimento de softwares dentro de custos, prazos adequados e alta qualidade. Software é abstrato, não há limitações físicas. Essa falta de limitações pode torna-lo extremamente complexo e de difícil compreensão.

O conceito de ES foi proposto em 1968 em uma conferência para discutir o que foi chamado de “crise do software”, que resultava do surgimento de novos hardwares de computadores baseados em CI’s e tornava sistemas impensáveis até então em projetos realizáveis e mais complexos que os anteriores. O desenvolvimento informal não era suficiente, atraso, não confiável, difícil de manter, baixo desempenho. Novas técnicas surgiram pois o custo do hardware caía enquanto do software aumentava. Até hoje em dia essas técnicas não são aplicadas efetivamente por muitas empresas.

O QUE É SOFTWARE?

                Além do programa executável, são todos os dados de documentação(sistema e usuário), arquivos de conf. necessários a operação do software.

Existem 2 tipos de produtos de software:

  1. Produtos genéricos: Sistemas do tipo Stand-alone e vendido no mercado para qualquer cliente;
  2. Produtos sob encomenda (ou personalizados):  Encomendado por um determinado cliente/ ou modificado para ele;

DIFERENÇAS:

Nos produtos genéricos quem controla a especificação é a empresa que desenvolve. Já nos produtos sob encomenda, essa especificação é controlada pela empresa que compra o produto.  Existe também o caso em que um produto genérico é modificado para atender um cliente específico (ERP’s como SAP).

O QUE É ENG. DE SOFT.?

É uma disciplina de engenharia relacionada com todos os aspectos da produção de software, desde a especificação até a manutenção.

Por que Disciplina? – Os engenheiros aplicam teorias métodos e ferramentas onde for apropriado e de forma seletiva mesmo quando não existem teorias e métodos aplicáveis, e fazem as coisas funcionarem.  Trabalham também sob restrições organizacionais e financeiras.

Todos os aspectos? – Porque também se relaciona com atividades do gerenciamento do projeto, desenvolvimento de ferramentas, métodos e teorias que apoiem a produção.

Em geral utiliza-se uma abordagem sistemática e organizada, mas pode ser extremamente eficaz selecionar uma abordagem alternativa e menos formal para uma determinada circunstância.

DIFERENÇA ENTRE E.S. E C.C.

A C.C. diz respeito as teorias e os métodos que formam a base para computadores e softwares. A E.S. se dedica aos problemas práticos da produção de software. Teorias mais elaboradas da C.C. nem sempre podem ser aplicadas a E.S. nos seus problemas reais e complexos.

DIFERENÇA ENTRE ENG. DE SOFTWARE E DE SISTEMAS

A Eng. Sistemas trata de todos os aspectos do desenvolvimento e da evolução de sistemas complexos. Relacionada ao desenvolvimento de hardware, políticas e processos de implantação e a própria Eng. De Soft. Mais envolvida com definição de arquitetura, integração de partes e menos envolvidos com eng. Dos componentes, hardware, software etc.   Enquanto a Eng. De Soft. se dedica aos problemas práticos da produção do software e faz parte da engenharia de sistemas.

O QUE É PROCESSO DE SOFTWARE?

É um conjunto de atividades e resultados associados que produz um produto de software(software, documentação, etc).

Atividades de processos comuns a todos os processos:

1 – Especificação: Definição do que será produzido;

2 – Desenvolvimento: Projetado e programado;

3 – Validação: Verificação se o que foi feito é o que o cliente deseja.

4 – Evolução: Adaptação as mudanças futuras e/ou melhorias;

Diferentes tipos de sistemas necessitam de diferentes tipos de desenvolvimento. Ex.: Alguns podem requerer que sejam especificados totalmente antes do desenvolvimento, para outros, essas atividades podem ocorrem em paralelo. O uso de um processo inadequado pode reduzir a qualidade ou a utilidade do produto de software a ser desenvolvido e/ou aumentando os custos de desenvolvimento.

O QUE É UM MODELO DE PROCESSO DE SOFTWARE?

É uma descrição simplificada do processo sob uma determinada visão. Os modelos incluem atividades do processo, produtos de software e os papéis das pessoas envolvidas.

A maioria dos modelos é baseada em um dos 3 modelos gerais ou paradigmas de desenvolvimento:

  • CASCATA – Fases separadas de processos. Uma fase não inicia sem que outra termine e seja aprovada.
  • DESENVOLVIMENTO ITERATIVO – Intercala as atividades. Desenvolvido rapidamente com base em especificações abstratas e depois é refinado com informações dos clientes para que possa satisfazer a necessidade desse.
  • E.S. BASEADA EM COMPONENTES – Supões que partes do sistema da já existem. Concentra-se mais na integração dessas partes do que no seu desenvolvimento a partir do início.

QUAIS SÃO OS CUSTOS DA ENG. DE SOFT.?

Não existe uma resposta simples. No modelo cascata, os custos de especificação, projeto, implementação e integração são medidos separadamente. Nesse caso, integração e testes são as atividades mais caras, entre 40 e 50% do custo total de desenvolvimento.

Na abordagem iterativa, não existe uma linha precisa entre especificação, projeto e desenvolvimento. Custos de especificação reduzidos, pois apenas uma especificação de alto nível é produzida antes do desenvolvimento, e também precisa de uma atividade de teste independente uma vez que a implementação inicial esteja completa.

A CBSE  tem sido aplicada  apenas nos últimos tempos, e sabemos que os custos de desenvolvimento são menores que os custos de integração e testes, porque é necessário assegurar que os componentes utilizados, realmente satisfazem as especificações e funcionam conforme o esperado, mas além disso não há dados precisos para os custos.

Custos também incorrem em alterações após a sua liberação para o uso. Os custos de evolução variam muito de acordo com o tipo de sistema.

Essa abordagem de custos é válida para softwares sob encomenda.  Nos produtos genéricos, há uma abordagem evolucionária, e os custos de especificação são relativamente baixos. Já os custos de testes são mais altos justamente por serem previstos para rodar em diferentes ambientes de configuração.

Os custos de evolução de produtos genéricos são relativamente difíceis de serem estimados, pois não são avaliados separadamente como nos softwares sob encomenda, mas são simplesmente custos de desenvolvimento.

O QUE SÃO MÉTODOS DE ENG. DE SOFTWARE?

                Um método é uma abordagem estruturada para o desenvolvimento de software, cujo objetivo é facilitar a produção de software de alta qualidade dentro de custos adequados. Não há um método ideal, e diferentes métodos possuem diferentes áreas onde são mais aplicáveis. Todos os métodos são baseados na ideia de modelos de desenvolvimento.

O QUE É CASE?

São ferramentas utilizadas para dar apoio as atividades do processo de software, tais como análise, modelagem, depuração e testes. Todos os métodos vêm atualmente com uma tecnologia case associada.

OQUE SÃO ATRIBUTOS DE UM BOM SOFTWARE?

Os atributos de um software refletem o comportamento do software, enquanto esse está em execução, sua estrutura e organização dos fontes bem como a documentação associada.

Alguns atributos: Facilidade de entendimento dos fontes, tempo de resposta a uma consulta. O conjunto de atributos varia de acordo com a sua aplicação. Pode-se resumir em: Facilidade de manutenção, confiança, eficiência e aceitação.

QUAIS SÃO OS DESAFIOS CHAVES DA E.S.?

Hoje a E.S. se depara com 3 desafios:

Desafio da heterogeneidade: É necessário que os sistemas de software operem com sistemas distribuídos e também com sistemas mais antigos (legados). Necessário técnicas para desenvolver sistemas flexíveis e confiáveis para adaptar-se a essa heterogeneidade.

Desafio de entrega: Muitas técnicas tradicionais demandam tempo para obter a qualidade. O desafio da entrega consiste em reduzir os tempos de entrega dos sistemas grandes e complexos sem comprometer a qualidade.

Desafio da confiança:  Os softwares estão presentes em todos os aspectos da nossa vida e precisamos confiar nele. O desafio da confiança consiste em desenvolver técnicas que demonstrem aos usuários que é possível confiar nele.

RESPONSABILIDADE PROFISSIONAL E ÉTICA

Confidencialidade: respeitar a confidencialidade de seus funcionários ou clientes independente ou não de acordo formal.

Competência: Não deve conscientemente aceitar um trabalho que esteja fora da sua competência.

Direitos sobre propriedade intelectual: Estar ciente das leis locais, patentes e assegurar que a propriedade intelectual de funcionários e clientes esteja protegida.

Mau uso de computadores: Evitar mau uso desde o trivial (como jogos por exemplo) até o mais sério (disseminação de vírus).

Baixar o Resumo no formato PDF.

Abraços!

Padrão
Eventos, Mova-se, Uncategorized

Meu primeiro TDC – (2010 São Paulo) – A Luz no fim do túnel

Imagem

Quem já participou de alguma edição do T.D.C., sabe do que estou falando.  Através de um amigo meu (Marcos Dallagnelo) fiquei sabendo de um evento para desenvolvedores que aconteceria em São Paulo. Ao dar uma olhada na grade de palestras fiquei impressionado com a variedade de tecnologias abordadas além de nomes bem conhecidos da comunidade de desenvolvimento. Decidimos ir e participar de todos os dias (na época eram 3 dias). Saímos de Joinville-SC às 21:30 com destino a São Paulo. A viagem levou em torno de 8 horas, e próximo às 05:30 da manhã já estávamos na rodoviária do Tietê. Tomamos um banho e pegamos o metrô até a paulista.

Chegando lá, tomamos um café com aquelas moças que vendem bolinhos e copos de café na beira da avenida (achei bem barato até rsrs) e em seguida partimos para a universidade Anhembi Morumbi. Às 07:00 horas já estávamos em frente a universidade aguardando o início do evento, enquanto isso ficamos ali trocando uma ideia e fazendo um networking, foi bem legal! Eu estava com medo que o sono batesse forte durante o evento, pois oito horas de estrada deixam você desgastado.  Esse era nosso primeiro dia no TDC, sexta feira 21/08. Nesse dia participamos da trilha de testes. Fomos para o auditório principal da universidade onde ocorreu a abertura daquele primeiro dia de evento. Já de início pudemos perceber que o dia seria promissor, além do nível dos palestrantes, organização, e a variedade de tópicos abordados atenderia a todas as expectativas do público ali presente. O sono bateu? Lógico que não, era impossível estar no TDC e cochilar. Uma grande maioria dos colegas participantes comigo (presentes na sala) eram da área de testes (claro, eu estava na trilha de testes). Como sei da importância de testar bem uma aplicação, participei dessa trilha, e vi coisas fantásticas, imagina para quem é tester!

O Sábado foi a vez do .Net, aí sim já estava em casa. Foi a partir desse dia que comecei a ver a luz no fim do túnel, comecei a ver tecnologias e abordagens totalmente novas e isso empolga muito! Digo que comecei a ver luz no fim do túnel porque foi a partir daí que comecei a me dedicar em aprender ainda mais sobre a tecnologia e explorar ao máximo as ferramentas que utilizo. Vi que o que eu vinha fazendo era algo como “Martelada Designer”, fazendo tudo apenas com if, while e for. Posso afirmar que esse evento foi um marco na minha vida profissional, a partir daí passei a estar ligado em comunidades, eventos e tudo o que diz respeito a isso. Cheguei a dar palestras em universidades aqui da região e escrever alguns artigos para a revista .Net magazine (a qual devido a outros projetos me afastei temporariamente, logo volto).

Faltou o terceiro dia né, bom o terceiro dia foi o dia do Agile, para fechar com chave de ouro a mudança que vivi. Palestras que abordavam diversas perspectivas em torno da agilidade e uma demostração de coach ao final do dia foi sem dúvida espetacular. Já estamos no domingo e é hora de retornar para Joinville. Saímos as 22:30 de São Paulo e perto das 06:00 já estávamos em casa. Então um banho e voltar a realidade.

Participei do TDC 2011 em Floripa e sempre que posso estou presente nesse evento. Vale muito a pena participar de um evento como esse, você volta com outra visão do que faz no dia a dia. Recomendo.

Agora estamos com o TDC 2013 saindo do forno, eu quero estar presente nesse também, e quem puder participe, vale a pena!

Abraços!

Padrão
Eventos

Evento Técnico – #BluDotNet

Olá Pessoal,

No dia 06 de abril de 2013 acontecerá mais um evento em Blumenau da comunidade BluDotNet.  O evento contará com nomes bem conhecidos da comunidade de desenvolvedores e a grade de palestras está bem interessante! Deem uma conferida:

  • Desenvolvendo com Kinect
    por Gabriel Cardoso – Benner Sistemas/SC
  • Acceptance Test Driven Development
    por Rafael Mueller – Inventti/SC
  • ASP.NET WEB API
    por Giovanni Bassi – Lambda3/SP – MVP de C#
  • Desenvolvendo software como serviço para negócios
    por Fernando Correia – Benner Sistemas/SC
  • Adotando Continuous Delivery
    por Marcelo Oliveira e Rafael Magrin – ThoughtWorks/RS
  • Fundamentos do CQRS
    por Elemar Junior – Promob/RS – MVP de C#

Apesar de ser gratuito, as vagas são limitadas, então faça sua inscrição.

Abraço!

Padrão