Artigo
· Jun. 10, 2023 9min de leitura

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"

https://www.youtube.com/embed/8WfRcnF4iZI
[Isso é um link incorporado, mas você não pode ver conteúdo incorporado diretamente no site, porque recusou os cookies necessários para acessá-lo. Para ver o conteúdo incorporado, você precisa aceitar todos os cookies nas suas Definições de cookies]

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(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 😂

Discussão (4)1
Entre ou crie uma conta para continuar