<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Pedro Fernandes</title>
    <description>The latest articles on DEV Community by Pedro Fernandes (@pedrofernandss).</description>
    <link>https://dev.to/pedrofernandss</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3561247%2F5e458870-e9db-4cf1-ae29-b9342e5e738d.jpeg</url>
      <title>DEV Community: Pedro Fernandes</title>
      <link>https://dev.to/pedrofernandss</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pedrofernandss"/>
    <language>en</language>
    <item>
      <title>O Problema do Caixeiro-Viajante: De Gregor Samsa à Max Verstappen e a Busca Incessante pelo Caminho Perfeito.</title>
      <dc:creator>Pedro Fernandes</dc:creator>
      <pubDate>Wed, 15 Oct 2025 16:55:27 +0000</pubDate>
      <link>https://dev.to/pedrofernandss/o-problema-do-caixeiro-viajante-de-gregor-samsa-a-max-verstappen-e-a-busca-incessante-pelo-caminho-2bi3</link>
      <guid>https://dev.to/pedrofernandss/o-problema-do-caixeiro-viajante-de-gregor-samsa-a-max-verstappen-e-a-busca-incessante-pelo-caminho-2bi3</guid>
      <description>&lt;p&gt;Um caixeiro-viajante é uma pessoa que viaja constantemente para diferentes cidades e regiões a fim de vender produtos em nome de uma empresa. Talvez você se lembre (ou não) mas um exemplo famoso de caixeiro-viajante é o personagem Gregor Samsa, de A Metamorfose. Gregor trabalhava arduamente como caixeiro-viajante para sustentar sua família e pagar uma dívida de seus pais, possuindo uma rotina exaustiva e com diversas pressões no trabalho.&lt;/p&gt;

&lt;p&gt;Como um caixeiro-viajante é um vendedor que precisa passar por diversos locais, há a necessidade de escolher a melhor rota para economizar tempo. Para isso, existem dois fatores básicos que precisam ser considerados: distância entre as cidades e a ordem em que elas são visitadas. Além disso, precisamos pensar também que o viajante não deve passar em um mesmo local duas vezes.&lt;/p&gt;

&lt;p&gt;Em uma pequena escala, é possível solucionar esse problema facilmente. Observando a imagem ilustrativa abaixo, podemos observar que alguns locais possuem saídas para duas outras cidades enquanto existem alguns que possuem saída para apenas uma cidade. Algo relativamente comum, de acordo com a realidade.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi1u24pd2dz4wxjctnpm3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi1u24pd2dz4wxjctnpm3.png" alt="Mapa" width="695" height="477"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Imagine que o primeiro caminho seja:&lt;/p&gt;

&lt;p&gt;Rio de Janeiro, London, Cape Town, Moscow → Distância Resultante: 70 km&lt;/p&gt;

&lt;p&gt;Agora se percorrermos:&lt;/p&gt;

&lt;p&gt;Cape Town, Moscow, London, Rio de Janeiro → Distância Resultante: 90 km&lt;/p&gt;

&lt;p&gt;Ambos os caminhos atendem aos requisitos propostos porém o segundo caminho é mais longo, custoso e cansativo para o caixeiro-viajante. Podemos descobrir isso de forma simples, testando todas as possibilidades e combinações possíveis, algo plausível de se fazer em pequenas situações. Porém apesar de parecer um problema simples, a medida que a quantidade de locais a serem visitados aumenta, mais difícil se torna encontrar boas soluções. E isso se mostrou um verdadeiro pesadelo para muitos matemáticos e cientistas da computação.&lt;/p&gt;

&lt;p&gt;Mas ok, agora você pode estar se perguntando o que o Max Verstappen 🦁 tem a ver com o caixeiro-viajante. &lt;/p&gt;

&lt;p&gt;Bom, ambos desgostam de viajar longas distâncias sem necessidade.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Eu sempre disse que temos muitas corridas no calendário. Mas acho que o problema maior é viajar pelos diferentes fusos, entre Las Vegas e Catar. Estamos voando para o outro lado do mundo de novo e acho que podemos fazer um trabalho um pouco melhor nas pernas triplas, que estejam um pouco mais próximas. Para mim, isso faria um pouco mais de sentido, então provavelmente é algo que precisamos analisar" - Max Verstappen&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Para quem não sabe, Max Verstappen é tetracampeão de Fórmula 1 e no ano de 2025, o campeonato de F1 possui 24 etapas, ou seja, realiza corrida em 24 cidades diferentes, passando por 21 países e 5 continentes.&lt;/p&gt;

&lt;p&gt;Com a crescente conscientização da sociedade a respeito do desenvolvimento sustentável, dos impactos ambientais causados pela indústria, do efeito estufa, da pegada zero de Carbono e etc. uma das maiores dificuldades da Fórmula 1 tem sido encontrar a melhor e mais eficiente organização das corridas ao longo do ano pois apesar do que muitos acreditam, o maior impacto ambiental causado pela organização é proveniente de viagens (seja por via marítima, aérea ou terrestre) enquanto a emissão dos carros de corrida consiste em apenas 0.7%.&lt;/p&gt;

&lt;p&gt;Voltando à temática computacional, nessa larga escala e com grandes distâncias, tentar encontrar a melhor solução calculando e testando todas as possibilidades seria extremamente exaustivo. Observando a tabela abaixo, apenas com 24 cidades a quantidade de possibilidades se torna impossível de ser calculada à mão e extremamente longa para um computador simples.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Cidades&lt;/th&gt;
&lt;th&gt;Possíveis Combinações&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;120&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;720&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;5040&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;40320&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;362880&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;3628800&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;39916800&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;479001600&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;6,20448×10²³&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;E mesmo que, na década de 1980, os pesquisadores Grötschel, Padberg, Rinaldi tenham conseguido resolver o problema com até 2392, o Problema do Caixeiro Viajante continua mais relevante do que nunca. Há quem argumente que a evolução do hardware é a principal solução para os problemas computacionais atuais, a ponto de não precisarmos mais nos preocupar tanto com otimização de algoritmos porém podemos refletir e observar com a história que problemas como o caixeiro viajante e sua discussão ao longo dos anos trouxeram soluções que foram aplicadas em nas mais diferentes áreas. Portanto, mesmo que a evolução do hardware seja um grande avanço, a construção de soluções inteligentes para problemas são igualmente importantes.&lt;/p&gt;

&lt;p&gt;A cada nova temporada da F1, com seu calendário global, ou a cada desafio logístico que surge, a necessidade de encontrar a rota mais inteligente persiste, com pesquisadores constantemente desenvolvendo métodos para lidar com a crescente complexidade do mundo real.&lt;/p&gt;

&lt;p&gt;Afinal, quem sabe daqui um tempo não precisaremos encontrar as melhores rotas para entre galáxias, estrelas e planetas? 🚀&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>ai</category>
      <category>challenge</category>
      <category>computerscience</category>
    </item>
    <item>
      <title>Como Integrar Diferentes Linguagens de Programação em um Projeto: A Abordagem Multilíngue</title>
      <dc:creator>Pedro Fernandes</dc:creator>
      <pubDate>Sun, 12 Oct 2025 23:15:58 +0000</pubDate>
      <link>https://dev.to/pedrofernandss/como-integrar-diferentes-linguagens-de-programacao-em-um-projeto-a-abordagem-multilingue-43j5</link>
      <guid>https://dev.to/pedrofernandss/como-integrar-diferentes-linguagens-de-programacao-em-um-projeto-a-abordagem-multilingue-43j5</guid>
      <description>&lt;p&gt;No desenvolvimento de software, principalmente no mundo das startups e pequenas empresas, é comum trabalhar com uma única linguagem de programação para todo o projeto — frontend e backend, por exemplo, usando JavaScript/TypeScript. No entanto, há situações em que diferentes linguagens precisam coexistir dentro da mesma aplicação. Seja para aproveitar bibliotecas especializadas, melhorar a performance de determinados processos ou integrar sistemas legados, saber como combinar múltiplas linguagens de forma eficiente pode ser um grande diferencial.&lt;/p&gt;

&lt;p&gt;A escolha pela forma com que se irá integrar diferentes linguagens, depende muito da complexidade do problema enfrentado. Desta forma, escrevo este artigo na tentativa de desmistificar as abordagens e auxiliar na solução de eventuais questionamentos, além de também promover uma visão mais holística e crítica sobre o desenvolvimento de softwares.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bibliotecas específicas
&lt;/h2&gt;

&lt;p&gt;Uma das maneiras mais diretas de realizar a integração de diferentes tecnologias é por meio de bibliotecas desenvolvidas especificamente para essa finalidade. Essas bibliotecas têm como objetivo atuar de forma rápida e direta, mas podem apresentar problemas ao executar códigos muito complexos e robustos, que realizem ações complexas ou que dependam de outras bibliotecas. Alguns exemplos de bibliotecas específicas que facilitam a integração entre linguagens incluem:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;CFFI (C Foreign Function Interface) - Python:&lt;br&gt;
O CFFI é uma biblioteca que permite que código C seja chamado diretamente a partir de Python.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ffi-napi - Node.js:&lt;br&gt;
A biblioteca ffi-napi permite que o Node.js faça chamadas para funções nativas de bibliotecas escritas em C ou C++. Ela oferece uma maneira de integrar funcionalidades de baixo nível em projetos Node.js, como manipulação de arquivos ou criptografia, utilizando o poder de bibliotecas nativas sem a necessidade de reescrever código.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Application Programming Interface - APIs
&lt;/h2&gt;

&lt;p&gt;É comum que muitos desenvolvedores considerem as APIs apenas como ferramentas para comunicação entre o frontend e o backend de seus projetos ou que sirvam para comunicar algum site/sistema externo à aplicação como em situações de autenticação ou busca por informações públicas. Entretanto, o uso de APIs, de forma conceitual, tem como função a de atuar como intermediário entre diferentes componentes de softwares - sejam eles o frontend e backend, seu sistema e algum sistema externo mas inclusive, diferentes linguagens de programação.&lt;/p&gt;

&lt;p&gt;O importante é que, independentemente de as linguagens estarem em repositórios separados ou não, é necessário que se tenha endpoints em uma das linguagens. Assim, o código do servidor na linguagem X pode realizar uma requisição para o outro servidor que está escrito na linguagem Y.&lt;br&gt;
No exemplo a seguir, observa-se uma situação em que um backend escrito em Node.js realiza uma requisição, utilizando a biblioteca Axios, para um outro servidor backend escrito na linguagem Python, o qual executa um processo de ETL (Extract, Transform, Load) de dados.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F44tebfjnvys6nl9zzdkj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F44tebfjnvys6nl9zzdkj.png" alt="" width="800" height="418"&gt;&lt;/a&gt;&lt;br&gt;Requisição HTTP feita com Axios em Node.js para um servidor Python que executa um processo de ETL e retorna os dados.
  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd04utr1rehns7bmj9xpg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd04utr1rehns7bmj9xpg.png" alt="" width="800" height="601"&gt;&lt;/a&gt;&lt;br&gt;Código Python implementando um processo de ETL para extração, transformação e carregamento de dados.
  &lt;/p&gt;

&lt;h2&gt;
  
  
  Foreign Function Interface - FFI
&lt;/h2&gt;

&lt;p&gt;Outra abordagem para integrar diferentes linguagens, evitando a sobrecarga das chamadas HTTP, é a utilização de FFI (Foreign Function Interface), que permite chamadas diretas entre códigos escritos em diferentes linguagens. Embora essa estratégia ofereça uma performance superior, ela pode ser mais complexa de implementar e depurar.&lt;/p&gt;

&lt;p&gt;Essa técnica demonstra ser mais utilizada para a chamada de código de linguagens de baixo nível como C/C++ e Rust e é muito utilizada na criação e uso de bibliotecas. Muitas bibliotecas são escritas nessas linguagens com o objetivo de aproveitamento de performance e apenas expõem uma interface para que possam ser utilizadas em outras linguagens como Python, Nodejs ou Java. Exemplos clássicos dessa abordagem são o uso das bibliotecas NumPy (escrita em C e Fortran) e TensorFlow (escrita em C++).&lt;/p&gt;

&lt;p&gt;Além de objetivos em performance, muitas bibliotecas e algoritmos já estão implementados em C/C++, de forma que por meio do FFI é possível reutilizar essas implementações em linguagens mais "modernas", excluindo assim a necessidade de reescrita de código e facilitando a comunicação entre diferentes gerações de código.&lt;/p&gt;




&lt;p&gt;Integrar diferentes linguagens de programação em um mesmo projeto pode ser uma tarefa desafiadora, mas também uma oportunidade valiosa para aproveitar as forças específicas de cada tecnologia. Seja utilizando bibliotecas específicas, APIs ou interfaces de função estrangeira (FFI), cada abordagem oferece soluções que podem melhorar a performance, facilitar a reutilização de código e permitir que sistemas diversos trabalhem de forma conjunta.&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>beginners</category>
      <category>architecture</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
