<?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>Forem: 💻🎮</title>
    <description>The latest articles on Forem by 💻🎮 (@noodle).</description>
    <link>https://forem.com/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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1059258%2Fc19cf9db-5939-4078-87a5-5747b3fdc506.png</url>
      <title>Forem: 💻🎮</title>
      <link>https://forem.com/noodle</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/noodle"/>
    <language>en</language>
    <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://forem.com/noodle/when-should-you-really-delete-an-app-4g62</link>
      <guid>https://forem.com/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://forem.com/noodle/react-native-comment-une-simple-mise-a-jour-fait-tout-secrouler-405k</link>
      <guid>https://forem.com/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 android/build.gradle  pour basculer  compileSdkVersion et targetSdkVersion vers 35&lt;/li&gt;
&lt;li&gt;Mise à jour buildToolsVersion vers "35.0.0"&lt;/li&gt;
&lt;li&gt;Upgrade Android Gradle Plugin : 8.2.0 → 8.6.0 (première alerte rouge que j'aurais du voir venir)&lt;/li&gt;
&lt;li&gt;Ajout de la propriété magique android.suppressUnsupportedCompileSdk=35 dans 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 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 ^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>
