Olá a todos!

Quando converso com desenvolvedores que nunca programaram para dispositivos móveis, quase sempre sinto aquele ar de "não teria dificuldade nenhuma de programar dispositivos móveis. É igual!". Tento explicar delicadamente que não é bem assim, mas as pessoas raramente acreditam.

Para aqueles que têm um mínimo de modéstia, tentarei esclarecer ao longo deste texto as diferenças fundamentais que existem no desenvolvimento de sistemas móveis.

Para os que já têm realmente alguma experiência no desenvolvimento deste tipo de solução, sei que muito já se foi escrito sobre o tema anteriormente, mas acredito que este é um bom momento tanto para reforçar quanto para atualizar os conceitos face às inovações tecnológicas recentes. Como o assunto é um pouco extenso, trataremos o tema em dois artigos, e este é o primeiro deles. Vamos a elas então:

Processamento

Apesar de a Marvell/Intel ter recentemente anunciado processadores com clock de até 1,2Ghz, o poder de processamento dos dispositivos móveis não é algo com que se possa contar de forma abundante. Primeiro porque tais processadores são desenvolvidos primariamente para consumir pouca energia, e depois é que se pensa em performance; em segundo lugar, por questões técnicas que estão fora do escopo deste texto, tais processadores são baseados normalmente em arquitetura RISC, e não CISC, como a maioria dos processadores para desktop. Isto tudo somado significa que não dá pra comparar um processador de dispositivo móvel com um para desktop de mesmo clock: Este último ganha com folga.

Memória

Assim como acontece com os processadores, a disponibilidade de memória nos dispositivos móveis tem aumentado bastante nos últimos tempos - tanto de execução quanto de armazenamento. Mas esta oferta ainda é ínfima se comparada a dos desktops. Um ponto importante (e que muitos desenvolvedores ignoram) é que em dispositivos móveis não existe memória virtual, e conseqüentemente o desenvolvedorprecisase preocupar com a questão de memória disponível nos palmtops e celulares (quantas vezes você se preocupou se o seu programa desktop teria memória suficiente para rodar?).

Outro ponto importante é a disponibilidade de cartões de memória (muito comuns hoje), mas que não têm garantias de estarem presentes o tempo todo no dispositivo. É preciso, pois, pensar em estratégias para lidar com todos estes tópicos relacionados à memória.

Armazenamento de dados

Ainda relacionado à questão da memória, é importante pensar em como os dados serão armazenados. Não existem tantas opções como no desktop por aqui. Você terá à disposição alguns poucos SGBDs de baixa performance (se comparados aos de desktop) e recursos resumidos, arquivos texto e talvez XML. E além disso é necessário pensar em se seus dados vão "caber" na memória disponível, e caso contrário, definir estratégias de filtragem/escolha de dados, e/ou recuperaçãoon-demandde certas informações.

Suprimento de energia

Este tema sempre foi problemático em dispositivos móveis, e não progrediu muito nos últimos anos. O que melhorou foi que agora a maioria dos dispositivos não perde todos os dados quando "falta energia" (isto acontecia - pode acreditar), pois utilizam memória Flash-ROM para armazenamento de dados. De toda forma ainda precisamos estar atentos a isto, pois dados ainda não persistidos no armazenamento (que ainda estão em memória de execução) se perdem em um "apagão". E, se a falta de energia é coisa rara em desktop, nos dispositivos móveis é uma coisa relativamente rotineira.

Estratégia de backup

Ainda considerando o tópico anterior, em alguns contextos faz-se necessário o desenvolvimento de estratégias / ferramentas de backup, seja para um cartão de memória ou para um desktop. Analise se a sua solução de mobilidade terá esta necessidade para garantir uma maior confiabilidade.

Comunicação com sistemas de desktop

A maioria dos sistemas para desktop não prevê replicação/sincronização de dados. No máximo, há um servidor onde um SGBD armazena os dados utilizados por várias estações através de rede local conectada em tempo integral. No caso de dispositivos móveis, por outro lado, dificilmente se desenvolve algo que não exija comunicação com algum sistema remoto, pois normalmente os dados armazenados no dispositivo são "parte" de um conjunto maior que está num servidor central, ou no computador desktop do usuário. E deve-se levar em consideração que a comunicação entre eles raramente será on-line (devido a custos e infra-estrutura de comunicação deficiente). Portanto, o desenvolvedor de soluções de mobilidade deve definir a estratégia e as tecnologias de comunicação de dados o mais cedo possível no processo de desenvolvimento.

Tela

É preciso também dedicar especial atenção à questão da interface com o usuário que o dispositivo móvel proporciona. Em geral, o espaço disponível na tela é muito menor do que o que estamos acostumados nos sistemas para desktop. Isto significa que temos que estudar com muito critério como vamos dispor as informações e formulários de nossa aplicação. Além disso, temos que considerar diversas resoluções de telas diferentes. Só no universo de palmtops temos atualmente 160x160, 320x240, 320x320 e 640x480. Algumas destas resoluções, para piorar, podem ser rotacionadas, ou ainda ter sua área útil reduzida devido ao teclado virtual. No caso de celulares, a diversidade é ainda maior. A dica é definir com antecedência os aparelhos que serão alvos de sua aplicação e estudar todas as combinações de resoluções possíveis, de forma a organizar a interface da melhor maneira possível.

Entrada de dados

Não sei quantas pessoas que estão lendo este artigo já pararam para pensar nisto, mas não é nada fácil digitar em dispositivos móveis. Falo isto em relação a digitar num desktop. No caso de palmtops, existe a opção de teclado virtual, no qual o usuário fica “catando milho” na em busca de cada tecla, uma por vez. Há também o reconhecimento de escrita, que pode ser bem rápido, mas poucos usuários chegam a ter “fluência” neste tipo de entrada de dados, pois exige muito treino. Nos celulares a coisa complica mais ainda, com aquelas teclas numéricas nas quais para se digitar uma letra chega-se a teclar quatro vezes a mesma tecla. O modo de digitação T9 ajuda, mas, novamente, poucos sabem usar. Existem também as opções de teclados externos, ou alguns modelos com teclado embutido, que no entanto, infelizmente, são minoria ainda e não se pode contar com eles em larga escala.

Novamente, deve-se estudar com cautela os modelos principais que serão alvo da aplicação móvel e tentar reduzir ao máximo a necessidade do usuário de digitar, dando preferência a controles que permitam escolhas (combobox, radiobox, datetimepicker, etc.).

Conectividade

Se o seu aplicativo móvel interage com algum recurso remoto, tal como um banco de dados num servidor central, web services, etc., é importante pensar em como o dispositivo irá efetuar uma conexão com a internet ou a rede desejada. Perceba que dificilmente os dispositivos móveis ficam conectados em tempo integral. E mesmo que isso ocorra, fatalmente em alguns momentos as conexões terão “caído” devido a falhas na rede. Então você deve preparar seu aplicativo para: verificar se uma conexão está ativa e funcional; efetuar uma conexão caso contrário; e ter algum “plano B” caso não consiga efetuar uma conexão. Recomendo que estude profundamente sobre redes GSM/GPRS e redes WI-FI, pois não é trivial configurar os dispositivos móveis para se conectarem a estas redes, ainda mais de forma programática (transparente ao usuário). Outra coisa: não confie que o usuário vai saber resolver quaisquer problemas de conectividade que vierem a acontecer. Este é um assunto técnico demais para usuários comuns. Então, tente abstrair ao máximo esta questão deles, exibindo apenas mensagens amigáveis e guardando um log para posterior avaliação sua.

Restrições de APIs

Ao contrário do ambiente Windows desktop, no qual dispomos de uma enorme diversidade de APIs nativas ou de terceiros para fazer praticamente tudo o que precisamos, nos dispositivos móveis esta oferta é bastante limitada, e muitas vezes nem encontramos a função que necessitamos, resultando freqüentemente em adaptações de projetos ou o desenvolvimento custoso da funcionalidade requisitada (o que também resulta em estouro de prazos). Por isso é importante estudar sobre a plataforma escolhida para saber qual nível de risco/dificuldade seu projeto vai sofrer neste quesito.

Uma observação importante pra quem é novato: em geral, uma DLL ou executável para desktopnão rodaem dispositivos móveis. A maioria dos inexperientes não sabe disto, e acha que basta copiar uma DLL de Windows para o dispositivo que a coisa funciona - ledo engano. A exceção à regra se dá em casos de utilização de binários Java ou .NET, e mesmo assim que mantenham compatibilidade com osruntimesmóveis.

Diversidade de plataformas

Como se não bastasse todas as questões acima, ainda temos toda uma miríade de plataformas de hardware e sistemas operacionais diferentes para lidar. Apenas para listar os mais populares, temos o Windows Mobile, o PalmOS, o Symbiam, e o Linux. Se você quer desenvolver um aplicativo para o público em geral, você terá um grande problema para resolver neste quesito. Como alternativas, pode-se sugerir desenvolver uma versão para cada plataforma (extremamente trabalhoso), ou tentar desenvolver seu aplicativo numa linguagem multi-plataforma tal como Waba (e que muitas vezes não evita a necessidade de se ter trechos de código específicos para uma). Se você puder estipular uma plataforma única para seu aplicativo (em alguns ambientes corporativos isto é possível), faça isto, pois vai lhe poupar dor de cabeça.

Mais uma vez, espero que estas dicas ajudem a quem está iniciando na área a compreender melhor as minúcias do desenvolvimento para dispositivos móveis. Acredito que estes conceitos são tão ou mais importantes que trechos de código, pois tratam de assuntos que não podem ser desprezados por nenhum desenvolvedor sério de mobilidade.

Vou deixar abaixo alguns links de referências interessantes sobre o tema para quem quiser estudar mais detalhadamente sobre o tema (todas as páginas estão em inglês. Infelizmente existem poucas referências sobre mobilidade em nossa língua – com raríssimas exceções como este portal).