1*6vPEnqaggNVBF44KtOeRxA

Gerentes e desenvolvedores — Processo de transformação

Numa conversa com a minha amiga Jéssica Rodrigues, aspirante a Project Manager de TI, ela citou um ponto que é comum na maior parte dos projetos da nossa área, existe uma grande diferença no conhecimento técnico entre gerentes e desenvolvedores. Isso dificulta a delegação de tarefas pelo gerente e para os desenvolvedores explicarem seus prazos.

Mas acabei percebendo que não tentamos resolver este gap, fica cada grupo defendendo o seu lado, o gerente reclamando que os desenvolvedores não cumprem os prazos ou estão enrolando, e do outro lado, como os gerentes são incompreensíveis ou leigos demais. Quero a partir deste post começar uma série de textos voltados para os gerentes com o objetivo de preencher esta lacuna entre as partes, espero que assim tenhamos resultados melhores nos projetos. (mais…)

Leia Mais

download

Utilizando polyfill INTL no Ionic 2

Começamos um projeto novo aqui na Tegra e para ele decidimos utilizar Ionic 2 pelo seu desempenho em relação ao Ionic 1.

 

A ideia deste post é mostrar um problema comum que boa parte dos desenvolvedores estão passando hoje ao fazer build para iOS.

 

Os pipes padrões do Angular 2 utilizam a especificação INTL para fazer as formatações de data e número.
Segue a documentação da INTL:
https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Intl

(mais…)

Leia Mais

Coragem e Inovação

Ao assistir o vídeo acima, lembrei dos momentos que realmente fazem a diferença na vida, aqueles que não tem volta, aqueles que não podemos consertar.

Montanha Russa

Quando você está na fila da montanha russa, tudo é tranquilo, basta ter paciência que você vai chegar lá ou dar meia volta e desistir. Mesmo quando você está sentado no banco do carrinho e aquele moço vem baixando a trava de segurança, ainda dá pra desistir. Mas quando aquele carrinho dá o seu primeiro tranco, já era, sua vida mudou, não tem mais volta.

Piscina

No fim da tarde, você olha para a piscina. A água parece fria, coloca a ponta do pé, dá aquele arrepio. Mas você não desiste, pensa, pensa e pensa. Se prepara e dá o pulo, já era, não tem volta, você se molhou.

Coragem

Quando eu penso nessa palavra, sempre me lembro de uma frase que vi no Esporte Espetacular:

Só precisa de coragem quem tem medo – Homem Pássaro

São esses pequenos momentos de coragem que fazem toda diferença.

Leia Mais

Algoritmo – Um noção sobre Custos

Cena do filme Rede Social

Hoje, vou falar um pouco sobre custos de execução dos algoritmos. A ideia é passar uma noção de como mensurar o custo de um algoritmo.

Vamos pegar o problema abaixo:

Some todos os números entre 1 e 100

A primeira abordagem para resolver o problema acima seria a implementação abaixo:

int total = 0;
for(int i = 1; i <= 100; i++ )
   total = total + i;

Obs: Graças ao Caio, conseguimos colocar código aqui no blog =)

Quanto custa para o computador executar o algoritmo acima ?

Imagine que para cada instrução executada o custo seja 1, por exemplo:

  • Criar a variável total com valor 0, custa 1
  • Criar a variável com valor 1, custa 1
  • Comparar com 100, custa 1
  • Somar total com i e atribuir a total, custa 1
  • Incrementar i, custa 1

Com isso, podemos dizer que a implementação acima tem custo 1 + 1 + 3 * 100 = 302. Porque:

  • 1 – Para criar a variável total
  • 1 – Para criar a variável i
  • 300 – Para cada loop do for temos um custo de 3 ( comparação, soma e incremento) e como são 100 loops teremos um custo de 300.

Agora vamos dificultar um pouco as coisas:

Some todos os números pares entre 1 e 100

Implementando:

int total = 0;
for(int i = 1; i <= 100; i++ )
   if ( i % 2 == 0 )
      total = total + i;

O custo do algoritmo algoritmo sobe para 502 agora, porque colocamos uma instrução aritmética ( i % 2 ) e uma de comparação ( i % 2 == 0 ), ou seja adicionamos 2 de custo para cada loop.

Melhorando…

Imagine que você está executando o algoritmo acima em um celular bem, mas bem velho e bem limitado, você precisa otimizar o algoritmo para somar os números pares. Depois de pensar muito você chegou nisso:

int total = 0;
for(int i = 2; i <= 100; i += 2 )
      total = total + i;

O custo do algoritmo acima é 1 + 1 + 3 * 50 = 152. Porque:

  • 1 – Para criar a variável total
  • 1 – Para criar a variável i
  • 150 – Reduzimos a quantidade de loops para 50, pois incrementamos de 2 em 2 a partir de 2 (papo de louco), mas o custo por loop ainda é 3, logo 3 * 50 = 150

Por quê entender custos?

Ao analisar a segunda implementação que tem custo 502, fica claro que o gargalo está no for e o jeito de melhorá-lo é diminuir o custo dos loops. Você só chega nessa conclusão entendo o custo de execução do algoritmo.

Gauss

Será que dá pra diminuir mais o custo ? 152 é o mínimo ?

Voltando para a oitava série, você deve se lembrar da história sobre Gauss ( todo professor de matemática conta, eu acho =P ).

Um dia na escola de Gauss ( que tinha 8 anos segundo a lenda ), a professora de matemática estava cansada para dar aula, então pediu para os alunos somarem os números de 1 a 100, isso iria ocupar um bom tempo deles. Para infelicidade da professora, em alguns minutos, Gauss aparece com a resposta, ele havia criado a fórmula da progressão aritmética.

Sn = (( a1 + an ) *  n ) / 2

Para conhecer mais: http://pt.wikipedia.org/wiki/Progressão_aritmética

Importância da matemática

Se implementarmos a fórmula de Gauss para os número de 1 a 100:

int total = ((1 + 100) * 100) / 2;

O custo é de 1 + 1 + 1 + 1 = 4. Porque:

  • 1 – Para a operação de soma
  • 1 – Para a operação de multiplicação
  • 1 – Para a operação de divisão
  • 1 – Criar a variável total e atribuir o valor

Agora implementando a fórmula para os números pares:

int total = ((2 + 100) * 50) / 2;

Veja que o custo continua mesmo. É a melhor solução para fazer a soma de um intervalo de números =) . Pois o custo não é sensível aos dados de entrada como nas 3 primeiras implementações, ou seja, se eu quiser somar um número de 1 a 1.000.000, ainda teria custo 4, já na implementação que utiliza o for o custo seria de 3.000.002.

A solução aritmética é sempre a melhor, por isso dê mais valor as aulas de matemática na escola e na faculdade.

O objetivo desse post é passar essa noção de custo e não explicar ao fundo como é mensurado o custo de um algoritmo, pois nem toda instrução tem custo 1, se quiser aprofundar no assunto indico o livro abaixo:

http://www.livrariasaraiva.com.br/produto/4061865

Para o dia a dia, o importante é ter uma noção, não precisa ser o expert em custos. Esse conhecimento é aplicado em outras áreas e não apenas programação, como em processos de produção ou até mesmo numa viagem de fim de semana.

Abraço!

Leia Mais

IOS – Trabalhando com cores em Hexadecimais

IMG_0007

Desenvolvemos um aplicativo mobile, no qual o usuário poderia consultar informações da sua empresa como desempenho das vendas e o atingimento das metas.

A ideia era fazer algo semelhante ao Google Now, distribuindo as informações em cartões:

Para deixar o conteúdo de forma customizável o aplicativo solicitava um xml do servidor do cliente. Através desse xml é montado os cartões e as informações dentro dele. Um exemplo está abaixo:

<cards>

<card>

<data>

<line>

<label>Venda</label>

<value>R$ 1.000,00</value>

</line>

</data>

</card>

</cards>

No xml acima não existe o atributo de cor em nenhuma das tags. Decidimos adicionar o atributo color nas tags label e value (da tag line), assim o cliente poderia customizar a cor das ‘linhas’.

No iOS trabalhamos com o UIColor para gerar as cores. Mas UIColor recebe como parâmetro 4 valores ( red, green, blue, alpha ) seria ruim adicionar esses 4 paramêtros na tag, ficando assim:

<line>

<label>Venda</label>

<value colorRed=”255″ colorGreen=”255″ colorBlue=”255″ colorAlpha=”1″>R$ 1.000,00</value>

</line>

Pensamos em trabalhar com cores hexadecimais que reduz os 4 atributos para 1 só. Removemos também o atributo alpha, ficando assim:

<value color=”#00FFD2″>R$ 1.000,00</value>

Agora precisamos dentro da aplicação interpretar o valor hexadecimal e criar um objeto UIColor.

Entendo a cor hexadecimal

Uma cor ela pode ser composta pela variação das 3 cores primárias.

 

Na cor hexadecimal, cada par representa a intensidade de uma cor primária, essa composição forma uma nova cor:

#00FFD2

Como a cor está em base 16 ( hexa ) precisamos converter para base 10 ( decimal ) assim poderemos usar na UIColor. Para entender mais sobre conversão entre sistemas numéricos veja este link: http://pt.wikipedia.org/wiki/Conversão_entre_sistemas_numéricos

Abaixo segue uma implementação em objective-c para conversão de base 16 para base 10:

Screen Shot 2013-12-05 at 7.59.17 AM
Pessoal, não achei um jeito de postar código aqui no blog, por isso a screenshot. Vamos melhor nos próximos posts.

Obs: Podemos converter qualquer caracter para número apenas subtraindo por outro caracter. Ex.:

O caracter ‘1’ pode ser convertido para o valor inteiro 1 fazendo isso:

‘1’ – ‘0’ = 1 (inteiro)

Isso funciona porque a representação decimal desses caracteres é 31 e 30, respectivamente, ou seja, quando fazemos ‘1’ – ‘0’, na verdade estamos fazendo 31 – 30.

Logo, podemos converter ‘A’ para 10 fazendo ‘A’ – ‘A’ + 10.

Agora sabendo como converter a cor hexa para decimal basta criar UIColor com os valores decimais.

Segue abaixo uma implementação para criar UIColor a partir de cor hexadecimal:

Screen Shot 2013-12-05 at 8.10.44 AM

Abraço e até a próxima!

Leia Mais