Atualização de alvenaria-AR

A capacidade de comprar moedas por criptomoeda foi adicionada ao jogo Masonry-AR! Por US$ 1 você pode obter 5.000 MOS. Links de referência também foram adicionados ao jogo; para cada compra de um amigo, o indicador recebe 50.000 MOS. Detalhes no Wiki Maçônico. Também foi adicionado um modo de caminhada automática: quando não há acesso ao módulo GPS, o Mason começa a caminhar de uma das capitais do mundo automaticamente, apenas para frente.

Link do jogo:
https://demensdeum.com/demos/masonry-ar/client/

Adepto do Burro

“Donkey Adept” é uma peça impressionante e eletrizante de surrealismo pixelado. No centro está uma figura com uma jaqueta de couro preta, cuja cabeça é uma televisão em chamas e cheia de estática, com orelhas de burro em chamas. O sujeito segura uma lanterna poderosa, agindo como um sentinela solitário que busca a verdade em meio ao barulho. É uma meditação furiosa em estilo retrô sobre a mídia, a loucura e a busca incansável pela luz.

https://opensea.io/item/ethereum/0x008d50b3b9af49154d6387ac748855a3c62bf40d/5

Cube Art Project 2 online

Conheça o Cube Art Project 2 Online – Editor leve, rápido e totalmente reescrito da programação da estação, que funciona diretamente no navegador. Agora, com a possibilidade de criatividade conjunta!

Isso não é apenas uma ferramenta, mas um experimento com cor, geometria e uma criação 3D meditativa à qual você pode conectar amigos. O projeto foi criado em JavaScript Pure e três.js sem estruturas e membros da Web, demonstrando os recursos de WebGL e Shaaders.

NOVO: Multiplayer! Cooperar com outros usuários em tempo real. Todas as mudanças, a adição e coloração dos cubos são sincronizadas instantaneamente, permitindo que você crie obras -primas da estação.

Controlar:
– WASD – movendo a câmera
– Mouse – rotação
– GUI – Configurações de cores

On-line:
https://demensdeum.com/software/cube-art-project-2-online/

Fontes no Github:
https://github.com/demensdeum/cube-art-project-2-online

O projeto é escrito em JavaScript puro usando três.js.
Sem estruturas, sem colecionadores, sem o WebAssembly – apenas Webgl, Shaders e um pouco de amor pela geometria de pixels.

Donki Hills Steam

Donki Hills é um jogo de terror de comédia, uma experiência narrativa emocionante na primeira pessoa, mergulhando os jogadores em um profundo segredo com uma mistura de humor inesperado. Desenvolvido e publicado por Demensdeum no motor Unreal Engine, o jogo permite controlar James, uma pessoa comum, cuja vida dá uma virada incomum após o misterioso desaparecimento de seu conhecido online, Maria. Sua única pista é uma única foto sugerindo uma vila russa isolada chamada Quiet Donki, localizado perto de Novosibirsk. Dirigindo com uma conexão inabalável e uma necessidade desesperada de respostas (e, possivelmente, com várias risadas nervosas), James faz uma jornada épica para revelar a verdade sobre o desaparecimento de Maria.

O jogo está disponível no Steam:
https://store.steampowered.com/app/3476390/Donki_Hills/

Entropia em programação

[Complementos]

A entropia na programação é uma força poderosa, mas muitas vezes discreta, que determina a variabilidade e a imprevisibilidade do comportamento do software. De bugs simples a avós complexas, a entropia é a razão pela qual nossos programas nem sempre se comportam como esperamos.

O que é entropia no software?

A entropia no software é uma medida de resultados inesperados de algoritmos. O usuário percebe os resultados 1stti como erros ou bugs, mas do ponto de vista da máquina, o algoritmo executa exatamente as instruções que o programador estabeleceu nele. O comportamento inesperado surge devido a um grande número de combinações possíveis de dados de entrada, condições do sistema e interações.

Causas de entropia:

* Alterando o estado: quando o objeto pode alterar seus dados internos, o resultado de seu trabalho se torna dependente de todo o histórico de seu uso.

* A complexidade dos algoritmos: à medida que o programa cresce, o número de maneiras possíveis de executar o código cresce exponencialmente, o que torna quase impossível a previsão de todos os resultados.

* Fatores externos: sistema operacional, outros programas, atrasos na rede – tudo isso pode afetar a execução do seu código, criando fontes adicionais de variabilidade.

Causas de entropia:

* Alterando o estado: quando o objeto pode alterar seus dados internos, o resultado de seu trabalho se torna dependente de todo o histórico de seu uso.

* A complexidade dos algoritmos: à medida que o programa cresce, o número de maneiras possíveis de executar o código cresce exponencialmente, o que torna quase impossível a previsão de todos os resultados.

* Fatores externos: sistema operacional, outros programas, atrasos na rede – tudo isso pode afetar a execução do seu código, criando fontes adicionais de variabilidade.

Variáveis globais como fonte de entropia

Em seu trabalho, “Global Varia Bybles Conseded Liveful” (1973) W.A. Wulf e M. Shaw mostraram que as variáveis globais são uma das principais fontes de comportamento imprevisível. Eles criam vícios implícitos e efeitos colaterais difíceis de rastrear e controlar, que é uma manifestação clássica da entropia.

Leis de Leman e Entropy

A idéia de crescente complexidade dos sistemas de software formulou perfeitamente Manny Leman em suas leis de evolução do software. Dois deles refletem diretamente o conceito de entropia:

O programa de computador usado será modificado. Esta declaração sugere que o software não é estático. Ele vive, desenvolve e muda para atender a novos requisitos e meio ambiente. Cada nova “rodada” da vida do programa é uma fonte potencial de entropia.

Quando o programa de computador é modificado, sua complexidade aumenta, desde que ninguém impeça isso. Esta lei é uma conseqüência direta da entropia. Sem esforços direcionados de gerenciamento de complexidade, cada nova modificação introduz variabilidade adicional e imprevisibilidade no sistema. Existem novas dependências, condições e efeitos colaterais que aumentam a probabilidade de bugs e comportamento não obsoleto.

entropia no mundo da IA e LLM: código imprevisível

No campo da inteligência artificial e dos grandes modelos de idiomas (LLM), a entropia é especialmente aguda, pois aqui estamos lidando com algoritmos não -metâmicos. Ao contrário dos programas tradicionais, onde o mesmo acesso sempre oferece a mesma saída, o LLM pode fornecer respostas diferentes para a mesma solicitação.

Isso cria um enorme problema: a correção do algoritmo pode ser confirmada apenas em um determinado conjunto limitado de dados de entrada usando autores. Mas ao trabalhar com dados de entrada desconhecidos (solicitações dos usuários), o comportamento do modelo se torna imprevisível.

Exemplos de entropia em LLM

Vocabulário e declarações racistas e inordenadas: casos conhecidos quando os bots de bate -papo, como Tay da Microsoft ou Grok de XII, depois de treinar dados da Internet, começaram a gerar declarações ofensivas ou racistas. Este foi o resultado da entropia: dados de entrada desconhecidos em combinação com um enorme volume de amostra de treinamento levou a um comportamento imprevisível e incorreto.

Apelações ilegais: esses problemas surgem quando uma rede neural começa a emitir conteúdo que viola direitos autorais ou normas éticas.

Ai Bota nos Jogos: A introdução de personagens de IA em jogos com a possibilidade de aprender, por exemplo, em Fortnite, levou ao fato de que a IA Bot teve que ser desligada e adicionada ao rastreamento da correção da atividade, para impedir que ações ilegais do LLM Bot.

Dívida técnica: juros acumulados em defeitos

Código mal escrito e soluções de desvio
O dever técnico é um compromisso consciente ou inconsciente, no qual é dada prioridade à entrega rápida em detrimento do apoio e qualidade a longo prazo. Correções rápidas e soluções de desvio sem documentos, geralmente implementadas em pouco tempo, acumulam, formando um “campo minado”. Isso torna a base de código extremamente sensível, mesmo para pequenas alterações, uma vez que se torna difícil distinguir soluções de desvio intencional da lógica errônea real, o que leva a regressão inesperada e um aumento no número de erros.

Isso demonstra o efeito direto e cumulativo do dever técnico sobre a propagação de erros e a integridade dos algoritmos, onde cada redução atual adota leva a erros mais complexos e frequentes no futuro.

testes inadequados e seu efeito cumulativo

Quando os sistemas de software não são testados com cuidado, eles são muito mais suscetíveis a erros e comportamento inesperado. Essa inadequação permite que os erros se acumulem com o tempo, criando um sistema difícil de suportar e que é muito suscetível a outros erros. Negligenciar os testes desde o início não apenas aumenta a dívida técnica, mas também ajuda diretamente a aumentar o número de erros. A “teoria das janelas quebradas” na entropia de software sugere que erros insignificantes, ignorados ou problemas de design podem se acumular ao longo do tempo e levar a problemas mais sérios e reduzir a qualidade do software.

Isso estabelece uma relação causal direta: a falta de teste leva ao acúmulo de erros, o que leva a um aumento na entropia, o que leva a erros mais complexos e frequentes, afetando diretamente a correção e a confiabilidade dos algoritmos.

Falta de documentação e informação Silos

A documentação adequada é frequentemente ignorada ao desenvolver software, o que leva à fragmentação ou perda de conhecimento sobre como o sistema funciona e como apoiá -lo. Isso força os desenvolvedores a “apoiar” o sistema para fazer alterações, aumentando significativamente a probabilidade de mal -entendidos e modificações incorretas, o que leva diretamente a erros. Também complica seriamente a adaptação de novos desenvolvedores, pois informações críticas não estão disponíveis ou enganosas.

A entropia do programa ocorre devido à “falta de conhecimento” e “discrepâncias entre suposições gerais e o comportamento real do sistema existente”. Esta é uma observação organizacional mais profunda: a entropia se manifesta não apenas no nível do código, mas também no nível do conhecimento. Esses conhecimentos informais e implícitos são frágeis e são facilmente perdidos (por exemplo, ao deixar os membros da equipe), o que leva diretamente a erros ao tentar modificar, especialmente os novos membros da equipe, levando assim a integridade da lógica algorítmica, uma vez que suas principais suposições deixam de ser claras.

Métodos de desenvolvimento inconsistentes e perda de propriedade

O fator humano é um fator determinante significativo, geralmente subestimado, na entropia de software. Várias habilidades, codificação e expectativas de qualidade entre os desenvolvedores levam a inconsistências e desvios no código -fonte. A falta de processos padronizados para linhagem, revisões de código, testes e documentação exacerba esse problema. Além disso, um código pouco claro ou instável do código, quando vários comandos possuem parte do código ou nenhum possui, leva a negligenciar e aumentar em decaimento, o que leva à duplicação de componentes que desempenham a mesma função de maneiras diferentes, espalhando erros.

Isso mostra que a entropia não é apenas um problema técnico, mas também um sociotécnico, profundamente enraizado na dinâmica organizacional e no comportamento humano. A “inconsistência coletiva” que surge devido a práticas inconsistentes e posse fragmentada leva diretamente a inconsistências e defeitos, tornando o sistema imprevisível e difícil de controlar, o que afeta muito a integridade dos algoritmos.

Falações em cascata em sistemas interconectados

Os sistemas de software modernos geralmente são complexos e muito interconectados. Em tais sistemas, um alto grau de complexidade e componentes intimamente relacionados aumentam a probabilidade de falhas em cascata, quando a recusa de um componente causa uma reação em cadeia de falhas em outros. Esse fenômeno exacerba a influência de erros e o comportamento inadequado dos algoritmos, transformando problemas localizados em riscos sistêmicos. Os resultados dos algoritmos nesses sistemas se tornam muito vulneráveis a falhas que surgem longe de seu caminho direto de execução, o que leva a resultados incorretos generalizados.

A complexidade arquitetônica, a manifestação direta da entropia, pode transformar erros algorítmicos isolados em falhas de grande escala de escala, tornando o sistema geral não confiável e seus dados de saída não são confiáveis. Isso enfatiza a necessidade de estabilidade arquitetônica de conter a propagação de efeitos de entropia.

Um dos exemplos mais recentes é a parada bem conhecida dos aeroportos da América e da Europa devido ao aparecimento da tela de morte azul após atualizar o software antivírus em 2024, o resultado errôneo do algoritmo antivírus e o sistema operacional levou ao tráfego aéreo no mundo.

Exemplos práticos

Exemplo 1: Entropia em Unicode e Restrição de Byte

Vejamos um exemplo simples com um campo de texto, limitado por 32 bytes.

Cenário com ASCII (baixa entropia)

Se o campo aceitar apenas símbolos ASCII, cada símbolo pega 1 bytes. Assim, exatamente 32 caracteres são colocados no campo. Qualquer outro símbolo simplesmente não será aceito.

@startuml
Exemplo de título com ASCII (baixa entropia)
Usuário do ator
Participante “Textfield”

Usuário -> TextField: apresenta 32 símbolos ASCII
TextField -> TextField: verifica o comprimento (32 bytes)
Nota à direita
Tudo está bem.
Nota final
TextField -> Usuário: Aceps entrada
@enduml

Cenário com UTF-8 (alta entropia):

Agora, nosso programa de seus anos 80 cai em 2025. Quando o campo toma UTF-8, cada símbolo pode ocupar de 1 a 4 bytes. Se o usuário introduzir uma linha superior a 32 bytes, o sistema poderá cortá -la incorretamente. Por exemplo, o emoji ocupa 4 bytes. Se a poda ocorrer dentro do símbolo, obtemos um símbolo “quebrado”.

@startuml
Exemplo de título com UTF-8 (alta entropia)
Usuário do ator
Participante “Textfield”

Usuário -> TextField: apresenta “Hi” (37 byte)
TextField -> TextField: Corta a linha até 32 bytes
Nota à direita
De repente! Símbolo
Cortado por bytes.
Nota final
TextField -> Usuário: exibe “oi”
Nota esquerda
Símbolo incorreto.
Nota final
@enduml

Aqui a entropia se manifesta no fato de que a mesma operação de poda para diferentes dados de entrada leva a resultados imprevisíveis e incorretos.

Exemplo 2: Entropia no CSS e incompatibilidade dos navegadores

Mesmo em tecnologias aparentemente estáveis, como o CSS, a entropia pode ocorrer devido a diferentes interpretações dos padrões.

Imagine que o desenvolvedor aplicou o usuário eleito: nenhum; A todos os elementos para desativar a saída de texto.

navegador 10 (lógica antiga)

O navegador 10 faz uma exceção para os campos de entrada. Assim, apesar da bandeira, o usuário pode inserir dados.

@startuml
Navegador de título 10
Usuário do ator
Participante “Navegador 10” como navegador10

Usuário -> Browser10: Entrando na entrada
Browser10 -> navegador10: verifica o CSS
Nota à direita
-User-Elect: Nenhum;
Ignorado para entrada
Nota final
Navegador10 -> usuário: permite a entrada
@enduml

navegador 11 (nova lógica)

Os desenvolvedores do novo navegador decidiram seguir estritamente as especificações, aplicando a regra a todos os elementos sem exceção.

@startuml
Navegador de título 11
Usuário do ator
Participante “Navegador 11” como navegador11

Usuário -> Browser11: Inserindo a entrada
Navegador11 -> navegador11: verifica o CSS
Nota à direita
-User-Elect: Nenhum;
Aplicado a todos os elementos, incluindo entrada
Nota final
Navegador11 -> Usuário: se recusa a entrar
Nota esquerda
O usuário não pode fazer nada
tipo.
Nota final
@enduml

Este exemplo clássico de entropia – a mesma regra leva a diferentes resultados, dependendo do “sistema” (versão do navegador).

Exemplo 3: Entropia devido a um TK ambíguo

Uma tarefa técnica ambígua (TK) é outra fonte poderosa de entropia. Quando dois desenvolvedores, Bob e Alice, entendem o mesmo requisito de maneiras diferentes, isso leva a implementações incompatíveis.

TK: “Para implementar um gerador de números de Fibonacci. Para otimização, uma lista de números gerados deve ser armada dentro do gerador”.

Modelo mental de Bob (OOP com uma condição variável)
Bob se concentrou na frase “Lista … deve ser arrancada”. Ele implementou uma classe que armazena o mesmo estado (Self.Sensence) e a aumenta a cada chamada.

    def __init__(self):
        self.sequence = [0, 1]

    def generate(self, n):
        if n <= len(self.sequence):
            return self.sequence

        while len(self.sequence) < n:
            next_num = self.sequence[-1] + self.sequence[-2]
            self.sequence.append(next_num)

        return self.sequence

Modelo mental de Alice (abordagem funcional)

Alice se concentrou na frase "retorna a sequência". Ela escreveu uma função pura que retorna uma nova lista a cada vez, usando o cache apenas como otimização interna.

    sequence = [0, 1]
    if n <= 2:
        return sequence[:n]

    while len(sequence) < n:
        next_num = sequence[-1] + sequence[-2]
        sequence.append(next_num)

    return sequence

Quando Alice começa a usar o gerador Bob, ela espera que a geração (5) sempre retorne 5 números. Mas se antes disso Bob chamou Gereate (8) no mesmo objeto, Alice receberá 8 números.

Conclusão: entropia aqui está uma conseqüência dos modelos mentais. O estado mutável na implementação de Bob torna o sistema imprevisível para Alice, que aguarda o comportamento da função pura.

Entropia e multi -definição: a condição da raça e do avô

Na programação multi -fluxo, a entropia se manifesta especialmente. Vários fluxos são realizados simultaneamente e o procedimento para sua implementação é imprevisível. Isso pode levar à condição de corrida, quando o resultado depende de qual fluxo é o primeiro a acessar o recurso comum. O caso extremo é o avô quando dois ou mais fluxos estão esperando um pelo outro, e o programa congela.

Exemplo da solução de Dedlok:

O problema do Dedlok surge quando dois ou mais fluxo se bloqueiam, aguardando a liberação do recurso. A solução é estabelecer um procedimento único e fixo para aproveitar os recursos, por exemplo, bloqueá -los aumentando o ID. Isso exclui uma expectativa cíclica que impede o impasse.

@startuml
Solução de título: Procedimento de bloqueio unificado
Participante "Stream 1" como Thread1
Participante "Stream 2" como Thread2
Participante "como" como conta
Participante "Conta B" como conta

Thread1 -> Accounta: Blocks Conta A
Nota sobre o thread1
A regra segue:
ID do bloco
Nota final
Thread2 -> Accounta: esperando a conta A será libertado
Nota sobre Thread2
A regra segue:
Esperando por bloquear um
Nota final
Thread1 -> AccountB: Blocks Conta B
Thread1 -> Accounta: Frees Conta A
Thread1 -> AccountB: Liberações Pontuação B
Nota sobre o thread1
A transação está concluída
Nota final
Thread2 -> conta: bloqueia a conta a
Thread2 -> AccountB: Blocks Conta B
Nota sobre Thread2
A transação termina
Nota final
@enduml

Essa abordagem - bloqueio ordenado (pedidos de bloqueio) - é uma estratégia fundamental para prevenir os Deadlles em programação paralela.

Ótimo, vamos analisar como o estado mutável na abordagem OOP aumenta a entropia, usando o exemplo de desenho de tela e comparar isso com uma função pura.

Problema: Condição alterada e entropia

Quando o objeto tem um estado alterado, seu comportamento se torna imprevisível. O resultado de chamar o mesmo método depende não apenas de seus argumentos, mas também de toda a história da interação com esse objeto. Isso traz entropia para o sistema.

Considere as duas abordagens do retângulo que desenham tela: uma em um estilo OOP com uma condição variável, a outra em uma função funcional, com uma função pura.

1. Abordagem OOP: Classe com um estado variável
Aqui, criamos uma classe de cursor, que armazena seu estado interno, neste caso, cor. O método de desenho desenhará um retângulo usando esta condição.

  constructor(initialColor) {
    // Внутреннее состояние объекта, которое может меняться
    this.color = initialColor;
  }

  // Метод для изменения состояния
  setColor(newColor) {
    this.color = newColor;
  }

  // Метод с побочным эффектом: он использует внутреннее состояние
  draw(ctx, rect) {
    ctx.fillStyle = this.color;
    ctx.fillRect(rect.x, rect.y, rect.width, rect.height);
  }
}

// Использование
const myCursor = new Cursor('red');
const rectA = { x: 10, y: 10, width: 50, height: 50 };
const rectB = { x: 70, y: 70, width: 50, height: 50 };

myCursor.draw(ctx, rectA); // Используется начальный цвет: red
myCursor.setColor('blue'); // Изменяем состояние курсора
myCursor.draw(ctx, rectB); // Используется новое состояние: blue

Diagrama UML da abordagem OOP:

Esse diagrama mostra claramente que a chamada do método de desenho fornece resultados diferentes, embora seus argumentos possam não mudar. Isso se deve a uma chamada setColor separada, que mudou o estado interno do objeto. Esta é uma manifestação clássica da entropia em um estado mutável.

title ООП-подход
actor "Программист" as Programmer
participant "Класс Cursor" as Cursor
participant "Canvas" as Canvas

Programmer -> Cursor: Создает new Cursor('red')
note left
  - Инициализирует состояние
    с цветом 'red'.
end note
Programmer -> Cursor: draw(ctx, rectA)
note right
  - Метод draw использует
    внутреннее состояние
    объекта (цвет).
end note
Cursor -> Canvas: Рисует 'red' прямоугольник
Programmer -> Cursor: setColor('blue')
note left
  - Изменяет внутреннее состояние!
  - Это побочный эффект.
end note
Programmer -> Cursor: draw(ctx, rectB)
note right
  - Тот же метод draw,
    но с другим результатом
    из-за измененного состояния.
end note
Cursor -> Canvas: Рисует 'blue' прямоугольник
@enduml

2. Abordagem funcional: função pura

Aqui usamos uma função pura. Sua tarefa é simplesmente desenhar um retângulo usando todos os dados necessários que são transmitidos a ele. Ela não tem condição, e seu desafio não afetará nada fora de suas fronteiras.

  // Функция принимает все необходимые данные как аргументы
  ctx.fillStyle = color;
  ctx.fillRect(rect.x, rect.y, rect.width, rect.height);
}

// Использование
const rectA = { x: 10, y: 10, width: 50, height: 50 };
const rectB = { x: 70, y: 70, width: 50, height: 50 };

drawRectangle(ctx, rectA, 'red'); // Рисуем первый прямоугольник
drawRectangle(ctx, rectB, 'blue'); // Рисуем второй прямоугольник

Diagrama de uml de uma abordagem funcional:

Este diagrama mostra que a função Drawrectangle sempre recebe a cor externa. Seu comportamento depende completamente dos parâmetros de entrada, o que o torna limpo e com um baixo nível de entropia.

@startuml
Abordagem funcional do título
Ator "Programador" como programador
Participante "função \ n drecrectangle" como drawfunc
Participante "tela" como tela

Programador -> drawfunc: drawrewerctangle (ctx, reta, 'vermelho')
Nota à direita
- Ligue com argumentos:
- ctx
- Recta (coordenadas)
- 'vermelho' (cor)
- A função não tem condição.
Nota final

DrawFunc -> Canvas: inundações com a cor 'vermelha'
Programador -> drawfunc: dreatrewerctangle (ctx, retb, 'azul')
Nota à direita
- Ligue com novos argumentos:
- ctx
- Retb (coordenadas)
- 'azul' (cor)
Nota final
DrawFunc -> Canvas: inundações com a cor 'azul'
@enduml

Em um exemplo com uma função pura, o comportamento é completamente previsível, pois a função não tem condição. Todas as informações para o trabalho são transmitidas por meio de argumentos, o que a torna isolada e segura. Em uma abordagem OOP com um estado variável para o comportamento do método de desenho, toda a história da interação com o objeto pode afetar, o que introduz entropia e torna o código menos confiável.

Design e arquitetura modulares: isolamento, testabilidade e re -use

A divisão de sistemas complexos em módulos menores, independentes e auto -suficientes simplifica o design, desenvolvimento, teste e manutenção. Cada módulo processa certas funcionalidades e interage através de interfaces claramente definidas, reduzindo a interdependência e contribuindo para a separação de responsabilidade. Essa abordagem melhora a legibilidade, simplifica a manutenção, facilita o desenvolvimento paralelo e simplifica testes e depuração, isolando problemas. É fundamental que isso reduz o "raio da derrota" de erros, segurando defeitos em módulos separados e impedindo falhas em cascata. A arquitetura do microsserviço é uma poderosa realização da modalidade.

A modularidade não é apenas uma maneira de organizar o código, mas também uma abordagem fundamental para conter defeitos e aumentar a estabilidade. Limitando o impacto do erro em um módulo, a modalidade aumenta a estabilidade geral do sistema para decaimento de entropia, garantindo que um ponto de recusa não comprometa a correção de todo o aplicativo. Isso permite que as equipes se concentrem em partes menores e mais controladas do sistema, o que leva a testes mais completos e erros de detecção e correção mais rápidos.

Práticas de código puro: beijo, seca e princípios sólidos para confiabilidade

Beijo (mantenha -o simples, estúpido):
Essa filosofia de design significa simplicidade e clareza, evitando ativamente a complexidade desnecessária. Um código simples é inerentemente mais fácil de ler, entender e modificar, o que leva diretamente a uma diminuição em uma tendência a erros e melhorar o suporte. A complexidade é claramente definida como um ambiente de nutrientes para erros.

O KISS não é apenas uma preferência estética, mas uma escolha deliberada de design, que reduz a superfície do ataque por erros e torna o código mais resistente a mudanças futuras, mantendo assim a correção e a previsibilidade dos algoritmos. Esta é uma medida proativa contra entropia em um nível detalhado de código.

Seco (não se repita):
O princípio seco visa reduzir a repetição de informações e duplicação de código, substituindo -a por abstrações ou usando a normalização dos dados. Sua posição principal é que "cada fragmento de conhecimento deve ter uma representação única, inequívoca e autoritária no sistema". Essa abordagem elimina a redundância, que, por sua vez, reduz as inconsistências e evita a propagação de erros ou sua correção inconsistente em várias cópias da lógica duplicada. Ele também simplifica o suporte e a depuração da base de código.

A duplicação do código leva a alterações inconsistentes, o que, por sua vez, leva a erros. O seco impede isso, fornecendo uma única fonte de verdade para lógica e dados, que contribuem diretamente para a correção dos algoritmos, garantindo que a lógica geral se comporte de maneira uniforme e previsível em todo o sistema, impedindo que erros finos e difíceis de inserir.

sólido

princípios

Este acrônimo mnemônico apresenta cinco princípios fundamentais de design (responsabilidade unificada, abertura/proximidade, substituição de liskin, separação de interfaces, inversões de dependências) que são cruciais para a criação de projetos orientados a objetos claros, flexíveis e solidários. A adesão a entidades sólidas de software se torna mais fácil de suportar e adaptar, o que leva a um número menor de erros e ciclos de desenvolvimento mais rápidos. Eles conseguem isso simplificando o Serviço (SRP), garantindo as funções de adição escalável sem modificação (OCP), garantindo consistência comportamental (LSP), minimizando a coerência (ISP) e aumentando a flexibilidade devido à abstração (DIP).

Os princípios sólidos fornecem uma abordagem holística da integridade estrutural, que torna o sistema em essência mais resistente aos efeitos de acrobacias das mudanças. Promovendo modularidade, separação e responsabilidades claras, eles impedem erros em cascata e mantêm a correção dos algoritmos, mesmo quando o sistema é continuamente evolução, atuando como medidas fundamentais para combater a entropia.

Design de entropia e domínio (DDD)

O design orientado ao domínio (DDD) não é apenas uma filosofia, mas uma metodologia completa que oferece padrões específicos para dividir a aplicação em domínios, o que permite controlar efetivamente a complexidade e combater a entropia. O DDD ajuda a transformar um sistema caótico em um conjunto de componentes previsíveis e isolados.

Padrões de gangue de quatro design como um único aparelho conceitual

O livro "Padrões de design: elementos do software reutilizável orientado a objetos" (1994), escrito por uma "gangue de quatro" (GOF), ofereceu um conjunto de soluções comprovadas para problemas típicos. Esses padrões são excelentes ferramentas para combater a entropia, pois criam sistemas estruturados, previsíveis e controlados.

Um dos principais efeitos dos padrões é a criação de um único aparelho conceitual. Quando o desenvolvedor em uma equipe fala sobre a "fábrica" ou "solitária", seus colegas entendem imediatamente de que tipo de código é que estamos falando. Isso reduz significativamente a entropia na comunicação, porque:

A ambiguidade diminui: os padrões têm nomes e descrições claras, o que exclui diferentes interpretações, como no exemplo de Bob e Alice.

Acelera o intervalo: os novos membros da equipe são derramados mais rapidamente no projeto, pois não precisam adivinhar a lógica atrás de estruturas complexas.

A refatoração é facilitada: se você precisar alterar a parte do sistema construído de acordo com o padrão, o desenvolvedor já sabe como é organizado e quais peças podem ser modificadas com segurança.

Exemplos de padrões de GOF e sua influência na entropia:

Padrão "Estratégia": permite encapsular vários algoritmos em classes individuais e torná -los intercambiáveis. Isso reduz a entropia, pois permite alterar o comportamento do sistema sem alterar seu código principal.

Padrão "comando" (comando): inkapsules o método do método para o objeto. Isso permite que você adie a execução, coloque os comandos na fila ou os cancele. O padrão reduz a entropia, pois separa o remetente da equipe de seu destinatário, tornando -os independentes.

Padrão de observador (observador): determina a dependência do "um para muitos", no qual uma alteração no estado de um objeto notifica automaticamente todos os dependentes. Isso ajuda a controlar os efeitos colaterais, tornando -os óbvios e previsíveis, e não caóticos e ocultos.

Padrão "Método da Fábrica": define a interface para criar objetos, mas permite que as subclasses decidam qual classe instituir. Isso reduz a entropia, pois permite criar objetos com flexibilidade sem a necessidade de conhecer classes específicas, reduzindo a conexão.

Esses padrões ajudam os programadores a criar sistemas mais previsíveis, testados e controlados, reduzindo assim a entropia, o que ocorre inevitavelmente em projetos complexos.

Padrões -chave DDD para controlar a entropia

Contextos limitados: esse padrão é a fundação DDD. Ele se oferece para dividir um grande sistema em peças pequenas e autônomas. Cada contexto tem seu próprio modelo, um dicionário de termos (idioma onipresente) e lógica. Isso cria limites estritos que impedem a propagação de mudanças e efeitos colaterais. A mudança em um contexto limitado, por exemplo, no "contexto das ordens", não afetará o "contexto de entrega".

Agregados (agregados): A unidade é um cluster de objetos relacionados (por exemplo, "ordem", "linhas da ordem"), que é considerada como um todo. A unidade possui um objeto raiz (raiz agregada), que é o único ponto de entrada para todas as alterações. Isso fornece consistência e garante que o estado da unidade sempre permaneça integral. Ao alterar a unidade apenas através de seu objeto raiz, controlamos como e quando há uma alteração na condição, o que reduz significativamente a entropia.

Serviços de domínio Serviços: Para operações que não pertencem a nenhum objeto específico da área de assunto (por exemplo, a transferência de dinheiro entre contas), o DDD propõe usar os serviços de domínio. Eles coordenam as ações entre várias unidades ou objetos, mas não mantêm a condição. Isso torna a lógica mais transparente e previsível.

Os eventos da área de assunto (eventos de domínio): em vez de métodos de chamada direta de diferentes contextos, o DDD oferece para usar eventos. Quando algo importante acontece em um contexto, ele "publica" o evento. Outros contextos podem se inscrever neste evento e responder a ele. Isso cria uma conexão fraca entre os componentes, o que torna o sistema mais escalável e resistente a alterações.

O DDD ajuda a controlar a entropia, criando limites claros, regras estritas e componentes isolados. Isso transforma um sistema complexo e confuso em um conjunto de partes independentes e controladas, cada uma das quais tem sua própria "lei" e comportamento previsível.

Documentação complexa e animada

Manter documentação detalhada e relevante sobre alterações de código, soluções de design, diagramas arquitetônicos e manuais do usuário é de suma importância. Essa "documentação ao vivo" ajuda os desenvolvedores a entender os meandros do sistema, rastrear alterações e comemoradamente fazer modificações futuras ou corrigir erros. Reduz significativamente o tempo gasto na “re -abertura” ou no design reverso do sistema, que são fontes comuns de erros.

A entropia do programa ocorre devido à "falta de conhecimento" e "discrepâncias entre suposições gerais e o comportamento real do sistema existente". A documentação atua não apenas como um guia, mas como

O mecanismo crítico para preservar o conhecimento, que luta diretamente com a "entropia do conhecimento". Ao tornar o conhecimento implícito explícito e acessível, reduz os mal -entendidos e a probabilidade de cometer erros devido a suposições incorretas sobre o comportamento de algoritmos ou interações do sistema, protegendo assim a correção funcional.

Teste rigoroso e garantia de qualidade contínua

Testes automatizados: testes modulares, de integração, sistema e regressão
O teste automatizado é uma ferramenta indispensável para amolecer a entropia do software e prevenir erros. Ele permite a detecção precoce de problemas, garantindo que as alterações de código não violem a funcionalidade existente e fornecem feedback rápido e consistente. Os tipos de chave incluem testes modulares (para componentes isolados), testes de integração (para interações entre módulos), testes do sistema (para um sistema integrado completo) e testes de regressão (para garantir que novas alterações não levem à aparência repetida de erros antigos). O teste automatizado reduz significativamente o fator humano e aumenta a confiabilidade.

O teste automatizado é a principal proteção contra o acúmulo de defeitos ocultos. Ele "muda" ativamente a descoberta de erros para a esquerda no ciclo de desenvolvimento, o que significa que os problemas são encontrados quando sua correção é a mais barata e mais simples, impedindo sua contribuição para o efeito do coma de neve da entropia. Isso afeta diretamente a correção dos algoritmos, constantemente verificando o comportamento esperado em vários níveis de detalhe.

Desenvolvimento através do teste (TDD): Mudar para a esquerda na detecção de erros

O desenvolvimento através do teste (TDD) é um processo de desenvolvimento de software, que inclui a gravação de testes para o código antes de escrever o código em si. Esse ciclo iterativo "refactorar vermelho-verde" promove um feedback rápido, permitindo a detecção precoce de erros e reduzindo significativamente o risco de problemas complexos em estágios posteriores de desenvolvimento. Foi demonstrado que o TDD leva a um número menor de erros e à qualidade ideal do código, coordenando bem a filosofia da seca (não se repete). Estudos empíricos da IBM e da Microsoft mostram que o TDD pode reduzir a densidade de erro a ser lançada em impressionantes 40-90%. Exemplos de teste também servem como documentação ao vivo.

O TDD atua como controle proativo da qualidade, construído diretamente no processo de desenvolvimento. Forçando os desenvolvedores a determinar o comportamento esperado antes da implementação, minimiza a introdução de erros lógicos e garante que o código seja criado propositadamente para cumprir os requisitos, melhorando diretamente a correção e a previsibilidade dos algoritmos desde o início.

Integração e entrega contínuas (IC/CD): Feedback inicial e liberações estáveis
As práticas de CI/CD são fundamentais para o desenvolvimento moderno de software, ajudando a identificar erros nos estágios iniciais, acelerar o desenvolvimento e garantir o processo de implantação ininterrupto. A integração frequente de pequenos pacotes de código no repositório central permite a detecção precoce de erros e a melhoria contínua da qualidade do código por meio de conjuntos e testes automatizados. Esse processo fornece um feedback rápido, permitindo que os desenvolvedores eliminem de maneira rápida e eficaz os problemas e também aumente significativamente a estabilidade do código, impedindo o acúmulo de código não verificado ou instável.

Os transportadores de CI/CD funcionam como um mecanismo contínuo para reduzir a entropia. Ao automatizar a integração e o teste, eles impedem o acúmulo de problemas de integração, fornecem uma condição constantemente em desdobramento e fornecem visibilidade imediata de regressão. Essa abordagem sistemática e automatizada neutraliza diretamente o distúrbio feito por alterações contínuas, mantendo a estabilidade dos algoritmos e impedindo a propagação de erros em todo o sistema.

Gerenciamento sistemático da dívida técnica

REFATORIA INCRECIONAL: Melhoria estratégica de código

A refatoração é o processo de reestruturação do código existente para melhorar sua estrutura interna sem alterar seu comportamento externo. Esse é um meio direto de combater o software apodrecendo e reduzindo a complexidade. Embora a refatoração seja geralmente considerada uma maneira de reduzir o número de erros, é importante admitir que algumas refraturas podem contribuir com inauguração novos erros, o que requer testes rígidos. No entanto, os estudos geralmente confirmam que o código refratado está menos sujeito a erros do que o não aceito. Increting A refatoração, na qual o gerenciamento da dívida é integrada ao atual processo de desenvolvimento e não é adiada, é crucial para impedir o acúmulo exponencial da dívida técnica.

A refatoração é uma ação deliberada para reduzir a entropia, reestruturação de código proativo para torná -la mais resistente a alterações, reduzindo assim a probabilidade de erros futuros e melhorar a clareza dos algoritmos. Transforma incêndios reativos com extinção no gerenciamento proativo da saúde estrutural.

Backlogs da dívida técnica: priorização e distribuição de recursos

A manutenção de um Bablog atual da dívida técnica é uma prática crítica para o gerenciamento sistemático e a eliminação da dívida técnica. Este backlog serve como um registro abrangente de elementos identificados de serviço técnico e áreas que exigem melhorias, garantindo que esses problemas não sejam negligenciados. Ele permite que os gerentes de projeto priorizem os elementos da dívida com base em sua seriedade de influência e riscos potenciais. A integração do Bablog durante o projeto garante que a refatoração, a correção de erros e a limpeza de código sejam partes regulares do gerenciamento diário do projeto, reduzindo os custos de pagamento de longo prazo.

O baclog da dívida técnica transforma um problema abstrato e crescente em um conjunto de tarefas controlado e eficaz. Essa abordagem sistemática permite que as organizações adotem compromissos razoáveis entre o desenvolvimento de novas funções e investimentos em qualidade, impedindo a acumulação de dívida discreta, o que pode levar a erros críticos ou degradação da produtividade do algoritmo. Ele fornece visibilidade e controle sobre o poder de entropia da chave.

Análise de código estático e dinâmico: identificação proativa de problemas

Análise estática

Essa técnica inclui uma análise do código -fonte sem sua implementação para identificar problemas como erros, cheiros de código, vulnerabilidade de segurança e padrões de codificação prejudicados. Ele serve como a “primeira linha de proteção”, identificando problemas nos estágios iniciais do ciclo de desenvolvimento, melhorando a qualidade geral do código e reduzindo a dívida técnica, identificando modelos problemáticos antes que eles apareçam como erros durante a execução.

A análise estática atua como uma "polícia de qualidade de código automatizada". Identificando problemas em potencial (incluindo aqueles que afetam a lógica algorítmica) antes de executar, evita sua manifestação na forma de erros ou desvantagens arquitetônicas. Este é um método escalável de garantir padrões de codificação e identificar erros comuns que contribuem para a entropia do software.

Análise dinâmica

Este método avalia o comportamento do software durante a execução, fornecendo informações valiosas sobre problemas que se manifestam apenas durante a execução. Excelentemente descobre erros durante a execução, como vazamentos de memória, a condição da raça e a exclusão do ponteiro zero, bem como locais estreitos no desempenho e vulnerabilidade da segurança.

A análise dinâmica é fundamental para identificar desvantagens comportamentais durante a execução, que não pode ser detectada por análise estática. A combinação de análise estática e dinâmica garante uma idéia abrangente da estrutura e comportamento do código, permitindo que as equipes identifiquem defeitos antes de se transformarem em problemas sérios.

Monitorando a produção e o escritório de incidentes

APM (Monitoramento de desempenho do aplicativo):
As ferramentas APM foram projetadas para monitorar e otimizar o desempenho dos aplicativos. Eles ajudam a identificar e diagnosticar problemas complexos de desempenho, além de detectar as causas raiz dos erros, reduzindo assim a perda de renda do tempo de inatividade e da degradação. Os sistemas APM monitoram várias métricas, como tempo de resposta, uso de recursos e frequência de erros, fornecendo informações em tempo real, o que permite resolver proativamente os problemas antes que eles afetem os usuários.

As ferramentas da APM criticam soluções proativas para problemas e manutenção dos níveis de serviço. Eles fornecem uma visibilidade profunda no ambiente de produção, permitindo que as equipes identifiquem e eliminem rapidamente problemas que podem afetar os algoritmos corretos ou causar erros, minimizando assim o tempo de inatividade e melhorando a experiência do usuário.

Observabilidade (logs, métricas, rastreio):

A observabilidade refere -se à capacidade de analisar e medir os estados internos dos sistemas com base em seus dados de saída e interações entre ativos. Três pilares principais de observabilidade são métricas (dados quantitativos sobre produtividade e uso de recursos), logs (registros cronológicos detalhados de eventos) e rastreamento (rastreando o fluxo de solicitações através de componentes do sistema). Juntos, eles ajudam a identificar e resolver problemas, fornecendo uma compreensão abrangente do comportamento do sistema. A observabilidade vai além do monitoramento tradicional, ajudando a entender "desconhecido desconhecido" e melhorando o tempo da aplicação livre de aplicativos.

A observabilidade permite que as equipes investigem flexivelmente o que está acontecendo e determine rapidamente a causa raiz dos problemas que podem não ter previsto. Isso fornece uma compreensão mais profunda, flexível e proativa do comportamento do sistema, permitindo que as equipes identifiquem rapidamente e eliminem problemas imprevistos e mantenham a alta acessibilidade dos aplicativos.

Análise da causa raiz (RCA)

A análise das causas radiculares (RCA) é um processo estruturado com base em dados que revelam as causas fundamentais de problemas em sistemas ou processos, permitindo que as organizações implementem soluções eficazes e de longo prazo, e não apenas elimine os sintomas. Inclui a definição do problema, coleta e análise dos dados relevantes (por exemplo, métricas, logs, escalas temporárias), determinação de fatores causais e relacionados usando ferramentas como "5 por que" e diagramas de Ishikawa, bem como o desenvolvimento e implementação de ações corretivas. A RCA é crucial para impedir a re -ocorrência de problemas e treinamento em incidentes.

A RCA é crucial para a prevenção a longo prazo de problemas e treinamento em incidentes. Identificando e eliminando sistematicamente as principais causas, e não apenas os sintomas, as organizações podem impedir a re -ocorrência de erros e falhas de algoritmos, reduzindo assim o sistema geral do sistema e aumentando sua confiabilidade.

Metodologias flexíveis e práticas de equipe

Gerenciamento de erros no Agile:

No ambiente ágil, o gerenciamento de erros é extremamente importante e é recomendável alocar o tempo em sprints para corrigi -los. Os erros devem ser registrados em um único produto do produto e associados ao histórico correspondente para facilitar a análise de causas radiculares e melhorar o código nas sprints subsequentes. As equipes devem se esforçar para corrigir os erros o mais rápido possível, de preferência no sprint atual, a fim de impedir seu acúmulo. A coleta de estatísticas de erros (o número de resolvidos, o número de horas registradas e as horas em correção) ajuda a ter uma idéia da qualidade do código e melhorar os processos.

Isso enfatiza a importância de correções imediatas, análise de causas radiculares e melhora contínua. As metodologias flexíveis fornecem uma estrutura para o controle proativo dos erros, impedindo sua contribuição para a entropia do sistema e mantendo a correção dos algoritmos por verificação e adaptação constantes.

DevOps

Práticas

As práticas do DevOps ajudam a reduzir os defeitos do software e melhorar a qualidade através de várias abordagens importantes. Eles incluem o desenvolvimento de uma cultura de cooperação e comunicação inconfundível, a adoção de integração e entrega contínuas (IC/CD), a configuração de testes automatizados, focando a atenção na observabilidade e métricas, evitando trabalho artesanal, incluindo segurança nos estágios iniciais do ciclo de desenvolvimento e treinamento em incidentes. Essas práticas reduzem o número de erros, melhoram a qualidade e contribuem para melhorias constantes.

O DevOps contribui para a melhoria contínua e a redução da entropia através da automação, feedback rápido e uma cultura de responsabilidade geral. Integrando os processos de desenvolvimento e operação, o DevOps cria um ambiente no qual os problemas são detectados e eliminados rapidamente, impedindo sua acumulação e degradação de sistemas, que suporta diretamente a integridade dos algoritmos.

Conclusão

A entropia do programa é uma força inevitável que se esforça constantemente para a degradação de sistemas de software, especialmente no contexto da correção de algoritmos e erros. Isso não é apenas o envelhecimento físico, mas uma interação dinâmica entre o código, seu ambiente e fatores humanos que constantemente fazem uma bagunça. As principais forças motrizes desse decaimento incluem crescente complexidade, acúmulo de dívida técnica, documentação inadequada, alterações em ambientes externos constantemente e métodos de desenvolvimento inconsistentes. Esses fatores levam diretamente a resultados incorretos do trabalho de algoritmos, a perda de previsibilidade e um aumento no número de erros que podem se espalhar em cascata pelos sistemas interconectados.

A luta contra a entropia de software requer uma abordagem multifacetada, contínua e proativa. Não basta apenas corrigir erros à medida que ocorrem; É necessário eliminar sistematicamente os principais motivos que os geram. A adoção dos princípios do design modular, código limpo (beijo, seco, sólido) e documentação complexa é fundamental para a criação de sistemas estáveis, que são essencialmente menos suscetíveis à entropia. Testes automatizados rigorosos, desenvolvimento por meio de testes (TDD) e integração/entrega contínua (IC/CD) atuam como mecanismos críticos da detecção e prevenção precoce de defeitos, constantemente verificando e estabilizando a base de código.

Além disso, o gerenciamento sistemático da dívida técnica por meio de refatoração incidental e bafflogistas da dívida técnica, bem como o uso de ferramentas estáticas e dinâmicas de análise de código, permite que as organizações identifiquem e eliminem ativamente as áreas problemáticas antes de levarem a falhas críticas. Finalmente, o monitoramento confiável da produção com a ajuda de ferramentas APM e plataformas de observabilidade, em combinação com uma análise disciplinada das causas radiculares e práticas flexíveis da equipe, garante uma rápida resposta a problemas emergentes e cria um ciclo de melhoria contínua.

Por fim, garantindo a integridade dos algoritmos e minimizando erros nas condições de entropia de software - esse não é um esforço único, mas uma obrigação constante de manter a ordem em um ambiente dinâmico e em constante mudança. Aplicando essas estratégias, as organizações podem aumentar significativamente a confiabilidade, previsibilidade e durabilidade de seus sistemas de software, garantindo que os algoritmos funcionarão conforme o planejado, mesmo à medida que se evoluem.

Diagramas de bloqueio na prática sem formalina

O diagrama de blocos é uma ferramenta visual que ajuda a transformar um algoritmo complexo em uma sequência de ações compreensíveis e estruturadas. Da programação ao gerenciamento de processos de negócios, eles servem como uma linguagem universal para visualização, análise e otimização dos sistemas mais complexos.

Imagine um mapa onde, em vez de estradas, é lógica e, em vez de cidades – ações. Esta é um diagrama de blocos-uma ferramenta indispensável para navegação nos processos mais confusos.

Exemplo 1: Esquema de lançamento de jogo simplificado
Para entender o princípio do trabalho, vamos apresentar um simples esquema de lançamento de jogo.

Esse esquema mostra o script perfeito quando tudo acontece sem falhas. Mas na vida real, tudo é muito mais complicado.

Exemplo 2: Esquema expandido para iniciar o jogo com carregamento de dados
Os jogos modernos geralmente exigem conexão à Internet para baixar dados, salvamento ou configurações do usuário. Vamos adicionar essas etapas ao nosso esquema.

Esse esquema já é mais realista, mas o que acontecerá se algo der errado?

Como foi: um jogo que “quebrou” com a perda da Internet

No início do projeto, os desenvolvedores não puderam levar em consideração todos os cenários possíveis. Por exemplo, eles se concentraram na lógica principal do jogo e não pensaram no que aconteceria se o jogador tivesse uma conexão com a Internet.

Em tal situação, o diagrama de blocos de seu código ficaria assim:

Nesse caso, em vez de emitir um erro ou fechar corretamente, o jogo congelou na fase de espera por dados que ela não recebeu devido à falta de uma conexão. Isso levou à “tela preta” e congelando o aplicativo.

Como se tornou: correção nas reclamações de usuários

Após inúmeras reclamações dos usuários sobre pairando, a equipe do desenvolvedor percebeu que precisávamos corrigir o erro. Eles fizeram alterações no código adicionando uma unidade de processamento de erros que permite que o aplicativo responda corretamente à falta de conexão.

É assim que o diagrama de blocos corrigido se parece, onde ambos os cenários são levados em consideração:

Graças a essa abordagem, o jogo agora informa corretamente o usuário sobre o problema e, em alguns casos, ele pode até ir para o modo offline, permitindo que você continue o jogo. Este é um bom exemplo de por que os diagramas de blocos são tão importantes : eles fazem o desenvolvedor pensar não apenas sobre a maneira ideal de execução, mas também sobre todas as falhas possíveis, tornando o produto final muito mais estável e confiável.

comportamento incerto

Pendurado e erros são apenas um exemplos de comportamento imprevisível do programa. Na programação, existe um conceito de comportamento incerto (comportamento indefinido) – Esta é uma situação em que o padrão do idioma não descreve como o programa deve se comportar em um determinado caso.

Isso pode levar a qualquer coisa: do “lixo” aleatório na retirada ao fracasso do programa ou mesmo à séria vulnerabilidade de segurança. O comportamento indefinido geralmente ocorre ao trabalhar com memória, por exemplo, com linhas na linguagem de C.

Um exemplo do idioma c:

Imagine que o desenvolvedor copiou a linha para o buffer, mas esqueceu de adicionar ao final o símbolo zero (`\ 0`) , que marca o final da linha.

É assim que o código se parece:

#include 

int main() {
char buffer[5];
char* my_string = "hello";

memcpy(buffer, my_string, 5);

printf("%s\n", buffer);
return 0;
}

Resultado esperado: “Olá”
O resultado real é imprevisível.

Por que isso está acontecendo? A função `printf` com o especificador`%s` espera que a linha termine com um símbolo zero. Se ele não estiver, ela continuará lendo a memória fora do buffer destacado.

Aqui está o diagrama de blocos deste processo com dois resultados possíveis:

Este é um exemplo claro de por que os diagramas de blocos são tão importantes: eles fazem o desenvolvedor pensar não apenas sobre a maneira ideal de execução, mas também sobre todas as falhas possíveis, incluindo problemas de baixo nível, tornando o produto final muito mais estável e confiável.

LLM Fine-Tune

Atualmente, todos os provedores populares de serviços LLM usam ajuste fino usando arquivos JSONL, que descrevem as entradas e saídas do modelo, com pequenas variações, por exemplo, para Gemini, OpenAI, o formato é um pouco diferente.

Após o download de um arquivo JSONL especialmente formado, o processo de especialização do modelo LLM no conjunto de dados especificado começa, para todos os provedores de LLM bem conhecidos atuais, este serviço é pago.

Para ajustar uma máquina local usando Ollama, recomendo confiar em um vídeo detalhado da tecnologia de canal do YouTube com a maneira mais fácil de ajustar um LLM e nós com Alloma:
https://www.youtube.com/watch?v=pTaSDVz0gok

Um exemplo de um laptop Jupyter com a preparação do conjunto de dados JSONL a partir de exportações de todas as mensagens do Telegram e o lançamento do processo de ajuste fino local está disponível aqui:
https://github.com/demensdeum/llm-train-example

Reaja breve revisão nativa

O React Native se estabeleceu como uma ferramenta poderosa para o desenvolvimento cruzado de aplicativos móveis e da Web. Ele permite criar aplicativos nativos para Android e iOS, bem como aplicativos da Web usando uma única base de código no JavaScript/TypeScript.

Fundamentos de arquitetura e desenvolvimento

A React National Architecture é baseada em ligações nativas do JavaScript/TypeScript. Isso significa que a lógica de negócios básica e um aplicativo no aplicativo são gravados em JavaScript ou TypeScript. Quando o acesso a funcionalidade nativa específica (por exemplo, o dispositivo ou a câmera GPS) é necessária, essas ligações nativas são usadas, o que permite chamar o código escrito no SWIFT/Objective-C para iOS ou Java/Kotlin para Android.

É importante observar que as plataformas resultantes podem variar em funcionalidade. Por exemplo, uma determinada funcionalidade pode estar disponível apenas para Android e iOS, mas não para a Web ou vice -versa, dependendo dos recursos nativos da plataforma.

Configuração e atualizações

A configuração das ligações nativas é realizada através da tecla Plugins. Para um desenvolvimento estável e seguro, é fundamental usar as versões mais recentes dos componentes nativos do React e sempre recorrer à documentação atual. Isso ajuda a evitar problemas de compatibilidade e a usar todas as vantagens das atualizações mais recentes.

Recursos de desenvolvimento e otimização

O React Native pode gerar projetos resultantes para plataformas específicas (por exemplo, pastas Android e iOS). Isso permite que os desenvolvedores, se necessário, corrigem os arquivos de projetos resultantes manualmente para otimização fina ou configurações específicas, o que é especialmente útil para aplicativos complexos que exigem uma abordagem individual ao desempenho.

Para aplicações típicas e simples, geralmente é suficiente usar a Expo Bandle com ligações nativas construídas. No entanto, se o aplicativo possui funcionalidade complexa ou requer uma personalização profunda, é recomendável usar conjuntos personalizados nativos do React.

Comerabilidade do desenvolvimento e atualizações

Uma das principais vantagens do React Native é o suporte a quente para recarregar para o código TypeScript/JavaScript durante o desenvolvimento. Isso acelera significativamente o processo de desenvolvimento, pois as alterações do código são exibidas instantaneamente no aplicativo, permitindo que o desenvolvedor veja o resultado em tempo real.

O React Native também suporta “Atualização silenciosa) ignorando o processo do Google Play e da Apple App Store, mas isso é aplicável apenas ao código TypeScript/JavaScript. Isso permite que você libere rapidamente erros ou pequenas atualizações de funcionalidade sem a necessidade de passar por um ciclo completo de publicação através de lojas de aplicativos.

É importante entender que o código TS/JS é enfaixado em uma versão específica de dependências nativas usando impressão digital, o que garante a coordenação entre JavaScript/TypeScript Part e parte nativa do aplicativo.

Uso de LLM no desenvolvimento

Embora seja possível a Codhegeneração com LLM (modelos de idiomas grandes), sua adequação nem sempre é alta devido a conjuntos de dados potencialmente desatualizados nos quais os modelos foram treinados. Isso significa que o código gerado pode não corresponder às versões mais recentes do React Native ou as práticas recomendadas.

O React Native continua a desenvolver, oferecendo aos desenvolvedores uma maneira flexível e eficaz de criar aplicativos cruzados. Ele combina a velocidade do desenvolvimento com a possibilidade de acesso a funções nativas, tornando -a uma escolha atraente para muitos projetos.