Não faça regras de negócio dentro do SGDB

banco de dados
Imagem ilustrativa

Já se passaram muitos anos desde a década de 90 e ainda assim eu continuo ouvindo e vendo muitas corporações colocando regra de negócio das soluções dentro de um banco de dados. Hoje o cenário de soluções corporativas é outro completamente mais complexo e a arquitetura em duas camadas não oferece características que sustente sua evolução. Resumidamente, soluções construídas em duas camadas não cumprem requisitos como escalabilidade, extensibilidade, manutenibilidade, segurança, perfomance e disponibilidade. Dessa forma, hoje usamos arquitetura n-camadas que é a única que, se bem projetada, pode cumprir todos os requisitos não-funcionais característicos das soluções atuais. Segue um resumo básico dos velhos e já batidos motivos documentados que justificam o não uso de regras dentro de um banco de dados:

1. Acomplamento

Regra dentro do banco de dados viola o princípio SOC, que define que cada pedaço de um sistema precisa estar localizado em um lugar único e exclusivo promovendo isolamento, manutenção, reutilização e futura substituição, sem impacto nas outras partes.

2. Falta de portabilidade

Regras escritas dentro do banco não oferecem portabilidade entre os diferentes produtos concorrentes da mesma filosofia de banco de dados adotado. Na década de 90 já era um transtorno e só tínhamos os famosos SGDB. Hoje, então, a coisa piorou com o surgimento do NoSQL e suas várias opções estruturais.

3. Péssima manutenção e código inflexível

Regras no banco de dados são, na maioria das vezes, escritas usando store procedures  (filosofia procedural da década de 60) que são desprovidos de recursos e as diretrizes da OOP como encapsulamento, agregação, composição, associação, herança e polimorfismo e da mesma forma não conseguem usufruir de nenhum tipo de padrões (patterns) arquiteturais, projetos e programação.

4. Know-how especializado

Regras no banco de dados precisam ser manutenidas por profissionais que detenham conhecimento especializado para aquele produto específico e filosofia de banco de dados adotado, sendo difícil eqou caro de encontrar mercado ou de formá-lo internamente.

5. Problemas de performance

Soluções de grande porte, dotadas de um grande e crescente número de acessos simultâneos e com a execução de regras pesadas vão degradando gradativamente a performance da solução, podendo até (que é o acontece na maioria dos casos) derrubar o serviço, uma vez que os banco de dados são desprovidos de devidos gerenciamentos de recursos encontrados normalmente em MIDDLEWARE relacionados com técnicas de otimizações, tunning, comunicação assíncronas, mensageira (MOM), escalabilidade vertical e horizontal apropriadas aplicadas especificamente na execução das regras de negócios.

6. Ausência de recursos

Regras de negócio normalmente englobam o uso de recursos como lógica binária, manipulação de arquivos PDF, DOC, XLS, XML, JSON. Comunicação com sistemas externos como LDAP, SMTP, FTP, Mensageira, SOAP, REST etc. Os SGDB normalmente não possuem API’s disponíveis para estes fins e muitos outros recursos, salvo em casos raros que alguns provedores de SGDB fornece alguma coisa bem limitada e proprietária para tratar um ou outro. A coisa piora por que normalmente não existe abertura para se acrescentar uma API de terceiros para dentro do banco.

Conclusão

Martin Folwer, no livro Patterns of Enterprise Application Architecture – capitulo 8, escreveu:

“Por todas estas questões, muitas pessoas evitam implementar regras de negócio dentro de um banco de dados. Eu tento me alinhar com esta visão, a menos que haja um grande ganho de desempenho a ser obtido – o que, para ser sincero, frequentemente ocorre. Nesse caso, pego um método de negócio da camada de domínio e alegremente  o transformo em um procedure dentro de um banco de dados. Faço isso apenas em áreas com claros problemas de desempenho, tratando-o como um abordagem de otimização e não como um principio arquitetural”.

Joshua Bloch, no livro Java Effective, escreveu no item 55 (que eu resumi):

“A história das décadas passadas nos mostram que otimização prematura na verdade é mais propenso a causar danos do que benefícios. O caminho da otimização precoce pode levá-lo a uma solução que ainda não seja rápida, arquiteturalmente ruim e, pior de tudo, inflexível e de difícil evolução. Portanto, não tente criar programas rápidos! Na verdade, foque em criar bons programas, usando todos os conceitos, princípios e abordagem necessários. Se um programa bem arquiteturado não for rápido suficiente, a boa arquitetura já estabelecida permitirá que ele seja facilmente otimizado. Não pense em problemas de desempenho enquanto estiver projetando uma solução. Quando terminar a codificação, avalie seu desempenho. Se ele for suficientemente rápido, tudo estará resolvido. Caso contrário, localize a fonte de gargalo usando uma ferramenta de profile e trabalhe nas partes relevantes. Repita esse processo conforme necessário, avaliando o desempenho após cada alteração até apresentar um tempo satisfatório”.

Acredito que todos estes fatos já fornecem base suficiente para que você tenha condições de fazer a sua tomada de decisão.

Até a próxima!

—–

Artigo de Fernando Franzini, publicado no iMasters.

Utilizando ferramentas de digital analytics para otimizar um e-commerce em tempo real

Os dados do último relatório Webshoppers, da e-bit, sobre o comércio eletrônico, referentes ao primeiro semestre de 2014, indicam um avanço de 36% nas transações on-line e de 26% no faturamento em relação ao mesmo período do ano passado, enquanto no varejo físico o crescimento foi de apenas 4%.

Em paralelo ao grande e contínuo desenvolvimento do e-commerce, a concorrência, especialização e as expectativas dos usuários têm aumentado muito. Em um mundo cada vez mais rápido, as correções e melhorias devem ser cada vez mais rápidas – quase que instantâneas. Uma ferramenta imprescindível para acompanhar os passos desse novo consumidor é o Digital Analytics, que permite entender o comportamento, navegação e origem dos usuários e serve como bússola para as otimizações em tempo real.

As primeiras ações que devemos fazer em um e-commerce para otimizar os resultados é tentar recuperar o dinheiro que deixamos na mesa. Conhecer os usuários que geraram pedidos de compra, mas não completaram as vendas, seja porque não pagaram o boleto, não tinham limite de crédito ou não passaram no sistema antifraude, é o primeiro passo.

Outro grupo importante é dos usuários que colocaram produtos no carrinho de compra, mas o abandonaram e acabaram por não comprar. Uma solução de analytics pode extrair estes grupos de usuários e enviá-los às ferramentas de e-mail marketing para ações de retargeting. Ou a um call center ativo. Mas não podemos demorar, porque o usuário está decidindo se comprará de nós ou de um de nossos muitos concorrentes.

Estas ações não devem demorar mais do que uma hora após o pedido efetuado ou carrinho abandonado. As ações de mídia também devem ser gerenciadas com intervalos cada vez menores. Em uma parte do dia podemos ter uma ótima performance de vendas com uma certa campanha de links patrocinados. Mas poucas horas depois, alguns concorrentes podem começar a dar lances por aquelas palavras e, como consequência, nosso resultado cair drasticamente. O analytics ajudará a saber qual o valor ideal a pagar para conquistarmos a melhor conversão possível.

Em um minuto qualquer do dia, pode haver centenas ou milhares de usuários diferentes em um site. Mas como saber qual é o produto certo que deve ser oferecido para cada um destes usuários naquele exato instante?

Como as ferramentas de analytics permitem a segmentação de diferentes grupos de usuários (cada um com suas necessidades e preferências), por meio da análise dos dados de fontes de tráfego podemos conhecer quais os melhores canais e como devemos anunciar para cada grupo de usuários, dentro e fora do site.

Também é possível entender quais os caminhos percorridos até a conclusão de uma compra, quanto tempo é levado durante todo o processo de decisão e reunir informações para descobrir os possíveis motivos do abandono do “carinho de compras”.

Uma gestão ideal de e-commerce deve avaliar a performance dos produtos em tempo real na home page e outras páginas importantes a partir dos números de visitas, clicks nas chamadas e taxas de conversão. Isto também deve ocorrer nas promoções, landing pages e páginas de novos produtos.

Será que a chamada ao iPhone 6 deve ser colocada na posição esquerda da minha home ou seria melhor a TV de 55”? Será que aquela landing page com a promoção do Xbox com um ótimo preço está performando como esperávamos, considerando que temos 25 unidades disponíveis?

Estas informações ainda podem ser enriquecidas com o monitoramento dos preços dos concorrentes. Com estas variáveis podemos alterar os preços, em tempo real, de acordo com os resultados nas vendas. A batalha da ubiquidade será cada vez mais dura. Se não atendermos nossos clientes, alguém certamente o fará.

—–

Artigo de Alejandro Dicovsky, publicado no iMasters.

Refatoração – aperfeiçoamento e projeto

Imagem ilustrativa
Imagem ilustrativa

O que há de errado em um código simples feito de forma rápida e imperfeita? Aparentemente nada, desde que ele funcione! Seria um julgamento meramente estético? O usuário final e o compilador não se importam se o código é ou não elegante. Mas, quando alteramos uma solução, há um humano envolvido e humanos se importam. Uma solução mal projetada é difícil de ser alterada. Se for difícil descobrir onde e como alterar, há uma grande chance desse humano cometer um erro e introduzir falhas, principalmente se caso o pedaço de código esteja inserido dentro de uma solução complexa.

Refatoração é o processo de alteração de uma solução de modo que o comportamento externo do código não mude, mas que sua estrutura interna seja melhorada. É uma maneira disciplinada e sistemática de aperfeiçoar o código que minimiza a chance de introdução de falhas.

Sem refatoração, o projeto termina por se deteriorar. À medida que as pessoas alteram o código, alterações para executar objetivos de curto prazo, alterações sem uma compreensão total do projeto da solução e principalmente alterações por pessoas sem experiência reais de design OO levam o projeto para o caminho da inflexibilidade e rigidez. Isso tem um efeito cumulativo. Quanto mais difícil é entender a solução a partir do código, mais difícil será de preservá-lo e rapidamente ele se desestruturará.

A seguir, vou resumir cada dica desse livro com o objetivo de ser utilizado com material de referência e estudos:

Maus cheiros #1

Será que você já passou pela experiência de pegar uma criança recém-nascida que acabou de fazer cocô nas fraldas? No mesmo momento que você se aproxima, já percebe instantaneamente aquele cheiro desagradável. Da mesma forma isso acontece em desenvolvimento de software, quando você pega o código fonte de uma solução para dar manutenção já logo de cara sente que alguma coisa não esta cheirando muito bem. Seguindo essa visão, estarei postando os “maus cheiros” mais básicos referindo-se na verdade em um catálogo de anti-padrões que precisam ser, a todo custo, evitado e refatorado.

Código duplicado

Ocorre quando encontramos pedaços de código duplicado em vários lugares diferentes na solução. Você tem que decidir onde faz mais sentido centralizar esse método e garantir que ele fique exclusivamente em apenas um lugar.

Método longo

Ocorre quando encontramos um método com muitas linhas de código, normalmente fazendo muitas responsabilidades ao mesmo tempo. Quanto maior o método, mais difícil é de entender. Por isso, sempre seja agressivo na decomposição de métodos menores.

Maus cheiros #2

Classes grandes

Ocorre quando uma classe tenta fazer muitas coisas, pois ela frequentemente se torna um solo fértil para código duplicado, excesso de variáveis e confusão. Elimine as redundâncias internas e divida uma classe em classes menores, separando logicamente em pedaços que façam sentido dentro do contexto. Use a política de coesão na separação de classes.

Lista de parâmetros longa

Ocorre quando encontramos um método com listas de parâmetros longas, normalmente acima de quatro parâmetros. São difíceis de entender e de usar e por isso, sempre seja agressivo na redução.

Alteração divergente

Ocorre quando qualquer alteração para lidar com uma variante gera mudanças em vários métodos diferentes dentro uma mesma classe. Quando as alterações estão espalhadas em vários métodos diferentes, ela se torna difícil de encontrar, difícil de fazer e fácil de ser esquecido. Você deve identificar tudo que pode mudar e centralizar isso em um único método de alteração.

Maus cheios #3

Alteração divergente

Ocorre quando qualquer alteração para lidar com uma variante gera mudanças em vários métodos diferentes dentro uma mesma classe. Quando as alterações estão espalhadas em vários métodos diferentes, ela se torna difícil de encontrar, difícil de fazer e fácil de ser esquecido. Você deve identificar tudo que pode mudar e centralizar isso em um único método de alteração.

Cirurgia com rifle

Ocorre quando qualquer alteração para lidar com uma variante gera mudanças em vários pontos em classes diferentes. Quando as alterações estão espalhadas em varias classes diferentes, elas se tornam difíceis de encontrar, difíceis de fazer e fácil de ser esquecido. Você deve identificar tudo que pode mudar e centralizar isso em uma única classe de alteração ou na criação uma nova classe.

Inveja dos dados

Ocorre quando um objeto usa dados de outros objetos para fazer operações ou lógicas, fazendo com que o objeto fique mais interessado no estado de outro do que o seu próprio estado. A essência dos objetos é encapsular tanto os dados e as operações que manipulam esses dados. Diante disso, você deve atribuir as responsabilidades a um objeto que seja o mais coerente com suas informações e nuca para um objeto externo. Inveja dos dados é um antipadrão conhecido com Anemic Domain Model.

Maus cheiros #4

Classes de dados

Ocorre quando você encontra classes que contêm apenas dados sem métodos de manipulação. Na maioria das vezes, o estado dessas classes de dados está sendo usados por outras classes. Por isso, evite fazer isso, uma vez que classes devem conter dados e métodos. Classe de dados é um antipadrão conhecido com Anemic Domain Model.

Grupo de dados

Ocorre quando encontramos grupos de campos sendo utilizado de forma duplicada dentro de classes e ou de parâmetros. Estes agrupamentos de dados que perambulam juntos, na verdade deveriam ser agrupados como objeto.

Obsessão primitiva

Ocorre quando encontramos códigos relutantes em usar objetos para pequenas tarefas tais como dinheiro, CPF, CEP, telefone etc., preferindo o uso de tipos primitivos como int, long etc e a classe String. Sempre prefira criar pequenos objetos que façam o devido encapsulamento de primitivos que representem o valor de algum tipo. Futuramente você poderá acrescentar outras operações relacionadas ao tratamento do determinado tipo.

Maus cheios #5

Classe ociosa

Cada classe que você cria custa dinheiro para manter e compreender. Uma classe que não esteja fazendo o suficiente para se pagar deve ser eliminada, principalmente aquelas que foram acrescentadas para suportar alterações futuras de forma antecipada, mas que nunca aconteceu.

Generalidade especulativa

Ocorre quando é implementado estruturas genéricas e flexíveis ao ponto de compor situações futuras que ainda não aconteceram no projeto, sem uma real previsão de acontecer. O resultado muita vezes é a dificuldade de se entender e manter, mais atrapalhando que ajudando. Diante disso, se livre de todas elas. Ou seja, faça somente o que for realmente necessário, deixando o futuro para uma futura refatoração.

Campo temporário

Ocorre quando você encontra um objeto no qual uma variável de instância recebe um valor apenas em determinadas circunstancias de execuções e ou algoritmos, deixando difícil de ler e entender, uma vez que o normal é esperar que um objeto precise de todas as suas variáveis. Diante disso, separe estes campos órfãos em algum lugar diferente, de acordo com o contexto da situação, podendo ser uma nova classe especifica chamada de “objeto método”.

Maus cheiros #6

Cadeias de mensagens

Ocorre quando você encontra longas cadeias de mensagem quando um objeto pede para outro objeto, que por sua vez pede outro objeto e assim por diante… Gerando um acoplamento na cadeia de navegação. Diante disso, sempre tente ocultar ao máximo a delegação.

Intermediário

Ocorre quando você encontra um objeto que extrapola no uso da delegação para outros objetos, sem códigos adicionais, transformando o objeto em apenas um intermediário vazio e sem sentido. Nesse contexto, remova o intermediário fazendo com que o objeto cliente fale diretamente com o objeto que realmente sabe o que está acontecendo.

Intimidade inadequada

Ocorre quando você encontra classes manipulando partes privadas de outras, principalmente no uso de herança que permite que subclasses acessem partes protegidas. Seja radical com premissa básica do encapsulamento: sempre oculte o máximo que puder, evitando expor detalhes internos de um objeto.

Maus cheios #7

Classes alternativas com interfaces diferentes

Ocorre quando você encontra classes diferentes, com assinatura de métodos diferentes, mas que oferecem o mesmo serviço duplicadamente. Refatore e centralize em apenas um único lugar.

Bibliotecas de classes incompletas

Ocorre quando precisamos de um método que está faltando em uma biblioteca, mas não temos como alterar a biblioteca para incluir o método. O método acaba sendo anexados em outra classe. Se você não pode modificar a biblioteca, considere isolar o método.

—–

Artigo de Fernando Franzini, publicado no iMasters.

A atribuição de valor no marketing digital

marketing digital
Imagem ilustrativa

Afinal, como sabemos que não estamos perdendo dinheiro com nossas campanhas?

Não é segredo para ninguém no mundo dos negócios que a proliferação dos canais online resultaram em uma tremenda mudança de paradigma, sobretudo quando o assunto são métricas para mensuração de resultados de marketing.

Antes da popularização da internet, a equação era simples: medíamos o alcance de nossas campanhas correlacionando-as com a audiência ou tiragem das plataformas que tínhamos à disposição naquela época, jornais, revistas, canais de TV e rádio. Hoje a brincadeira é bem mais complexa: temos muitíssimos mais canais, como e-mail marketing, links patrocinados, banners display, loja virtual e redes sociais, que podem ser acessados de plataformas como tablets, smartphones e desktop.

É fato que cada um deles tem um papel decisivo no processo que culmina na conversão das campanhas em compras. Parece óbvio? No entanto, muitos anunciantes não os levam completamente em consideração ao relacioná-los aos resultados obtidos, gerando informações distorcidas que podem acarretar em desastradas perdas de tempo e dinheiro.

Isto acontece porque ainda acredita-se que uma ação foi bem-sucedida apenas se houver um clique final, ou seja, estamos presos a métrica do “last click” para identificar quantos consumidores foram impactados pelas campanhas de marketing digital, e assim mensurarmos o nosso sucesso. No entanto, esquece-se que o processo que leva à compra é mais complexo e é por isso que devemos evoluir, pensar de maneira mais holística, de modo a enxergar a importância de cada uma dessas etapas através de modelos de atribuição. Mas porque devemos pensar assim? Porque a tão desejada conversão pode, de repente, não acontecer se ignorarmos o desempenho de alguns canais em determinadas etapas.

Segundo o estudo The Consumer Journey, da consultoria McKinsey, o processo de compras funciona da seguinte maneira: consciência (da existência do produto), familariedade, consideração (da compra), conversão e fidelização.

Consideremos um consumidor que esteja interessado numa televisão de 40 polegadas. Suponhamos que este indivíduo chega à loja virtual via redes sociais. Uma semana depois, volta a ter contato com este produto, desta vez, clicando em um link patrocinado. Dois dias depois, ele recebe um e-mail marketing e retorna novamente ao site, mas ainda não efetua a compra. Com as Digital Marketing Suites (DMS), que permitem identificar de que forma o usuário foi impactado e de que forma cada canal contribuiu para isto, é possível supor que este cliente em potencial está fortemente considerando a compra de uma TV. Com essa informação em mãos, a marca em questão gera um banner personalizado com uma promoção deste produto em um site qualquer que este cliente acesse. E, mais uma vez, ele é impactado. Mas agora, devidamente impactado, ele realiza a compra.

Após este processo, verificamos que este consumidor ainda busca informações sobre o produto que comprou. E alguns, satisfeitos, o elogiam em canais como redes sociais e fóruns, fazendo com que sua opinião se torne uma referência para novos clientes, o que contribui para a reputação da marca.

As empresas devem entender essa jornada de decisão de compra de seus consumidores e determinar com precisão quais os pontos de contato são mais influentes e, a partir disso direcionar seus esforços e verbas de marketing adequadamente. Mas isto só acontece se entendermos que compras não acontecem apenas ao acaso, por impulso.

É possível dizermos, que, se não houvesse os passos anteriores, o comprador da televisão de 40 polegadas não teria sido tão impactado e, por fim, o último clique não teria sido feito. Com o mapeamento adequado e a integração dos canais de marketing, foi possível saber o exato momento para abordá-lo com um banner personalizado, que trouxesse a ele exatamente aquilo que deseja.

Sabendo quais e como cada canal impactou o cliente, um gestor de marketing justifica por A+B para o conselho administrativo de sua empresa por que investir mais em um determinado canal em detrimento de outro. Ainda, é possível rentabilizar esses investimentos ao destinar para cada etapa o valor correspondente a seu peso de contribuição para o caminho de conversão. Com efeito, isso se traduz em melhores resultados e economia de tempo e dinheiro. É por essas e outras que a atribuição é visto como a última palavra quando o assunto é marketing digital.

—–

Artigo de Alessandro Gil, publicado no iMasters.

Outernet: conheça a “internet” gratuita e acessível ao mundo inteiro

Outernet
Outernet

Em 2011, a Organização das Nações Unidas (ONU) afirmou em público que o acesso à internet deve ser tratado como um direito humano. Se pensarmos nas utilidades da rede de uma forma mais abrangente, fica fácil entender o posicionamento da organização: a web é, atualmente, o meio de comunicação mais difundido e um dos mais confiáveis que um cidadão pode usufruir. Ela facilita o exercício da democracia, pode ser considerada uma excelente ferramenta educacional e é capaz de auxiliar o indivíduo em diversos momentos de sua vida.

Contudo, estima-se que 4,3 bilhões de pessoas ao redor do mundo não possuem acesso à internet e, consequentemente, não podem consumir informações da mesma forma que todos nós podemos. Seja por condições geográficas ou situação socioeconômica desfavorável, esses cidadãos não podem usufruir de livros gratuitos publicados na rede, informações meteorológicas, notícias sobre desastres, material jornalístico sem censura, conteúdo didático e tudo mais que estamos acostumados a encontrar em uma rápida pesquisa no Google.

Não é preciso pensar em países distantes e regiões remotas para entender essa situação – até mesmo aqui, no Brasil, uma conexão banda larga ainda é muita cara para boa parte da população. Além disso, internet é algo um tanto instável: todos nós corremos o risco de ficar sem informações digitais no caso de catástrofes naturais (um terremoto ou uma tempestade, por exemplo, pode danificar a infraestrutura de uma conexão cabeada ou antena de rede móvel). Sendo assim, temos aqui um grande problema: como oferecer informação digital de uma forma barata, acessível, estável e segura? A resposta pode estar na Outernet.

O que é a Outernet?

Fundada por Syed Karim, a Outernet é uma empresa e pode também ser encarada como um projeto social. Trata-se de uma espécie de “internet alternativa”, gratuita e oferecida por satélite, que visa levar informações digitais de alta relevância para regiões em que a rede convencional possui pouca penetração por motivos variados.

Seu esquema de funcionamento pode parecer um pouco complicado de início, mas o conceito como um todo é bastante simples e não utiliza quaisquer tipos de tecnologias mirabolantes – nas palavras da própria equipe responsável pelo projeto, a Outernet simplesmente utiliza recursos existentes da forma mais inteligente possível.

Primeiramente, o time de operações da Outernet seleciona conteúdos que ele considera importantes para a humanidade, como notícias, conteúdo educacional e outros materiais relevantes. Isso inclui não apenas páginas da web, mas também vídeos, músicas e até mesmo softwares (distribuições do Linux, por exemplo).

Esse amontoado de dados é batizado de “Core Archive”, ou “Arquivo Central”, em uma tradução livre. Junto com o Core Archive, os responsáveis pela Outernet selecionam também conteúdos sugeridos pelo público em geral (“Queue” ou “Fila”) e pagos para estar nessa coleção (“Sponsored” ou “Patrocinados”).

Uma vez que todas essas informações foram recolhidas, elas são tratadas em um database da própria Outernet, tornando-se mais leves e menos “quebradas” (uma página selecionada da Wikipédia não pode ter links para outras páginas não-selecionadas, por exemplo). Esse bloco massivo de dados é então enviado para satélites geoestacionários que pertencem à Outernet e retransmitido para a Terra.

Atualmente, a companhia conta com dois satélites que estavam abandonados e foram adaptados para essa finalidade: o Galaxy 19 e um Hot Bird. Essa dupla é capaz de transmitir informações para boa parte da Terra, mas o projeto prevê o lançamento de cubesats (satélites miniaturizados) para aumentar sua área de atuação.

Legal, mas o que eu faço com essa transmissão?

Chegamos na parte bacana da coisa: os sinais enviados pelos satélites da Outernet podem ser captados por um dispositivo receptor que transforma essa transmissão em uma rede WiFi. Conectando-se nessa rede através de um dispositivo qualquer – como um notebook, um celular ou um tablet –, você consegue navegar pelas informações do citadas anteriormente usando um navegador comum.

Esse receptor pode ser tanto um aparato que você mesmo é capaz de construir (é possível conferir tutoriais detalhados aqui) ou uma Lantern, um dispositivo minúsculo que está sendo financiado através do Indiegogo. Nesta fase de financiamento, uma Lantern custa US$ 99 (pouco mais de R$ 200), sendo que seu preço estimado no futuro é de US$ 150 (cerca de R$ 300).

O aparato é um tanto discreto, pode ser recarregado através da energia solar e, na fase de testes da Outernet, consegue receber até 2 MB de dados por dia dos satélites – se tudo der certo, no futuro, será possível receptar até 100 MB diários. O mais bacana é que, uma vez que o cidadão tenha uma Lantern, ele pode usar a Outernet o quanto quiser sem ter que pagar um único centavo por isso. O hardware tem seu custo, mas o serviço é completamente gratuito.

A Outernet quer substituir a internet convencional?

De forma alguma. Como você deve ter reparado, a Outernet possui uma série de limitações – ela não permite que você faça transferência de dados em tempo real, impossibilitando o uso de mensageiros instantâneos e redes sociais, por exemplo. Além disso, a taxa de atualização dos conteúdos transmitidos é bem lenta – o Core Archive é atualizado semanalmente, salvo em situações emergenciais (notícias sobre catástrofes de importância mundial, por exemplo).

Dessa forma, a Outernet deve ser encarada como uma verdadeira biblioteca digital gratuita e que está sempre disponível aos seus usuários (já que transmissões por satélites dificilmente sofrem interrupções). Vale observar que o sinal da Outernet já pode ser captado por receptores caseiros, mas a Lantern deve ser enviada aos seus devidos compradores somente em julho do ano que vem.

—–

Artigo de Ramon de Souza, publicado no Tecmundo.

Internet das Coisas pode ser sinônimo de mais vida!

Imagem ilustrativa
Imagem ilustrativa

Imaginar o futuro é sempre uma aventura. Não sei bem como as crianças de hoje imaginam o futuro, mas ainda devem existir os carros que voam e as casas com robôs que fazem de tudo.

O que surpreende é que as crianças de hoje acreditam que a Internet existe em todos os lugares, como o oxigênio, ou seja, que a Internet existe como o ar que respiramos ou disponível como a eletricidade. Elas não precisam desejar ou sonhar, elas acreditam que isto já é real e se irritam ou não entendem quando estão em um lugar onde seus jogos e equipamentos não funcionam pela ausência do acesso Internet.

Segundo dados da pesquisa realizada em julho de 2013 pelo IBGE (Instituto Brasileiro de Geografia e Estatística) sobre a Inclusão Digital, somente 14,3% das cidades brasileiras oferecem pontos com WiFi. São 795 municípios que disponibilizam essa opção de conexão sem fio. Em 93,6% delas, o acesso é gratuito e o sinal Wifi pode estar restrito às localidades definidas pela prefeitura como parques, praças e regiões centrais. Os dados fazem parte da pesquisa sobre iniciativas no âmbito municipal de inclusão digital do instituto e foi realizado pela primeira vez.

E como tornar este presente imaginado pelas crianças mais real? Ter a Internet disponível em todos os lugares? Para os adultos, a Internet “como  ar” é uma perspectiva de futuro? Qual a visão de futuro dos adultos?

E você, o que vem em sua mente, quando pensa no futuro?

Na mente de muitas pessoas, falar em futuro é falar no conceito de “cidades inteligentes”.

E o que isto significa?
O conceito formal das “Cidades Inteligentes”ou “smart city” é o uso de tecnologia com sustentabilidade para que as cidades sejam vivas e aproveitem melhor os recursos, ao mesmo tempo que ofereçam mais mobilidade e serviços com o objetivo de que as pessoas possam ter mais qualidade de vida.

Trata-se de uma recente inovação tecnológica que está sendo pensada e discutida nos mais diversos fóruns mundiais. A necessidade surge do crescimento desordenado dos centros urbanos e do aumento populacional e suas consequências. Afinal, tal crescimento traz diversos desafios que estão relacionados ao fornecimento inteligente de serviços essenciais, como água, energia, transporte público, saúde e educação, entre outros.

O pensamento sobre cidades inteligentes começou a partir da ficção cientifica, algo como as ideias que refletiam o imaginário das pessoas sobre o futuro, bem exemplificado no desenho animado Os Jetson’s (criado em 1962 pelos estúdios Hanna Barbera): carros voadores, cidades suspensas, trabalho automatizado, teletransporte, aparelhos eletrodomésticos para tudo e robôs. E toda esta evolução tem o único propósito de servir ao ser humano.

A partir do século 21, devido ao avanço da tecnologia, de forma revolucionária e rápida, o pensamento e o desejo de “cidades inteligentes” se tornaram mais próximo e até mais reais.

Esta busca tem um significado simples: as cidades são o elemento central e fundamental do crescimento demográfico e econômico dos países e vive-se um contexto de crise, pois os recursos são limitados. É preciso uma inovação para que exista o desenvolvimento social, econômico e ambiental do ecossistema urbano.

As Tecnologias da Informação e Comunicação (TICs) são consideradas indispensáveis para racionalizar, otimizar e reduzir os custos e também para mudar a forma de colaboração entre os cidadãos e seu local de viver.

A World Foundation for Smart Communities define que as Cidades Inteligentes devem ser baseadas em um crescimento inteligente e planejado, por meio das TICs. “Uma Comunidade Inteligente é uma comunidade que faz um esforço consciente para usar a tecnologia da Informação para transformar a vida e o trabalho dentro de seu território, de uma forma significativa e fundamental, em vez de seguir uma forma incremental”.

Pensar nestas cidades é considerar que as tecnologias de informação e comunicação estarão embarcadas e incorporadas nos objetos e nas coisas. Elas, as tecnologias, se tornam invisíveis aos nossos olhos, apenas existem.

Pode-se concluir que Cidades Inteligentes são ambientes feitos com um esforço consciente para usar a tecnologia da comunicação para transformar a vida e o trabalho de uma região. O objetivo está além de apenas programar novidades tecnológicas, mas que o uso delas permita enfrentar desafios e obstáculos e dar soluções para as cidades e para as pessoas.

De forma mais poética, as Cidades Inteligentes são apenas cidades para as pessoas viverem bem, simples assim. A onda de conscientização, bem como a movimentação das pessoas neste caminho é positiva, pois une iniciativa, criatividade, conhecimento, mobilidade e a Internet das Coisas.

E o que é a Internet das coisas?
Para explicar a Internet das Coisas é necessário entender um pouco melhor sobre a Internet na vida das pessoas.

A primeira revolução da Internet se concentrou nas pessoas e mudou a forma das pessoas estarem conectadas entre si, e até na forma de comunicação e relacionamento das pessoas.

A segunda revolução envolveu as pessoas e os processos. Passamos a usar a Internet para conectar os processos de nosso dia a dia. A mobilidade se tornou essencial para os afazeres profissionais, para fazer o link entre o eu e os processos.

E a terceira revolução, que pode estar acontecendo neste momento, envolve as pessoas, os processos e as coisas. Colocou-se Internet nas Coisas.

Os eletrodomésticos do desenho da família “Jetson”, dotados de incrível sofisticação e com uma variedade de dispositivos capazes de poupar as pessoas de trabalho, passam a existir na vida real.

Uma Cidade Inteligente precisa que a revolução da Internet das Coisas aconteça, pois é preciso colocar “vida” nas coisas para que a Cidade Inteligente exista.

Passa a existir uma mudança de relacionamento do homem com as máquinas ou com as coisas, pois é inevitável uma mudança de paradigma. “A tecnologia por trás da Internet das Coisas vai mudar a relação dos seres humanos com máquinas de uma forma jamais vista, com outras inovações tecnológicas recentes. Por exemplo, a proliferação de meios de comunicação via smartphones já nos deu novas maneiras de organizar a nós mesmos, tanto social e quanto politicamente”, argumenta McKeown.

O MIT Auto-ID Laboratory é, em parte, responsável pelo objetivo de criar um sistema global de registro de bens usando um sistema único de numeração chamado Electronic Product Code, que é a essência da Internet das Coisas e representa o futuro da computação e da comunicação,cujo desenvolvimento depende da inovação técnica dinâmica em campos tão importantes como os sensores wireless e a nanotecnologia.

Através da nanotecnologia passam a existir processadores de tamanho muito reduzido e a função destes processadores é estar “nas coisas”, para que “as coisas” enviem informações para as grandes bases de dados e a Internet. Só desta forma se torna possível coligir e registrar os dados sobre cada uma “das coisas”.Essas informações serão processadas e terão a capacidade de interagir e se conectar.

Os produtos industriais e os objetos de uso diário com informação integrada, poderão vir a ter identidades eletrônicas ou poderão ser equipados com sensores que detectam mudanças físicas à sua volta. Tudo poderá ser etiquetado e colocado na rede. Estas mudanças transformarão objetos estáticos em coisas novas e dinâmicas, misturando inteligência ao meio e estimulando a criação de produtos inovadores e novos serviços.

É a Computação em Nuvem que viabiliza esse acontecimento, a explosão de dados. É necessária uma infraestrutura de serviços elástica e expansiva com capacidade de gerir o volume de dados que passa a existir e tornar o ambiente propício.

Uma forma de materializar é compreender que até mesmo as partículas de pó poderão estar equipadas com sensores que percebem a mudança física a sua volta e, com a inteligência artificial, transformarem esse dado em informação para ligar outro aparelho de limpeza, ou acender um equipamento ou desligar para que o objetivo definido (que seja ter um número de partículas de pó com um determinado comportamento) seja alcançado sem uma intervenção direta do homem.

Perceba que a Internet das Coisas é essencial para a existência das Cidades Inteligentes, que apenas acontecem com a integração promovida pelo uso da tecnologia e um suporte inteligente e contextualmente relevante. Sem tudo isto a denominação “smart” deixa de existir.

A função da tecnologia é tornar as tarefas mais fáceis de executar e em menor tempo. A Internet das Coisas nos oferecerá um nível de automação que nos possibilitará estreitar relações de trabalho com máquinas e com a Inteligência Artificial. Portanto, a Internet das Coisas tem potencial de nos permitir viver uma vida mais sustentável e com muitas possibilidades, desde automatizar a prevenção e o tratamento de doenças, como o controle do uso da água e da eletricidade, e até certas formas de trabalho.

Existem projetos isolados no mundo inteiro colocando o conceito em prática, tanto da Internet das Coisas como das Cidades Inteligentes. Pode-se citar o caso do projeto CITY+ que tem como objetivo melhorar a qualidade de vida, a sustentabilidade e a competitividade da área metropolitana de Milão com o aumento da taxa de inovação, lançado em 2010 e pretende ir além da cidade depois de 2015 e assim reduzir a despesa pública com o recolhimento do lixo e despesas de água. Tem o caso de Amsterdã, na Holanda,  que conta com o programa chamado Amsterdam Smart City, reunindo atualmente 43 projetos que visam o desenvolvimento sustentável por meio de inovações tecnológicas.

No Brasil, há diversas iniciativas de pessoas e organizações que estão pensando na Internet das Coisas e nas Cidades inteligentes. Vale destacar dois projetos:

1. Miguel Nicolelis, um neurocientista que lidera um projeto “do futuro” chamado ANDAR DE NOVO, que busca dar movimentos nas pernas e nos braços de quem os perdeu

2. Um grupo de professores e estudantes da Poli – USP e o seu PRÓPRIO projeto de Cidade Inteligente, que se destaca por apresentar um panorama de alimentação e a redução do desperdício de comida. Afinal se é uma Cidade Inteligente, tem que ser sustentável.

Entre muitos outros projetos ou iniciativas que buscam a interligação entre equipamentos, como o carro conectado na casa do individuo e a possibilidade de interligar/conectar as embalagens de remédios com as receitas de cada paciente para um tratamento mais customizado.

Alguns dizem que isso terá um efeito positivo, outros se preocupam com prováveis efeitos colaterais. O potencial é grande, o valor da realidade reside na sua aplicação e por isso existe a necessidade de reflexão.

Esta revolução é boa para a humanidade?
Existe uma movimentação em torno do que é chamado de a primeira grande conferência internacional (com o título de “Philosophy of the Internet of Things” em Julho/2014 na York St. John University) sobre a Internet das Coisas (ou IoT/Internet of Things, na língua inglesa) e um dos questionamentos é se este acontecimento é uma revolução tecnológica ou uma revolução social e se vai liberar o potencial humano e trazer mais qualidade de vida para a humanidade ou parte dela.

Joachim Walewksi, Rob Van Kranenburg e McKeown, organizadores da conferência, comentam que “seu desenvolvimento tecnológico está sendo impulsionado principalmente pelas preocupações comerciais e de negócios. De acordo com ele, se olharmos para a primeira revolução industrial, veremos que ela libertou os seres humanos, aliviando muitos deles da carga de seus postos de trabalho, através da mecanização. Em contrapartida, não aliviou os problemas econômicos trazidos pela falta de renda causada pela falta de trabalho. Assim, no curto prazo, com base na evidência histórica, não há garantias de que a IoT vai liberar todo o potencial humano”.

A conclusão é que os benefícios a longo prazo da primeira revolução industrial, acabou por nos levar para um lugar onde o potencial humano se tornou livre o suficiente para se envolver em outras coisas e hoje temos mais qualidade de vida, mas temos também alguns efeitos colaterais como menos tempo para as atividades de lazer, mais trabalho e uma mal distribuição de renda que divide desde as pessoas como os países. Daí a necessidade de começar a pensar sobre as implicações filosóficas da IoT agora para fazer melhor com a revolução da Internet das Coisas.

Se a expectativa social é que esta revolução possa beneficiar o maior número possível de pessoas e não apenas pequenos grupos ou apenas ambientes de negócios, qual o posicionamento mais adequado? E quanto isto é discurso e vai tornar-se efetivamente prática? Afinal, o que podemos fazer para que a tecnologia possa facilitar a vida de todas as pessoas e dar mais tempo para o lazer, dar mais qualidade de vida para a humanidade e não apenas para um grupo de pessoas?

A ideia de que a tecnologia poderá nos arrumar mais tempo para o lazer e deixar o trabalho acontecer de forma mais prática, pode ser uma ilusão. Há alguns anos, pensou-se que a utilização da internet nos daria mobilidade e as pessoas poderiam ter mais tempo livre, mas por outro lado parece que a tecnologia nos arruma mais trabalho e não mais qualidade de vida ou mais tempo.

Parece que na teoria faz muito sentido, mas as pessoas não tem tido muito sucesso nesta empreitada. O capitalismo e a competitividade tornam a premissa do fazer mais com menos (tempo) essenciais. E como fica a qualidade de vida?

A qualidade de vida envolve muitas facetas do conhecimento, apenas para citar algumas como o biológico, o econômico e o social e por isso desenvolve muitas das preocupações das pessoas como saúde física, mental e espiritual, arquitetura, educação, segurança, políticas públicas entre outras. É quase um debate interdisciplinar, o que em alguns aspectos dificulta o uso mais adequado do conceito. Qualidade de vida passou a fazer parte da linguagem comum e usual, desde fazer um exercício diariamente como implantar uma política pública de tratamento de resíduos, quanto trabalhar com satisfação e prazer. Enfim, tudo envolve e tem como propósito a qualidade de vida. E todas as áreas, de trabalho, de lazer, de cultura, do meio ambiente e de novas tecnologias, envolve a busca pela qualidade de vida.

De acordo com Cristovam Buarque (1993, p.156) “talvez nenhum conceito seja mais antigo”do que o de qualidade de vida. Mesmo antes de ser definido, já era sentido e ao mesmo tempo é “o mais moderno e atual: o ter qualidade de vida”.

O primeiro gesto do que viria a ser o homem tinha por motivação a melhoria na qualidade de vida dele e dos demais de sua tribo. Apesar disso, só muito recentemente o conceito surge, se consolida no imaginário coletivo dos homens, e assume como definição o uso de técnicas. Durante séculos, a qualidade de vida estava em não ser ameaçado pelos deuses, nem ser surpreendido pelas intempéries, e ter força para resistir aos inimigos naturais ou humanos. A vida era rotina, a qualidade dela era não quebrar a rotina. (BUARQUE, 1993, p. 156).

Dessa forma, qualidade de vida pode envolver o cultivo de amizades, a boa alimentação, o lazer, o trabalho e de forma mais específica está relacionada com a diminuição do consumo de produtos industrializados, a diminuição do conceito capitalista nas gerações mais jovens para um consumo melhor orientado, ter uma relação melhor com o meio ambiente, o trabalhar com mais prazer e qualidade para ter mais tempo livre e de lazer, os processos que facilitem a população a ter mais saúde ou tratamentos mais acessíveis, o uso mais rápido das informações para o ganho do tempo.

Por isso as Cidades Inteligentes que usam a Internet das Coisas e buscam a sobrevivência das cidades com mais qualidade de vida para as pessoas são o novo desafio da humanidade.

Depende da atitude de hoje para que a revolução da Internet das Coisas tenha melhores resultados do que a revolução industrial. Os homens tiveram benefícios incomparáveis, mas alguns deles não foram utilizados plenamente para uma vida mais plena e focada no meio ambiente, na cultura, na saúde, enfim na qualidade de vida do próprio homem. Será que este é o novo propósito, será diferente?

E para concluir este artigo,fica o convite para você continuar a viver esta aventura chamada de vida, agora com processadores de tamanho reduzido + computação em nuvem + automação + inteligência artificial + interligação + qualidade de vida + sustentabilidade = mais vida!

—–

Artigo de Luciane Faria, publicado no CIO.

Designers versus Bootstrap

Bootstrap
Bootstrap

Embora eu não seja um web designer por formação, estou muito interessado na disciplina. Como tal, eu leio livros e blogs com foco em design.

Ocasionalmente, percebo que determinados temas provocam fortes emoções na comunidade. Temas como “Flat design: uma boa ideia ou a melhor ideia de todos os tempos”, “Qual é a punição correta para um CEO que redesenha o logotipo de sua empresa durante um final de semana?”.

Um desses tópicos de debate é se é uma boa ideia usar um framework front-end, como Bootstrap ou Foundation, em vez de construir um você mesmo. Como eu sou um grande fã desses frameworks, fiquei curioso quanto às razões de por que usar um seria uma má ideia.

Até onde eu posso dizer, a oposição aos frameworks front-end decorre das seguintes crenças:

Frameworks forçam você a uma marcação “não-semântica”

Marcação semântica é sobre HTML limitando apenas aquelas marcas necessárias para expressar o conteúdo da página, ao contrário de seu layout. Por isso, coisas como “container divs” são malvistas.

Bem, Bootstrap, de fato, faze uso liberal de elementos apenas de layout, como este:


1<div class="container">
2  ...
3</div>

 

 

Frameworks são muito super valorizados

Outra queixa comum é que em sua busca para ser todas as coisas para todas as pessoas, frameworks front-end possuem coisas das quais você pode nunca precisar. Por exemplo, Bootstrap permite várias maneiras de estruturar os links de navegação: como abas ou pills, com ou sem menus suspensos, fixos ou não, verticais ou horizontais. Se o seu site precisa de apenas um (ou talvez dois) deles, por que suas folhas de estilo incluem todos esses estilos estranhos?

Frameworks fazem tudo para parecer muito igual

Frameworks front-end te dão um conjunto de opções padrão para construir seus sites. Portanto, não é uma grande surpresa quando as pessoas constroem seus sites usando essas opções. O efeito colateral disso é que você olha e vê “Bootstrap” em todos os lugares.

Então Bootstrap não é bom?

Agora que eu já construí um bom espantalho com os argumentos da oposição, eu sou obrigado a tacar fogo no espantalho.

Marcação semântica onde faz sentido

Em primeiro lugar, vamos direto ao ponto de marcação semântica. Sim, na medida em que uma página HTML é um documento, ela deveria incluir o conteúdo e um pouco mais. A boa notícia é que para toda uma classe de páginas HTML este é um ajuste natural: blogs, sites de marketing, revistas, e assim por diante.

No entanto, a web está cheia de páginas HTML que servem a um propósito bem diferente: a de um contêiner de aplicativos. Para todos os clientes de e-mail, editores de documentos, formulários de pedidos de compra, análise de dashboards e assim por diante, a pureza semântica é legal, mas receber o app para expor corretamente é muito mais agradável.

Bootstrap, com todos os seus “container” divs, ajuda a resolver o problema de layout para aplicativos. Além disso, se a pureza semântica é uma preocupação forte, ele te fornece as ferramentas para gerenciar layouts sem violá-los.

Cheio de features, mas com features demais

Sim, Bootstrap tem uma tonelada de classes CSS nele, provavelmente milhares e milhares. No entanto, é 107k são minificados e altamente armazenávies em cache. Para efeito de comparação, uma simples adição de imagem do New York Times de hoje tem 20K.

Claro, existem sites para os quais vale a pena salvar entre 30-50K extras por pedido inicial. E nesses casos, pelo amor de qualquer coisa que você queira, personalize todos fora do CSS. Caso contrário, considere se o esforço extra vale a pena.

Ele só parece o mesmo se você deixar

A razão pela qual muitos sites construídos com Bootstrap parecem ser semelhantes é porque elas são feitas por desenvolvedores e não designers. A maioria dos desenvolvedores tem pouco interesse/habilidade de personalizar de forma eficaz os aspectos visuais de um site e, assim, usar o que já parece ser bom: o tema padrão.

Claro que, para aqueles que podem (ou querem) ajustar o visual, há muito que pode ser feito.

Algo mais?

Existem mais dois benefícios do uso de frameworks front-end que tenho que mencionar. O primeiro é o suporte para design responsivo. O Bootstrap 3.0 tem várias opções para fazer suas páginas parecerem agradáveis em diversos tipos de dispositivos. E mesmo que demore um pouco para envolver sua mente nessa abordagem, ela pode ser muito eficaz.

Em segundo lugar está o suporte para navegadores mais antigos (ou seja, IE8). IE8 é o grande devorador de tempo de desenvolvimento web. Ele pode levar horas e horas de ajustes e correções até que o seu layout que funciona muito bem em todos os outros navegadores finalmente fique decente. Embora não seja perfeito, o suporte do Bootstrap para IE8 é muito bom.

Reflexão final

Alguns designers dizem que nenhum designer que se preze usaria um framework que não criou. Eles temem perder o controle sobre o seu projeto, sem o benefício aparente suficiente para compensar essa perda. Eu costumava ter uma opinião similar sobre o uso de frameworks de desenvolvimento, mas aí eu superei isso e comecei a fazer o que tinha que ser feito.

—–

Artigo de Alex Tatiyants, publicado no iMasters.

Explorando o Composite Pattern JavaScript

Imagem ilustrativa
Imagem ilustrativa

Design Patterns é um assunto bem comum em todas as linguagens de programação, e o mais importante quando se trata em manutenção de código. Um pattern é uma solução reutilizável que pode ser aplicada em um projeto de desenvolvimento de software. Hoje, vamos explorar o Composite pattern com implementação JavaScript.

O composite pattern diz que um grupo de objetos pode ser tratado da mesma maneira que um objeto individual desse grupo.

Um uso bem comum de Composite Pattern que você provavelmente já tenha visto é o sistema de diretórios de um Sistema Operacional que utiliza estrutura de dados em árvore (considere que temos uma pasta e dentro dessa pasta temos várias outras pastas, e que dentro de cada uma dessas outras pastas temos mais algumas pastas, e assim por diante).

Nesse modelo, temos “N” objetos que possui “N” filhos que também pode ter mais “N” filhos. Entretanto, a quantidade de objetos não importa, porque a implementação é a mesma para todos eles. Ok? Vamos ver isso melhor na prática.

Exemplo: Construindo uma cidade com Composite Pattern

Vamos colocar a mão na massa e criar nosso próprio exemplo modificando um pouco o modelo apresentado acima, mas ainda seguindo a estrutura em árvore. No nosso exemplo vamos construir duas cidades que possuem bairros que, por sua vez, possuem algumas casas (lembre-se da estrutura em árvore). Algo bem simples e que vai ficar parecido com isto:

| cities
|
|– São Paulo/
| |– Liberdade
| |– Casa 1
| |– Casa 2
| |– Ipiranga
| |– Casa 3
|
|– Rio de Janeiro/
| |– Leblon
| |– Casa 4
| |– Lapa
| |– Casa 5
| |– Casa 6
|

O objeto possuirá os seguintes métodos específicos do nosso composite:

add: adiciona um novo filho para o objeto;
remove: remove um determinado filho do objeto;
getChild: retorna um filho do objeto;

Método auxiliar:

getElement: retorna o elemento HTML do objeto específico;

Criamos o objeto “Cidade” que terá o formato composite:


1var City = function (title, id, className) {
2    this.children = [];
3    this.element = document.createElement('div');
4    var h2 = document.createElement('h2');
5
6    this.element.id = id;
7    if (className) this.element.className = className;
8
9    h2.textContent = title;
10    this.element.appendChild(h2);
11
12}
13
14City.prototype = {
15    add: function (child) {
16        this.children.push(child);
17        this.element.appendChild(child.getElement());
18    },
19
20    remove: function (child) {   
21        for (var node, i = 0; node = this.getChild(i); i++) {
22            if (node == child) {
23                this.children.splice(i, 1);
24                this.element.removeChild(child.getElement());
25                return true;
26            }
27        }
28
29        return false;
30    },
31
32    getChild: function (i) {
33        return this.children[i];
34    },
35
36    getElement: function () {
37        return this.element;
38    }
39}

Instanciamos os objetos e montamos a estrutura


1var cities = new City('', 'cities');
2var saoPaulo = new City('São Paulo', 'sao-paulo');
3var rioDeJaneiro = new City('Rio de Janeiro', 'rio-de-janeiro');
4var liberdade = new City('Liberdade', 'liberdade');
5var ipiranga = new City('Ipiranga', 'ipiranga');
6var lapa = new City('Lapa', 'lapa');
7var leblon = new City('Leblon', 'leblon');
8var casa1 = new City('Casa 1', 'casa-1', 'composite-house');
9var casa2 = new City('Casa 2', 'casa-2', 'composite-house');
10var casa3 = new City('Casa 3', 'casa-3', 'composite-house');
11var casa4 = new City('Casa 4', 'casa-4', 'composite-house');
12var casa5 = new City('Casa 5', 'casa-5', 'composite-house');
13var casa6 = new City('Casa 6', 'casa-6', 'composite-house');
14var casaRemover7 = new City('Casa remover 7', 'casa-remover-7', 'composite-house');
15
16liberdade.add(casa1);
17liberdade.add(casa2);
18
19ipiranga.add(casa3);
20ipiranga.add(casaRemover7);
21
22ipiranga.remove(casaRemover7); // Removido
23
24lapa.add(casa4);
25
26leblon.add(casa5);
27leblon.add(casa6);
28
29saoPaulo.add(liberdade);
30saoPaulo.add(ipiranga);
31
32rioDeJaneiro.add(lapa);
33rioDeJaneiro.add(leblon);
34
35cities.add(saoPaulo);
36cities.add(rioDeJaneiro);
37
38document.body.appendChild(cities.getElement());

Se preferir, aqui está o demo de como ficou o exemplo funcionando. Composite pattern é interessante quando temos uma coleção de objetos que possuem o mesmo tratamento, é um ótimo pattern e bastante usado pelos desenvolvedores.

Espero que tenham gostado. Qualquer dúvida, sugestão ou crítica, fique à vontade para deixar seu comentário. Até a próxima!

—-

Artigo de Pedro Araújo, publicado no iMasters.

Viu isso? Mark Zuckerberg responde porque usa a mesma camiseta todos os dias

Mark Zuckerberg
Imagem: Niall Kennedy/CC

Durante a sessão de perguntas e respostas com os usuários do Facebook na quinta-feira (6), uma das questões mais votadas pelos usuários foi: “Por que você usa a mesma camiseta todos os dias?”

Isto porque Mark Zuckerberg veste a mesma camiseta cinza na maioria dos eventos públicos a que comparece.

Como o presidente do Facebook deveria responder as perguntas mais curtidas da sessão, ele não se negou a responder a questão:

“Eu quero realmente limpar minha vida. para fazer o mínimo de decisões possível sobre o que não tenha relação com a melhor forma de atender esta comunidade”, disse Zuckerberg, que disse ter várias camisetas iguais.

Ele afirmou que até mesmo decisões corriqueiras como escolher o que vestir ou o que comer no café da manhã podem consumir energia. E ele não quer perder tempo com essas coisas.

“Estou nessa posição muito privilegiada de poder acordar todos os dias e ajudar a atender mais de um bilhão de pessoas. E sinto que não estou fazendo meu trabalho se gasto qualquer das minhas energias em coisas bobas ou frívolas sobre minha vida”, afirmou.

Zuckerberg lembrou que outras pessoas influentes, como Steve Jobs ou Barack Obama, têm a mesma teoria no que diz respeito a escolha de suas roupas.

—–

Artigo de Gabriel Garcia, na INFO.

As habilidades mais procuradas em novos UX Designers

design ux
Imagem ilustrativa

Em época de longas baterias de entrevistas para contratar novos profissionais de UX, é comum parar um pouco para organizar os pensamentos e analisar: “quais habilidades um novo profissional de UX (junior/pleno) precisa ter?”.

É claro que essas habilidades variam muito de empresa para empresa, mas algumas delas são onipresentes em vários times de design no mercado (tanto em agência, em cliente, em consultoria, em produtora etc.).

Penso que esses profissionais de nível júnior e pleno são um bom termômetro do que está acontecendo no mercado. Normalmente não são exigidos deles habilidades como contato com cliente, apresentações ou definição de estratégia de marca – o que faz com que eles fiquem bem focados no “craft”, no desenvolvimento do trabalho.

Olhando para o job description desses caras, é possível entender:

  • O tipo de conhecimento que as universidades deveriam oferecer;
  • O tipo de projeto mais comum no mercado;
  • Que ajuda a entender o que os clientes procuram;
  • Que ajuda a entender o que os consumidores procuram;

 

Abaixo algumas habilidades comumente procuradas:

  • Design para mobile. Não adianta, mobile já é uma realidade na vida do consumidor e nas empresas. Para profissionais entrantes no mercado, um verdadeiro requisito. No mínimo o profissional precisa ser um usuário ativo de interfaces mobile (aplicativos ou sites) para ir adquirindo vocabulário de design e entender como as coisas funcionam. Mas já espera-se ver pelo menos um ou dois projetos mobile no portfólio dos novos candidatos.
  • Prototipação. Dominar ferramentas que permitem montar protótipos não é um requisito, mas um diferencial para futuros UXers. Em alguns casos, o profissional conhece o suficiente de HTML e CSS para montar protótipos na própria linguagem. Isso é ainda mais comum em profissionais de front-end que estão migrando para UX e não querem abandonar completamente as linhas de código. Mas conhecimentos em ferramentas como Axure, Adobe Edge e Animate, ou mesmo o Invision, já são imensamente apreciados na hora de contratar.
  • Sketching. Você não precisa ser um artista renascentista para conseguir um emprego em UX, mas grande parte dos novos profissionais já possui alguma habilidade em sketching (nas universidades americanas, inclusive, o sketching já faz parte da grade curricular). A necessidade de usar esse método nos projetos é enraizada no fato de que ele incentiva a colaboração e o desapego de ideias – fatores bastante procurados em profissionais junior.
  • Colaboração, organização e profissionalismo. Essas não são habilidades exclusivas do Design, mas dentro desse universo elas são extremamente importantes. Saber colaborar com profissionais de outras disciplinas e que pensam diferente de você, ser organizado para lidar com grande volume de informação e ser responsável pelo trabalho que está sendo feito – a ponto de seu chefe poder confiar uma atividade a você sem precisar se preocupar em ficar cobrando a entrega. Pode parecer um pouco básico, mas como muitas vezes a vaga de junior UX é um dos primeiros empregos da pessoa, ela pode não estar acostumada com o que se espera dela dentro de um ambiente profissional, longe do colo seguro da universidade.

—–

Artigo de Fabrício Teixeira, publicado originalmente no iMasters.