<?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: 💻🎮</title>
    <description>The latest articles on DEV Community by 💻🎮 (@noodle).</description>
    <link>https://dev.to/noodle</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1059258%2Fc19cf9db-5939-4078-87a5-5747b3fdc506.png</url>
      <title>DEV Community: 💻🎮</title>
      <link>https://dev.to/noodle</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/noodle"/>
    <language>en</language>
    <item>
      <title>Managing AI in a Mixed Team</title>
      <dc:creator>💻🎮</dc:creator>
      <pubDate>Thu, 09 Jul 2026 17:13:18 +0000</pubDate>
      <link>https://dev.to/noodle/managing-ai-in-a-mixed-team-2009</link>
      <guid>https://dev.to/noodle/managing-ai-in-a-mixed-team-2009</guid>
      <description>&lt;p&gt;Today, everything revolves around AI and its performance. Me, I wanted to talk about something else: the life of a cross-functional team, and how to manage AI within a heterogeneous group, where no one shares the same approach or the same feelings about it.&lt;/p&gt;

&lt;p&gt;Getting every discipline to work together is already a source of small conflicts: sprints, tickets, the friction between developers, POs, PMs… And lately, AI has amplified all of it even more. Between the companies pushing to adopt it, the articles promising to double your productivity, and the tech conferences where AI now shows up on every booth, the famous "just ask Claude to do it" is now circulating in every office. And it's fueling a kind of war: those who are against it and relay every failure they find online, the moderates who manage to keep some perspective, and the die-hard pro-AI crowd who swear by nothing else.&lt;/p&gt;

&lt;h2&gt;
  
  
  On the ground, in a real Merge Request
&lt;/h2&gt;

&lt;p&gt;Let me give you a concrete example, because I'm living it right now. I'm currently building an application with OpenSpec and Claude, which I use daily on a real project, not as a simple experiment. In practice, everything plays out at code review time: when a developer proposes their changes through a Merge Request, the whole team can review it before approval. And that's where, on a real MR, the true limits start to appear: not in LinkedIn threads, but at the office.&lt;/p&gt;

&lt;p&gt;The first thing that jumps out: MRs get bigger. It takes enormous concentration to review, and the generated tests follow a logic that isn't a human's: you don't read AI code the way you read a colleague's whose habits you know. As a result, the whole review flow has to be rethought. And the real questions, the ones we ask each other, go well beyond "for or against":&lt;/p&gt;

&lt;p&gt;How do we make AI-generated code and hand-written code coexist? How do we make sure the blend holds together? Is code review as effective when the code comes from AI, or does the risk of error climb because we read it differently, maybe less carefully?&lt;/p&gt;

&lt;p&gt;And that's when the debate within the team shifts to something concrete, and everyone shows up with their own answer. Should humans stop coding altogether and just steer the tool? Or, on the contrary, does the code remain the single source of truth, the thing we keep the day we unplug the tool, the thing we'll have to maintain, the thing we need to keep under control to avoid the silent accumulation of anti-patterns? On that question, we don't agree among ourselves. And that's normal: no one has the answer.&lt;/p&gt;

&lt;p&gt;But something is taking shape all the same: value is shifting. It has left the writing of code to settle upstream, in design, and downstream, in review, integration, and the choice of what we keep or not. Deciding what to build, how to architect it, what makes sense for the product: that's what takes over when writing becomes delegable. On MRs, what we look at first is the code and the tests, because that's where we see what needs adjusting, that's where what actually runs in production is decided. The craft doesn't disappear, it slides elsewhere: today, what really matters is being able to read code with a critical eye and spot the subtle error, far more than writing fast.&lt;/p&gt;

&lt;p&gt;And this shift feeds real discussions within the team, because everyone experiences it through their own lens. On the senior side, we wonder what becomes of years of expertise in the face of a tool that catches up in seconds to what we'd mastered. On the junior side, the worry is different but just as well-founded: the latest Stanford HAI AI Index finds that employment for developers aged 22 to 25 has dropped by nearly 20% since late 2022, while employment for more experienced developers grew. The routine implementation tasks, the ones we used to learn the craft through, are precisely the first to be automated.&lt;/p&gt;

&lt;p&gt;Seen from this angle, the "for or against AI" debate loses its meaning. The real question becomes: who keeps their value, and who feels they're losing it? And no one has told us where we're supposed to stand now.&lt;/p&gt;

&lt;h2&gt;
  
  
  The referee with no rulebook
&lt;/h2&gt;

&lt;p&gt;And in the middle of all this, there's someone we don't talk about enough: the lead, the manager. The one stuck between the two. From above, they're told "we need to adopt AI, show us the gains." From below, they have a divided team, with clashing sensibilities. And they're the one who has to arbitrate.&lt;/p&gt;

&lt;p&gt;Except no one gave them the rules of the game. Do they impose it? Do they let it go and watch the fracture quietly settle into their team? Do they measure it? And if they measure, measure what, the number of lines generated per sprint? We can clearly see that makes no sense and ends in surveillance.&lt;/p&gt;

&lt;p&gt;That's where, I think, the real subject lies. The same organizational conflict I described at the start plays out again here, but this time with a referee who has no rules. Because deep down, no one has yet written the manual for managing a team that's half-AI, half-human.&lt;/p&gt;

&lt;p&gt;And in the end, maybe that's the real work ahead: learning to manage ourselves, before we even manage the tool.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>discuss</category>
      <category>management</category>
      <category>productivity</category>
    </item>
    <item>
      <title>When should you really delete an app?</title>
      <dc:creator>💻🎮</dc:creator>
      <pubDate>Thu, 16 Oct 2025 06:47:26 +0000</pubDate>
      <link>https://dev.to/noodle/when-should-you-really-delete-an-app-4g62</link>
      <guid>https://dev.to/noodle/when-should-you-really-delete-an-app-4g62</guid>
      <description>&lt;p&gt;React 16, Node 12, no TypeScript, a single CSS file with 1,500 lines... and of course no functional specs.&lt;/p&gt;

&lt;p&gt;That's what our subscription application for TV devices looked like. The majority of the team decided it would be best to start over from scratch.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;An application with constraints&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Our application allows people to subscribe directly to services on their televisions, such as packages giving access to applications, without needing another device. &lt;br&gt;
The main challenge with this type of device comes from technical constraints that are stricter than on the traditional web. Built-in browsers cannot be updated, which prevents the use of certain recent JavaScript, CSS, or HTML features.&lt;/p&gt;

&lt;p&gt;So we are stuck with so-called “old” technologies more out of necessity than choice.&lt;/p&gt;

&lt;p&gt;The code reflected these constraints:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React 16, therefore in the React class&lt;/li&gt;
&lt;li&gt;No TypeScript&lt;/li&gt;
&lt;li&gt;No React Router&lt;/li&gt;
&lt;li&gt;CSS styling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a developer accustomed to modern stacks, this was not at all appealing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Restarting the project: challenges and constraints
&lt;/h2&gt;

&lt;p&gt;When a new Product Owner took over the project, his first observation was that the application was “&lt;strong&gt;too outdated&lt;/strong&gt;.”&lt;br&gt;
The obvious solution, which was immediately proposed, was to start a new project. It seems easier to start over than to repair what already exists. &lt;/p&gt;

&lt;p&gt;But there was a catch: despite numerous UX and architectural proposal meetings, we kept coming back to the same technical constraints.&lt;br&gt;
What's more, the new project would have the same constraints as the old one, but with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Several months of development&lt;/li&gt;
&lt;li&gt;A complete qualification phase&lt;/li&gt;
&lt;li&gt;Integration of the company's various teams (sales, support, etc.)&lt;/li&gt;
&lt;li&gt;A risk of functional regression&lt;/li&gt;
&lt;li&gt;Zero value delivered for the company during this time&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;One question kept running through my mind: What if we improved what we already had?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The more I compared the models for the new project with what we already had, the less I saw a revolution...&lt;br&gt;
The real question that no one was asking at that moment was: &lt;br&gt;
“Have we really tried to improve what we already have?”&lt;/p&gt;

&lt;p&gt;Unfortunately, the answer was no. We had always focused on features, never on continuous improvement of the product.&lt;/p&gt;

&lt;p&gt;I pushed this idea, and my superiors followed me.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The strategy: incremental improvement&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Phase 1: Design and UX (1 sprint)
&lt;/h3&gt;

&lt;p&gt;We started with what is visible, for example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Redesign of the background image&lt;/li&gt;
&lt;li&gt;Redesign of the buttons&lt;/li&gt;
&lt;li&gt;Improvement of UX positioning&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result was already visible when it was presented to the sales team. &lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 2: Continuous technical improvement (2-3 sprints)
&lt;/h3&gt;

&lt;p&gt;We tackled technical debt in small steps: &lt;br&gt;
&lt;strong&gt;Backend:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Migration from Node 12 to Node 22 (progressive, in several stages)&lt;/li&gt;
&lt;li&gt;Refactoring of endpoints&lt;/li&gt;
&lt;li&gt;Improvement of code structure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Frontend:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creation of reusable components&lt;/li&gt;
&lt;li&gt;Improvement of folder structure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Quality:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Systematic processing of the anomaly backlog&lt;/li&gt;
&lt;li&gt;Correction of bugs that had been around for years&lt;/li&gt;
&lt;li&gt;Improvement of stability&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Phase 3: Measurable results
&lt;/h3&gt;

&lt;p&gt;After several months of this approach:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Technical&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Node 12 → 22: successful migration without regression&lt;/li&gt;
&lt;li&gt;Reusable components created&lt;/li&gt;
&lt;li&gt;Technical documentation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Quality&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bug backlog: reduced by approximately half&lt;/li&gt;
&lt;li&gt;Pilot site testing: 0 anomalies reported&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Business&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Positive user feedback&lt;/li&gt;
&lt;li&gt;Sales staff satisfied to see a product improving&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Team&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Motivation maintained (continuous delivery of value)&lt;/li&gt;
&lt;li&gt;Increased skills in refactoring&lt;/li&gt;
&lt;li&gt;Pride in seeing the product improve&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Lessons learned
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. New things are always more appealing, but they come at a cost
&lt;/h3&gt;

&lt;p&gt;Starting from scratch gives the illusion of building on a solid foundation. In reality:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We always underestimate the time required&lt;/li&gt;
&lt;li&gt;We lose the business knowledge hidden in the code&lt;/li&gt;
&lt;li&gt;We often repeat the same mistakes&lt;/li&gt;
&lt;li&gt;We deliver no value for months&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Legacy code isn't always bad
&lt;/h3&gt;

&lt;p&gt;Our application was described as “legacy,” which should not be confused with “obsolete”:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It runs on React 16 - This isn't the most recent version, but it's still functional&lt;/li&gt;
&lt;li&gt;It worked and had satisfied users&lt;/li&gt;
&lt;li&gt;It contained proven business logic&lt;/li&gt;
&lt;li&gt;It was stable in production&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The real problem was that we never took the time to continuously improve the existing code; we just kept adding features.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Technical constraints do not magically disappear
&lt;/h3&gt;

&lt;p&gt;Our main limitation (devices) still existed. Rewriting would not have changed that.&lt;/p&gt;

&lt;p&gt;Sometimes the best option is to optimize according to constraints rather than believe in a world without constraints.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: Think before starting from scratch
&lt;/h2&gt;

&lt;p&gt;Yes, our application still does not meet the criteria of the latest recommendations for modern JS stacks.&lt;/p&gt;

&lt;p&gt;Yes, there is still room for improvement.&lt;/p&gt;

&lt;p&gt;But today it is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More maintainable&lt;/li&gt;
&lt;li&gt;More user-friendly&lt;/li&gt;
&lt;li&gt;More reliable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And above all: we have delivered concrete improvements at the end of each sprint.&lt;/p&gt;

&lt;p&gt;Sometimes, technical debt isn't in the code, but in the time we never devoted to it.&lt;/p&gt;

&lt;p&gt;Cover image generated using AI&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>discuss</category>
      <category>webdev</category>
    </item>
    <item>
      <title>React Native : comment une simple mise à jour fait tout s'écrouler</title>
      <dc:creator>💻🎮</dc:creator>
      <pubDate>Sat, 16 Aug 2025 16:54:35 +0000</pubDate>
      <link>https://dev.to/noodle/react-native-comment-une-simple-mise-a-jour-fait-tout-secrouler-405k</link>
      <guid>https://dev.to/noodle/react-native-comment-une-simple-mise-a-jour-fait-tout-secrouler-405k</guid>
      <description>&lt;p&gt;En tant que développeuse full-stack dans une entreprise qui jongle avec plusieurs produits, je travaille principalement sur des applications web. Le mobile n'est pas notre spécialité, et comme souvent, nous faisons les montées de version au dernier moment. C'est dans ce contexe que replonge dans les profondeurs de React Native.&lt;br&gt;
Première appréhension, est ce que le projet rebuild ? Là, j'ai déjà une petite victoire, celui qui a déjà fait du mobile connaît cette joie de voir passer son &lt;code&gt;npm run android&lt;/code&gt; et l'application se lance, mais tout ce n'est pas passé comme prévu.&lt;br&gt;
Je souhaite partager avec vous les difficultés rencontrées pendant une semaine dans cet article.&lt;/p&gt;

&lt;h2&gt;
  
  
  Chronologie : une semaine mouvementée avec React native
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Jour 1. La migration Android SDK - L'optimisme du début
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Mission&lt;/strong&gt; : passer d'Android SDK33 à 35 pour supporter Android 15&lt;br&gt;
La première étape semblait simple sur le papier. J'ai attaqué méthodiquement : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Modification du&amp;nbsp;android/build.gradle&amp;nbsp;&amp;nbsp;pour basculer &amp;nbsp;compileSdkVersion et&amp;nbsp;targetSdkVersion&amp;nbsp;vers 35&lt;/li&gt;
&lt;li&gt;Mise à jour&amp;nbsp;buildToolsVersion&amp;nbsp;vers "35.0.0"&lt;/li&gt;
&lt;li&gt;Upgrade Android Gradle Plugin&amp;nbsp;: 8.2.0 →&amp;nbsp;8.6.0 (première alerte rouge que j'aurais du voir venir)&lt;/li&gt;
&lt;li&gt;Ajout&amp;nbsp;de la propriété magique android.suppressUnsupportedCompileSdk=35&amp;nbsp;dans&amp;nbsp;gradle.properties&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;verdict&lt;/strong&gt; : Build Android réussi ! Je pensais naïvement que ce serait aussi simple que ça. &lt;/p&gt;




&lt;h3&gt;
  
  
  2. Jour 2 : le château de cartes des dépendances npm commence à vaciller
&lt;/h3&gt;

&lt;p&gt;C'est là que la réalité m'a rattrapé. Les conflits de dépendances ont commencé leur danse infernale : &lt;/p&gt;

&lt;p&gt;Voici un exemple d'un de mes nombreux problèmes de la journée :&lt;br&gt;
React&amp;nbsp;18.2.0 ne voulait plus parler à &lt;a href="mailto:react-intl@4.5.0"&gt;react-intl@4.5.0&lt;/a&gt; qui réclamait demande React&amp;nbsp;^16.3.0.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ma descente aux enfers&lt;/strong&gt;* :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Premier réflexe : le classique rm -rf node_modules suivi d'une réinstallation&lt;/li&gt;
&lt;li&gt;Échec. Tentative avec npm install --legay-peer-deps pour forcer la roue&lt;/li&gt;
&lt;li&gt;Miracle : 2266 packages installés ! (avec seulement 62 vulnérabilités comme cadeau bonus)&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Jour 3 : Gradle, un vieil ennemi oublié
&lt;/h3&gt;

&lt;p&gt;Au moment où je pensais avoir dompté npm, Gradle s'est rappelé à moi : &lt;/p&gt;

&lt;p&gt;" Error resolving plugin [id : 'com.facebook.react.settings'] node_modules/@react-native/gradle-plugin' does not exist" &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Le diagnostic&lt;/strong&gt; : notre React Native 0.71.8 ne connaissant pas ce plugin qui n'existe qu'à partir de la version 0.72+. &lt;br&gt;
A ce moment là j'ai même pensé recommencer l'application de zéro entre les soucis de dépendances et de build, j'étais à deux doigts de faire lancer un &lt;code&gt;npx create-expo-app@latest&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;La méthodologie&lt;/strong&gt; : réécriture complète du settings.gradle en remplaçant les références futuristes par la vielle méthode @react-native-community/cli-platform-android&lt;/p&gt;




&lt;h3&gt;
  
  
  Jour 4 : Jitsi - Le boss final
&lt;/h3&gt;

&lt;p&gt;C'est ici que j'ai compris l'ampleur du désastre : &lt;br&gt;
Oui, Jitsi (&lt;em&gt;Logiciel de visioconférence open source gratuit pour le web et les appareils mobiles&lt;/em&gt;) sort des versions régulières, la dernière 11.4.0. Mais entre la théorie et la pratique, il y a un gouffre, faire tourner ces versions avec un projet React native qui a été initié il y a 5 ans. &lt;/p&gt;

&lt;p&gt;" Could not resolve com.android.tolls.build:gradle:3.5.3"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;La révélation&lt;/strong&gt; : la version implémentée dans mon projet du SDK Jitsi vivait encore en 2019 avec Android Gradle Plugin 3.5.3, complètement incompatible avec notre stack moderne (SDK35+AGP 8.6.0).&lt;br&gt;
Les repositories Maven refusaient même de répondre à des requêtes aussi lointaines...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;L'espoir&lt;/strong&gt; : du coup, j'ai installé la dernière version du SDK Jitsi et j'ai été heureuse, car un moment, j'avais même réussi à faire monter la version de React native en 0.77.3, mais là retour de la boucle infernale des dépendaces...  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Issues&lt;/strong&gt; :&lt;br&gt;
Après de l'errance sur le web, je tombe sur l'issue qui disait &lt;a href="https://github.com/jitsi/jitsi-meet/issues/14912" rel="noopener noreferrer"&gt;https://github.com/jitsi/jitsi-meet/issues/14912&lt;/a&gt; ne supportait pas les versions React natives supérieures à 0.73.&lt;/p&gt;




&lt;h3&gt;
  
  
  Jour 5 : les erreurs runtine
&lt;/h3&gt;

&lt;p&gt;Après avoir réussi à compiler (petit miracle même si cela ne marchait pas !), l'application a décidé de me gratifier d'un magnifique : &lt;br&gt;
"Failed to get room and jwt using code : 10208310 [Error: Request failed with status code 500]"&lt;br&gt;
&lt;strong&gt;L'origine&lt;/strong&gt; : une fonction appelée dans le front ne marchait plus, ce n’était même pas lié à la migration. Le backend avait ses propres problèmes...&lt;/p&gt;




&lt;p&gt;Cette semaine m'a vraiment fait prendre conscience à quel point c'est compliqué de garder une application mobile à jour, surtout quand ce n'est pas notre cœur de métier. On pense naïvement qu'on va juste mettre à jour une petite dépendance, mais en fait, c'est toute une cascade de changements qui s'enchaîne...&lt;/p&gt;

&lt;p&gt;Le plus dur, c'est qu'on touche à cette application de temps en temps seulement. Du coup, à chaque fois qu'on y revient, on se retrouve avec des mois de retard à rattraper d'un coup.&lt;/p&gt;

&lt;p&gt;La prochaine fois qu'on me dira " on a juste besoin de mettre à jour le SDK pour publier", je saurai que c'est le début d'une nouvelle aventure, car avec React native il n'y a pas de petites mises à jour juste de grandes batailles... Où je poserai mes vacances à ce moment-là ...&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Image de couverture générée à partir d'une IA&lt;/em&gt;&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>mobile</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
