Pontos Principais
- O surgimento de IoT implica que as coisas das nosso dia a dia, como por exemplo lâmpadas, maçanetas e escova de dentes, se tornarão conectadas e dinamicamente programáveis;
- Os métodos atuais de desenvolvimento, suas linguagens e ferramentas não são adequados para o surgimento de milhões de dispositivos programáveis em nossas vidas;
- Apesar da aparente diversidade no mercado de IoT, está emergindo uma arquitetura comum end-to-end (ponta a ponta), composta por um conjunto de elementos como por exemplo dispositivos, gateways e cloud.
- Duas importantes tendências na evolução de soluções de IoT são a mudança de enfoque: de uma simples coleta de dados para a manipulação do mundo real para o surgimento do paradigma de computação de fronteira (edge computing), onde os dados são processada localmente antes de serem enviados a nuvem.
- Os principais desafios enfrentados por desenvolvedores no mundo programável são os problemas intrínsecos relacionados a computação distribuída, a segurança destes sistemas e a inadequação das linguagens e ferramentas mais populares no desenvolvimento IoT, como por exemplo o JavaScript.
Este arquivo foi originalmente publicado na revista IEEE Software. A IEEE Software oferece informação sólida e revisada por pares sobre os os recentes desafios estratégicos em tecnologia. Para enfrentar os desafios de uma execução confiável e flexível nas empresas, gerentes e líderes de TI confiam na soluções de última geração apresentadas na IT Pro.
O surgimento de milhões de dispositivos programáveis de forma remota em nosso dia a dia criará desafios significativos para os desenvolvedores de software. Contudo, ainda não foi desenvolvido um roteiro que aborde estes desafios a partir da perspectiva centrada em dados e nuvem dos sistemas atuais de IoT e em direção ao novo mundo programável.
A Internet das Coisas (IoT) representa o próximo passo significativo na evolução da internet. Na década de 70 e 80, a Internet era basicamente uma forma de conectar computadores. Os anos 90 e 2000, marcaram a Internet como a ferramenta de conexão entre as pessoas. Agora, a ênfase está mudando de forma a conectar tudo (todas as coisas) a Internet.
Grande parte da pesquisa atual de IoT é destinada ao problemas de aquisição de dados, análise destes dados em tempo real e offline, aprendizado de máquina, visualização de dados e outros tópicos importantes para big data1. Este enfoque não nos surpreende, dado ao enorme potencial de negócio que emerge da habilidade de coletar dados de milhões de dispositivos e sensores, processá-los e combiná-los de forma a fornecer novas informações sobre o comportamento da população e diversos outros fenômenos do mundo real.
Contudo, uma disrupção igualmente importante, porém mais sutil, está acontecendo. A evolução do hardware e o fácil acesso a chips integrados poderosos e de baixo custo, possibilita embarcar conectividade, máquinas virtuais e ambientes de execução de linguagens dinâmicas em todos os dispositivos. Desta forma, os dispositivos do nosso dia a dia como lâmpadas, maçanetas, sistemas de ar condicionado, regadores de jardim, aspiradores, escova de dentes e a pia da cozinha se tornarão conectadas e programáveis de forma dinâmica.
Neste artigo, nós apresentamos um roteiro a partir da perspectiva centrada em dados e nuvem dos sistemas atuais de IoT para um mundo onde os objetos do nosso dia dia estão conectados e a "ponta" das redes (network edge) é realmente programável. Este novo mundo programável trará novos desafios aos desenvolvedores de software. Os métodos mais populares de desenvolvimento, suas linguagens e ferramentas não são adequadas para o surgimento de milhões de dispositivos programáveis em nossas vidas. Estes desafios não estão entre os tópicos que recebem mais atenção da comunidade de IoT, contudo, acreditamos que é necessário um estudo aprofundado dos problemas e desafios técnicos relacionados a esta realidade.
Como este artigo é baseado numa realidade futura, ele é de certa forma subjetivo. Nosso ponto de vista é baseado na experiência de nossos próprios projetos, nosso trabalho com IoT2-5, bem como da nossa experiência na previsão e participação nos últimos 20 anos de evolução da computação web e mobile. Por exemplo, no final dos anos 90, o surgimento de máquinas virtuais em dispositivos móveis não se apresentava como uma revolução tecnológica. Contudo, ela abriu o mercado de software em dispositivos móveis ao mercado de desenvolvedores e criou a hoje multibilionária indústria de aplicativos móveis. Embora a história raramente se repita, muitas vezes ela rima. Neste caso, um paralelo com o passado parece óbvio, porque estamos apenas chegando ao ponto em que poderemos embarcar programação dinâmica praticamente em todos os lugares e coisas.
O surgimento de uma arquitetura IoT comum de ponta a ponta
O termo "Internet of Things" (Internet das Coisas) não é novo. Nos últimos 20 anos, professores do MIT descrevem um mundo onde as coisas (dispositivos ou sensores) estão conectados e compartilham dados6. No princípio, os conceitos de IoT surgiram baseados em tecnologias como RFID e redes de sensores wireless7. Contudo, recentemente IoT se expandiu para vários domínios, incluindo saúde, transportes, energia, varejo e automação de processos. Centenas de startups foram criadas nestas áreas e a maioria destas empresas anunciaram componentes e uma plataforma de IoT. Um recente estudo listou 115 plataformas de cloud IoT8. Atualmente, nós estamos em um período onde a plataforma vencedora ainda não foi definida9. Provavelmente em meados de 2025, existirá apenas um pequeno, mas dominante, conjunto de fornecedores e plataformas de IoT.
O que é interessante em relação a grande gama de plataformas de IoT disponíveis é sua similaridade conceitual. Apesar de uma aparente diversidade e um grande número de fornecedores focados no mercado de IoT, uma arquitetura end-to-end comum está emergindo das soluções de IoT, pois um grande número de elementos são comuns a todos os sistemas1,10,11. A Figura 1 apresenta os conceitos básicos, que serão sumarizados a seguir .
(Clique na imagem para ampliar)
Figura 1 - O surgimento de uma arquitetura IoT comum end-to-end. Apesar de uma aparente diversidade e um grande número de fornecedores focados no mercado de IoT, uma arquitetura end-to-end comum está emergindo das soluções de IoT, pois um grande número de elementos são comuns a todos os sistemas
Dispositivos (devices)
Dispositivos (ou periféricos) são elementos de hardware que coletam dados de sensores ou realizam determinadas ações e que possuem capacidade de se comunicar de forma a transmitir os dados coletados ao ecossistema de IoT. Funcionalmente, dispositivos são sensores ou atuadores (actuators, que realizam ação).
Os sensores fornecem informações sobre a entidade física que monitoram. Esta informação pode variar desde a identidade da entidade física até variáveis mensuráveis, tais como temperatura, umidade, pressão, luminosidade, nível de som, fluxo de fluido, vibração e abrasão. Sensores cujo único propósito é facilitar um processo de identificação são chamados de tags.
Os atuadores utilizam energia, geralmente transportada por ar, eletricidade ou líquido, e a convertem em uma mudança de estado, modificando assim uma ou mais entidades físicas.
Gateways
Os gateways (ou hubs) coletam, pré-processam e transferem dados de dispositivos IoT e seus sensores, empregando diferentes protocolos de comunicação (geralmente sem fio), como Wi-Fi ou Bluetooth Smart. Os gateways fornecem tradução segura de protocolo entre dispositivos e a nuvem, e podem suportar tarefas como armazenamento e pré-processamento de dados, descoberta de serviços, geolocalização, verificação e cobrança. Os gateways também entregam os pedidos de atuação da nuvem para os dispositivos.
Em alguns sistemas, os próprios dispositivos podem carregar dados de detecção diretamente na nuvem e receber solicitações de atuação diretamente da nuvem - por exemplo, através de redes Wi-Fi, 3G ou 4G ou (em breve) NB-IoT (NarrowBand IoT) e 5G. Essas soluções não exigem gateways dedicados. Além disso, os próprios dispositivos geralmente atuam como gateways para outros dispositivos, possivelmente formando topologias de rede peer-to-peer ou mesh através da conectividade da rede local.
A Nuvem
Cloud computing (computação em nuvem) e as soluções de armazenamento e análise baseadas em nuvem são fundamentais para a maioria das plataformas IoT. Na arquitetura genérica de end-to-end (ponta a ponta), a nuvem desempenha três papéis principais.
O primeiro é a aquisição de dados, armazenamento e acesso. Uma funcionalidade fundamental nos sistemas IoT é a coleta e armazenamento de dados gerados pelos sensores. Os sensores de IoT geralmente coletam um grande volume de dados e estes devem ser armazenados na nuvem para eventual processamento e análise. As soluções nesta área vão desde bancos de dados simples a clusters de armazenamento amplamente replicáveis, tolerantes a falhas e escaláveis. As APIs de consulta e notificação para acessar os dados coletados também são fornecidas.
O segundo papel é a análise de dados. Isso se refere ao exame, conexão e transformação de dados proveniente de sensores de forma a descobrir e apresentar informações úteis, como por exemplo, para prover o compartilhamento de informações remotas e auxiliar na tomada de decisões. A análise em tempo real refere-se a funções de análise que são executadas imediatamente após o recebimento dos dados. Análise off-line se referem a operações em lote (batch) que ocorrem após o armazenamento de um grande conjunto de dados. Tecnologias de algoritmo, aprendizado de máquina e mineração de dados são importantes nesta área.
O terceiro papel é o suporte de atuação. Os fluxos de dados do sistema IoT não são apenas unidirecionais. Além da coleta de dados do sensor de dispositivos para a nuvem, é importante a capacidade de atuação segura do dispositivo através da nuvem. As capacidades de atuação são um facilitador fundamental para a programação remota do dispositivo.
Além disso, uma solução em nuvem que suporta o IoT geralmente inclui funções administrativas, como gerenciamento de dispositivos, gerenciamento de contas de usuários, registro de uso, monitoramento de status do servidor e recursos de relatórios.
O Roteiro
Acreditamos que o futuro da IoT reside na capacidade de orquestrar e programar de forma remota as grandes e complexas topologias dos dispositivos de IoT. Como argumentou Bill Wasik, uma vez que os dispositivos estão conectados a nuvens públicas ou privadas e que o fluxo de dados dos sensores e a capacidade de atuação nestes dispositivos esteja amplamente disponível, o foco passará da coleta e análise de dados dos sensores para a possibilidade de se programar aplicativos que manipulam sistemas complexos do mundo real12. Os recursos de atuação oferecidos pelos dispositivos IoT formam a fundação para toda esta mudança, pois nos permitem comandar e controlar os objetos em nossos arredores (e potencialmente em todo o planeta) a partir do conforto de um ambiente de programação e de nossos aplicativos.
Como mencionamos anteriormente, os avanços de hardware direcionarão a transição para o mundo programável. O avanço tecnológico do hardware e o custo de dispositivos de IoT estão rapidamente chegando a um ponto de inflexão no qual em breve poderemos executar sistemas operacionais completos, como por exemplo o Linux, stacks de software de forma virtualizada e até runtimes de linguagens dinâmicas em quase qualquer tipo de dispositivo. Os chips de baixo custo, que recentemente se tornaram disponíveis, já são iguais ou ou superiores em relação a memória e poder de processamento dos telefones celulares no final da década de 1990 - época do surgimento da plataforma Java 2, a Micro Edition13, marco inicial da revolução do aplicativo móvel. Desta forma, acreditamos que em breve estarão disponíveis em nossos dispositivos IoT um ambiente de programação multi-plataforma similares ao Java 2.
Outra tendência importante que impulsiona a indústria em relação ao mundo programável é a edge computing (computação de fronteira ou borda). Os sistemas clássicos de computação em nuvem são altamente centralizados. Embora a computação centralizada tenha benefícios significativos, pode ser dispendiosa em termos de comunicação e consumo de energia. Considere um ambiente IoT consistindo de uma grande coleção de dispositivos próximos uns dos outros. Pode ser ineficiente transmitir os dados a serem processados desses dispositivos para datacenter remoto e, em seguida, transmitir os pedidos de atuação de volta do datacenter para os dispositivos. Em uma implantação IoT com requisitos de latência restritos, a sobrecarga de latência por si só pode tornar tais soluções impraticáveis.
O termo "edge computing" (computação de fronteira) foi cunhado em 2002 e foi originalmente associado à implantação de aplicativos em redes de entrega de conteúdo (CDNs). O objetivo principal era se beneficiar da proximidade de servidores de borda CDN para melhorar a escalabilidade e menor latência. As soluções IoT de computação de borda utilizam a borda da rede (geralmente dispositivos de gateway, como roteadores ou estações base) para computação, por exemplo, para pré-processar dados de sensores, disparar alertas e solicitações de atuação localmente com base em critérios pré-definidos. Tais sistemas podem beneficiar de tecnologias de conectividade locais (por exemplo, Bluetooth Smart ou Wi-Fi Direct) para permitir a comunicação direta, de forma eficiente e descentralizada entre os dispositivos sensores. As tecnologias de virtualização também desempenham um papel central na ativação da migração de computação entre dispositivos.
A Tabela 1 apresenta nosso roteiro que prevê como os sistemas IoT evoluirão nos próximos 10 anos, tanto do pontos de vista de dados quanto de programação. A tabela é baseada em:
- Tendências observadas na indústria e na academia, refletindo teses recentes, trabalhos acadêmicos e livros publicados1,5,7,10,11,14,15;
- Opiniões de especialistas baseadas em experiências práticas de desenvolvimento de produtos e protótipos tanto na indústria quanto na academia2,3;
- experiência pessoal e observações anteriores proveniente da revolução dos mobileapps, à medida que os telefones celulares evoluíram de dispositivos fechados e centrados na voz para smartphones de aplicativos13; e
- experiência pessoal e observações anteriores da evolução da web, a partir de um ambiente de distribuição de documentos simples para uma plataforma que suporta um rico desenvolvimento de aplicativos e um deploys em escala mundial de forma instantânea16.
(Clique para na imagem para ampliar)
Como nosso foco é principalmente em relação aos aspectos relacionados a programação, na sequência do artigo mergulharemos mais profundamente nos desafios relacionados à programação.
Basicamente, esperamos que os recursos de programação da IoT evoluam a partir de recursos de atuação simples, aplicativos específicos do fornecedor, APIs de dispositivos e aquisição e processamento de dados centrados na nuvem, para sistemas que ampliem a computação, virtualização e os contêineres na ponta das redes. Estes sistemas suportarão o desenvolvimento de aplicações portáveis e independentes de fornecedor e indústria. Eles também permitirão, quando necessário, a migração flexível de computação e dados entre a nuvem e dispositivos de borda heterogêneos. Nós denominamos as próximas fases da evolução dos sistemas IoT como a Era Edge IoT ou a Era do IoT Universal.
É discutível se somente uma uma API abrangerá dispositivos IoT de domínios totalmente diferentes e proveniente de mercados verticais. No entanto, é seguro prever que em 5 a 10 anos, os dispositivos IoT e suas API terão convergido significativamente. Também é impraticável que as pessoas sejam obrigadas a utilizar um app específico para cada fornecedor e para cada dispositivo. Além disso, é provável que a infraestrutura necessária para esta mudança cresça em torno da rede IP e da web, contudo, a web ainda necessita ser aprimorada de forma a suportar tecnologias de conectividade locais de forma a abranger a computação de ponta.
O que torna o desenvolvimento para IoT diferente
São sete os pontos que diferem desenvolvimento do IoT do desenvolvimento de aplicativos móveis e do desenvolvimento web client-side. Essas diferenças são fundamentais para as implicações e os desafios técnicos que serão apresentados.
Primeiro, os dispositivos IoT são quase sempre parte de um sistema maior de dispositivos, por exemplo, uma instalação de dispositivos interoperantes em uma casa, um escritório, uma fábrica, um shopping center ou um avião. Além disso, os dispositivos IoT geralmente são apenas uma pequena parte da arquitetura de end-to-end que discutimos anteriormente. É fato que, PCs e smartphones também possuem uma grande dependências em serviços baseados em nuvem. No entanto, do ponto de vista do desenvolvedor do aplicativo, eles ainda são principalmente dispositivos isolados (standalone), com o desenvolvedor programando para um único computador ou smartphone.
Em segundo lugar, os sistemas IOT nunca dormem. PCs, smartphones e outros dispositivos de computação autônomos podem ser vistos como sistemas "rebootables" (reiniciáveis) que podem e serão reiniciados quando as coisas irem mal. Em contraste, os sistemas IOT geralmente não devem ou não podem ser encerrados na sua totalidade. Embora os dispositivos individuais possam ser desligados, todo o sistema de IoT deve ser resiliente para interrupções de serviço nos dispositivos e redes.
Em terceiro lugar, sistemas de IoT são mais parecidos com um rebanho do que com um único animal de estimação. O número de unidades de computação (dispositivos ou CPUs) nos sistemas IoT usualmente é dramaticamente maior do que nos ambientes de computação tradicionais, potencialmente alcançando centenas, milhares ou mesmo milhões de dispositivos. Ao contrário das PCs e smartphones, sistemas em que os usuários os tratam quase como animais de estimação, os dispositivos de um grande sistema de IoT são mais parecidos com um rebanho, pois devem ser gerenciados em massa ao invés de receber atenção e cuidados individuais.
Em quarto lugar, dispositivos IoT são muitas vezes incorporados em nossos ambientes, de modo que sejam fisicamente invisíveis e inalcançáveis. Os dispositivos podem estar permanentemente no subsolo ou incorporados fisicamente em vários materiais (por exemplo, sensores de vibração em equipamentos de mineração). Pode ser impossível conectar cabos físicos a esses dispositivos ou substituir hardware ou software embarcado para tentar solucionar eventuais problemas.
Em quinto lugar, os sistemas IoT são extremamente heterogêneos. Suas unidades de computação podem variar drasticamente em relação a poder de computação, recursos de armazenamento, largura de banda de rede e requisitos de energia. Além disso, também podemos encontrar uma ampla gama de mecanismos de I/O, funcionalidades dos sensores e modalidades de input (entrada) disponíveis. Alguns dispositivos possuem botões físicos e visores, enquanto muitos dispositivos não possuem nenhuma interface de usuário visível.
O sexto ponto é que sistemas IoT tendem a possuir uma conectividade fraca, com conexões de rede intermitentes e muitas vezes pouco confiáveis. Do ponto de vista do desenvolvedor de software, esse ambiente impõe a necessidade de se preparar constantemente para a falha. As aplicações com um tratamento de erros precário provavelmente serão bloqueadas durante uma interrupção do dispositivo ou da rede, por exemplo esperando infinitamente por um pacote de resposta ou memória, energia ou qualquer outro recurso.
Por fim, as topologias do sistema IoT podem ser dinâmicas e efêmeras. Por exemplo, plantas de fábrica podem ter uma multiplicidade de peças de equipamentos constantemente em movimento com capacidades de detecção. Ou ainda elas podem produzir produtos (ou partes) que permanecem no perímetro da fábrica apenas de forma transitória. Estes exemplos, combinados com um grande número de dispositivos, exigirão tecnologias de implantação e programação que possam lidar com a mudança dinâmica de "enxames" (swarms) de dispositivos.
Além dessas diferenças básicas, muitas questões adicionais surgem da relativa imaturidade do sistemas de IoT. Para ilustrar estas questões, detalharemos dois exemplos:
Primeiro, os sistemas IoT de hoje possuem APIs para desenvolvimento imaturas incompatíveis. APIs de desenvolvimento comuns a toda indústria ainda não foram desenvolvidas. Ao contrário do desenvolvimento de aplicativos para aplicativos móveis e web, em que já houve uma convergência significativa, As APIs da IoT ainda tendem a ser específicas para cada fornecedor e para cada hardware. Contudo, vários esforços de padronização estão em andamento, por exemplo Industrial Internet Consortium, IPSO Alliance, Open Connectivity Foundation (antigamente denominada Open Interconnect Consortium), e a Open Mobile Alliance. No entanto, estas iniciativas de padronização ainda levarão vários anos para alcançar o consenso e a maturidade.
Além disto, os sistemas IoT atuais estão centrados na nuvem, ou seja, quase todos os dados são coletados e armazenados na cloud e a maioria das computações ou ações nos dados coletados também ocorrem no lado da nuvem. No entanto, à medida que os dispositivos e gateways IoT se tornam mais robustos, a computação pode ocorrer em vários locais: dispositivos, gateways ou a nuvem. O comportamento ideal do sistema IoT dependerá da sua capacidade de migrar a computação e os dados de forma flexível para os dispositivos nos quais os cálculos fazem mais sentido em um determinado momento.
Implicações e Desafios para o Desenvolvimento de Software
Para resumir as diferenças que acabamos de apresentar, os desenvolvedores de IoT devem considerar várias dimensões que não são familiares para a maioria dos desenvolvedores de aplicativos para dispositivos móveis e web (client side), incluindo:
- Programação multi dispositivo;
- A natureza reativa e sempre online dos sistemas;
- Heterogeneidade e diversidade;
- A natureza distribuída, altamente dinâmica e potencialmente migratória do software; e
- O requisito primordial de se escrever software de forma defensiva e tolerante a falhas.
Uma aplicação IoT típica é contínua e reativa. Com base nas leituras observadas dos sensores, os cálculos são disparadas e eventualmente resultam em vários eventos que geram algum tipo de ação. Os programas são essencialmente assíncronos, paralelos e distribuídos.
Estritamente falando, essas características não são novas no desenvolvimento de software. Qualquer desenvolvedor que criou software para sistemas distribuídos ou de missão crítica é pelo menos um pouco familiarizado com os desafios decorrentes dessas características. Os desenvolvedores do software de backends de cloud distribuídos em cluster também enfrentam esses mesmos desafios.
Falácias da Computação Distribuída
No entanto, com base em nossa experiência, acreditamos que o desenvolvedor de aplicações Web e Mobile não estão preparados para enfrentar os desafios do desenvolvimento de sistemas de IoT. Como L. Peter Deutsch e James Gosling apropriadamente resumiram no seu artigo "Falácias da Computação Distribuída", invariavelmente, programadores possuem oito suposições falsas quando escrever software para sistemas distribuídos pela primeira vez 17:
- A rede é confiável;
- A latência é zero;
- A largura de banda é infinita;
- A rede é segura;
- A topologia não muda;
- Existe somente um administrador;
- O custo de transporte é zero.
A falta de consideração desses falsos pressupostos resultará em vários tipos de erros - por exemplo, sockets abertos que escutam dispositivos que não estão mais presentes, assumir respostas imediatas ou aguardar infinitamente pacotes de resposta, ou ainda consumindo memória e baterias desnecessariamente. Como Leslie Lamport escreveu, em um sistema distribuído, "o fracasso de um computador que você nem sabia que existe pode tornar seu próprio computador inutilizável" 18.
Dito isto, existe o perigo de que os desenvolvedores terão que escrever muito código para lidar com qualquer potencial erro e exceção. Isso poderia enterrar a lógica do programa real em milhares de linhas de código de controle de erros, tornando os programas muito mais difíceis de serem mantidos e compreendidos. Portanto, um grande desafio no desenvolvimento do IoT é alcançar o equilíbrio adequado entre a lógica da aplicação e o tratamento de erros. Idealmente, as linguagens e ferramentas de desenvolvimento devem auxiliar o desenvolvedor, de forma que o código de manipulação de erros não torne incompreensível a lógica do programa.
Em geral, os custos ocultos de construção e manutenção de software para sistemas distribuídos são quase sempre subestimados. De acordo com estudos, as atividades de verificação, testes e validação podem representar até 75% dos custos totais de desenvolvimento19.
Linguagens e ferramentas inadequadas
As linguagens de programação e as ferramentas utilizadas para o desenvolvimento do IoT são, em grande parte, as mesmas usadas para o desenvolvimento de aplicativos mobile e web Por exemplo, os kits de ferramentas de desenvolvimento de software para as populares placas de desenvolvimento do IoT como Arduino, Espruino, Edison e Galileo da Intel e Tessel, oferecem a escolha entre as linguagens C, C #, Java, JavaScript ou Python.
Indo contra todas as probabilidades, JavaScript e Node.js (a versão do lado do servidor do JavaScript) estão se tornando ferramentas centrais para o desenvolvimento do IoT devido a sua popularidade no desenvolvimento web. Contudo, esta é uma escolha infeliz pois o JavaScript não foi projetado para escrever aplicativos assíncronos e distribuídos. Recentemente, a expressão "callback hell" tornou-se popular em programas escritos em JavaScript pois caracteriza situações nas quais a lógica da aplicação se torna impossível de entender, devido ao número de chamadas de função assíncronas e funções de gerenciamento de eventos utilizadas para a lidar com eventos de sucesso e manipulação de erros (Veja, por exemplo, Callback Hell).
As atuais linguagens populares de desenvolvimento IoT também não abordam os aspectos de programação em larga escala, pois elas não provêm mecanismos de orquestração de sistemas para milhares de dispositivos e nem permitiriam que o código migre com flexibilidade entre a nuvem, gateways e os dispositivos.
A natureza dinâmica dos sistemas de IoT
De forma geral, o desenvolvimento de software se tornou muito mais ágil e dinâmico nos últimos 10 a 15 anos. A maioria dos aplicativos está conectado a serviços back-end. Linguagens de programação dinâmicas, como JavaScript e Python, ganharam popularidade. O surgimento da World Wide Web permitiu o deploy instantânea de software de qualquer lugar do mundo. Os desenvolvedores esperam poder atualizar suas aplicações em um ritmo drasticamente mais rápido do que a 10 anos atrás - e muitas muitas vezes, várias atualizações por hora. O modelo de desenvolvimento e deploy do DevOps20 substituiu a maioria das práticas anteriores de software, automatizando a entrega de software e infraestrutura.
Embora esses avanços tenham beneficiado a indústria de software, a natureza extremamente dinâmica dos sistemas IoT apresenta desafios adicionais. Por exemplo, depurar (debugging) e testar sistemas IoT pode ser um grande desafio dado o grande número de dispositivos, as topologias dinâmicas, a conectividade não confiável e a heterogeneidade dos dispositivos.
Embora um dispositivo IoT individualmente possa ser facilmente testado pois possui funcionalidades limitada de coleta de dados, o teste de um sistema inteiro composto por centenas ou milhares de dispositivos implantados em ambientes complexos do mundo real (fábricas, shoppings, estufas, navios, etc.) pode ser desafiador. A depuração e o teste tornam-se ainda mais complicados se o sistema puder se ajustar e equilibrar (trocar) a velocidade de computação, a latência da rede e o consumo de bateria do dispositivo ao migrar dinamicamente a computação entre a nuvem, gateways e dispositivos. Nesse caso, o comportamento do sistema pode não ser totalmente replicável para testes e depuração.
Novamente, para os desenvolvedores de software distribuído ou de missão crítica ou sistemas de automação de processos, esses desafios não são necessariamente novos. No entanto, a grande maioria dos desenvolvedores de aplicações web e de aplicações para dispositivos móveis não enfrentaram tais desafios e, portanto, provavelmente subestimam o esforço e os potenciais problemas associados à depuração e teste destes sistemas.
Olhando para frente, mas atento às lições do passado
As observações e os desafios apresentados revelam que o surgimento do mundo programável exigirá muito mais do que apenas um novo desenvolvimento de hardware, novos protocolos e tecnologias de comunicação ou ainda novas técnicas para analisar enorme conjuntos de dados. Para aproveitar todo o poder do mundo programável, precisaremos de novas tecnologias, processos, metodologias, abstrações e ferramentas de engenharia e desenvolvimento de software. Experiências anteriores e tecnologias existentes para o desenvolvimento de sistemas distribuídos e software de missão crítica desempenham um papel importante na redução do trabalho duplicado e na reinvenção da roda. Em grande parte, os desafios precisam ser abordados educando os desenvolvedores de software para perceber que o desenvolvimento do IoT realmente difere do desenvolvimento de aplicativos para dispositivos móveis e de aplicativos do web do lado cliente.
Segurança
Um dos maiores desafios para a efetivação do mundo programável é a segurança. O gerenciamento remoto de instalações complexas de dispositivos IoT em ambientes como fábricas, usinas de energia ou plataformas de petróleo exige, obviamente, a máxima atenção à segurança. Os recursos de atuação e programação remota podem representar riscos importantes de segurança. Protocolos de criptografia para a segurança da camada de transporte, certificados de segurança, isolamento físico e outras práticas industriais estabelecidas desempenham um papel fundamental nessa área, mas ainda existem vários desafios técnicos interessantes. No entanto, talvez na prática o risco de segurança mais significativo seja que milhares de dispositivos IoT ainda tenham suas configurações de segurança padrão, muitas vezes com a senha de administrador padrão. Na Finlândia, já ocorreram incidentes em que os sistemas de aquecimento de blocos de apartamentos inteiros foram desligados remotamente porque seus sistemas de controle foram deixados expostos a ataques baseados na Internet.
Discussão
Até o presente momento, os recursos de programação dos sistemas IoT são em sua maioria apresentados na forma de aplicativos personalizados de diferentes fabricantes para controlar equipamentos específicos de seus ecossistemas. Por exemplo, as lâmpadas Philips podem ser controladas com o aplicativo Philips Hue, enquanto a GE e o Cree fornecem aplicativos diferentes para seus sistemas de iluminação. Do mesmo modo, os sistemas de ar condicionado, sistemas de segurança, sistemas de controle de mídia doméstica e aplicativos de controle remoto de carro de diferentes fabricantes normalmente exigem aplicativos distintos. A abordagem "aplicação separada para cada coisa" não escala bem e é apenas uma solução temporária até que os padrões da indústria sejam definidos.
Nós prevemos nos próximos anos uma mudança na maneira que desenvolvemos soluções de IoT. Até o momento, não existem ambientes de desenvolvimento de software universalmente interoperáveis que permitam aos desenvolvedores escreverem sem esforço, um aplicativo IoT capaz de ser executado em todos os tipos de dispositivos, e muito menos existe uma forma de se orquestrar e gerenciar topologias grandes e complexas de instalações heterogêneas de tais dispositivos. A falta de tais ferramentas reflete a imaturidade e a fragmentação do mercado IoT, bem como as limitações técnicas dos dispositivos - por exemplo, CPUs com capacidade restrita ou a incapacidade de atualizar o software sem conectar cabos físicos aos dispositivos. As máquinas virtuais, os ambientes de execução de linguagens dinâmicas e as técnicas de software "líquido" desempenharão um papel fundamental tornando possível transferir dados e computação de forma flexível entre dispositivos. (Um software líquido funciona perfeitamente em vários dispositivos de propriedade de um ou mais usuários.) O software binário tradicional e os kits de desenvolvimento específicos de hardware IoT estão em desvantagem significativa se o mesmo código deve ser executado (ou adaptável à execução) em uma ampla gama de dispositivos.
O mundo programável apresenta emocionantes oportunidades e desafios. Esperamos que este artigo - e particularmente o nosso roteiro - inspire e incentive as pessoas a trabalharem arduamente nesta área.
Agradecimentos
A Academy of Finland (projeto 295913), Mozilla e Nokia Technologies apoiaram esta pesquisa.
Referências Bibliográficas
1. R. Stackowiak et al., Big Data and the Internet of Things: Enterprise Information Architecture for a New Age, Apress, 2015.
2. P. Selonen and A. Taivalsaari, "Kiuas: IoT Cloud Environment for Enabling the Programmable World", Proc. 42nd Euromicro Conf. Software Eng. and Advanced Applications (SEAA 16), 2016, pp. 250-257.
3. F. Ahmadighohandizi and K. Systä, "Application Development and Deployment for IoT Devices", to be published in Proc. 4th Int'l Workshop Cloud for IoT (CLIoT 16), 2016.
4. A. Gallidabino et al., "On the Architecture of Liquid Software: Technology Alternatives and Design Space", Proc. 13th Working IEEE/IFIP Conf. Software Architecture (WICSA 16), 2016;
5. J. Miranda et al., "From the Internet of Things to the Internet of People", IEEE Internet Computing, vol. 19, no. 2, 2015, pp. 40-47.
6. "Internet of Things History", Postscapes, 2014;
7. A. Al-Fuqaha et al., "Internet of Things: A Survey on Enabling Technologies, Protocols, and Applications", IEEE Communications Surveys / Tutorials, vol. 17, no. 4, 2015, pp. 2347-2376.
8. "IoT Cloud Platform Landscape", Postscapes, 2016;
9. G. Moore, Crossing the Chasm: Marketing and Selling Disruptive Products to Mainstream Customers, 3rd ed., HarperBusiness, 2014.
10. O. Said and M. Masud, "Towards Internet of Things: Survey and Future Vision", Int'l J. Computer Networks, vol. 5, no. 1, 2013, pp. 1-17.
11. J. Gubbi et al., "Internet of Things (IoT): A Vision, Architectural Elements, and Future Directions", Future Generation Computer Systems, vol. 29, no. 7, 2013, pp. 1645-1660.
12. B. Wasik, "In the Programmable World, All Our Objects Will Act as One", Wired, 14 May 2013;
13. R. Riggs, A. Taivalsaari, and M. VandenBrink, Programming Wireless Devices with the Java 2 Platform, Micro Edition, Addison-Wesley, 2001.
14. S. Greengard, The Internet of Things, MIT Press, 2015.
15. N. Balani, Enterprise IoT: A Definitive Handbook, CreateSpace, 2015.
16. D. Ingalls et al., "The Lively Kernel: A Self-Supporting System on a Web Page", Self-Sustaining Systems, LNCS 5146, Springer, 2008, pp. 31-50.
17. A. Rotem-Gal-Oz, "Fallacies of Distributed Computing Explained";
18. L. Lamport, Distribution, 28 May, 1987;
19. J.-C. Laprie, "Dependable Computing: Concepts, Limits, Challenges", Proc. 25th IEEE Int'l Symp. Fault-Tolerant Computing, 1995, pp. 42-54.
20. P. Debois, "DevOps: A Software Revolution in the Making?", Cutter Business Technology J., 30 Aug. 2011;