Limpar filtro
Artigo
Henrique Dias · Jun. 10, 2023
20 anos.
Agora em 2023 eu completo 20 anos trabalhando com tecnologia, desenvolvendo sistemas, implementando, criando novas soluções e posso afirmar que trabalhar com tecnologia InterSystems fez e faz parte da minha vida. Afinal, foram 18 anos trabalhando todos os dias com essa tecnologia.
Comecei a trabalhar com o Caché 4, lá atrás em 2003, vivenciei as mudanças para o Caché 5, Caché e Ensemble 2008, 2010, 2012, 2014, 2017, 2018 e até finalmente chegarmos no InterSystems IRIS.
A evolução da plataforma é algo notável e sempre trouxe mais robustez, flexibilidade e estabilidade para nós desenvolvedores.
Sempre fui apaixonado pela facilidade de desenvolver um sistema com a plataforma InterSystems e como conseguia obter excelentes resultados em performance e velocidade de implementação com uma tecnologia que poucas pessoas conheciam.
Agora em 2023, no "meu aniversário" de 20 anos trabalhando com tecnologia, a InterSystems completa 45 anos!
E quando vejo como a InterSystems evoluiu e onde ela está agora, fico muito feliz de ter conseguido vivenciar e experimentar a evolução dessa tecnologia.
Mas, em contrapartida, são 45 anos e já encontrei muita gente utilizando a tecnologia da mesma forma que se desenvolvia sistemas, utilizava o banco de dados como a 45, 40 anos atrás! Não evoluíram o desenvolvimento ao longo dos anos, continuavam/continuam desenvolvendo como na época do meu saudoso Caché 4 ou até mesmo antes disso.
Então, sempre que ouviam falar de Caché, torciam o nariz e menosprezam o sistema. Mesmo sendo o sistema com maior estabilidade, velocidade e escalabilidade nas empresas.
E para eles, o Caché/MUMPS que era um sucesso no passado, passou a ser muito mal visto. E até me lembra um trecho do filme do Batman Dark Knight:
"You Either Die a Hero, or You Live Long Enough To See Yourself Become the Villain"
Eu costumo dizer que nessas empresas eles tem uma Ferrari nas mãos, mas só sabem andar de 1a e 2a marcha hehehe
E isso me traz para um segundo ponto.
A falta de conhecimento fez com que esses desenvolvimentos ficassem parados no tempo. Fez com que uma tecnologia que vem sendo evoluida continuamente não fosse aproveitada em seu potencial máximo.
E o mais agravante, como você consegue ter uma equipe especializada em uma tecnologia que não é muito conhecida?
Quantos estagiários saem da faculdade conhecendo de InterSystems IRIS, sabendo o que é uma global, entendendo como fazer uma integração no Ensemble?
Para que você possa trocar a marcha da sua Ferrari, é preciso focar na capacitação do seu time, é preciso fomentar e formar novos talentos e ensinar sobre a arquitetura do seu sistema.
E trago aqui um reforço na importância que é a capacitação da sua equipe.
Um estudo do Google aponta exatamente a falta de mão de obra qualificada na área de TIGoogle for Startups: para 92% das empresas entrantes faltam profissionais de TI no Brasil
É formando pessoas capacitadas que você consegue evoluir sua equipe, seu produto.
Seria ingenuidade da nossa parte pensar em substituir sistemas que veem sendo desenvolvidos ao longo de anos. A evolução do sistema, uma melhoria gradual e continua é muito mais aconselhavel do que um "RIP and Replace".
Por esses motivos que o "onboarding" de novos desenvolvedores é fundamental. Entender o conceito por trás do Caché/IRIS e conseguir fazer com que a curva de aprendizado seja a menor possível.
Sendo assim, eu (Henrique), prefiro ensinar o básico antes de sair ensinando as maiores novidades da plataforma.
Com isso sempre em mente, fiz a iniciação ao mundo InterSystems de muitos filhos estagiários, que se tornaram profissionais excelentes, sem nunca sequer ter ouvido falar de InterSystems ou o que era uma global na faculdade 😂
Para essa "iniciação", quero destacar alguns conceitos e funções básicas que serão muito úteis no dia a dia.
Introdução as Globais segundo a documentação oficial:
InterSystems IRIS suporta um tipo especial de variável que não é vista em outras linguagens de programação; esta é a variável global, que geralmente é simplesmente chamada de global. No InterSystems IRIS, o termo global indica que esses dados estão disponíveis para todos os processos que acessam este banco de dados. Este uso é diferente de outras linguagens de programação nas quais global significa "disponível para todo o código neste módulo". O conteúdo de um global é armazenado em um banco de dados InterSystems IRIS.
No InterSystems IRIS, um banco de dados contém globais e nada mais; até mesmo o código é armazenado em globais. No nível mais baixo, todo acesso a dados é feito através de acesso global direto — isto é, usando comandos e funções que trabalham diretamente com globais.
Tentando facilitar o entendimento para quem veem de uma estrutura mais "relacional", podemos dizer que global seria o equivalente a uma tabela.
E na representação abaixo, estamos definindo o nome de um cliente na "tabela" hero
set ^hero(1)="Tony Stark~Armor~29/05/1970"
set ^hero(2)="Steve Rogers~Shield~04/07/1920"
Se compararmos a estrutura da global acima com uma tabela relacional, esta seria o que o seu "SELECT * FROM hero" retornaria
No exemplo da global acima, ^hero é uma global, enquanto 1 e 2 são subscritos que especificam entradas individuais nessa global. Aqui, ^hero(1) se refere a "Tony Stark" e ^hero(2) a "Steve Rogers".
As globais podem também ter múltiplos níveis de subscritos, como mostrado no exemplo a seguir:
set ^hero(1,"codename")="Iron Man"
set ^hero(1,"power")="flight"
set ^hero(2,"codename")="Captain America"
set ^hero(2,"power")="superStrength"
Neste exemplo, conseguimos ver que cada hero tem seu codename em um subscrito relacionado.
A estrutura flexivel das globais, pode até mesmo ser descrita como o JSON a seguir
[
{
"id": 1,
"codename": "Iron Man",
"power": "flight"
},
{
"id": 2,
"codename": "Captain America",
"power": "superStrength"
}
]
Índices no InterSystems IRIS
Índices são estruturas de dados que permitem acesso rápido a informações específicas em um global. Em bancos de dados relacionais, um índice é criado em uma coluna de uma tabela para acelerar consultas que envolvem essa coluna. No IRIS, um índice é uma estrutura de dados criada em um global.
Veja um exemplo de como um índice pode ser definido:
set ^heroIdx("power","flight",1)=""
set ^heroIdx("power","superStrength",2)=""
Aqui, ^heroIdx é um índice que permite que você encontre rapidamente todos os heroes com um determinado poder.
Para completar esse InterSystems IRIS express overview, trago uma lista de funções úteis para lidar com a maravilhosa estrutura multidimensional.
Funções de String: O ObjectScript tem várias funções para manipulação de strings, incluindo:
$GET(variable,[defaultValue]): Se a variável ou a localização do array especificada existir, $GET retornará seu valor. Se não existir, $GET retornará um valor padrão, se fornecido, ou uma string vazia.
$LENGTH(string,[delimiter]): Retorna o número de caracteres em uma string, ou o número de substrings delimitadas.
$EXTRACT(string,start,[end]): Retorna uma substring de uma string.
$PIECE(string,delimiter,[start,[end]]): Retorna uma substring de uma string dividida por um delimitador.
Funções de Data e Hora: ObjectScript fornece funções para manipulação de datas e horas, incluindo:
$HOROLOG: Retorna a data e a hora atuais como um valor $H.
Curiosidade: A função $HOROLOG retorna a data e a hora atual no formato $HOROLOG.
O formato $HOROLOG é uma representação numérica do tempo na seguinte forma: dias,segundos, onde dias é o número de dias desde 31 de dezembro de 1840, e segundos é o número de segundos desde a meia-noite do dia atual. Por exemplo, $HOROLOG pode retornar 63940,71700, o que representaria a data e a hora no momento da execução da função.
$ZDATETIMEH(datetime): Converte uma data e hora do formato $H para o formato ODBC.
$ZDATEH(date): Converte uma data do formato $H para o formato ODBC.
Funções de Manipulação de Globais: ObjectScript tem várias funções para trabalhar com globais, como:
SET ^global(subscript)=value: Define o valor de um global.
KILL ^global(subscript): Remove um global ou uma parte de um global.
$DATA(^global(subscript)): Verifica a existência de um global e se ele tem algum valor.
Funções de Manipulação de Listas: As funções de lista incluem:
$LISTBUILD(element1,[element2,...]): Cria uma lista de elementos.
$LISTLENGTH(list): Retorna o número de elementos em uma lista.
$LISTGET(list,index): Retorna o valor de um elemento em uma posição específica em uma lista.
Se você chegou até aqui e ficou se perguntando que tipo de casos de uso, InterSystems IRIS pode ajudar a resolver no seu projeto, sistema, empresa, eu digo para você que todos.
A arquitetura que podemos usar com globais faz com que a forma de encarar determinadas situações possam ser simplificadas, aumentando performance, reduzindo tempo de desenvolvimento.
Como nessa questão trazida pelo meu amigo Henry.
https://community.intersystems.com/post/hierarchical-queries
A solução proposta pelo Timothy é elegante
Class DC.Demo.Hierarchy Extends %Persistent [ MemberSuper = AppS.Index.Methods ]
{
Property message As %String;
Property login As %String;
Property parentId As DC.Demo.Hierarchy [ SqlFieldName = parent_id ];
Index parentId On parentId [ Type = bitmap ];
ClassMethod RunDemo()
{
Do ..%KillExtent()
&sql(insert into DC_Demo.Hierarchy (message, login, parent_id)
values ('Bacon ipsum dolor amet pork shoulder ribs', 'User 1', null))
&sql(insert into DC_Demo.Hierarchy (message, login, parent_id)
values ('BGouda croque monsieur emmental.', 'User 2', 1))
&sql(insert into DC_Demo.Hierarchy (message, login, parent_id)
values ('Manchego fromage frais airedale', 'User 3', 2))
Do ##class(%SQL.Statement).%ExecDirect(,
"select id, message, parent_id from DC_Demo.Hierarchy "_
"where id %FIND DC_Demo.Hierarchy_parentIdFind(2,'all descendants')").%Display()
Do ##class(%SQL.Statement).%ExecDirect(,
"select id, message, parent_id from DC_Demo.Hierarchy "_
"where id %FIND DC_Demo.Hierarchy_parentIdFind(3,'all related')").%Display()
}
}
No entanto, caso estivessemos olhando para um modo de desenvolvimento com globais ao invés da estrutura mais relacional, nosso resultado mais simples.
^messages(idMensagem) = "Bacon ipsum dolor amet pork shoulder ribs"
^messages(idMensagem,idParent) = "Gouda croque monsieur emmental."
^messages(idMensagem,idParent) = "Manchego fromage frais airedale"
Com isso, conseguiriamos recuperar facilmente os itens ordenando pela ordem do "parent id". Simples e eficaz.
Nesses 45 anos, conseguimos muitas melhorias, uma evolução constante em arquitetura, performance, features e muito mais. E nessa linha evolutiva constante, temos também a possibilidade de utilizar agora diferentes linguagens e não apenas ObjectScript.
Embedded Language Development
Você pode agora usar diferentes linguagens e trabalhar com a plataforma InterSystems, seja utilizando Python, .Net, Noje.js, ou até mesmo Java (tem gosto para tudo 😂)
E para encerrar deixo aqui dessa flexibilidade com um exemplo de Embedded Python.
Embedded Python
Class User.EmbeddedPython
{
/// Description
ClassMethod Test() As %Status [ Language = python ]
{
# print the members of the Fibonacci series that are less than 10
print('Fibonacci series:')
a, b = 0, 1
while a < 10:
print(a, end=' ')
a, b = b, a + b
# import the iris module and show the classes in this namespace
import iris
print('\nInterSystems IRIS classes in this namespace:')
status = iris.cls('%SYSTEM.OBJ').ShowClasses()
return status
}
}
Se você não morreu de tédio lendo esse texto, te convido para dar um like no artigo e mandar esse texto para os seus estagiários, ou mesmo para aqueles que ainda usam a plataforma como há 40 anos atrás 😂 Parabéns Henrique pela postagem!
Sempre temos o desafio de explicar a tecnologia, principalmente em projetos integrados com outras linguagens onde enxergam o IRIS como uma tecnologia "alienígena"!
Esse é um ótimo post para usar como apresentação!
Excelente artigo Henrique, parabéns!!! Realmente o IRIS é uma tecnologia extremamente potente e pouco aproveitada. Só acho que a Intersystems poderia divulgar mais a tecnologia com cursos mais acessíveis nas empresas, escolas técnicas, universidades. @Felipe.Carvalho muito obrigado! 😃
Acho que todos nós que trabalhamos com tecnologia InterSystems temos esse desafio. Mostrar que não é um bicho de 7 cabeças, que não tem nada de alienígena numa global e que um $order não mata ninguém hahaha
E acho que o maior desafio de todos é provar que diferente do COBOL, a plataforma veio continuamente evoluindo Oi @VeraLucia.AlvesdeOliveira concordo plenamente.
Tenho esse mesmo sentimento. É uma excelente tecnologia, mas sinto muita falta dessa tecnologia não ser amplamente divulgada e difundida.
Quem sabe a gente não monta um curso no TikTok para atrair o público mais jovem? kkkkkk
Anúncio
Angelo Bruno Braga · Mar. 10, 2022
Olá Desenvolvedores !
Segue uma oportunidade para bolsas de estudo remuneradas:
Duas bolsas de estudo para área de tecnologia da informação:• Valor de R$ 7.373,10 durante 24 meses• https://inovahc.hc.fm.usp.br/oportunidades/• Código da vaga: HC04 Desenvolvedor• Código da vaga: HC05 Desenvolvedor Integrador
Desenvolvedor e Desenvolvedor Integrador
Requisitos:
Graduação completa em Análise de Sistemas, Desenvolvimento de Sistemas, Ciências da Computação, Sistemas de Informação ou Engenharia da Computação, Elétrica, Biomédica, Informática, Estatística, Matemática, Física.
Conhecimento em Lógica de programação orientada a objeto, Programação C#, geração de relatórios, SQL (select, insert, update, procedures, funções e views), banco de dados relacional (ORACLE e MS-SQL); geração de relatório (ireport, crystal report e afins), desenvol.de produtos para área de saúde digital;
Diferenciais:
Conhecimento em TASY / MV, InterSystems Ensemble / InterSystems Caché
Técnico em informática ou sistemas da informação ou eletrônica é um diferencial.
Atribuições:
Desenvolvimento de sistemas em saúde digital para apoiar os projetos de conectividade 5G.
Desenvolver e realizar a integração das soluções c/ os sistemas legados.
Tipo de local de trabalho: híbrido (presencial e home office) Duração: até dezembro de 2023.
Os candidatos interessados deverão enviar currículo e certificados de formação citados na divulgação da vaga desejada, até o dia 17/03/22, para o e-mail rhselecao@ffm.br, mencionando no assunto o código completo da vaga.