Revendo 20 anos
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 TI
Google 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(insertinto DC_Demo.Hierarchy (message, login, parent_id)
values ('Bacon ipsum dolor amet pork shoulder ribs', 'User 1', null))
&sql(insertinto DC_Demo.Hierarchy (message, login, parent_id)
values ('BGouda croque monsieur emmental.', 'User 2', 1))
&sql(insertinto 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.
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.
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, 1while a < 10:
print(a, end=' ')
a, b = b, a + b
# import the iris module and show the classes in this namespaceimport 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 😂
Comments
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!
@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
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.
Oi @Vera Lucia Alves de Oliveira 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